Example #1
0
        /// <summary>
        /// Perform undo of GSM operations before LSM operations. Basically checks if the operation
        /// to be undone is still present in the log.
        /// </summary>
        /// <returns>
        /// <c>true</c> if further undo operations are necessary, <c>false</c> otherwise.
        /// </returns>
        private bool UndoGlobalPreLocal()
        {
            IStoreResults result;

            _operationState = StoreOperationState.UndoGlobalPreLocalBeginTransaction;

            using (IStoreTransactionScope ts = this.GetTransactionScope(StoreOperationTransactionScopeKind.Global))
            {
                _operationState = StoreOperationState.UndoGlobalPreLocalExecute;

                result = this.UndoGlobalPreLocalExecute(ts);

                if (result.Result == StoreResult.Success)
                {
                    ts.Success = true;

                    if (result.StoreOperations.Any())
                    {
                        this.OriginalShardVersionRemoves = result.StoreOperations.Single().OriginalShardVersionRemoves;
                        this.OriginalShardVersionAdds    = result.StoreOperations.Single().OriginalShardVersionAdds;
                        _operationState = StoreOperationState.UndoGlobalPreLocalCommitTransaction;
                    }
                }
            }

            if (result.Result != StoreResult.Success)
            {
                this.HandleUndoGlobalPreLocalExecuteError(result);
            }

            return(result.StoreOperations.Any());
        }
Example #2
0
        /// <summary>
        /// Given a state of the Do operation progress, gets the corresponding starting point
        /// for Undo operations.
        /// </summary>
        /// <param name="doState">State at which Do operation was executing.</param>
        /// <returns>Corresponding state for Undo operation.</returns>
        private static StoreOperationState UndoStateForDoState(StoreOperationState doState)
        {
            switch (doState)
            {
            case StoreOperationState.DoGlobalConnect:
            case StoreOperationState.DoLocalSourceConnect:
            case StoreOperationState.DoLocalTargetConnect:
            case StoreOperationState.DoGlobalPreLocalBeginTransaction:
            case StoreOperationState.DoGlobalPreLocalExecute:
                return(StoreOperationState.UndoEnd);

            case StoreOperationState.DoGlobalPreLocalCommitTransaction:
            case StoreOperationState.DoLocalSourceBeginTransaction:
            case StoreOperationState.DoLocalSourceExecute:
                return(StoreOperationState.UndoGlobalPostLocalBeginTransaction);

            case StoreOperationState.DoLocalSourceCommitTransaction:
            case StoreOperationState.DoLocalTargetBeginTransaction:
            case StoreOperationState.DoLocalTargetExecute:
                return(StoreOperationState.UndoLocalSourceBeginTransaction);

            case StoreOperationState.DoLocalTargetCommitTransaction:
            case StoreOperationState.DoGlobalPostLocalBeginTransaction:
            case StoreOperationState.DoGlobalPostLocalExecute:
            case StoreOperationState.DoGlobalPostLocalCommitTransaction:
                return(StoreOperationState.UndoLocalTargetBeginTransaction);

            case StoreOperationState.DoBegin:
            case StoreOperationState.DoEnd:
            default:
                Debug.Fail("Unexpected Do states for corresponding Undo operation.");
                return(StoreOperationState.UndoBegin);
            }
        }
Example #3
0
        /// <summary>
        /// Performs the final GSM operation after the LSM operations.
        /// </summary>
        /// <returns>Results of the GSM operation.</returns>
        private IStoreResults DoGlobalPostLocal()
        {
            IStoreResults result;

            _operationState = StoreOperationState.DoGlobalPostLocalBeginTransaction;

            using (IStoreTransactionScope ts = this.GetTransactionScope(StoreOperationTransactionScopeKind.Global))
            {
                _operationState = StoreOperationState.DoGlobalPostLocalExecute;

                result = this.DoGlobalPostLocalExecute(ts);

                if (result.Result == StoreResult.Success)
                {
                    ts.Success      = true;
                    _operationState = StoreOperationState.DoGlobalPostLocalCommitTransaction;
                }
            }

            if (result.Result != StoreResult.Success)
            {
                this.HandleDoGlobalPostLocalExecuteError(result);
            }
            else
            {
                this.DoGlobalPostLocalUpdateCache(result);
            }

            return(result);
        }
 /// <summary>
 /// Creates request to update a mapping in given shard map.
 /// </summary>
 /// <param name="operationCode">Operation code.</param>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation Id.</param>
 /// <param name="undoStartState">Undo start state.</param>
 /// <param name="root">Xml representation of the object.</param>
 /// <param name="originalShardVersionRemoves">Original shard version for removes.</param>
 /// <param name="originalShardVersionAdds">Original shard version for adds.</param>
 /// <returns>The store operation.</returns>
 public virtual IStoreOperation CreateUpdateMappingOperation(
     StoreOperationCode operationCode,
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     XElement root,
     Guid originalShardVersionRemoves,
     Guid originalShardVersionAdds)
 {
     return(new UpdateMappingOperation(
                shardMapManager,
                operationId,
                undoStartState,
                operationCode,
                StoreObjectFormatterXml.ReadIStoreShardMap(root.Element("ShardMap")),
                StoreObjectFormatterXml.ReadIStoreMapping(
                    root.Element("Steps").Element("Step").Element("Mapping"),
                    root.Element("Removes").Element("Shard")),
                StoreObjectFormatterXml.ReadIStoreMapping(
                    root.Element("Steps").Element("Step").Element("Update").Element("Mapping"),
                    root.Element("Adds").Element("Shard")),
                root.Element("PatternForKill").Value,
                StoreObjectFormatterXml.ReadLock(root.Element("Steps").Element("Step").Element("Lock")),
                originalShardVersionRemoves,
                originalShardVersionAdds));
 }
Example #5
0
        /// <summary>
        /// Performs the undo of LSM operation on the target shard.
        /// </summary>
        private void UndoLocalTarget()
        {
            if (_localConnectionTarget != null)
            {
                IStoreResults result;

                _operationState = StoreOperationState.UndoLocalTargetBeginTransaction;

                using (IStoreTransactionScope ts = this.GetTransactionScope(StoreOperationTransactionScopeKind.LocalTarget))
                {
                    _operationState = StoreOperationState.UndoLocalTargetExecute;

                    result = this.UndoLocalTargetExecute(ts);

                    if (result.Result == StoreResult.Success)
                    {
                        ts.Success      = true;
                        _operationState = StoreOperationState.UndoLocalTargetCommitTransaction;
                    }
                }

                if (result.Result != StoreResult.Success)
                {
                    this.HandleUndoLocalTargetExecuteError(result);
                }
            }
        }
 /// <summary>
 /// Creates request to attach shard to given shard map.
 /// </summary>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation id.</param>
 /// <param name="undoStartState">State from which Undo operation starts.</param>
 /// <param name="shardMap">Shard map for which to attach shard.</param>
 /// <param name="shard">Shard to attach.</param>
 internal AttachShardOperation(
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     IStoreShardMap shardMap,
     IStoreShard shard) :
     base(shardMapManager, operationId, undoStartState, StoreOperationCode.AttachShard, default(Guid), default(Guid))
 {
     _shardMap = shardMap;
     _shard    = shard;
 }
 /// <summary>
 /// Creates request to add shard to given shard map.
 /// </summary>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation id.</param>
 /// <param name="undoStartState">State from which Undo operation starts.</param>
 /// <param name="shardMap">Shard map for which to add shard.</param>
 /// <param name="shard">Shard to add.</param>
 internal AddShardOperation(
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     IStoreShardMap shardMap,
     IStoreShard shard) :
     base(shardMapManager, operationId, undoStartState, StoreOperationCode.AddShard, default(Guid), default(Guid))
 {
     _shardMap = shardMap;
     _shard = shard;
 }
 /// <summary>
 /// Creates request to remove shard from given shard map.
 /// </summary>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation Id.</param>
 /// <param name="undoStartState">Undo start state.</param>
 /// <param name="root">Xml representation of the object.</param>
 /// <returns>The store operation.</returns>
 public virtual IStoreOperation CreateRemoveShardOperation(
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     XElement root)
 {
     return(new RemoveShardOperation(
                shardMapManager,
                operationId,
                undoStartState,
                StoreObjectFormatterXml.ReadIStoreShardMap(root.Element("ShardMap")),
                StoreObjectFormatterXml.ReadIStoreShard(root.Element("Steps").Element("Step").Element("Shard"))));
 }
        /// <summary>
        /// Sets the stub of StoreOperation.OnStoreException(StoreException se, StoreOperationState state)
        /// </summary>
        public override ShardManagementException OnStoreException(StoreException se, StoreOperationState state)
        {
            Func <StoreException, StoreOperationState, ShardManagementException> func1 = this.OnStoreExceptionStoreExceptionStoreOperationState;

            if (func1 != null)
            {
                return(func1(se, state));
            }
            if (this.___callBase)
            {
                return(base.OnStoreException(se, state));
            }
            return(this.InstanceBehavior.Result <StubUpdateMappingOperation, ShardManagementException>(this, "OnStoreException"));
        }
