예제 #1
0
        public static void RegisterResponse(Enlistment enlistment, Status status, object obj)
        {
            MsgRegisterEvent      source = (MsgRegisterEvent)obj;
            ParticipantEnlistment protocolProviderContext = (ParticipantEnlistment)enlistment.ProtocolProviderContext;

            protocolProviderContext.StateMachine.Enqueue(new TmRegisterResponseEvent(protocolProviderContext, status, source));
        }
예제 #2
0
        public void Rejoin(Enlistment enlistment, ProtocolProviderCallback callback, object obj)
        {
            DebugTrace.TraceEnter(this, "Rejoin");
            ParticipantEnlistment participant = null;

            try
            {
                participant = this.state.LogEntrySerialization.DeserializeParticipant(enlistment);
            }
            catch (SerializationException exception)
            {
                DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Critical);
                if (DebugTrace.Error)
                {
                    DebugTrace.Trace(TraceLevel.Error, "Failed to deserialize log entry for participant: {0}", exception);
                }
                ParticipantRecoveryLogEntryCorruptRecord.TraceAndLog(enlistment.LocalTransactionId, enlistment.RemoteTransactionId, enlistment.GetRecoveryData(), exception);
                DiagnosticUtility.FailFast("A participant recovery log entry could not be deserialized. This is a fatal condition.");
            }
            if (ParticipantRecoveredRecord.ShouldTrace)
            {
                ParticipantRecoveredRecord.Trace(participant.EnlistmentId, participant.Enlistment.RemoteTransactionId, (participant.ParticipantProxy != null) ? participant.ParticipantProxy.To : null, this.state.ProtocolVersion);
            }
            participant.StateMachine.Enqueue(new TmRejoinEvent(participant, callback, obj));
            DebugTrace.TraceLeave(this, "Rejoin");
        }
        public override void OnEvent(TmRollbackEvent e)
        {
            ParticipantEnlistment participant = e.Participant;

            participant.SetCallback(e.Callback, e.CallbackState);
            base.state.TransactionManagerSend.Aborted(participant);
        }
예제 #4
0
        public byte[] Serialize(ParticipantEnlistment participant)
        {
            Enlistment enlistment = participant.Enlistment;
            LogEntry   logEntry   = new LogEntry(enlistment.RemoteTransactionId, enlistment.LocalTransactionId, participant.EnlistmentId, participant.ParticipantProxy.To);

            return(this.SerializeLogEntry(logEntry));
        }
        public override void OnEvent(InternalEnlistSubordinateTransactionEvent e)
        {
            ParticipantEnlistment participant = e.Participant;

            base.state.TransactionManagerSend.Register(participant, e);
            participant.StateMachine.ChangeState(base.state.States.SubordinateRegistering);
        }
        public override void OnEvent(MsgPreparedEvent e)
        {
            ParticipantEnlistment participant = e.Participant;
            Exception             exception   = null;

            try
            {
                byte[] data = base.state.LogEntrySerialization.Serialize(participant);
                participant.Enlistment.SetRecoveryData(data);
                base.state.TransactionManagerSend.Prepared(participant);
                e.StateMachine.ChangeState(base.state.States.DurablePrepared);
            }
            catch (SerializationException exception2)
            {
                DiagnosticUtility.ExceptionUtility.TraceHandledException(exception2, TraceEventType.Error);
                exception = exception2;
            }
            if (exception != null)
            {
                if (DebugTrace.Error)
                {
                    DebugTrace.Trace(TraceLevel.Verbose, "Failed to serialize log entry for participant: {0}", exception);
                }
                ParticipantRecoveryLogEntryCreationFailureRecord.TraceAndLog(participant.EnlistmentId, participant.Enlistment.RemoteTransactionId, exception.Message, exception);
                base.state.TwoPhaseCommitCoordinator.SendRollback(participant);
                base.state.TransactionManagerSend.Aborted(participant);
                e.StateMachine.ChangeState(base.state.States.DurableAborted);
            }
        }
예제 #7
0
        public override void OnEvent(TmParticipantForgetEvent e)
        {
            ParticipantEnlistment participant = e.Participant;

            participant.SetCallback(e.Callback, e.CallbackState);
            base.state.TransactionManagerSend.ForgetResponse(participant, Status.Success);
        }
