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;
 }
 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 Committed(ParticipantEnlistment participant)
 {
     if (DebugTrace.Info)
     {
         DebugTrace.TxTrace(TraceLevel.Info, participant.EnlistmentId, "Replying Committed to transaction manager");
     }
     participant.DeliverCallback(Status.Committed);
 }
Beispiel #4
0
 public bool TryEnqueueRecoveryOutcome(ParticipantCallbackEvent e)
 {
     lock (this.recoveryLock)
     {
         if (!this.recovering)
         {
             return(false);
         }
         if (DebugTrace.Info)
         {
             ParticipantEnlistment participant = e.Participant;
             DebugTrace.TxTrace(TraceLevel.Info, participant.EnlistmentId, "Queuing recovery outcome {0} for participant at {1}", e, Ports.TryGetAddress(participant.ParticipantProxy));
         }
         this.recoveryQueue.Enqueue(e);
     }
     return(true);
 }
 public TimerParticipantEvent(ParticipantEnlistment participant, TimerProfile profile) : base(participant)
 {
     this.profile = profile;
 }
 public void SendRollback(ParticipantEnlistment participant)
 {
     if (DebugTrace.Info)
     {
         DebugTrace.TxTrace(TraceLevel.Info, participant.EnlistmentId, "Sending Rollback to {0} participant at {1}", participant.ControlProtocol, Ports.TryGetAddress(participant.ParticipantProxy));
     }
     IAsyncResult ar = participant.ParticipantProxy.BeginSendRollback(this.sendComplete, participant);
     if (ar.CompletedSynchronously)
     {
         this.OnSendComplete(ar, participant);
     }
 }
 private void OnSendComplete(IAsyncResult ar, ParticipantEnlistment participant)
 {
     Exception exception = null;
     try
     {
         participant.ParticipantProxy.EndSendMessage(ar);
     }
     catch (WsatSendFailureException exception2)
     {
         Microsoft.Transactions.Bridge.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception2, TraceEventType.Warning);
         DebugTrace.TraceSendFailure(participant.EnlistmentId, exception2);
         this.state.Perf.MessageSendFailureCountPerInterval.Increment();
         exception = exception2;
     }
     if (exception != null)
     {
         participant.StateMachine.Enqueue(new MsgParticipantSendFailureEvent(participant));
     }
 }
 protected ParticipantCallbackEvent(ParticipantEnlistment participant, ProtocolProviderCallback callback, object state) : base(participant)
 {
     this.callback = callback;
     this.callbackState = state;
 }
 public DurableStateMachine(ParticipantEnlistment participant) : base(participant)
 {
 }
 protected ParticipantFaultEvent(ParticipantEnlistment participant, MessageFault fault) : base(participant)
 {
     this.fault = fault;
 }
 public ParticipantStateMachine(ParticipantEnlistment participant) : base(participant)
 {
     this.participant = participant;
 }
 public void ReadOnly(ParticipantEnlistment participant)
 {
     if (DebugTrace.Info)
     {
         DebugTrace.TxTrace(TraceLevel.Info, participant.EnlistmentId, "Replying Readonly to transaction manager");
     }
     participant.DeliverCallback(Status.Readonly);
 }
 public MsgPreparedEvent(ParticipantEnlistment participant) : base(participant)
 {
 }
 protected ParticipantStatusEvent(ParticipantEnlistment participant, Microsoft.Transactions.Bridge.Status status) : base(participant)
 {
     this.status = status;
 }
 public InternalEnlistSubordinateTransactionEvent(ParticipantEnlistment participant, MsgEnlistTransactionEvent source) : base(participant)
 {
     this.source = source;
 }
 protected ParticipantEvent(ParticipantEnlistment participant) : base(participant)
 {
     this.participant = participant;
 }
 public MsgReadOnlyEvent(ParticipantEnlistment participant) : base(participant)
 {
 }
 public TmRegisterResponseEvent(ParticipantEnlistment participant, Status status, MsgRegisterEvent source) : base(participant, status)
 {
     this.source = source;
 }
 private void InvalidParticipantFaultEvent(SynchronizationEvent e, ParticipantEnlistment participant)
 {
     this.TraceInvalidEvent(e, false);
     this.TryToAbortTransaction(e, participant);
 }
 public TmCommitEvent(ParticipantEnlistment participant, ProtocolProviderCallback callback, object state) : base(participant, callback, state)
 {
 }
 public MsgRegisterEvent(ParticipantEnlistment participant, ref Register register, RequestAsyncResult result) : base(participant)
 {
     this.register = register;
     this.result = result;
 }
 public MsgParticipantSendFailureEvent(ParticipantEnlistment participant) : base(participant)
 {
 }
 public MsgAbortedEvent(ParticipantEnlistment participant) : base(participant)
 {
 }
 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);
 }
        public void Register(Message message, Microsoft.Transactions.Wsat.Messaging.RequestAsyncResult result)
        {
            Microsoft.Transactions.Wsat.Messaging.Register register = new Microsoft.Transactions.Wsat.Messaging.Register(message, this.state.ProtocolVersion);
            EndpointAddress participantProtocolService = register.ParticipantProtocolService;
            WsatRegistrationHeader header = WsatRegistrationHeader.ReadFrom(message);
            if (header == null)
            {
                if (DebugTrace.Warning)
                {
                    DebugTrace.Trace(TraceLevel.Warning, "Rejecting Register message with no registration header");
                }
                this.SendFault(result, this.state.Faults.InvalidParameters);
                return;
            }
            switch (register.Protocol)
            {
                case ControlProtocol.Completion:
                {
                    CompletionEnlistment completion = this.state.Lookup.FindEnlistment(header.TransactionId) as CompletionEnlistment;
                    if (completion != null)
                    {
                        CompletionParticipantProxy proxy = this.state.TryCreateCompletionParticipantProxy(participantProtocolService);
                        if (proxy == null)
                        {
                            if (DebugTrace.Warning)
                            {
                                DebugTrace.Trace(TraceLevel.Warning, "Rejecting Register message for completion on no completion enlistment");
                            }
                            this.SendFault(result, this.state.Faults.InvalidParameters);
                            return;
                        }
                        try
                        {
                            completion.StateMachine.Enqueue(new MsgRegisterCompletionEvent(completion, ref register, result, proxy));
                            return;
                        }
                        finally
                        {
                            proxy.Release();
                        }
                        break;
                    }
                    if (DebugTrace.Warning)
                    {
                        DebugTrace.Trace(TraceLevel.Warning, "Rejecting uncorrelated Register message for completion");
                    }
                    this.SendFault(result, this.state.Faults.UnknownCompletionEnlistment);
                    return;
                }
                case ControlProtocol.Volatile2PC:
                case ControlProtocol.Durable2PC:
                    break;

                default:
                    goto Label_0222;
            }
            if (!this.state.TransactionManager.Settings.NetworkOutboundAccess)
            {
                if (DebugTrace.Warning)
                {
                    DebugTrace.Trace(TraceLevel.Warning, "Rejecting Register message because outbound transactions are disabled");
                }
                this.SendFault(result, this.state.Faults.ParticipantRegistrationNetAccessDisabled);
                return;
            }
            if (register.Loopback == this.state.ProcessId)
            {
                if (DebugTrace.Warning)
                {
                    DebugTrace.Trace(TraceLevel.Warning, "Rejecting recursive Register message from self");
                }
                this.SendFault(result, this.state.Faults.ParticipantRegistrationLoopback);
                return;
            }
            TwoPhaseCommitParticipantProxy proxy2 = this.state.TryCreateTwoPhaseCommitParticipantProxy(participantProtocolService);
            if (proxy2 == null)
            {
                if (DebugTrace.Warning)
                {
                    DebugTrace.Trace(TraceLevel.Warning, "Rejecting Register message because 2PC proxy could not be created");
                }
                this.SendFault(result, this.state.Faults.InvalidParameters);
                return;
            }
            try
            {
                ParticipantEnlistment participant = new ParticipantEnlistment(this.state, header, register.Protocol, proxy2);
                this.state.TransactionManagerSend.Register(participant, new MsgRegisterEvent(participant, ref register, result));
                return;
            }
            finally
            {
                proxy2.Release();
            }
        Label_0222:
            Microsoft.Transactions.Bridge.DiagnosticUtility.FailFast("Registration protocol should have been validated");
        }
 public VolatileStateMachine(ParticipantEnlistment participant) : base(participant)
 {
 }
 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);
 }
 public MsgCommittedEvent(ParticipantEnlistment participant) : base(participant)
 {
 }
 public TmSubordinateRegisterResponseEvent(ParticipantEnlistment participant, Status status, InternalEnlistSubordinateTransactionEvent source) : base(participant, status)
 {
     this.source = source;
 }