Example #10
0
        /// <summary>
        /// Performs the undo store operation.
        /// </summary>
        public void Undo()
        {
            try
            {
                this.Manager.RetryPolicy.ExecuteAction(
                    () =>
                {
                    try
                    {
                        // Open connections & acquire the necessary app locks.
                        this.EstablishConnnections(true);

                        if (this.UndoGlobalPreLocal())
                        {
                            if (this.UndoStartState <= StoreOperationState.UndoLocalTargetBeginTransaction)
                            {
                                // Execute & commit the Local operations on target.
                                this.UndoLocalTarget();
                            }

                            if (this.UndoStartState <= StoreOperationState.UndoLocalSourceBeginTransaction)
                            {
                                // Execute & commit the Local undo operations on source.
                                this.UndoLocalSource();
                            }

                            if (this.UndoStartState <= StoreOperationState.UndoGlobalPostLocalBeginTransaction)
                            {
                                // Execute & commit the Global post-Local operations.
                                this.UndoGlobalPostLocal();
                            }
                        }

                        _operationState = StoreOperationState.UndoEnd;
                    }
                    finally
                    {
                        // Close connections & release the necessary app locks.
                        this.TeardownConnections();
                    }
                });
            }
            catch (StoreException se)
            {
                throw this.OnStoreException(se, _operationState);
            }
        }
Example #11
0
 /// <summary>
 /// Constructs an instance of StoreOperation.
 /// </summary>
 /// <param name="shardMapManager">ShardMapManager object.</param>
 /// <param name="operationId">Operation Id.</param>
 /// <param name="undoStartState">State from which Undo operation starts.</param>
 /// <param name="opCode">Operation code.</param>
 /// <param name="originalShardVersionRemoves">Original shard version for removes.</param>
 /// <param name="originalShardVersionAdds">Original shard version for adds.</param>
 protected StoreOperation(
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     StoreOperationCode opCode,
     Guid originalShardVersionRemoves,
     Guid originalShardVersionAdds
     )
 {
     this.Id             = operationId;
     this.OperationCode  = opCode;
     this.Manager        = shardMapManager;
     this.UndoStartState = undoStartState;
     _operationState     = StoreOperationState.DoBegin;
     _maxDoState         = StoreOperationState.DoBegin;
     this.OriginalShardVersionRemoves = originalShardVersionRemoves;
     this.OriginalShardVersionAdds    = originalShardVersionAdds;
 }
 /// <summary>
 /// Constructs an instance of StoreOperation.
 /// </summary>
 /// <param name="shardMapManager">ShardMapManager object.</param>
 /// <param name="operationId">Operation Id.</param>
 /// <param name="undoStartState">State from which Undo operation starts.</param>
 /// <param name="opCode">Operation code.</param>
 /// <param name="originalShardVersionRemoves">Original shard version for removes.</param>
 /// <param name="originalShardVersionAdds">Original shard version for adds.</param>
 protected StoreOperation(
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     StoreOperationCode opCode,
     Guid originalShardVersionRemoves,
     Guid originalShardVersionAdds
     )
 {
     this.Id = operationId;
     this.OperationCode = opCode;
     this.Manager = shardMapManager;
     this.UndoStartState = undoStartState;
     _operationState = StoreOperationState.DoBegin;
     _maxDoState = StoreOperationState.DoBegin;
     this.OriginalShardVersionRemoves = originalShardVersionRemoves;
     this.OriginalShardVersionAdds = originalShardVersionAdds;
 }
 /// <summary>
 /// Creates request to update shard in given shard map.
 /// </summary>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation id.</param>
 /// <param name="undoStartState">State from which Undo operation starts.</param>
 /// <param name="shardMap">Shard map for which to remove shard.</param>
 /// <param name="shardOld">Shard to update.</param>
 /// <param name="shardNew">Updated shard.</param>
 internal UpdateShardOperation(
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     IStoreShardMap shardMap,
     IStoreShard shardOld,
     IStoreShard shardNew) :
     base(
     shardMapManager,
     operationId,
     undoStartState,
     StoreOperationCode.UpdateShard,
     default(Guid),
     default(Guid))
 {
     _shardMap = shardMap;
     _shardOld = shardOld;
     _shardNew = shardNew;
 }
        /// <summary>
        /// Established connections to the target databases.
        /// </summary>
        /// <param name="undo">Is this undo operation.</param>
        private void EstablishConnnections(bool undo)
        {
            _operationState = undo ? StoreOperationState.UndoGlobalConnect : StoreOperationState.DoGlobalConnect;

            // Find the necessary information for connections.
            StoreConnectionInfo sci = this.GetStoreConnectionInfo();

            Debug.Assert(sci != null);

            // Open global & local connections and acquire application level locks for the corresponding scope.
            _globalConnection = this.Manager.StoreConnectionFactory.GetConnection(
                StoreConnectionKind.Global,
                this.Manager.Credentials.ConnectionStringShardMapManager,
                this.Manager.Credentials.SecureCredentialShardMapManager);

            _globalConnection.OpenWithLock(this.Id);

            if (sci.SourceLocation != null)
            {
                _operationState = undo ? StoreOperationState.UndoLocalSourceConnect : StoreOperationState.DoLocalSourceConnect;

                _localConnectionSource = this.Manager.StoreConnectionFactory.GetConnection(
                    StoreConnectionKind.LocalSource,
                    this.GetConnectionStringForShardLocation(sci.SourceLocation),
                    this.GetSecureCredentialForShardLocation(sci.SourceLocation));

                _localConnectionSource.OpenWithLock(this.Id);
            }

            if (sci.TargetLocation != null)
            {
                Debug.Assert(sci.SourceLocation != null);

                _operationState = undo ? StoreOperationState.UndoLocalTargetConnect : StoreOperationState.DoLocalTargetConnect;

                _localConnectionTarget = this.Manager.StoreConnectionFactory.GetConnection(
                    StoreConnectionKind.LocalTarget,
                    this.GetConnectionStringForShardLocation(sci.TargetLocation),
                    this.GetSecureCredentialForShardLocation(sci.TargetLocation));

                _localConnectionTarget.OpenWithLock(this.Id);
            }
        }
 /// <summary>
 /// Creates request to add a mapping in given shard map.
 /// </summary>
 /// <param name="operationCode">Operation code.</param>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation Id.</param>
 /// <param name="undoStartState">Undo start state.</param>
 /// <param name="root">Xml representation of the object.</param>
 /// <param name="originalShardVersionAdds">Original shard version.</param>
 /// <returns>The store operation.</returns>
 public virtual IStoreOperation CreateAddMappingOperation(
     StoreOperationCode operationCode,
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     XElement root,
     Guid originalShardVersionAdds)
 {
     return(new AddMappingOperation(
                shardMapManager,
                operationId,
                undoStartState,
                operationCode,
                StoreObjectFormatterXml.ReadIStoreShardMap(root.Element("ShardMap")),
                StoreObjectFormatterXml.ReadIStoreMapping(
                    root.Element("Steps").Element("Step").Element("Mapping"),
                    root.Element("Adds").Element("Shard")),
                originalShardVersionAdds));
 }
