public ReplicatedTableQuorumWriteResult UploadConfigurationToBlobs(List <int> blobIndexes, ReplicatedTableConfiguration configuration) { if (blobIndexes == null || !blobIndexes.Any()) { throw new ArgumentNullException("blobIndexes"); } if (configuration == null) { throw new ArgumentNullException("configuration"); } List <CloudBlockBlob> blobs = new List <CloudBlockBlob>(); foreach (var blobIndex in blobIndexes) { if (blobIndex < this.configManager.GetBlobs().Count) { blobs.Add(this.configManager.GetBlobs()[blobIndex]); continue; } var msg = string.Format("blobIndex={0} >= BlobCount={1}", blobIndex, this.configManager.GetBlobs().Count); ReplicatedTableLogger.LogError(msg); throw new Exception(msg); } SanitizeConfiguration(configuration); // - Upload to blobs ... ReplicatedTableQuorumWriteResult result = CloudBlobHelpers.TryUploadBlobs(blobs, configuration); this.configManager.Invalidate(); if (result.Code != ReplicatedTableQuorumWriteCode.Success) { ReplicatedTableLogger.LogError("Failed to upload configuration to blobs, \n{0}", result.ToString()); } return(result); }
private void SaveConfigAndRefreshItsIdAndValidateIsLoaded(ReplicatedTableConfiguration configuration, string iteration, bool validateConfigIsLoaded = true) { string msg = ""; ReplicatedTableQuorumWriteResult writeResult = UpdateConfigurationInternal(configuration, true); if (writeResult.Code != ReplicatedTableQuorumWriteCode.Success) { msg = string.Format("{0} : Failed to update configuration, \n{1}", iteration, writeResult.ToString()); ReplicatedTableLogger.LogError(msg); throw new Exception(msg); } // Update config with new Id configuration.Id = new Guid(writeResult.Message); // do we need to validate if the config is loaded by the config manager ? if (!validateConfigIsLoaded) { return; } // - Confirm the new config is the current loaded into the RTable config manager if (configuration.Id == this.configManager.GetCurrentRunningConfigId()) { return; } msg = string.Format("{0} : ConfigId({1}) != currently running configurationId({2})", iteration, configuration.Id, this.configManager.GetCurrentRunningConfigId()); ReplicatedTableLogger.LogError(msg); throw new Exception(msg); }
private ReplicatedTableQuorumWriteResult UpdateConfigurationInternal(ReplicatedTableConfiguration configuration, bool useConditionalUpdate) { SanitizeConfiguration(configuration); // - Upload configuration ... Func <ReplicatedTableConfiguration, ReplicatedTableConfiguration, bool> comparer = (a, b) => a.Id == b.Id; if (!useConditionalUpdate) { comparer = (a, b) => true; } ReplicatedTableQuorumWriteResult result = CloudBlobHelpers.TryWriteBlobQuorum( this.configManager.GetBlobs(), configuration, ReplicatedTableConfiguration.FromJson, comparer, ReplicatedTableConfiguration.GenerateNewConfigId); if (result.Code == ReplicatedTableQuorumWriteCode.Success) { this.configManager.Invalidate(); } else { ReplicatedTableLogger.LogError("Failed to update configuration, \n{0}", result.ToString()); } return(result); }
public void TurnReplicaOff(string storageAccountName) { if (string.IsNullOrEmpty(storageAccountName)) { throw new ArgumentNullException("storageAccountName"); } ReplicatedTableConfiguration configuration = null; // - Retrieve configuration ... ReplicatedTableQuorumReadResult readResult = RetrieveConfiguration(out configuration); if (readResult.Code != ReplicatedTableQuorumReadCode.Success) { var msg = string.Format("TurnReplicaOff={0}: failed to read configuration, \n{1}", storageAccountName, readResult.ToString()); ReplicatedTableLogger.LogError(msg); throw new Exception(msg); } // - Parse/Update all views ... foreach (var viewConf in configuration.viewMap.Values) { var foundReplicas = viewConf.GetCurrentReplicaChain() .FindAll(r => r.StorageAccountName == storageAccountName); if (!foundReplicas.Any()) { continue; } foreach (var replica in foundReplicas) { replica.Status = ReplicaStatus.None; replica.ViewWhenTurnedOff = viewConf.ViewId; } // Update view id viewConf.ViewId++; } // - Write back configuration ... ReplicatedTableQuorumWriteResult writeResult = UpdateConfigurationInternal(configuration, true); if (writeResult.Code != ReplicatedTableQuorumWriteCode.Success) { var msg = string.Format("TurnReplicaOff={0}: failed to update configuration, \n{1}", storageAccountName, writeResult.ToString()); ReplicatedTableLogger.LogError(msg); throw new Exception(msg); } }
public void TurnReplicaOff(string storageAccountName) { if (string.IsNullOrEmpty(storageAccountName)) { throw new ArgumentNullException("storageAccountName"); } ReplicatedTableConfiguration configuration = null; // - Retrieve configuration ... ReplicatedTableQuorumReadResult readResult = RetrieveConfiguration(out configuration); if (readResult.Code != ReplicatedTableQuorumReadCode.Success) { var msg = string.Format("TurnReplicaOff={0}: failed to read configuration, \n{1}", storageAccountName, readResult.ToString()); ReplicatedTableLogger.LogError(msg); throw new Exception(msg); } // - Update all views ... configuration.TurnReplicaOff(storageAccountName); // - Write back configuration ... ReplicatedTableQuorumWriteResult writeResult = UpdateConfigurationInternal(configuration, true); if (writeResult.Code != ReplicatedTableQuorumWriteCode.Success) { var msg = string.Format("TurnReplicaOff={0}: failed to update configuration, \n{1}", storageAccountName, writeResult.ToString()); ReplicatedTableLogger.LogError(msg); throw new Exception(msg); } }