private VNodeFSM CreateFSM()
        {
            var stm = new VNodeFSMBuilder(() => _state)
                      .InAnyState()
                      .When <SystemMessage.SystemInit>().Do(Handle)
                      .When <SystemMessage.SystemStart>().Do(Handle)
                      .When <SystemMessage.BecomeShuttingDown>().Do(Handle)
                      .When <SystemMessage.BecomeWorking>().Do(Handle)
                      .When <SystemMessage.BecomeShutdown>().Do(Handle)
                      .InState(VNodeState.Initializing)
                      .When <SystemMessage.StorageReaderInitializationDone>().Do(Handle)
                      .When <SystemMessage.StorageWriterInitializationDone>().Do(Handle)
                      .When <ClientMessage.WriteMessage>().Ignore()
                      .When <ClientMessage.ReadMessage>().Ignore()
                      .WhenOther().Do(m => _outputBus.Publish(m))
                      .InState(VNodeState.Master)
                      .When <ClientMessage.CreateStream>().Do(Handle)
                      .When <ClientMessage.WriteEvents>().Do(Handle)
                      .When <ClientMessage.TransactionStart>().Do(Handle)
                      .When <ClientMessage.TransactionWrite>().Do(Handle)
                      .When <ClientMessage.TransactionCommit>().Do(Handle)
                      .When <ClientMessage.DeleteStream>().Do(Handle)
                      .WhenOther().Do(m => _outputBus.Publish(m))
                      .InStates(VNodeState.Initializing, VNodeState.Master)
                      .When <ClientMessage.RequestShutdown>().Do(Handle)
                      .InStates(VNodeState.ShuttingDown, VNodeState.Shutdown)
                      .When <SystemMessage.ServiceShutdown>().Do(Handle)
                      // TODO AN reply with correct status code, that system is shutting down (or already shut down)
                      .When <ClientMessage.WriteEvents>().Ignore()
                      .When <ClientMessage.TransactionStart>().Ignore()
                      .When <ClientMessage.TransactionWrite>().Ignore()
                      .When <ClientMessage.TransactionCommit>().Ignore()
                      .When <ClientMessage.DeleteStream>().Ignore()
                      .When <ClientMessage.ReadEvent>().Ignore()
                      .When <ClientMessage.ReadEventsBackwards>().Ignore()
                      .When <ClientMessage.ReadEventsForward>().Ignore()
                      .When <ClientMessage.ReadEventsFromTF>().Ignore()
                      .When <ClientMessage.ListStreams>().Ignore()
                      .WhenOther().Do(m => _outputBus.Publish(m))
                      .InState(VNodeState.ShuttingDown)
                      .When <SystemMessage.ShutdownTimeout>().Do(Handle)
                      .Build();

            return(stm);
        }
