/// <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()); }
/// <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 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)); }
/// <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")); }
/// <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> /// 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)); }
/// <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; }
/// <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 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> /// 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; }
/// <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 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> /// 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"); }
/// <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 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; }
/// <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> /// 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); }
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); } }