/// <summary> /// Execute the operation against LSM in the current transaction scope. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns> /// Results of the operation. /// </returns> public override IStoreResults DoLocalExecute(IStoreTransactionScope ts) { TraceHelper.Tracer.TraceInfo( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Started upgrading Local Shard Map structures at location {0}", base.Location); Stopwatch stopwatch = Stopwatch.StartNew(); IStoreResults checkResult = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsLocalScript.Single()); if (checkResult.StoreVersion == null) { // DEVNOTE(apurvs): do we want to throw here if LSM is not already deployed? // deploy initial version of LSM, if not found. ts.ExecuteCommandBatch(SqlUtils.CreateLocalScript); } if (checkResult.StoreVersion == null || checkResult.StoreVersion.Version < _targetVersion) { if (checkResult.StoreVersion == null) ts.ExecuteCommandBatch(SqlUtils.FilterUpgradeCommands(SqlUtils.UpgradeLocalScript, _targetVersion)); else ts.ExecuteCommandBatch(SqlUtils.FilterUpgradeCommands(SqlUtils.UpgradeLocalScript, _targetVersion, checkResult.StoreVersion.Version)); // Read LSM version again after upgrade. checkResult = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsLocalScript.Single()); stopwatch.Stop(); TraceHelper.Tracer.TraceInfo( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Finished upgrading store at location {0}. Duration: {1}", base.Location, stopwatch.Elapsed); } else { TraceHelper.Tracer.TraceInfo( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Local Shard Map at location {0} has version {1} equal to or higher than Client library version {2}, skipping upgrade.", base.Location, checkResult.StoreVersion, GlobalConstants.GsmVersionClient); } return checkResult; }
internal static IEnumerable <IStoreLogEntry> GetPendingStoreOperations() { IStoreResults result; using (IStoreConnection conn = new SqlStoreConnectionFactory().GetConnection( StoreConnectionKind.Global, new SqlConnectionInfo( Globals.ShardMapManagerConnectionString, null))) { conn.Open(); using (IStoreTransactionScope ts = conn.GetTransactionScope(StoreTransactionScopeKind.ReadOnly)) { result = ts.ExecuteCommandSingle( new StringBuilder( @"select 6, OperationId, OperationCode, Data, UndoStartState, ShardVersionRemoves, ShardVersionAdds from __ShardManagement.OperationsLogGlobal" )); } } return(result.StoreOperations); }
/// <summary> /// Execute the operation against GSM in the current transaction scope. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns> /// Results of the operation. /// </returns> public override IStoreResults DoGlobalExecute(IStoreTransactionScope ts) { TraceHelper.Tracer.TraceInfo( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Started upgrading Global Shard Map structures."); IStoreResults checkResult = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsGlobalScript.Single()); Debug.Assert(checkResult.StoreVersion != null, "GSM store structures not found."); if (checkResult.StoreVersion.Version < _targetVersion) { Stopwatch stopwatch = Stopwatch.StartNew(); ts.ExecuteCommandBatch(SqlUtils.FilterUpgradeCommands(SqlUtils.UpgradeGlobalScript, _targetVersion, checkResult.StoreVersion.Version)); // read GSM version after upgrade. checkResult = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsGlobalScript.Single()); // DEVNOTE(apurvs): verify (checkResult.StoreVersion == GlobalConstants.GsmVersionClient) and throw on failure. stopwatch.Stop(); TraceHelper.Tracer.TraceInfo( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Finished upgrading Global Shard Map. Duration: {0}", stopwatch.Elapsed); } else { TraceHelper.Tracer.TraceInfo( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Global Shard Map is at a version {0} equal to or higher than Client library version {1}, skipping upgrade.", (checkResult.StoreVersion == null) ? "" : checkResult.StoreVersion.Version.ToString(), GlobalConstants.GsmVersionClient); } return(checkResult); }
/// <summary> /// Execute the operation against GSM in the current transaction scope. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns> /// Results of the operation. /// </returns> public override IStoreResults DoGlobalExecute(IStoreTransactionScope ts) { TraceHelper.Tracer.TraceInfo( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Started upgrading Global Shard Map structures."); IStoreResults checkResult = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsGlobalScript.Single()); Debug.Assert(checkResult.StoreVersion != null, "GSM store structures not found."); if (checkResult.StoreVersion.Version < _targetVersion) { Stopwatch stopwatch = Stopwatch.StartNew(); ts.ExecuteCommandBatch(SqlUtils.FilterUpgradeCommands(SqlUtils.UpgradeGlobalScript, _targetVersion, checkResult.StoreVersion.Version)); // read GSM version after upgrade. checkResult = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsGlobalScript.Single()); // DEVNOTE(apurvs): verify (checkResult.StoreVersion == GlobalConstants.GsmVersionClient) and throw on failure. stopwatch.Stop(); TraceHelper.Tracer.TraceInfo( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Finished upgrading Global Shard Map. Duration: {0}", stopwatch.Elapsed); } else { TraceHelper.Tracer.TraceInfo( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Global Shard Map is at a version {0} equal to or higher than Client library version {1}, skipping upgrade.", (checkResult.StoreVersion == null) ? "" : checkResult.StoreVersion.Version.ToString(), GlobalConstants.GsmVersionClient); } return checkResult; }
/// <summary> /// Performs the LSM operation on the source shard. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns>Result of the operation.</returns> public override IStoreResults DoLocalSourceExecute(IStoreTransactionScope ts) { // There should already be some version of LSM at this location as RecoveryMAnager.AttachShard() first reads existing shard maps from this location. IStoreResults checkResult = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsLocalScript.Single()); Debug.Assert(checkResult.StoreVersion != null); // Upgrade local shard map to latest version before attaching. ts.ExecuteCommandBatch(SqlUtils.FilterUpgradeCommands(SqlUtils.UpgradeLocalScript, GlobalConstants.LsmVersionClient, checkResult.StoreVersion.Version)); // Now update the shards table in LSM. return(ts.ExecuteOperation( StoreOperationRequestBuilder.SpUpdateShardLocal, StoreOperationRequestBuilder.UpdateShardLocal(this.Id, _shardMap, _shard))); }
/// <summary> /// Execute the operation against GSM in the current transaction scope. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns> /// Results of the operation. /// </returns> public override IStoreResults DoGlobalExecute(IStoreTransactionScope ts) { TraceHelper.Tracer.TraceInfo( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Started creating Global Shard Map structures."); Stopwatch stopwatch = Stopwatch.StartNew(); IStoreResults checkResult = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsGlobalScript.Single()); // If we did find some store deployed. if (checkResult.StoreVersion != null) { // DEVNOTE(wbasheer): We need to have a way of erroring out if versions do not match. if (_createMode == ShardMapManagerCreateMode.KeepExisting) { throw new ShardManagementException( ShardManagementErrorCategory.ShardMapManagerFactory, ShardManagementErrorCode.ShardMapManagerStoreAlreadyExists, Errors._Store_ShardMapManager_AlreadyExistsGlobal); } TraceHelper.Tracer.TraceVerbose( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Dropping existing Global Shard Map structures."); ts.ExecuteCommandBatch(SqlUtils.DropGlobalScript); } // Deploy initial version and run upgrade script to bring it to the specified version. ts.ExecuteCommandBatch(SqlUtils.CreateGlobalScript); ts.ExecuteCommandBatch(SqlUtils.FilterUpgradeCommands(SqlUtils.UpgradeGlobalScript, _targetVersion)); stopwatch.Stop(); TraceHelper.Tracer.TraceInfo( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Finished creating Global Shard Map structures. Duration: {0}", stopwatch.Elapsed); return(new SqlResults()); }
/// <summary> /// Execute the operation against GSM in the current transaction scope. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns> /// Results of the operation. /// </returns> public override IStoreResults DoGlobalExecute(IStoreTransactionScope ts) { TraceHelper.Tracer.TraceInfo( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Started creating Global Shard Map structures."); Stopwatch stopwatch = Stopwatch.StartNew(); IStoreResults checkResult = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsGlobalScript.Single()); // If we did find some store deployed. if (checkResult.StoreVersion != null) { // DEVNOTE(wbasheer): We need to have a way of erroring out if versions do not match. if (_createMode == ShardMapManagerCreateMode.KeepExisting) { throw new ShardManagementException( ShardManagementErrorCategory.ShardMapManagerFactory, ShardManagementErrorCode.ShardMapManagerStoreAlreadyExists, Errors._Store_ShardMapManager_AlreadyExistsGlobal); } TraceHelper.Tracer.TraceVerbose( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Dropping existing Global Shard Map structures."); ts.ExecuteCommandBatch(SqlUtils.DropGlobalScript); } // Deploy initial version and run upgrade script to bring it to the specified version. ts.ExecuteCommandBatch(SqlUtils.CreateGlobalScript); ts.ExecuteCommandBatch(SqlUtils.FilterUpgradeCommands(SqlUtils.UpgradeGlobalScript, _targetVersion)); stopwatch.Stop(); TraceHelper.Tracer.TraceInfo( TraceSourceConstants.ComponentNames.ShardMapManagerFactory, this.OperationName, "Finished creating Global Shard Map structures. Duration: {0}", stopwatch.Elapsed); return new SqlResults(); }
/// <summary> /// Performs the undo of LSM operation on the source shard. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns>Result of the operation.</returns> public override IStoreResults UndoLocalSourceExecute(IStoreTransactionScope ts) { IStoreResults checkResult = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsLocalScript.Single()); if (checkResult.StoreVersion != null) { // Remove the added shard entries. return(ts.ExecuteOperation( StoreOperationRequestBuilder.SpRemoveShardLocal, StoreOperationRequestBuilder.RemoveShardLocal(this.Id, _shardMap, _shard))); } else { // If version is < 0, then shard never got deployed, consider it a success. return(new SqlResults()); } }
/// <summary> /// Execute the operation against LSM in the current transaction scope. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns> /// Results of the operation. /// </returns> public override IStoreResults DoLocalExecute(IStoreTransactionScope ts) { IStoreResults result = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsLocalScript.Single()); if (result.StoreVersion == null) { // Shard not deployed, which is an error condition. throw new ShardManagementException( ShardManagementErrorCategory.Recovery, ShardManagementErrorCode.ShardNotValid, Errors._Recovery_ShardNotValid, this.Location, this.OperationName); } return(ts.ExecuteOperation( StoreOperationRequestBuilder.SpGetAllShardsLocal, StoreOperationRequestBuilder.GetAllShardsLocal())); }
/// <summary> /// Execute the operation against LSM in the current transaction scope. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns> /// Results of the operation. /// </returns> public override IStoreResults DoLocalExecute(IStoreTransactionScope ts) { IStoreResults result = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsLocalScript.Single()); if (result.StoreVersion == null) { // Shard not deployed, which is an error condition. throw new ShardManagementException( ShardManagementErrorCategory.Recovery, ShardManagementErrorCode.ShardNotValid, Errors._Recovery_ShardNotValid, this.Location, this.OperationName); } Debug.Assert(result.Result == StoreResult.Success); return result; }
/// <summary> /// Execute the operation against LSM in the current transaction scope. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns> /// Results of the operation. /// </returns> public override IStoreResults DoLocalExecute(IStoreTransactionScope ts) { IStoreResults result = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsLocalScript.Single()); if (result.StoreVersion == null) { // Shard not deployed, which is an error condition. throw new ShardManagementException( ShardManagementErrorCategory.Recovery, ShardManagementErrorCode.ShardNotValid, Errors._Recovery_ShardNotValid, this.Location, this.OperationName); } Debug.Assert(result.Result == StoreResult.Success); return(result); }
/// <summary> /// Execute the operation against LSM in the current transaction scope. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns> /// Results of the operation. /// </returns> public override IStoreResults DoLocalExecute(IStoreTransactionScope ts) { IStoreResults result = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsLocalScript.Single()); if (result.StoreVersion == null) { // Shard not deployed, which is an error condition. throw new ShardManagementException( ShardManagementErrorCategory.Recovery, ShardManagementErrorCode.ShardNotValid, Errors._Recovery_ShardNotValid, this.Location, this.OperationName); } return ts.ExecuteOperation( StoreOperationRequestBuilder.SpGetAllShardsLocal, StoreOperationRequestBuilder.GetAllShardsLocal()); }
/// <summary> /// Performs the LSM operation on the source shard. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns>Result of the operation.</returns> public override IStoreResults DoLocalSourceExecute(IStoreTransactionScope ts) { IStoreResults checkResult = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsLocalScript.Single()); // Shard not already deployed, just need to add the proper entries. if (checkResult.StoreVersion == null) { // create initial version of LSM ts.ExecuteCommandBatch(SqlUtils.CreateLocalScript); // now upgrade LSM to latest version ts.ExecuteCommandBatch(SqlUtils.FilterUpgradeCommands(SqlUtils.UpgradeLocalScript, GlobalConstants.LsmVersionClient)); } // Now actually add the shard entries. return(ts.ExecuteOperation( StoreOperationRequestBuilder.SpAddShardLocal, StoreOperationRequestBuilder.AddShardLocal(this.Id, false, _shardMap, _shard))); }
/// <summary> /// Execute the operation against GSM in the current transaction scope. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns> /// Results of the operation. /// </returns> public override IStoreResults DoGlobalExecute(IStoreTransactionScope ts) { IStoreResults result = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsGlobalScript.Single()); SqlResults returnedResult = new SqlResults(); // If we did not find some store deployed. if (result.StoreVersion == null) { returnedResult.Result = StoreResult.Failure; } else { // DEVNOTE(wbasheer): We need to have a way of erroring out if versions do not match. // we can potentially call upgrade here to get to latest version. Should this be exposed as a new parameter ? returnedResult.Result = StoreResult.Success; } return(returnedResult); }
/// <summary> /// Execute the operation against GSM in the current transaction scope. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns> /// Results of the operation. /// </returns> public override IStoreResults DoGlobalExecute(IStoreTransactionScope ts) { IStoreResults result = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsGlobalScript.Single()); SqlResults returnedResult = new SqlResults(); // If we did not find some store deployed. if (result.StoreVersion == null) { returnedResult.Result = StoreResult.Failure; } else { // DEVNOTE(wbasheer): We need to have a way of erroring out if versions do not match. // we can potentially call upgrade here to get to latest version. Should this be exposed as a new parameter ? returnedResult.Result = StoreResult.Success; } return returnedResult; }
/// <summary> /// Performs the LSM operation on the source shard. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns>Result of the operation.</returns> public override IStoreResults DoLocalSourceExecute(IStoreTransactionScope ts) { IStoreResults checkResult = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsLocalScript.Single()); // Shard not already deployed, just need to add the proper entries. if (checkResult.StoreVersion == null) { // create initial version of LSM ts.ExecuteCommandBatch(SqlUtils.CreateLocalScript); // now upgrade LSM to latest version ts.ExecuteCommandBatch(SqlUtils.FilterUpgradeCommands(SqlUtils.UpgradeLocalScript, GlobalConstants.LsmVersionClient)); } // Now actually add the shard entries. return ts.ExecuteOperation( StoreOperationRequestBuilder.SpAddShardLocal, StoreOperationRequestBuilder.AddShardLocal(this.Id, false, _shardMap, _shard)); }
/// <summary> /// Performs the undo of LSM operation on the source shard. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns>Result of the operation.</returns> public override IStoreResults UndoLocalSourceExecute(IStoreTransactionScope ts) { IStoreResults checkResult = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsLocalScript.Single()); if (checkResult.StoreVersion != null) { // Remove the added shard entries. return ts.ExecuteOperation( StoreOperationRequestBuilder.SpRemoveShardLocal, StoreOperationRequestBuilder.RemoveShardLocal(this.Id, _shardMap, _shard)); } else { // If version is < 0, then shard never got deployed, consider it a success. return new SqlResults(); } }
/// <summary> /// Performs the LSM operation on the source shard. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns>Result of the operation.</returns> public override IStoreResults DoLocalSourceExecute(IStoreTransactionScope ts) { // There should already be some version of LSM at this location as RecoveryMAnager.AttachShard() first reads existing shard maps from this location. IStoreResults checkResult = ts.ExecuteCommandSingle(SqlUtils.CheckIfExistsLocalScript.Single()); Debug.Assert(checkResult.StoreVersion != null); // Upgrade local shard map to latest version before attaching. ts.ExecuteCommandBatch(SqlUtils.FilterUpgradeCommands(SqlUtils.UpgradeLocalScript, GlobalConstants.LsmVersionClient, checkResult.StoreVersion.Version)); // Now update the shards table in LSM. return ts.ExecuteOperation( StoreOperationRequestBuilder.SpUpdateShardLocal, StoreOperationRequestBuilder.UpdateShardLocal(this.Id, _shardMap, _shard)); }