Пример #2
0
        private VNodeFSM CreateFSM()
        {
            var stm = new VNodeFSMBuilder(() => _state)
                      .InAnyState()
                      .When <SystemMessage.StateChangeMessage>()
                      .Do(m => Application.Exit(ExitCode.Error, string.Format("{0} message was unhandled in {1}.", m.GetType().Name, GetType().Name)))
                      .When <UserManagementMessage.UserManagementServiceInitialized>().Do(Handle)
                      .When <SystemMessage.SubSystemInitialized>().Do(Handle)
                      .When <SystemMessage.SystemCoreReady>().Do(Handle)

                      .InState(VNodeState.Initializing)
                      .When <SystemMessage.SystemInit>().Do(Handle)
                      .When <SystemMessage.SystemStart>().Do(Handle)
                      .When <SystemMessage.ServiceInitialized>().Do(Handle)
                      .When <ClientMessage.ScavengeDatabase>().Ignore()
                      .WhenOther().ForwardTo(_outputBus)

                      .InState(VNodeState.Unknown)
                      .WhenOther().ForwardTo(_outputBus)

                      .InStates(VNodeState.Initializing, VNodeState.Master, VNodeState.PreMaster,
                                VNodeState.PreReplica, VNodeState.CatchingUp, VNodeState.Clone, VNodeState.Slave)
                      .When <SystemMessage.BecomeUnknown>().Do(Handle)

                      .InAllStatesExcept(VNodeState.Unknown,
                                         VNodeState.PreReplica, VNodeState.CatchingUp, VNodeState.Clone, VNodeState.Slave,
                                         VNodeState.Master)
                      .When <ClientMessage.ReadRequestMessage>().Do(msg => DenyRequestBecauseNotReady(msg.Envelope, msg.CorrelationId))

                      .InAllStatesExcept(VNodeState.Master,
                                         VNodeState.PreReplica, VNodeState.CatchingUp, VNodeState.Clone, VNodeState.Slave)
                      .When <ClientMessage.WriteRequestMessage>().Do(msg => DenyRequestBecauseNotReady(msg.Envelope, msg.CorrelationId))

                      .InState(VNodeState.Master)
                      .When <ClientMessage.ReadEvent>().ForwardTo(_outputBus)
                      .When <ClientMessage.ReadStreamEventsForward>().ForwardTo(_outputBus)
                      .When <ClientMessage.ReadStreamEventsBackward>().ForwardTo(_outputBus)
                      .When <ClientMessage.ReadAllEventsForward>().ForwardTo(_outputBus)
                      .When <ClientMessage.ReadAllEventsBackward>().ForwardTo(_outputBus)
                      .When <ClientMessage.WriteEvents>().ForwardTo(_outputBus)
                      .When <ClientMessage.TransactionStart>().ForwardTo(_outputBus)
                      .When <ClientMessage.TransactionWrite>().ForwardTo(_outputBus)
                      .When <ClientMessage.TransactionCommit>().ForwardTo(_outputBus)
                      .When <ClientMessage.DeleteStream>().ForwardTo(_outputBus)
                      .When <ClientMessage.CreatePersistentSubscription>().ForwardTo(_outputBus)
                      .When <ClientMessage.ConnectToPersistentSubscription>().ForwardTo(_outputBus)
                      .When <ClientMessage.UpdatePersistentSubscription>().ForwardTo(_outputBus)
                      .When <ClientMessage.DeletePersistentSubscription>().ForwardTo(_outputBus)

                      .InStates(VNodeState.PreReplica, VNodeState.CatchingUp, VNodeState.Clone, VNodeState.Slave,
                                VNodeState.Unknown)
                      .When <ClientMessage.ReadEvent>().Do(HandleAsNonMaster)
                      .When <ClientMessage.ReadStreamEventsForward>().Do(HandleAsNonMaster)
                      .When <ClientMessage.ReadStreamEventsBackward>().Do(HandleAsNonMaster)
                      .When <ClientMessage.ReadAllEventsForward>().Do(HandleAsNonMaster)
                      .When <ClientMessage.ReadAllEventsBackward>().Do(HandleAsNonMaster)
                      .When <ClientMessage.CreatePersistentSubscription>().Do(HandleAsNonMaster)
                      .When <ClientMessage.ConnectToPersistentSubscription>().Do(HandleAsNonMaster)
                      .When <ClientMessage.UpdatePersistentSubscription>().Do(HandleAsNonMaster)
                      .When <ClientMessage.DeletePersistentSubscription>().Do(HandleAsNonMaster)

                      .InStates(VNodeState.PreReplica, VNodeState.CatchingUp, VNodeState.Clone, VNodeState.Slave)
                      .When <ClientMessage.WriteEvents>().Do(HandleAsNonMaster)
                      .When <ClientMessage.TransactionStart>().Do(HandleAsNonMaster)
                      .When <ClientMessage.TransactionWrite>().Do(HandleAsNonMaster)
                      .When <ClientMessage.TransactionCommit>().Do(HandleAsNonMaster)
                      .When <ClientMessage.DeleteStream>().Do(HandleAsNonMaster)

                      .InAnyState()
                      .When <ClientMessage.NotHandled>().ForwardTo(_outputBus)
                      .When <ClientMessage.ReadEventCompleted>().ForwardTo(_outputBus)
                      .When <ClientMessage.ReadStreamEventsForwardCompleted>().ForwardTo(_outputBus)
                      .When <ClientMessage.ReadStreamEventsBackwardCompleted>().ForwardTo(_outputBus)
                      .When <ClientMessage.ReadAllEventsForwardCompleted>().ForwardTo(_outputBus)
                      .When <ClientMessage.ReadAllEventsBackwardCompleted>().ForwardTo(_outputBus)
                      .When <ClientMessage.WriteEventsCompleted>().ForwardTo(_outputBus)
                      .When <ClientMessage.TransactionStartCompleted>().ForwardTo(_outputBus)
                      .When <ClientMessage.TransactionWriteCompleted>().ForwardTo(_outputBus)
                      .When <ClientMessage.TransactionCommitCompleted>().ForwardTo(_outputBus)
                      .When <ClientMessage.DeleteStreamCompleted>().ForwardTo(_outputBus)

                      .InAllStatesExcept(VNodeState.Initializing, VNodeState.ShuttingDown, VNodeState.Shutdown)
                      .When <ElectionMessage.ElectionsDone>().Do(Handle)

                      .InStates(VNodeState.Unknown,
                                VNodeState.PreReplica, VNodeState.CatchingUp, VNodeState.Clone, VNodeState.Slave,
                                VNodeState.PreMaster, VNodeState.Master)
                      .When <SystemMessage.BecomePreReplica>().Do(Handle)
                      .When <SystemMessage.BecomePreMaster>().Do(Handle)

                      .InStates(VNodeState.PreReplica, VNodeState.CatchingUp, VNodeState.Clone, VNodeState.Slave)
                      .When <GossipMessage.GossipUpdated>().Do(HandleAsNonMaster)
                      .When <SystemMessage.VNodeConnectionLost>().Do(Handle)

                      .InAllStatesExcept(VNodeState.PreReplica, VNodeState.PreMaster)
                      .When <SystemMessage.WaitForChaserToCatchUp>().Ignore()
                      .When <SystemMessage.ChaserCaughtUp>().Ignore()

                      .InState(VNodeState.PreReplica)
                      .When <SystemMessage.BecomeCatchingUp>().Do(Handle)
                      .When <SystemMessage.WaitForChaserToCatchUp>().Do(Handle)
                      .When <SystemMessage.ChaserCaughtUp>().Do(HandleAsPreReplica)
                      .When <ReplicationMessage.ReconnectToMaster>().Do(Handle)
                      .When <ReplicationMessage.SubscribeToMaster>().Do(Handle)
                      .When <ReplicationMessage.ReplicaSubscriptionRetry>().Do(Handle)
                      .When <ReplicationMessage.ReplicaSubscribed>().Do(Handle)
                      .WhenOther().ForwardTo(_outputBus)
                      .InAllStatesExcept(VNodeState.PreReplica)
                      .When <ReplicationMessage.ReconnectToMaster>().Ignore()
                      .When <ReplicationMessage.SubscribeToMaster>().Ignore()
                      .When <ReplicationMessage.ReplicaSubscriptionRetry>().Ignore()
                      .When <ReplicationMessage.ReplicaSubscribed>().Ignore()

                      .InStates(VNodeState.CatchingUp, VNodeState.Clone, VNodeState.Slave)
                      .When <ReplicationMessage.CreateChunk>().Do(ForwardReplicationMessage)
                      .When <ReplicationMessage.RawChunkBulk>().Do(ForwardReplicationMessage)
                      .When <ReplicationMessage.DataChunkBulk>().Do(ForwardReplicationMessage)
                      .When <ReplicationMessage.AckLogPosition>().ForwardTo(_outputBus)
                      .WhenOther().ForwardTo(_outputBus)
                      .InAllStatesExcept(VNodeState.CatchingUp, VNodeState.Clone, VNodeState.Slave)
                      .When <ReplicationMessage.CreateChunk>().Ignore()
                      .When <ReplicationMessage.RawChunkBulk>().Ignore()
                      .When <ReplicationMessage.DataChunkBulk>().Ignore()
                      .When <ReplicationMessage.AckLogPosition>().Ignore()

                      .InState(VNodeState.CatchingUp)
                      .When <ReplicationMessage.CloneAssignment>().Do(Handle)
                      .When <ReplicationMessage.SlaveAssignment>().Do(Handle)
                      .When <SystemMessage.BecomeClone>().Do(Handle)
                      .When <SystemMessage.BecomeSlave>().Do(Handle)
                      .InState(VNodeState.Clone)
                      .When <ReplicationMessage.SlaveAssignment>().Do(Handle)
                      .When <SystemMessage.BecomeSlave>().Do(Handle)
                      .InState(VNodeState.Slave)
                      .When <ReplicationMessage.CloneAssignment>().Do(Handle)
                      .When <SystemMessage.BecomeClone>().Do(Handle)

                      .InStates(VNodeState.PreMaster, VNodeState.Master)
                      .When <GossipMessage.GossipUpdated>().Do(HandleAsMaster)
                      .When <ReplicationMessage.ReplicaSubscriptionRequest>().ForwardTo(_outputBus)
                      .When <ReplicationMessage.ReplicaLogPositionAck>().ForwardTo(_outputBus)
                      .InAllStatesExcept(VNodeState.PreMaster, VNodeState.Master)
                      .When <ReplicationMessage.ReplicaSubscriptionRequest>().Ignore()

                      .InState(VNodeState.PreMaster)
                      .When <SystemMessage.BecomeMaster>().Do(Handle)
                      .When <SystemMessage.WaitForChaserToCatchUp>().Do(Handle)
                      .When <SystemMessage.ChaserCaughtUp>().Do(HandleAsPreMaster)
                      .WhenOther().ForwardTo(_outputBus)

                      .InState(VNodeState.Master)
                      .When <SystemMessage.NoQuorumMessage>().Do(Handle)
                      .When <StorageMessage.WritePrepares>().ForwardTo(_outputBus)
                      .When <StorageMessage.WriteDelete>().ForwardTo(_outputBus)
                      .When <StorageMessage.WriteTransactionStart>().ForwardTo(_outputBus)
                      .When <StorageMessage.WriteTransactionData>().ForwardTo(_outputBus)
                      .When <StorageMessage.WriteTransactionPrepare>().ForwardTo(_outputBus)
                      .When <StorageMessage.WriteCommit>().ForwardTo(_outputBus)
                      .WhenOther().ForwardTo(_outputBus)

                      .InAllStatesExcept(VNodeState.Master)
                      .When <SystemMessage.NoQuorumMessage>().Ignore()
                      .When <StorageMessage.WritePrepares>().Ignore()
                      .When <StorageMessage.WriteDelete>().Ignore()
                      .When <StorageMessage.WriteTransactionStart>().Ignore()
                      .When <StorageMessage.WriteTransactionData>().Ignore()
                      .When <StorageMessage.WriteTransactionPrepare>().Ignore()
                      .When <StorageMessage.WriteCommit>().Ignore()

                      .InAllStatesExcept(VNodeState.ShuttingDown, VNodeState.Shutdown)
                      .When <ClientMessage.RequestShutdown>().Do(Handle)
                      .When <SystemMessage.BecomeShuttingDown>().Do(Handle)

                      .InState(VNodeState.ShuttingDown)
                      .When <SystemMessage.BecomeShutdown>().Do(Handle)
                      .When <SystemMessage.ShutdownTimeout>().Do(Handle)

                      .InStates(VNodeState.ShuttingDown, VNodeState.Shutdown)
                      .When <SystemMessage.ServiceShutdown>().Do(Handle)
                      .WhenOther().ForwardTo(_outputBus)

                      .Build();

            return(stm);
        }