Example #16
0
 /// <summary>
 /// Creates request to update shard in given shard map.
 /// </summary>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation id.</param>
 /// <param name="undoStartState">State from which Undo operation starts.</param>
 /// <param name="shardMap">Shard map for which to remove shard.</param>
 /// <param name="shardOld">Shard to update.</param>
 /// <param name="shardNew">Updated shard.</param>
 internal UpdateShardOperation(
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     IStoreShardMap shardMap,
     IStoreShard shardOld,
     IStoreShard shardNew) :
     base(
         shardMapManager,
         operationId,
         undoStartState,
         StoreOperationCode.UpdateShard,
         default(Guid),
         default(Guid))
 {
     _shardMap = shardMap;
     _shardOld = shardOld;
     _shardNew = shardNew;
 }
Example #17
0
 /// <summary>
 /// Creates request to replace mappings within shard map.
 /// </summary>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation id.</param>
 /// <param name="undoStartState">State from which Undo operation starts.</param>
 /// <param name="operationCode">Store operation code.</param>
 /// <param name="shardMap">Shard map for which to update mapping.</param>
 /// <param name="mappingsSource">Original mappings.</param>
 /// <param name="mappingsTarget">Target mappings mapping.</param>
 /// <param name="originalShardVersionAdds">Original shard version on source.</param>
 internal ReplaceMappingsOperation(
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     StoreOperationCode operationCode,
     IStoreShardMap shardMap,
     Tuple <IStoreMapping, Guid>[] mappingsSource,
     Tuple <IStoreMapping, Guid>[] mappingsTarget,
     Guid originalShardVersionAdds) :
     base(
         shardMapManager,
         operationId,
         undoStartState,
         operationCode,
         originalShardVersionAdds,
         originalShardVersionAdds)
 {
     _shardMap       = shardMap;
     _mappingsSource = mappingsSource;
     _mappingsTarget = mappingsTarget;
 }
 /// <summary>
 /// Creates request to replace mappings within shard map.
 /// </summary>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation id.</param>
 /// <param name="undoStartState">State from which Undo operation starts.</param>
 /// <param name="operationCode">Store operation code.</param>
 /// <param name="shardMap">Shard map for which to update mapping.</param>
 /// <param name="mappingsSource">Original mappings.</param>
 /// <param name="mappingsTarget">Target mappings mapping.</param>
 /// <param name="originalShardVersionAdds">Original shard version on source.</param>
 internal ReplaceMappingsOperation(
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     StoreOperationCode operationCode,
     IStoreShardMap shardMap,
     Tuple<IStoreMapping, Guid>[] mappingsSource,
     Tuple<IStoreMapping, Guid>[] mappingsTarget,
     Guid originalShardVersionAdds) :
     base(
     shardMapManager,
     operationId,
     undoStartState,
     operationCode,
     originalShardVersionAdds,
     originalShardVersionAdds)
 {
     _shardMap = shardMap;
     _mappingsSource = mappingsSource;
     _mappingsTarget = mappingsTarget;
 }
Example #19
0
        /// <summary>
        /// Creates request to add shard to given shard map.
        /// </summary>
        /// <param name="shardMapManager">Shard map manager object.</param>
        /// <param name="operationId">Operation id.</param>
        /// <param name="undoStartState">State from which Undo operation starts.</param>
        /// <param name="operationCode">Store operation code.</param>
        /// <param name="shardMap">Shard map for which to update mapping.</param>
        /// <param name="mappingSource">Mapping to update.</param>
        /// <param name="mappingTarget">Updated mapping.</param>
        /// <param name="patternForKill">Pattern for kill commands.</param>
        /// <param name="lockOwnerId">Id of lock owner.</param>
        /// <param name="originalShardVersionRemoves">Original shard version for removes.</param>
        /// <param name="originalShardVersionAdds">Original shard version for adds.</param>
        /// <param name="killConnection">Whether to kill open connections.</param>
        internal UpdateMappingOperation(
            ShardMapManager shardMapManager,
            Guid operationId,
            StoreOperationState undoStartState,
            StoreOperationCode operationCode,
            IStoreShardMap shardMap,
            IStoreMapping mappingSource,
            IStoreMapping mappingTarget,
            string patternForKill,
            Guid lockOwnerId,
            Guid originalShardVersionRemoves,
            Guid originalShardVersionAdds,
            bool killConnection) :
            base(
                shardMapManager,
                operationId,
                undoStartState,
                operationCode,
                originalShardVersionRemoves,
                originalShardVersionAdds)
        {
            _shardMap      = shardMap;
            _mappingSource = mappingSource;
            _mappingTarget = mappingTarget;
            _lockOwnerId   = lockOwnerId;

            _errorCategory = (operationCode == StoreOperationCode.UpdateRangeMapping ||
                              operationCode == StoreOperationCode.UpdateRangeMappingWithOffline) ?
                             ShardManagementErrorCategory.RangeShardMap :
                             ShardManagementErrorCategory.ListShardMap;

            _updateLocation = _mappingSource.StoreShard.Id != _mappingTarget.StoreShard.Id;

            _fromOnlineToOffline = operationCode == StoreOperationCode.UpdatePointMappingWithOffline ||
                                   operationCode == StoreOperationCode.UpdateRangeMappingWithOffline;

            _patternForKill = patternForKill;

            _killConnection = killConnection;
        }
 /// <summary>
 /// Creates request to add shard to given shard map.
 /// </summary>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation id.</param>
 /// <param name="undoStartState">State from which Undo operation starts.</param>
 /// <param name="operationCode">Store operation code.</param>
 /// <param name="shardMap">Shard map for which to add mapping.</param>
 /// <param name="mapping">Mapping to add.</param>
 /// <param name="originalShardVersionAdds">Original shard version.</param>
 internal AddMappingOperation(
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     StoreOperationCode operationCode,
     IStoreShardMap shardMap,
     IStoreMapping mapping,
     Guid originalShardVersionAdds) :
     base(
     shardMapManager,
     operationId,
     undoStartState,
     operationCode,
     default(Guid),
     originalShardVersionAdds)
 {
     _shardMap = shardMap;
     _mapping = mapping;
     _errorCategory = operationCode == StoreOperationCode.AddRangeMapping ?
         ShardManagementErrorCategory.RangeShardMap :
         ShardManagementErrorCategory.ListShardMap;
 }
 /// <summary>
 /// Creates request to add shard to given shard map.
 /// </summary>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation id.</param>
 /// <param name="undoStartState">State from which Undo operation starts.</param>
 /// <param name="operationCode">Store operation code.</param>
 /// <param name="shardMap">Shard map for which to add mapping.</param>
 /// <param name="mapping">Mapping to add.</param>
 /// <param name="originalShardVersionAdds">Original shard version.</param>
 internal AddMappingOperation(
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     StoreOperationCode operationCode,
     IStoreShardMap shardMap,
     IStoreMapping mapping,
     Guid originalShardVersionAdds) :
     base(
         shardMapManager,
         operationId,
         undoStartState,
         operationCode,
         default(Guid),
         originalShardVersionAdds)
 {
     _shardMap      = shardMap;
     _mapping       = mapping;
     _errorCategory = operationCode == StoreOperationCode.AddRangeMapping ?
                      ShardManagementErrorCategory.RangeShardMap :
                      ShardManagementErrorCategory.ListShardMap;
 }
        /// <summary>
        /// Creates request to replace a set of mappings with new set in given shard map.
        /// </summary>
        /// <param name="operationCode">Operation code.</param>
        /// <param name="shardMapManager">Shard map manager object.</param>
        /// <param name="operationId">Operation Id.</param>
        /// <param name="undoStartState">Undo start state.</param>
        /// <param name="root">Xml representation of the object.</param>
        /// <param name="originalShardVersionAdds">Original shard Id of source.</param>
        /// <returns>The store operation.</returns>
        public virtual IStoreOperation CreateReplaceMappingsOperation(
            StoreOperationCode operationCode,
            ShardMapManager shardMapManager,
            Guid operationId,
            StoreOperationState undoStartState,
            XElement root,
            Guid originalShardVersionAdds)
        {
            XElement removeShard = root.Element("Removes").Element("Shard");
            XElement addShard    = root.Element("Adds").Element("Shard");

            return(new ReplaceMappingsOperation(
                       shardMapManager,
                       operationId,
                       undoStartState,
                       operationCode,
                       StoreObjectFormatterXml.ReadIStoreShardMap(root.Element("ShardMap")),
                       root.Element("Steps").Elements("Step").Where(e => e.Attribute("Kind").Value == "1").Select(
                           xe => new
            {
                Index = Int32.Parse(xe.Attribute("Id").Value),
                Mapping = StoreObjectFormatterXml.ReadIStoreMapping(xe.Element("Mapping"), removeShard),
                Lock = StoreObjectFormatterXml.ReadLock(xe.Element("Lock"))
            })
                       .OrderBy(el => el.Index)
                       .Select(el => new Tuple <IStoreMapping, Guid>(el.Mapping, el.Lock))
                       .ToArray(),
                       root.Element("Steps").Elements("Step").Where(e => e.Attribute("Kind").Value == "3").Select(
                           xe => new
            {
                Index = Int32.Parse(xe.Attribute("Id").Value),
                Mapping = StoreObjectFormatterXml.ReadIStoreMapping(xe.Element("Mapping"), addShard),
                Lock = StoreObjectFormatterXml.ReadLock(xe.Element("Lock"))
            })
                       .OrderBy(el => el.Index)
                       .Select(el => new Tuple <IStoreMapping, Guid>(el.Mapping, el.Lock))
                       .ToArray(),
                       originalShardVersionAdds));
        }
