예제 #1
0
        /// <summary>
        /// Removes a transaction from the transaction table and terminates it by clearing all its locks.
        /// </summary>
        /// <param name="atomicGroupId">Associated atomic group.</param>
        /// <exception cref="System.ArgumentException">Atomic group is invalid.</exception>
        /// <returns></returns>
        public bool RemoveTransaction(long atomicGroupId)
        {
            //
            // Check arguments.
            //
            if (0 > atomicGroupId)
            {
                throw new ArgumentException(StringResources.Error_InvalidAtomicGroup, "atomicGroupId");
            }
            ReadWriteTransaction rwtx      = null;
            bool noActiveTransactionsFound = false;

            //
            // Remove transaction before releasing the transaction locks.
            //
            this.stateLock.EnterWriteLock();
            bool exists = this.rwTransactions.ContainsKey(atomicGroupId);

            if (exists)
            {
                rwtx = this.rwTransactions[atomicGroupId];
                this.rwTransactions.Remove(atomicGroupId);
                noActiveTransactionsFound = (0 == this.rwTransactions.Count && !this.status);
                if (!this.status)
                {
                    AppTrace.TraceSource.WriteNoise(
                        "TransactionManager.RemoveTransaction",
                        "{0} {1} transactions remaining",
                        this.owner,
                        this.rwTransactions.Count);
                }
            }
            this.stateLock.ExitWriteLock();
            if (exists)
            {
                AppTrace.TraceSource.WriteNoise(
                    "TransactionManager.RemoveTransaction",
                    "({0}, {1})",
                    this.owner,
                    atomicGroupId);
                //
                // Release transaction locks.
                //
                rwtx.Terminate();
                //
                // Complete the close if it is in progress.
                //
                if (noActiveTransactionsFound)
                {
                    AppTrace.TraceSource.WriteNoise("TransactionManager.RemoveTransaction", "{0} transactions drained", this.owner);
                    this.drainAllRwTransactions.SetResult(true);
                }
            }
            return(exists);
        }
예제 #2
0
        /// <summary>
        /// Removes a transaction from the transaction table and terminates it by clearing all its locks.
        /// </summary>
        /// <param name="transaction">Transaction to terminate.</param>
        /// <exception cref="System.ArgumentNullException">Transaction is null.</exception>
        /// <exception cref="System.ArgumentException">Transaction type is unknown.</exception>
        /// <returns></returns>
        public bool RemoveTransaction(ITransaction transaction)
        {
            //
            // Check arguments.
            //
            if (null == transaction)
            {
                throw new ArgumentNullException("transaction");
            }
            //
            // Done, if transaction is read only.
            //
            if (transaction is IReadOnlyTransaction)
            {
                ReadOnlyTransaction rotx = transaction as ReadOnlyTransaction;
                if (null == rotx)
                {
                    throw new ArgumentException(StringResources.Error_InvalidTransaction, "transaction");
                }
                //
                // Release transaction locks.
                //
                rotx.Terminate();
                return(false);
            }
            //
            // Done, if transaction is trivial.
            //
            ReadWriteTransaction rwtx = transaction as ReadWriteTransaction;

            if (null == rwtx)
            {
                throw new ArgumentException(StringResources.Error_InvalidTransaction, "transaction");
            }
            if (FabricReplicatorEx.InvalidAtomicGroupId == rwtx.AtomicGroupId)
            {
                //
                // Release transaction locks.
                //
                rwtx.Terminate();
                return(false);
            }
            return(this.RemoveTransaction(rwtx.AtomicGroupId));
        }
예제 #3
0
        /// <summary>
        /// Creates a read/write transaction.
        /// </summary>
        /// <param name="atomicGroupId">Associated atomic group id.</param>
        /// <param name="existing">True, if transaction already exists.</param>
        /// <exception cref="System.OutOfMemoryException">Operation could not be completed due to insufficient resources.</exception>
        /// <exception cref="System.Fabric.FabricObjectClosedException">The object has been closed.</exception>
        /// <returns></returns>
        public IReadWriteTransaction CreateTransaction(long atomicGroupId, out bool existing)
        {
            existing = false;
            //
            // Check arguments.
            //
            if (0 > atomicGroupId && FabricReplicatorEx.InvalidAtomicGroupId != atomicGroupId)
            {
                throw new ArgumentException(StringResources.Error_InvalidAtomicGroup, "atomicGroupId");
            }
            this.stateLock.EnterWriteLock();
            try
            {
                //
                // If the transaction manager is closing, then reject new transaction creation.
                //
                if (!this.status)
                {
                    AppTrace.TraceSource.WriteError(
                        "TransactionManager.IReadWriteTransaction.CreateTransaction",
                        "{0}",
                        this.owner);

                    throw new FabricObjectClosedException();
                }
                if (FabricReplicatorEx.InvalidAtomicGroupId == atomicGroupId)
                {
                    AppTrace.TraceSource.WriteNoise(
                        "TransactionManager.IReadWriteTransaction.CreateTransaction",
                        "({0}, {1})",
                        this.owner,
                        atomicGroupId);
                    //
                    // Do not store trivial transactions.
                    //
                    return(new ReadWriteTransaction(atomicGroupId, this.lockManager, this.owner));
                }
                ReadWriteTransaction rwtx = null;
                if (this.rwTransactions.ContainsKey(atomicGroupId))
                {
                    //
                    // Return existing transaction.
                    //
                    rwtx     = this.rwTransactions[atomicGroupId];
                    existing = true;
                }
                else
                {
                    //
                    // Create and store new transaction.
                    //
                    rwtx = new ReadWriteTransaction(atomicGroupId, this.lockManager, this.owner);
                    this.rwTransactions.Add(atomicGroupId, rwtx);
                }

                AppTrace.TraceSource.WriteNoise(
                    "TransactionManager.IReadWriteTransaction.CreateTransaction",
                    "({0}, {1})",
                    this.owner,
                    atomicGroupId);

                return(rwtx);
            }
            finally
            {
                this.stateLock.ExitWriteLock();
            }
        }