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); }
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); }
public VNodeFSMStatesDefinition(VNodeFSMBuilder fsm, params VNodeState[] states) { FSM = fsm; States = states; }
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); }