Example #23
0
        /// <summary>
        /// Performs the undo of GSM operation after LSM operations.
        /// </summary>
        private void UndoGlobalPostLocal()
        {
            IStoreResults result;

            _operationState = StoreOperationState.UndoGlobalPostLocalBeginTransaction;

            using (IStoreTransactionScope ts = this.GetTransactionScope(StoreOperationTransactionScopeKind.Global))
            {
                _operationState = StoreOperationState.UndoGlobalPostLocalExecute;

                result = this.UndoGlobalPostLocalExecute(ts);

                if (result.Result == StoreResult.Success)
                {
                    ts.Success      = true;
                    _operationState = StoreOperationState.UndoGlobalPostLocalCommitTransaction;
                }
            }

            if (result.Result != StoreResult.Success)
            {
                this.HandleUndoGlobalPostLocalExecuteError(result);
            }
        }
 /// <summary>
 /// Creates request to add shard to given shard map.
 /// </summary>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation id.</param>
 /// <param name="undoStartState">State from which Undo operation starts.</param>
 /// <param name="operationCode">Store operation code.</param>
 /// <param name="shardMap">Shard map from which to remove mapping.</param>
 /// <param name="mapping">Mapping to add.</param>
 /// <param name="lockOwnerId">Id of lock owner.</param>
 /// <param name="originalShardVersionRemoves">Original shard version.</param>
 internal RemoveMappingOperation(
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     StoreOperationCode operationCode,
     IStoreShardMap shardMap,
     IStoreMapping mapping,
     Guid lockOwnerId,
     Guid originalShardVersionRemoves) :
     base(
     shardMapManager,
     operationId,
     undoStartState,
     operationCode,
     originalShardVersionRemoves,
     default(Guid))
 {
     _shardMap = shardMap;
     _mapping = mapping;
     _lockOwnerId = lockOwnerId;
     _errorCategory = operationCode == StoreOperationCode.RemoveRangeMapping ?
         ShardManagementErrorCategory.RangeShardMap :
         ShardManagementErrorCategory.ListShardMap;
 }