예제 #8
0
        public static void SubordinateRegisterResponse(Enlistment enlistment, Status status, object obj)
        {
            InternalEnlistSubordinateTransactionEvent source = (InternalEnlistSubordinateTransactionEvent)obj;
            ParticipantEnlistment protocolProviderContext    = (ParticipantEnlistment)enlistment.ProtocolProviderContext;

            protocolProviderContext.StateMachine.Enqueue(new TmSubordinateRegisterResponseEvent(protocolProviderContext, status, source));
        }
예제 #9
0
 public void Committed(ParticipantEnlistment participant)
 {
     if (DebugTrace.Info)
     {
         DebugTrace.TxTrace(TraceLevel.Info, participant.EnlistmentId, "Replying Committed to transaction manager");
     }
     participant.DeliverCallback(Status.Committed);
 }
예제 #10
0
 public void Rejoined(ParticipantEnlistment participant)
 {
     if (DebugTrace.Info)
     {
         DebugTrace.TxTrace(TraceLevel.Info, participant.EnlistmentId, "Replying Success to transaction manager's Rejoin");
     }
     participant.DeliverCallback(Status.Success);
 }
예제 #11
0
 public void Register(ParticipantEnlistment participant, MsgRegisterEvent e)
 {
     if (DebugTrace.Info)
     {
         DebugTrace.TxTrace(TraceLevel.Info, participant.EnlistmentId, "Sending Register for {0} to transaction manager", participant.Enlistment.NotificationMask);
     }
     this.propagation.CreateSubordinateEnlistment(participant.Enlistment, this.registerResponseCallback, e);
 }
예제 #12
0
 public void ReadOnly(ParticipantEnlistment participant)
 {
     if (DebugTrace.Info)
     {
         DebugTrace.TxTrace(TraceLevel.Info, participant.EnlistmentId, "Replying Readonly to transaction manager");
     }
     participant.DeliverCallback(Status.Readonly);
 }
        public override void Enter(StateMachine stateMachine)
        {
            ParticipantEnlistment participant = (ParticipantEnlistment)stateMachine.Enlistment;

            participant.CreateCoordinatorService();
            base.state.TwoPhaseCommitCoordinator.SendCommit(participant);
            stateMachine.ChangeState(base.state.States.DurableCommitting);
        }
        public override void OnEvent(TmPrepareEvent e)
        {
            ParticipantEnlistment participant = e.Participant;

            participant.SetCallback(e.Callback, e.CallbackState);
            base.state.TransactionManagerSend.ReadOnly(participant);
            e.StateMachine.ChangeState(base.state.States.DurableInDoubt);
        }
        public TwoPhaseCommitParticipantEvent(ParticipantEnlistment participant) : base(participant)
        {
            MessageHeaders incomingMessageHeaders = OperationContext.Current.IncomingMessageHeaders;

            this.faultTo   = Library.GetFaultToHeader(incomingMessageHeaders, base.state.ProtocolVersion);
            this.replyTo   = Library.GetReplyToHeader(incomingMessageHeaders);
            this.messageID = incomingMessageHeaders.MessageId;
        }
        public override void OnEvent(TmPrePrepareEvent e)
        {
            ParticipantEnlistment participant = e.Participant;

            participant.SetCallback(e.Callback, e.CallbackState);
            base.state.TwoPhaseCommitCoordinator.SendPrepare(participant);
            e.StateMachine.ChangeState(base.state.States.VolatilePrePreparing);
        }
        public override void OnEvent(TmCommitEvent e)
        {
            ParticipantEnlistment participant = e.Participant;

            base.state.TwoPhaseCommitCoordinator.SendCommit(participant);
            participant.SetCallback(e.Callback, e.CallbackState);
            e.StateMachine.ChangeState(base.state.States.DurableCommitting);
        }
        public override void OnEvent(TmPrepareEvent e)
        {
            ParticipantEnlistment participant = e.Participant;

            participant.SetCallback(e.Callback, e.CallbackState);
            base.state.TransactionManagerSend.Prepared(participant);
            e.StateMachine.ChangeState(base.state.States.VolatilePrepared);
        }
예제 #19
0
        public override void OnEvent(TmRollbackEvent e)
        {
            ParticipantEnlistment participant = e.Participant;

            participant.SetCallback(e.Callback, e.CallbackState);
            base.state.TransactionManagerSend.Aborted(participant);
            participant.StateMachine.ChangeState(base.state.States.SubordinateFinished);
        }
