internal void VoteRequest() { OletxVolatileEnlistment enlistment = null; int count = 0; bool flag = false; lock (this) { if (DiagnosticTrace.Verbose) { string methodName = "OletxPhase1VolatileEnlistmentContainer.VoteRequest"; MethodEnteredTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), methodName); } base.phase = 1; if (0 < base.incompleteDependentClones) { flag = true; base.outstandingNotifications = 1; } else { base.outstandingNotifications = base.enlistmentList.Count; count = base.enlistmentList.Count; if (count == 0) { base.outstandingNotifications = 1; } } base.realOletxTransaction.TooLateForEnlistments = true; } if (flag) { this.DecrementOutstandingNotifications(false); } else if (count == 0) { this.DecrementOutstandingNotifications(true); } else { for (int i = 0; i < count; i++) { enlistment = base.enlistmentList[i] as OletxVolatileEnlistment; if (enlistment == null) { if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), ""); } throw new InvalidOperationException(System.Transactions.SR.GetString("InternalError")); } enlistment.Prepare(this); } } if (DiagnosticTrace.Verbose) { string str = "OletxPhase1VolatileEnlistmentContainer.VoteRequest"; MethodExitedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), str); } }
public object GetRealObject(StreamingContext context) { if (DiagnosticTrace.Verbose) { MethodEnteredTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "IObjectReference.GetRealObject"); } if (this.propagationTokenForDeserialize == null) { if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), System.Transactions.SR.GetString("UnableToDeserializeTransaction")); } throw TransactionException.Create(System.Transactions.SR.GetString("TraceSourceOletx"), System.Transactions.SR.GetString("UnableToDeserializeTransactionInternalError"), null); } if (null != this.savedLtmPromotedTransaction) { if (DiagnosticTrace.Verbose) { MethodExitedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "IObjectReference.GetRealObject"); } return(this.savedLtmPromotedTransaction); } Transaction transactionFromTransmitterPropagationToken = TransactionInterop.GetTransactionFromTransmitterPropagationToken(this.propagationTokenForDeserialize); this.savedLtmPromotedTransaction = transactionFromTransmitterPropagationToken; if (DiagnosticTrace.Verbose) { TransactionDeserializedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), transactionFromTransmitterPropagationToken.internalTransaction.PromotedTransaction.TransactionTraceId); } if (DiagnosticTrace.Verbose) { MethodExitedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "IObjectReference.GetRealObject"); } return(transactionFromTransmitterPropagationToken); }
internal void Prepare(OletxVolatileEnlistmentContainer container) { OletxVolatileEnlistmentState active = OletxVolatileEnlistmentState.Active; IEnlistmentNotificationInternal iEnlistmentNotification = null; lock (this) { iEnlistmentNotification = this.iEnlistmentNotification; if (this.state == OletxVolatileEnlistmentState.Active) { active = this.state = OletxVolatileEnlistmentState.Preparing; } else { active = this.state; } this.container = container; } if (OletxVolatileEnlistmentState.Preparing == active) { if (iEnlistmentNotification != null) { if (DiagnosticTrace.Verbose) { EnlistmentNotificationCallTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), base.InternalTraceIdentifier, NotificationCall.Prepare); } iEnlistmentNotification.Prepare(this); return; } if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), ""); } throw new InvalidOperationException(System.Transactions.SR.GetString("InternalError")); } if (OletxVolatileEnlistmentState.Done == active) { container.DecrementOutstandingNotifications(true); } else if ((OletxVolatileEnlistmentState.Prepared == active) && this.enlistDuringPrepareRequired) { container.DecrementOutstandingNotifications(true); } else if ((OletxVolatileEnlistmentState.Aborting == active) || (OletxVolatileEnlistmentState.Aborted == active)) { container.DecrementOutstandingNotifications(false); } else { if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), ""); } throw new InvalidOperationException(System.Transactions.SR.GetString("InternalError")); } }
void IPromotedEnlistment.Prepared() { if (DiagnosticTrace.Verbose) { MethodEnteredTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "OletxPreparingEnlistment.Prepared"); EnlistmentCallbackPositiveTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), base.InternalTraceIdentifier, EnlistmentCallback.Prepared); } OletxVolatileEnlistmentContainer container = null; TransactionStatus active = TransactionStatus.Active; lock (this) { if (OletxVolatileEnlistmentState.Preparing != this.state) { throw TransactionException.CreateEnlistmentStateException(System.Transactions.SR.GetString("TraceSourceOletx"), null); } this.state = OletxVolatileEnlistmentState.Prepared; active = this.pendingOutcome; if (this.container == null) { if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), ""); } throw new InvalidOperationException(System.Transactions.SR.GetString("InternalError")); } container = this.container; } container.DecrementOutstandingNotifications(true); switch (active) { case TransactionStatus.Active: break; case TransactionStatus.Aborted: this.Rollback(); break; case TransactionStatus.InDoubt: this.InDoubt(); break; default: if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), ""); } throw new InvalidOperationException(System.Transactions.SR.GetString("InternalError")); } if (DiagnosticTrace.Verbose) { MethodExitedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "OletxPreparingEnlistment.Prepared"); } }
private static void TimerCallback(object state) { TransactionScope scope = state as TransactionScope; if (scope == null) { if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceBase"), System.Transactions.SR.GetString("TransactionScopeTimerObjectInvalid")); } throw TransactionException.Create(System.Transactions.SR.GetString("TraceSourceBase"), System.Transactions.SR.GetString("InternalError") + System.Transactions.SR.GetString("TransactionScopeTimerObjectInvalid"), null); } scope.Timeout(); }
internal void InDoubt() { OletxVolatileEnlistmentState active = OletxVolatileEnlistmentState.Active; IEnlistmentNotificationInternal iEnlistmentNotification = null; lock (this) { if (OletxVolatileEnlistmentState.Prepared == this.state) { active = this.state = OletxVolatileEnlistmentState.InDoubt; iEnlistmentNotification = this.iEnlistmentNotification; } else { if (OletxVolatileEnlistmentState.Preparing == this.state) { this.pendingOutcome = TransactionStatus.InDoubt; } active = this.state; } } if (OletxVolatileEnlistmentState.InDoubt == active) { if (iEnlistmentNotification != null) { if (DiagnosticTrace.Verbose) { EnlistmentNotificationCallTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), base.InternalTraceIdentifier, NotificationCall.InDoubt); } iEnlistmentNotification.InDoubt(this); return; } if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), ""); } throw new InvalidOperationException(System.Transactions.SR.GetString("InternalError")); } if ((OletxVolatileEnlistmentState.Preparing != active) && (OletxVolatileEnlistmentState.Done != active)) { if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), ""); } throw new InvalidOperationException(System.Transactions.SR.GetString("InternalError")); } }
internal override void Committed() { OletxVolatileEnlistment enlistment = null; int count = 0; lock (this) { base.phase = 2; count = base.enlistmentList.Count; } for (int i = 0; i < count; i++) { enlistment = base.enlistmentList[i] as OletxVolatileEnlistment; if (enlistment == null) { if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), ""); } throw new InvalidOperationException(System.Transactions.SR.GetString("InternalError")); } enlistment.Commit(); } }
void IPromotedEnlistment.ForceRollback(Exception e) { if (DiagnosticTrace.Verbose) { MethodEnteredTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "OletxPreparingEnlistment.ForceRollback"); } if (DiagnosticTrace.Warning) { EnlistmentCallbackNegativeTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), base.InternalTraceIdentifier, EnlistmentCallback.ForceRollback); } OletxVolatileEnlistmentContainer container = null; lock (this) { if (OletxVolatileEnlistmentState.Preparing != this.state) { throw TransactionException.CreateEnlistmentStateException(System.Transactions.SR.GetString("TraceSourceOletx"), null); } this.state = OletxVolatileEnlistmentState.Done; if (this.container == null) { if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), ""); } throw new InvalidOperationException(System.Transactions.SR.GetString("InternalError")); } container = this.container; } Interlocked.CompareExchange <Exception>(ref base.oletxTransaction.realOletxTransaction.innerException, e, null); container.DecrementOutstandingNotifications(false); if (DiagnosticTrace.Verbose) { MethodExitedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "OletxPreparingEnlistment.ForceRollback"); } }
internal void Phase0Request(bool abortHint) { OletxVolatileEnlistment enlistment = null; int count = 0; OletxCommittableTransaction committableTransaction = null; bool flag = false; lock (this) { if (DiagnosticTrace.Verbose) { string methodName = "OletxPhase0VolatileEnlistmentContainer.Phase0Request, abortHint = " + abortHint.ToString(CultureInfo.CurrentCulture) + ", phase = " + this.phase.ToString(CultureInfo.CurrentCulture); MethodEnteredTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), methodName); } this.aborting = abortHint; committableTransaction = base.realOletxTransaction.committableTransaction; if ((committableTransaction != null) && !committableTransaction.CommitCalled) { flag = true; this.aborting = true; } if ((2 == base.phase) || (-1 == base.phase)) { if (-1 == base.phase) { base.phase = 0; } if ((this.aborting || this.tmWentDown) || (flag || (2 == base.phase))) { if (this.phase0EnlistmentShim != null) { try { this.phase0EnlistmentShim.Phase0Done(false); base.alreadyVoted = true; } catch (COMException exception) { if (DiagnosticTrace.Verbose) { ExceptionConsumedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), exception); } } } return; } base.outstandingNotifications = base.enlistmentList.Count; count = base.enlistmentList.Count; if (count == 0) { base.outstandingNotifications = 1; } } else { if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "OletxPhase0VolatileEnlistmentContainer.Phase0Request, phase != -1"); } throw new InvalidOperationException(System.Transactions.SR.GetString("InternalError")); } } if (count == 0) { this.DecrementOutstandingNotifications(true); } else { for (int i = 0; i < count; i++) { enlistment = base.enlistmentList[i] as OletxVolatileEnlistment; if (enlistment == null) { if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), ""); } throw new InvalidOperationException(System.Transactions.SR.GetString("InternalError")); } enlistment.Prepare(this); } } if (DiagnosticTrace.Verbose) { string str = "OletxPhase0VolatileEnlistmentContainer.Phase0Request, abortHint = " + abortHint.ToString(CultureInfo.CurrentCulture); MethodExitedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), str); } }
internal OletxEnlistment(IEnlistmentNotificationInternal enlistmentNotification, OletxTransactionStatus xactStatus, byte[] prepareInfoByteArray, OletxResourceManager oletxResourceManager) : base(oletxResourceManager, null) { this.transactionGuid = Guid.Empty; this.phase1Handle = IntPtr.Zero; this.enlistmentShim = null; this.phase0Shim = null; this.canDoSinglePhase = false; this.iEnlistmentNotification = enlistmentNotification; this.state = OletxEnlistmentState.Active; int length = prepareInfoByteArray.Length; this.proxyPrepareInfoByteArray = new byte[length]; Array.Copy(prepareInfoByteArray, this.proxyPrepareInfoByteArray, length); byte[] destinationArray = new byte[0x10]; Array.Copy(this.proxyPrepareInfoByteArray, destinationArray, 0x10); this.transactionGuid = new Guid(destinationArray); base.transactionGuidString = this.transactionGuid.ToString(); switch (xactStatus) { case OletxTransactionStatus.OLETX_TRANSACTION_STATUS_PREPARED: this.state = OletxEnlistmentState.Prepared; lock (oletxResourceManager.reenlistList) { oletxResourceManager.reenlistList.Add(this); oletxResourceManager.StartReenlistThread(); goto Label_01CD; } break; case OletxTransactionStatus.OLETX_TRANSACTION_STATUS_ABORTED: this.state = OletxEnlistmentState.Aborting; if (DiagnosticTrace.Verbose) { EnlistmentNotificationCallTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), base.InternalTraceIdentifier, NotificationCall.Rollback); } this.iEnlistmentNotification.Rollback(this); goto Label_01CD; case OletxTransactionStatus.OLETX_TRANSACTION_STATUS_COMMITTED: this.state = OletxEnlistmentState.Committing; lock (oletxResourceManager.reenlistList) { oletxResourceManager.reenlistPendingList.Add(this); } if (DiagnosticTrace.Verbose) { EnlistmentNotificationCallTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), base.InternalTraceIdentifier, NotificationCall.Commit); } this.iEnlistmentNotification.Commit(this); goto Label_01CD; } if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), System.Transactions.SR.GetString("OletxEnlistmentUnexpectedTransactionStatus")); } throw TransactionException.Create(System.Transactions.SR.GetString("TraceSourceOletx"), System.Transactions.SR.GetString("OletxEnlistmentUnexpectedTransactionStatus"), null); Label_01CD: if (DiagnosticTrace.Information) { EnlistmentTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), base.InternalTraceIdentifier, EnlistmentType.Durable, EnlistmentOptions.None); } base.AddToEnlistmentTable(); }
internal void ReenlistThread(object state) { int count = 0; bool flag = false; OletxEnlistment enlistment = null; IResourceManagerShim resourceManagerShim = null; Timer reenlistThreadTimer = null; bool flag2 = false; OletxResourceManager manager = (OletxResourceManager)state; try { if (DiagnosticTrace.Information) { MethodEnteredTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "OletxResourceManager.ReenlistThread"); } lock (manager) { resourceManagerShim = manager.ResourceManagerShim; reenlistThreadTimer = manager.reenlistThreadTimer; manager.reenlistThreadTimer = null; manager.reenlistThread = Thread.CurrentThread; } if (resourceManagerShim != null) { lock (manager.reenlistList) { count = manager.reenlistList.Count; } flag = false; while ((!flag && (count > 0)) && (resourceManagerShim != null)) { lock (manager.reenlistList) { enlistment = null; count--; if (manager.reenlistList.Count == 0) { flag = true; } else { enlistment = manager.reenlistList[0] as OletxEnlistment; if (enlistment == null) { if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), ""); } throw TransactionException.Create(System.Transactions.SR.GetString("TraceSourceOletx"), System.Transactions.SR.GetString("InternalError"), null); } manager.reenlistList.RemoveAt(0); object obj7 = enlistment; lock (obj7) { if (OletxEnlistment.OletxEnlistmentState.Done == enlistment.State) { enlistment = null; } else if (OletxEnlistment.OletxEnlistmentState.Prepared != enlistment.State) { manager.reenlistList.Add(enlistment); enlistment = null; } } } } if (enlistment != null) { OletxTransactionOutcome notKnownYet = OletxTransactionOutcome.NotKnownYet; try { if (enlistment.ProxyPrepareInfoByteArray == null) { if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), ""); } throw TransactionException.Create(System.Transactions.SR.GetString("TraceSourceOletx"), System.Transactions.SR.GetString("InternalError"), null); } resourceManagerShim.Reenlist((uint)enlistment.ProxyPrepareInfoByteArray.Length, enlistment.ProxyPrepareInfoByteArray, out notKnownYet); if (notKnownYet == OletxTransactionOutcome.NotKnownYet) { object obj5 = enlistment; lock (obj5) { if (OletxEnlistment.OletxEnlistmentState.Done == enlistment.State) { enlistment = null; } else { lock (manager.reenlistList) { manager.reenlistList.Add(enlistment); enlistment = null; } } } } } catch (COMException exception) { if (System.Transactions.Oletx.NativeMethods.XACT_E_CONNECTION_DOWN != exception.ErrorCode) { throw; } if (DiagnosticTrace.Verbose) { ExceptionConsumedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), exception); } if (System.Transactions.Oletx.NativeMethods.XACT_E_CONNECTION_DOWN == exception.ErrorCode) { manager.ResourceManagerShim = null; resourceManagerShim = manager.ResourceManagerShim; } } if (enlistment != null) { object obj3 = enlistment; lock (obj3) { if (OletxEnlistment.OletxEnlistmentState.Done != enlistment.State) { lock (manager.reenlistList) { manager.reenlistPendingList.Add(enlistment); } if (OletxTransactionOutcome.Committed != notKnownYet) { if (OletxTransactionOutcome.Aborted != notKnownYet) { if (DiagnosticTrace.Critical) { InternalErrorTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), ""); } throw TransactionException.Create(System.Transactions.SR.GetString("TraceSourceOletx"), System.Transactions.SR.GetString("InternalError"), null); } enlistment.State = OletxEnlistment.OletxEnlistmentState.Aborting; if (DiagnosticTrace.Verbose) { EnlistmentNotificationCallTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), enlistment.EnlistmentTraceId, NotificationCall.Rollback); } enlistment.EnlistmentNotification.Rollback(enlistment); } else { enlistment.State = OletxEnlistment.OletxEnlistmentState.Committing; if (DiagnosticTrace.Verbose) { EnlistmentNotificationCallTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), enlistment.EnlistmentTraceId, NotificationCall.Commit); } enlistment.EnlistmentNotification.Commit(enlistment); } } else { enlistment = null; } continue; } } } } } resourceManagerShim = null; lock (manager.reenlistList) { lock (manager) { count = manager.reenlistList.Count; if ((0 >= count) && (0 >= manager.reenlistPendingList.Count)) { if (!manager.CallProxyReenlistComplete()) { manager.reenlistThreadTimer = reenlistThreadTimer; if (!reenlistThreadTimer.Change(0x2710, -1)) { throw TransactionException.CreateInvalidOperationException(System.Transactions.SR.GetString("TraceSourceLtm"), System.Transactions.SR.GetString("UnexpectedTimerFailure"), null); } } else { flag2 = true; } } else { manager.reenlistThreadTimer = reenlistThreadTimer; if (!reenlistThreadTimer.Change(0x2710, -1)) { throw TransactionException.CreateInvalidOperationException(System.Transactions.SR.GetString("TraceSourceLtm"), System.Transactions.SR.GetString("UnexpectedTimerFailure"), null); } } manager.reenlistThread = null; } if (DiagnosticTrace.Information) { MethodExitedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "OletxResourceManager.ReenlistThread"); } } } finally { resourceManagerShim = null; if (flag2 && (reenlistThreadTimer != null)) { reenlistThreadTimer.Dispose(); } } }