Example #25
0
        /// <summary>
        /// Performs the LSM operation on the source shard.
        /// </summary>
        private void DoLocalSource()
        {
            IStoreResults result;

            _operationState = StoreOperationState.DoLocalSourceBeginTransaction;

            using (IStoreTransactionScope ts = this.GetTransactionScope(StoreOperationTransactionScopeKind.LocalSource))
            {
                _operationState = StoreOperationState.DoLocalSourceExecute;

                result = this.DoLocalSourceExecute(ts);

                if (result.Result == StoreResult.Success)
                {
                    ts.Success      = true;
                    _operationState = StoreOperationState.DoLocalSourceCommitTransaction;
                }
            }

            if (result.Result != StoreResult.Success)
            {
                this.HandleDoLocalSourceExecuteError(result);
            }
        }
 /// <summary>
 /// Creates request to add shard to given shard map.
 /// </summary>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation id.</param>
 /// <param name="undoStartState">State from which Undo operation starts.</param>
 /// <param name="operationCode">Store operation code.</param>
 /// <param name="shardMap">Shard map from which to remove mapping.</param>
 /// <param name="mapping">Mapping to add.</param>
 /// <param name="lockOwnerId">Id of lock owner.</param>
 /// <param name="originalShardVersionRemoves">Original shard version.</param>
 internal RemoveMappingOperation(
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     StoreOperationCode operationCode,
     IStoreShardMap shardMap,
     IStoreMapping mapping,
     Guid lockOwnerId,
     Guid originalShardVersionRemoves) :
     base(
         shardMapManager,
         operationId,
         undoStartState,
         operationCode,
         originalShardVersionRemoves,
         default(Guid))
 {
     _shardMap      = shardMap;
     _mapping       = mapping;
     _lockOwnerId   = lockOwnerId;
     _errorCategory = operationCode == StoreOperationCode.RemoveRangeMapping ?
                      ShardManagementErrorCategory.RangeShardMap :
                      ShardManagementErrorCategory.ListShardMap;
 }
 /// <summary>
 /// Creates request to update shard in given shard map.
 /// </summary>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation Id.</param>
 /// <param name="undoStartState">Undo start state.</param>
 /// <param name="root">Xml representation of the object.</param>
 /// <returns>The store operation.</returns>
 public virtual IStoreOperation CreateUpdateShardOperation(
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     XElement root)
 {
     return new UpdateShardOperation(
         shardMapManager,
         operationId,
         undoStartState,
         StoreObjectFormatterXml.ReadIStoreShardMap(root.Element("ShardMap")),
         StoreObjectFormatterXml.ReadIStoreShard(root.Element("Steps").Element("Step").Element("Shard")),
         StoreObjectFormatterXml.ReadIStoreShard(root.Element("Steps").Element("Step").Element("Update").Element("Shard")));
 }
        /// <summary>
        /// Creates request to replace a set of mappings with new set in given shard map.
        /// </summary>
        /// <param name="operationCode">Operation code.</param>
        /// <param name="shardMapManager">Shard map manager object.</param>
        /// <param name="operationId">Operation Id.</param>
        /// <param name="undoStartState">Undo start state.</param>
        /// <param name="root">Xml representation of the object.</param>
        /// <param name="originalShardVersionAdds">Original shard Id of source.</param>
        /// <returns>The store operation.</returns>
        public virtual IStoreOperation CreateReplaceMappingsOperation(
            StoreOperationCode operationCode,
            ShardMapManager shardMapManager,
            Guid operationId,
            StoreOperationState undoStartState,
            XElement root,
            Guid originalShardVersionAdds)
        {
            XElement removeShard = root.Element("Removes").Element("Shard");
            XElement addShard = root.Element("Adds").Element("Shard");

            return new ReplaceMappingsOperation(
                shardMapManager,
                operationId,
                undoStartState,
                operationCode,
                StoreObjectFormatterXml.ReadIStoreShardMap(root.Element("ShardMap")),
                root.Element("Steps").Elements("Step").Where(e => e.Attribute("Kind").Value == "1").Select(
                     xe => new
                     {
                         Index = Int32.Parse(xe.Attribute("Id").Value),
                         Mapping = StoreObjectFormatterXml.ReadIStoreMapping(xe.Element("Mapping"), removeShard),
                         Lock = StoreObjectFormatterXml.ReadLock(xe.Element("Lock"))
                     })
                .OrderBy(el => el.Index)
                .Select(el => new Tuple<IStoreMapping, Guid>(el.Mapping, el.Lock))
                .ToArray(),
                root.Element("Steps").Elements("Step").Where(e => e.Attribute("Kind").Value == "3").Select(
                    xe => new
                    {
                        Index = Int32.Parse(xe.Attribute("Id").Value),
                        Mapping = StoreObjectFormatterXml.ReadIStoreMapping(xe.Element("Mapping"), addShard),
                        Lock = StoreObjectFormatterXml.ReadLock(xe.Element("Lock"))
                    })
                .OrderBy(el => el.Index)
                .Select(el => new Tuple<IStoreMapping, Guid>(el.Mapping, el.Lock))
                .ToArray(),
                originalShardVersionAdds);
        }
 /// <summary>
 /// Find operation log entry by Id from GSM.
 /// </summary>
 /// <param name="operationId">Operation Id.</param>
 /// <param name="undoStartState">Minimum start from which to start undo operation.</param>
 /// <returns>Xml formatted request.</returns>
 internal static XElement FindAndUpdateOperationLogEntryByIdGlobal(Guid operationId, StoreOperationState undoStartState)
 {
     return new XElement(
         @"FindAndUpdateOperationLogEntryByIdGlobal",
         StoreOperationRequestBuilder.s_gsmVersion,
         StoreOperationRequestBuilder.OperationId(operationId),
         StoreOperationRequestBuilder.UndoStartState(undoStartState));
 }
        /// <summary>
        /// Performs the undo of LSM operation on the target shard.
        /// </summary>
        private void UndoLocalTarget()
        {
            if (_localConnectionTarget != null)
            {
                IStoreResults result;

                _operationState = StoreOperationState.UndoLocalTargetBeginTransaction;

                using (IStoreTransactionScope ts = this.GetTransactionScope(StoreOperationTransactionScopeKind.LocalTarget))
                {
                    _operationState = StoreOperationState.UndoLocalTargetExecute;

                    result = this.UndoLocalTargetExecute(ts);

                    if (result.Result == StoreResult.Success)
                    {
                        ts.Success = true;
                        _operationState = StoreOperationState.UndoLocalTargetCommitTransaction;
                    }
                }

                if (result.Result != StoreResult.Success)
                {
                    this.HandleUndoLocalTargetExecuteError(result);
                }
            }
        }
 /// <summary>
 /// Sets the stub of StoreOperation.OnStoreException(StoreException se, StoreOperationState state)
 /// </summary>
 public override ShardManagementException OnStoreException(StoreException se, StoreOperationState state)
 {
     Func<StoreException, StoreOperationState, ShardManagementException> func1 = this.OnStoreExceptionStoreExceptionStoreOperationState;
     if (func1 != null)
         return func1(se, state);
     if (this.___callBase)
         return base.OnStoreException(se, state);
     return this.InstanceBehavior.Result<StubReplaceMappingsOperation, ShardManagementException>(this, "OnStoreException");
 }
Example #32
0
        /// <summary>
        /// Performs the store operation.
        /// </summary>
        /// <returns>Results of the operation.</returns>
        public IStoreResults Do()
        {
            IStoreResults result;

            try
            {
                do
                {
                    result = this.Manager.RetryPolicy.ExecuteAction(() =>
                    {
                        IStoreResults r;

                        try
                        {
                            // Open connections & acquire the necessary app locks.
                            this.EstablishConnnections(false);

                            // Execute & commit the Global pre-Local operations.
                            r = this.DoGlobalPreLocal();

                            // If pending operation, we need to release the locks.
                            if (!r.StoreOperations.Any())
                            {
                                // Execute & commit the Local operations on source.
                                this.DoLocalSource();

                                // Execute & commit the Local operations on target.
                                this.DoLocalTarget();

                                // Execute & commit the Global post-Local operations.
                                r = this.DoGlobalPostLocal();

                                Debug.Assert(r != null);

                                _operationState = StoreOperationState.DoEnd;
                            }
                        }
                        finally
                        {
                            // Figure out the maximum of the progress made yet during Do operation.
                            if (_maxDoState < _operationState)
                            {
                                _maxDoState = _operationState;
                            }

                            // Close connections & release the necessary app locks.
                            this.TeardownConnections();
                        }

                        return(r);
                    });

                    // If pending operation, deserialize the pending operation and perform Undo.
                    if (result.StoreOperations.Any())
                    {
                        Debug.Assert(result.StoreOperations.Count() == 1);

                        using (IStoreOperation op = this.Manager.StoreOperationFactory.FromLogEntry(this.Manager, result.StoreOperations.Single()))
                        {
                            op.Undo();
                        }
                    }
                }while (result.StoreOperations.Any());
            }
            catch (StoreException se)
            {
                // If store exception was thrown, we will attempt to undo the current operation.
                this.AttemptUndo();

                throw this.OnStoreException(se, _operationState);
            }
            catch (ShardManagementException)
            {
                // If shard map manager exception was thrown, we will attempt to undo the operation.
                this.AttemptUndo();

                throw;
            }

            Debug.Assert(result != null);
            return(result);
        }
 public virtual ShardManagementException OnStoreException(StoreException se, StoreOperationState state)
 {
     return this.inner.OnStoreException(se, state);
 }
        /// <summary>
        /// Performs the undo of GSM operation after LSM operations.
        /// </summary>
        private void UndoGlobalPostLocal()
        {
            IStoreResults result;

            _operationState = StoreOperationState.UndoGlobalPostLocalBeginTransaction;

            using (IStoreTransactionScope ts = this.GetTransactionScope(StoreOperationTransactionScopeKind.Global))
            {
                _operationState = StoreOperationState.UndoGlobalPostLocalExecute;

                result = this.UndoGlobalPostLocalExecute(ts);

                if (result.Result == StoreResult.Success)
                {
                    ts.Success = true;
                    _operationState = StoreOperationState.UndoGlobalPostLocalCommitTransaction;
                }
            }

            if (result.Result != StoreResult.Success)
            {
                this.HandleUndoGlobalPostLocalExecuteError(result);
            }
        }
        /// <summary>
        /// Performs the LSM operation on the source shard.
        /// </summary>
        private void DoLocalSource()
        {
            IStoreResults result;

            _operationState = StoreOperationState.DoLocalSourceBeginTransaction;

            using (IStoreTransactionScope ts = this.GetTransactionScope(StoreOperationTransactionScopeKind.LocalSource))
            {
                _operationState = StoreOperationState.DoLocalSourceExecute;

                result = this.DoLocalSourceExecute(ts);

                if (result.Result == StoreResult.Success)
                {
                    ts.Success = true;
                    _operationState = StoreOperationState.DoLocalSourceCommitTransaction;
                }
            }

            if (result.Result != StoreResult.Success)
            {
                this.HandleDoLocalSourceExecuteError(result);
            }
        }
        /// <summary>
        /// Performs the store operation.
        /// </summary>
        /// <returns>Results of the operation.</returns>
        public IStoreResults Do()
        {
            IStoreResults result;

            try
            {
                do
                {
                    result = this.Manager.RetryPolicy.ExecuteAction(() =>
                    {
                        IStoreResults r;

                        try
                        {
                            // Open connections & acquire the necessary app locks.
                            this.EstablishConnnections(false);

                            // Execute & commit the Global pre-Local operations.
                            r = this.DoGlobalPreLocal();

                            // If pending operation, we need to release the locks.
                            if (!r.StoreOperations.Any())
                            {
                                // Execute & commit the Local operations on source.
                                this.DoLocalSource();

                                // Execute & commit the Local operations on target.
                                this.DoLocalTarget();

                                // Execute & commit the Global post-Local operations.
                                r = this.DoGlobalPostLocal();

                                Debug.Assert(r != null);

                                _operationState = StoreOperationState.DoEnd;
                            }
                        }
                        finally
                        {
                            // Figure out the maximum of the progress made yet during Do operation.
                            if (_maxDoState < _operationState)
                            {
                                _maxDoState = _operationState;
                            }

                            // Close connections & release the necessary app locks.
                            this.TeardownConnections();
                        }

                        return r;
                    });

                    // If pending operation, deserialize the pending operation and perform Undo.
                    if (result.StoreOperations.Any())
                    {
                        Debug.Assert(result.StoreOperations.Count() == 1);

                        using (IStoreOperation op = this.Manager.StoreOperationFactory.FromLogEntry(this.Manager, result.StoreOperations.Single()))
                        {
                            op.Undo();
                        }
                    }
                }
                while (result.StoreOperations.Any());
            }
            catch (StoreException se)
            {
                // If store exception was thrown, we will attempt to undo the current operation.
                this.AttemptUndo();

                throw this.OnStoreException(se, _operationState);
            }
            catch (ShardManagementException)
            {
                // If shard map manager exception was thrown, we will attempt to undo the operation. 
                this.AttemptUndo();

                throw;
            }

            Debug.Assert(result != null);
            return result;
        }