Пример #3
0
 public VNodeFSMStatesDefinition(VNodeFSMBuilder fsm, params VNodeState[] states)
 {
     FSM    = fsm;
     States = states;
 }
Пример #4
0
        private VNodeFSM CreateFSM()
        {
            var stm = new VNodeFSMBuilder(() => _state)
                      .InAnyState()
                      .When <SystemMessage.StateChangeMessage>()
                      .Do(m => Application.Exit(ExitCode.Error, string.Format("{0} message was unhandled in {1}.", m.GetType().Name, GetType().Name)))

                      .InState(VNodeState.Initializing)
                      .When <SystemMessage.SystemInit>().Do(Handle)
                      .When <SystemMessage.SystemStart>().Do(Handle)
                      .When <SystemMessage.BecomePreMaster>().Do(Handle)
                      .When <SystemMessage.StorageReaderInitializationDone>().Do(Handle)
                      .When <SystemMessage.StorageWriterInitializationDone>().Do(Handle)
                      .WhenOther().ForwardTo(_outputBus)

                      .InStates(VNodeState.Initializing, VNodeState.ShuttingDown, VNodeState.Shutdown)
                      .When <ClientMessage.ReadRequestMessage>().Do(msg => DenyRequestBecauseNotReady(msg.Envelope, msg.CorrelationId))
                      .InAllStatesExcept(VNodeState.Initializing, VNodeState.ShuttingDown, VNodeState.Shutdown)
                      .When <ClientMessage.ReadRequestMessage>().ForwardTo(_outputBus)

                      .InAllStatesExcept(VNodeState.PreMaster)
                      .When <SystemMessage.WaitForChaserToCatchUp>().Ignore()
                      .When <SystemMessage.ChaserCaughtUp>().Ignore()

                      .InState(VNodeState.PreMaster)
                      .When <SystemMessage.BecomeMaster>().Do(Handle)
                      .When <SystemMessage.WaitForChaserToCatchUp>().ForwardTo(_outputBus)
                      .When <SystemMessage.ChaserCaughtUp>().Do(Handle)
                      .WhenOther().ForwardTo(_outputBus)

                      .InState(VNodeState.Master)
                      .When <ClientMessage.WriteEvents>().ForwardTo(_outputBus)
                      .When <ClientMessage.TransactionStart>().ForwardTo(_outputBus)
                      .When <ClientMessage.TransactionWrite>().ForwardTo(_outputBus)
                      .When <ClientMessage.TransactionCommit>().ForwardTo(_outputBus)
                      .When <ClientMessage.DeleteStream>().ForwardTo(_outputBus)
                      .When <StorageMessage.WritePrepares>().ForwardTo(_outputBus)
                      .When <StorageMessage.WriteDelete>().ForwardTo(_outputBus)
                      .When <StorageMessage.WriteTransactionStart>().ForwardTo(_outputBus)
                      .When <StorageMessage.WriteTransactionData>().ForwardTo(_outputBus)
                      .When <StorageMessage.WriteTransactionPrepare>().ForwardTo(_outputBus)
                      .When <StorageMessage.WriteCommit>().ForwardTo(_outputBus)
                      .WhenOther().ForwardTo(_outputBus)

                      .InAllStatesExcept(VNodeState.Master)
                      .When <ClientMessage.WriteRequestMessage>().Do(msg => DenyRequestBecauseNotReady(msg.Envelope, msg.CorrelationId))
                      .When <StorageMessage.WritePrepares>().Ignore()
                      .When <StorageMessage.WriteDelete>().Ignore()
                      .When <StorageMessage.WriteTransactionStart>().Ignore()
                      .When <StorageMessage.WriteTransactionData>().Ignore()
                      .When <StorageMessage.WriteTransactionPrepare>().Ignore()
                      .When <StorageMessage.WriteCommit>().Ignore()

                      .InAllStatesExcept(VNodeState.ShuttingDown, VNodeState.Shutdown)
                      .When <ClientMessage.RequestShutdown>().Do(Handle)
                      .When <SystemMessage.BecomeShuttingDown>().Do(Handle)

                      .InState(VNodeState.ShuttingDown)
                      .When <SystemMessage.BecomeShutdown>().Do(Handle)
                      .When <SystemMessage.ShutdownTimeout>().Do(Handle)

                      .InStates(VNodeState.ShuttingDown, VNodeState.Shutdown)
                      .When <SystemMessage.ServiceShutdown>().Do(Handle)
                      .WhenOther().ForwardTo(_outputBus)

                      .Build();

            return(stm);
        }