예제 #20
0
        public override void OnEvent(TmParticipantForgetEvent e)
        {
            ParticipantEnlistment participant = e.Participant;

            participant.SetCallback(e.Callback, e.CallbackState);
            base.state.TransactionManagerSend.ForgetResponse(participant, Status.Success);
            e.StateMachine.ChangeState(base.state.States.DurableInDoubt);
        }
        public override void OnEvent(TmRollbackEvent e)
        {
            ParticipantEnlistment participant = e.Participant;

            base.state.TwoPhaseCommitCoordinator.SendRollback(participant);
            participant.SetCallback(e.Callback, e.CallbackState);
            base.state.TransactionManagerSend.Aborted(participant);
            e.StateMachine.ChangeState(base.state.States.VolatileAborting);
        }
예제 #22
0
        public override void Enter(StateMachine stateMachine)
        {
            ParticipantEnlistment participant = (ParticipantEnlistment)stateMachine.Enlistment;

            participant.CreateCoordinatorService();
            base.state.TwoPhaseCommitCoordinator.SendRollback(participant);
            base.state.TransactionManagerSend.Aborted(participant);
            stateMachine.ChangeState(base.state.States.DurableAborted);
        }
        public override void OnEvent(MsgReplayEvent e)
        {
            ProtocolVersionHelper.AssertProtocolVersion10(base.state.ProtocolVersion, typeof(DurableActive), "OnEvent(replay)");
            ParticipantEnlistment participant = e.Participant;

            base.state.TwoPhaseCommitCoordinator.SendRollback(participant);
            base.state.TransactionManagerSend.Rollback(participant);
            e.StateMachine.ChangeState(base.state.States.DurableAborted);
        }
        public void Aborted(Message message)
        {
            ParticipantEnlistment participant = this.CheckMessage(message, true, false);

            if (participant != null)
            {
                participant.StateMachine.Enqueue(new MsgAbortedEvent(participant));
            }
        }
예제 #25
0
        protected void ForwardEnlistmentEventToSubordinate(MsgEnlistTransactionEvent e)
        {
            CoordinatorEnlistment     coordinator    = e.Coordinator;
            TransactionContextManager contextManager = coordinator.ContextManager;

            coordinator.ContextManager = null;
            ParticipantEnlistment participant = new ParticipantEnlistment(this.state, coordinator.Enlistment, contextManager);

            participant.StateMachine.Enqueue(new InternalEnlistSubordinateTransactionEvent(participant, e));
        }
        public void Fault(Message message, MessageFault fault)
        {
            ParticipantEnlistment participant = this.CheckMessage(message, false, false);

            if (participant != null)
            {
                this.state.Perf.FaultsReceivedCountPerInterval.Increment();
                participant.StateMachine.Enqueue(new MsgParticipantFaultEvent(participant, fault));
            }
        }
        public void Replay(Message message)
        {
            ProtocolVersionHelper.AssertProtocolVersion10(this.state.ProtocolVersion, base.GetType(), "Replay");
            ParticipantEnlistment participant = this.CheckMessage(message, true, true);

            if (participant != null)
            {
                participant.StateMachine.Enqueue(new MsgReplayEvent(participant));
            }
        }
        public override void Leave(StateMachine stateMachine)
        {
            base.Leave(stateMachine);
            ParticipantEnlistment enlistment = (ParticipantEnlistment)stateMachine.Enlistment;
            long num = Microsoft.Transactions.Wsat.StateMachines.State.QueryStopTime() - enlistment.LastMessageTime;

            base.state.Perf.AverageParticipantPrepareResponseTimeBase.Increment();
            base.state.Perf.AverageParticipantPrepareResponseTime.IncrementBy(num);
            enlistment.Retries = 0;
            stateMachine.CancelTimer();
        }
        public override void OnEvent(TimerParticipantEvent e)
        {
            ParticipantEnlistment participant = e.Participant;

            participant.Retries++;
            if (PrepareMessageRetryRecord.ShouldTrace)
            {
                PrepareMessageRetryRecord.Trace(participant.EnlistmentId, participant.Enlistment.RemoteTransactionId, participant.Retries);
            }
            base.state.Perf.PrepareRetryCountPerInterval.Increment();
            base.state.TwoPhaseCommitCoordinator.SendPrepare(participant);
        }
        public override void OnEvent(TmRejoinEvent e)
        {
            if (!base.state.Recovering)
            {
                DiagnosticUtility.FailFast("Rejoin events should only be delivered during recovery");
            }
            ParticipantEnlistment participant = e.Participant;

            participant.SetCallback(e.Callback, e.CallbackState);
            base.state.TransactionManagerSend.Rejoined(participant);
            e.StateMachine.ChangeState(base.state.States.DurableRejoined);
        }