Example #37
0
        /// <summary>
        /// Returns the ShardManagementException to be thrown corresponding to a StoreException.
        /// </summary>
        /// <param name="se">Store Exception that has been raised.</param>
        /// <param name="state">SQL operation state.</param>
        /// <returns>ShardManagementException to be thrown.</returns>
        public virtual ShardManagementException OnStoreException(StoreException se, StoreOperationState state)
        {
            switch (state)
            {
            case StoreOperationState.DoGlobalConnect:

            case StoreOperationState.DoGlobalPreLocalBeginTransaction:
            case StoreOperationState.DoGlobalPreLocalExecute:
            case StoreOperationState.DoGlobalPreLocalCommitTransaction:

            case StoreOperationState.DoGlobalPostLocalBeginTransaction:
            case StoreOperationState.DoGlobalPostLocalExecute:
            case StoreOperationState.DoGlobalPostLocalCommitTransaction:

            case StoreOperationState.UndoGlobalConnect:

            case StoreOperationState.UndoGlobalPreLocalBeginTransaction:
            case StoreOperationState.UndoGlobalPreLocalExecute:
            case StoreOperationState.UndoGlobalPreLocalCommitTransaction:

            case StoreOperationState.UndoGlobalPostLocalBeginTransaction:
            case StoreOperationState.UndoGlobalPostLocalExecute:
            case StoreOperationState.UndoGlobalPostLocalCommitTransaction:
                return(ExceptionUtils.GetStoreExceptionGlobal(
                           this.ErrorCategory,
                           se,
                           this.OperationName));

            case StoreOperationState.DoLocalSourceConnect:
            case StoreOperationState.DoLocalSourceBeginTransaction:
            case StoreOperationState.DoLocalSourceExecute:
            case StoreOperationState.DoLocalSourceCommitTransaction:

            case StoreOperationState.UndoLocalSourceConnect:
            case StoreOperationState.UndoLocalSourceBeginTransaction:
            case StoreOperationState.UndoLocalSourceExecute:
            case StoreOperationState.UndoLocalSourceCommitTransaction:
                return(ExceptionUtils.GetStoreExceptionLocal(
                           this.ErrorCategory,
                           se,
                           this.OperationName,
                           this.ErrorSourceLocation));

            case StoreOperationState.DoLocalTargetConnect:
            case StoreOperationState.DoLocalTargetBeginTransaction:
            case StoreOperationState.DoLocalTargetExecute:
            case StoreOperationState.DoLocalTargetCommitTransaction:

            case StoreOperationState.UndoLocalTargetConnect:
            case StoreOperationState.UndoLocalTargetBeginTransaction:
            case StoreOperationState.UndoLocalTargetExecute:
            case StoreOperationState.UndoLocalTargetCommitTransaction:

            default:
                return(ExceptionUtils.GetStoreExceptionLocal(
                           this.ErrorCategory,
                           se,
                           this.OperationName,
                           this.ErrorTargetLocation));
            }
        }
 /// <summary>
 /// Creates request to add a mapping in given shard map.
 /// </summary>
 /// <param name="operationCode">Operation code.</param>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation Id.</param>
 /// <param name="undoStartState">Undo start state.</param>
 /// <param name="root">Xml representation of the object.</param>
 /// <param name="originalShardVersionAdds">Original shard version.</param>
 /// <returns>The store operation.</returns>
 public virtual IStoreOperation CreateAddMappingOperation(
     StoreOperationCode operationCode,
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     XElement root,
     Guid originalShardVersionAdds)
 {
     return new AddMappingOperation(
         shardMapManager,
         operationId,
         undoStartState,
         operationCode,
         StoreObjectFormatterXml.ReadIStoreShardMap(root.Element("ShardMap")),
         StoreObjectFormatterXml.ReadIStoreMapping(
             root.Element("Steps").Element("Step").Element("Mapping"),
             root.Element("Adds").Element("Shard")),
         originalShardVersionAdds);
 }
 /// <summary>
 /// Creates request to update a mapping in given shard map.
 /// </summary>
 /// <param name="operationCode">Operation code.</param>
 /// <param name="shardMapManager">Shard map manager object.</param>
 /// <param name="operationId">Operation Id.</param>
 /// <param name="undoStartState">Undo start state.</param>
 /// <param name="root">Xml representation of the object.</param>
 /// <param name="originalShardVersionRemoves">Original shard version for removes.</param>
 /// <param name="originalShardVersionAdds">Original shard version for adds.</param>
 /// <returns>The store operation.</returns>
 public virtual IStoreOperation CreateUpdateMappingOperation(
     StoreOperationCode operationCode,
     ShardMapManager shardMapManager,
     Guid operationId,
     StoreOperationState undoStartState,
     XElement root,
     Guid originalShardVersionRemoves,
     Guid originalShardVersionAdds)
 {
     return new UpdateMappingOperation(
         shardMapManager,
         operationId,
         undoStartState,
         operationCode,
         StoreObjectFormatterXml.ReadIStoreShardMap(root.Element("ShardMap")),
         StoreObjectFormatterXml.ReadIStoreMapping(
             root.Element("Steps").Element("Step").Element("Mapping"),
             root.Element("Removes").Element("Shard")),
         StoreObjectFormatterXml.ReadIStoreMapping(
             root.Element("Steps").Element("Step").Element("Update").Element("Mapping"),
             root.Element("Adds").Element("Shard")),
         root.Element("PatternForKill").Value,
         StoreObjectFormatterXml.ReadLock(root.Element("Steps").Element("Step").Element("Lock")),
         originalShardVersionRemoves,
         originalShardVersionAdds);
 }
 public override IStoreOperation CreateUpdateMappingOperation(StoreOperationCode operationCode, ShardMapManager shardMapManager, Guid operationId, StoreOperationState undoStartState, XElement root, Guid originalShardVersionRemoves, Guid originalShardVersionAdds)
 {
     Func<StoreOperationCode, ShardMapManager, Guid, StoreOperationState, XElement, Guid, Guid, IStoreOperation> func1 = this.CreateUpdateMappingOperationStoreOperationCodeShardMapManagerGuidStoreOperationStateXElementGuidGuid;
     if (func1 != null)
         return func1(operationCode, shardMapManager, operationId, undoStartState, root, originalShardVersionRemoves, originalShardVersionAdds);
     if (this.___callBase)
         return base.CreateUpdateMappingOperation(operationCode, shardMapManager, operationId, undoStartState, root, originalShardVersionRemoves, originalShardVersionAdds);
     return this.InstanceBehavior.Result<StubStoreOperationFactory, IStoreOperation>(this, "CreateUpdateMappingOperation");
 }
        /// <summary>
        /// Established connections to the target databases.
        /// </summary>
        /// <param name="undo">Is this undo operation.</param>
        private void EstablishConnnections(bool undo)
        {
            _operationState = undo ? StoreOperationState.UndoGlobalConnect : StoreOperationState.DoGlobalConnect;

            // Find the necessary information for connections.
            StoreConnectionInfo sci = this.GetStoreConnectionInfo();

            Debug.Assert(sci != null);

            // Open global & local connections and acquire application level locks for the corresponding scope.
            _globalConnection = this.Manager.StoreConnectionFactory.GetConnection(
                StoreConnectionKind.Global,
                this.Manager.Credentials.ConnectionStringShardMapManager);

            _globalConnection.OpenWithLock(this.Id);

            if (sci.SourceLocation != null)
            {
                _operationState = undo ? StoreOperationState.UndoLocalSourceConnect : StoreOperationState.DoLocalSourceConnect;

                _localConnectionSource = this.Manager.StoreConnectionFactory.GetConnection(
                    StoreConnectionKind.LocalSource,
                    this.GetConnectionStringForShardLocation(sci.SourceLocation));

                _localConnectionSource.OpenWithLock(this.Id);
            }

            if (sci.TargetLocation != null)
            {
                Debug.Assert(sci.SourceLocation != null);

                _operationState = undo ? StoreOperationState.UndoLocalTargetConnect : StoreOperationState.DoLocalTargetConnect;

                _localConnectionTarget = this.Manager.StoreConnectionFactory.GetConnection(
                    StoreConnectionKind.LocalTarget,
                    this.GetConnectionStringForShardLocation(sci.TargetLocation));

                _localConnectionTarget.OpenWithLock(this.Id);
            }
        }
        /// <summary>
        /// Performs the final GSM operation after the LSM operations.
        /// </summary>
        /// <returns>Results of the GSM operation.</returns>
        private IStoreResults DoGlobalPostLocal()
        {
            IStoreResults result;

            _operationState = StoreOperationState.DoGlobalPostLocalBeginTransaction;

            using (IStoreTransactionScope ts = this.GetTransactionScope(StoreOperationTransactionScopeKind.Global))
            {
                _operationState = StoreOperationState.DoGlobalPostLocalExecute;

                result = this.DoGlobalPostLocalExecute(ts);

                if (result.Result == StoreResult.Success)
                {
                    ts.Success = true;
                    _operationState = StoreOperationState.DoGlobalPostLocalCommitTransaction;
                }
            }

            if (result.Result != StoreResult.Success)
            {
                this.HandleDoGlobalPostLocalExecuteError(result);
            }
            else
            {
                this.DoGlobalPostLocalUpdateCache(result);
            }

            return result;
        }
        /// <summary>
        /// Given a state of the Do operation progress, gets the corresponding starting point
        /// for Undo operations.
        /// </summary>
        /// <param name="doState">State at which Do operation was executing.</param>
        /// <returns>Corresponding state for Undo operation.</returns>
        private static StoreOperationState UndoStateForDoState(StoreOperationState doState)
        {
            switch (doState)
            {
                case StoreOperationState.DoGlobalConnect:
                case StoreOperationState.DoLocalSourceConnect:
                case StoreOperationState.DoLocalTargetConnect:
                case StoreOperationState.DoGlobalPreLocalBeginTransaction:
                case StoreOperationState.DoGlobalPreLocalExecute:
                    return StoreOperationState.UndoEnd;

                case StoreOperationState.DoGlobalPreLocalCommitTransaction:
                case StoreOperationState.DoLocalSourceBeginTransaction:
                case StoreOperationState.DoLocalSourceExecute:
                    return StoreOperationState.UndoGlobalPostLocalBeginTransaction;

                case StoreOperationState.DoLocalSourceCommitTransaction:
                case StoreOperationState.DoLocalTargetBeginTransaction:
                case StoreOperationState.DoLocalTargetExecute:
                    return StoreOperationState.UndoLocalSourceBeginTransaction;

                case StoreOperationState.DoLocalTargetCommitTransaction:
                case StoreOperationState.DoGlobalPostLocalBeginTransaction:
                case StoreOperationState.DoGlobalPostLocalExecute:
                case StoreOperationState.DoGlobalPostLocalCommitTransaction:
                    return StoreOperationState.UndoLocalTargetBeginTransaction;

                case StoreOperationState.DoBegin:
                case StoreOperationState.DoEnd:
                default:
                    Debug.Fail("Unexpected Do states for corresponding Undo operation.");
                    return StoreOperationState.UndoBegin;
            }
        }
        /// <summary>
        /// Performs the undo store operation.
        /// </summary>
        public void Undo()
        {
            try
            {
                this.Manager.RetryPolicy.ExecuteAction(
                () =>
                {
                    try
                    {
                        // Open connections & acquire the necessary app locks.
                        this.EstablishConnnections(true);

                        if (this.UndoGlobalPreLocal())
                        {
                            if (this.UndoStartState <= StoreOperationState.UndoLocalTargetBeginTransaction)
                            {
                                // Execute & commit the Local operations on target.
                                this.UndoLocalTarget();
                            }

                            if (this.UndoStartState <= StoreOperationState.UndoLocalSourceBeginTransaction)
                            {
                                // Execute & commit the Local undo operations on source.
                                this.UndoLocalSource();
                            }

                            if (this.UndoStartState <= StoreOperationState.UndoGlobalPostLocalBeginTransaction)
                            {
                                // Execute & commit the Global post-Local operations.
                                this.UndoGlobalPostLocal();
                            }
                        }

                        _operationState = StoreOperationState.UndoEnd;
                    }
                    finally
                    {
                        // Close connections & release the necessary app locks.
                        this.TeardownConnections();
                    }
                });
            }
            catch (StoreException se)
            {
                throw this.OnStoreException(se, _operationState);
            }
        }
        /// <summary>
        /// Creates request to add shard to given shard map.
        /// </summary>
        /// <param name="shardMapManager">Shard map manager object.</param>
        /// <param name="operationId">Operation id.</param>
        /// <param name="undoStartState">State from which Undo operation starts.</param>
        /// <param name="operationCode">Store operation code.</param>
        /// <param name="shardMap">Shard map for which to update mapping.</param>
        /// <param name="mappingSource">Mapping to update.</param>
        /// <param name="mappingTarget">Updated mapping.</param>
        /// <param name="patternForKill">Pattern for kill commands.</param>
        /// <param name="lockOwnerId">Id of lock owner.</param>
        /// <param name="originalShardVersionRemoves">Original shard version for removes.</param>
        /// <param name="originalShardVersionAdds">Original shard version for adds.</param>
        internal UpdateMappingOperation(
            ShardMapManager shardMapManager,
            Guid operationId,
            StoreOperationState undoStartState,
            StoreOperationCode operationCode,
            IStoreShardMap shardMap,
            IStoreMapping mappingSource,
            IStoreMapping mappingTarget,
            string patternForKill,
            Guid lockOwnerId,
            Guid originalShardVersionRemoves,
            Guid originalShardVersionAdds) :
            base(
            shardMapManager,
            operationId,
            undoStartState,
            operationCode,
            originalShardVersionRemoves,
            originalShardVersionAdds)
        {
            _shardMap = shardMap;
            _mappingSource = mappingSource;
            _mappingTarget = mappingTarget;
            _lockOwnerId = lockOwnerId;

            _errorCategory = (operationCode == StoreOperationCode.UpdateRangeMapping ||
                                  operationCode == StoreOperationCode.UpdateRangeMappingWithOffline) ?
                ShardManagementErrorCategory.RangeShardMap :
                ShardManagementErrorCategory.ListShardMap;

            _updateLocation = _mappingSource.StoreShard.Id != _mappingTarget.StoreShard.Id;

            _fromOnlineToOffline = operationCode == StoreOperationCode.UpdatePointMappingWithOffline ||
                                       operationCode == StoreOperationCode.UpdateRangeMappingWithOffline;

            _patternForKill = patternForKill;
        }
 /// <summary>
 /// Adds UndoStartState attribute.
 /// </summary>
 /// <param name="undoStartState">Number of remove steps.</param>
 /// <returns>XAttribute for the removeStepsCount.</returns>
 private static XAttribute UndoStartState(StoreOperationState undoStartState)
 {
     return new XAttribute("UndoStartState", (int)undoStartState);
 }
Example #47
0
 public virtual ShardManagementException OnStoreException(StoreException se, StoreOperationState state)
 {
     return(this.inner.OnStoreException(se, state));
 }
        /// <summary>
        /// Perform undo of GSM operations before LSM operations. Basically checks if the operation
        /// to be undone is still present in the log.
        /// </summary>
        /// <returns>
        /// <c>true</c> if further undo operations are necessary, <c>false</c> otherwise.
        /// </returns>
        private bool UndoGlobalPreLocal()
        {
            IStoreResults result;

            _operationState = StoreOperationState.UndoGlobalPreLocalBeginTransaction;

            using (IStoreTransactionScope ts = this.GetTransactionScope(StoreOperationTransactionScopeKind.Global))
            {
                _operationState = StoreOperationState.UndoGlobalPreLocalExecute;

                result = this.UndoGlobalPreLocalExecute(ts);

                if (result.Result == StoreResult.Success)
                {
                    ts.Success = true;

                    if (result.StoreOperations.Any())
                    {
                        this.OriginalShardVersionRemoves = result.StoreOperations.Single().OriginalShardVersionRemoves;
                        this.OriginalShardVersionAdds = result.StoreOperations.Single().OriginalShardVersionAdds;
                        _operationState = StoreOperationState.UndoGlobalPreLocalCommitTransaction;
                    }
                }
            }

            if (result.Result != StoreResult.Success)
            {
                this.HandleUndoGlobalPreLocalExecuteError(result);
            }

            return result.StoreOperations.Any();
        }
 public override IStoreOperation CreateUpdateShardOperation(ShardMapManager shardMapManager, Guid operationId, StoreOperationState undoStartState, XElement root)
 {
     Func<ShardMapManager, Guid, StoreOperationState, XElement, IStoreOperation> func1 = this.CreateUpdateShardOperationShardMapManagerGuidStoreOperationStateXElement;
     if (func1 != null)
         return func1(shardMapManager, operationId, undoStartState, root);
     if (this.___callBase)
         return base.CreateUpdateShardOperation(shardMapManager, operationId, undoStartState, root);
     return this.InstanceBehavior.Result<StubStoreOperationFactory, IStoreOperation>(this, "CreateUpdateShardOperation");
 }
        /// <summary>
        /// Returns the ShardManagementException to be thrown corresponding to a StoreException.
        /// </summary>
        /// <param name="se">Store Exception that has been raised.</param>
        /// <param name="state">SQL operation state.</param>
        /// <returns>ShardManagementException to be thrown.</returns>
        public virtual ShardManagementException OnStoreException(StoreException se, StoreOperationState state)
        {
            switch (state)
            {
                case StoreOperationState.DoGlobalConnect:

                case StoreOperationState.DoGlobalPreLocalBeginTransaction:
                case StoreOperationState.DoGlobalPreLocalExecute:
                case StoreOperationState.DoGlobalPreLocalCommitTransaction:

                case StoreOperationState.DoGlobalPostLocalBeginTransaction:
                case StoreOperationState.DoGlobalPostLocalExecute:
                case StoreOperationState.DoGlobalPostLocalCommitTransaction:

                case StoreOperationState.UndoGlobalConnect:

                case StoreOperationState.UndoGlobalPreLocalBeginTransaction:
                case StoreOperationState.UndoGlobalPreLocalExecute:
                case StoreOperationState.UndoGlobalPreLocalCommitTransaction:

                case StoreOperationState.UndoGlobalPostLocalBeginTransaction:
                case StoreOperationState.UndoGlobalPostLocalExecute:
                case StoreOperationState.UndoGlobalPostLocalCommitTransaction:
                    return ExceptionUtils.GetStoreExceptionGlobal(
                        this.ErrorCategory,
                        se,
                        this.OperationName);

                case StoreOperationState.DoLocalSourceConnect:
                case StoreOperationState.DoLocalSourceBeginTransaction:
                case StoreOperationState.DoLocalSourceExecute:
                case StoreOperationState.DoLocalSourceCommitTransaction:

                case StoreOperationState.UndoLocalSourceConnect:
                case StoreOperationState.UndoLocalSourceBeginTransaction:
                case StoreOperationState.UndoLocalSourceExecute:
                case StoreOperationState.UndoLocalSourceCommitTransaction:
                    return ExceptionUtils.GetStoreExceptionLocal(
                        this.ErrorCategory,
                        se,
                        this.OperationName,
                        this.ErrorSourceLocation);

                case StoreOperationState.DoLocalTargetConnect:
                case StoreOperationState.DoLocalTargetBeginTransaction:
                case StoreOperationState.DoLocalTargetExecute:
                case StoreOperationState.DoLocalTargetCommitTransaction:

                case StoreOperationState.UndoLocalTargetConnect:
                case StoreOperationState.UndoLocalTargetBeginTransaction:
                case StoreOperationState.UndoLocalTargetExecute:
                case StoreOperationState.UndoLocalTargetCommitTransaction:

                default:
                    return ExceptionUtils.GetStoreExceptionLocal(
                        this.ErrorCategory,
                        se,
                        this.OperationName,
                        this.ErrorTargetLocation);
            }
        }