public async Task BackupOperationResultAsync(BackupOperationResult operationResult, TimeSpan timeout, CancellationToken cancellationToken) { BackupRestoreTrace.TraceSource.WriteInfo(TraceType, "BackupOperationResultAsync invoked for partition {0}, OperationId {1} ErrorCode {2}, message {3}", operationResult.PartitionId, operationResult.OperationId, operationResult.ErrorCode, operationResult.Message); var backupPartitionStore = await BackupPartitionStore.CreateOrGetBackupPartitionStore(this.statefulService); var fabricUri = UtilityHelper.GetBackupMappingKey(await UtilityHelper.GetCustomServiceUri(operationResult.ServiceName, timeout, cancellationToken), operationResult.PartitionId.ToString()); await UtilityHelper.InvokeWithRetry(async() => { BackupRestoreTrace.TraceSource.WriteInfo(TraceType, "Trying to update the Backup Request for Partition Id {0} ", operationResult.PartitionId); using (ITransaction transaction = this.statefulService.StateManager.CreateTransaction()) { var backupPartitionStatus = await backupPartitionStore.GetValueWithUpdateLockModeAsync(fabricUri, timeout, cancellationToken, transaction); if ((backupPartitionStatus != null) && (backupPartitionStatus.BackupPartitionStatusState == BackupState.BackupInProgress || backupPartitionStatus.BackupPartitionStatusState == BackupState.Accepted) && backupPartitionStatus.OperationId.Equals(operationResult.OperationId)) // TODO : Also check for Guid for the request { var backupPartitionStatusBuilder = backupPartitionStatus.ToBuilder() .WithState(operationResult.ErrorCode != 0 ? BackupState.Failure : BackupState.Success) .WithErrorCode(operationResult.ErrorCode) .WithMessage(operationResult.Message) .WithTimeStampUtc(operationResult.TimeStampUtc); if (operationResult.ErrorCode == 0) { var updatedEpoch = new BackupEpoch { ConfigurationNumber = operationResult.EpochOfLastBackupRecord.ConfigurationNumber, DataLossNumber = operationResult.EpochOfLastBackupRecord.DataLossNumber }; backupPartitionStatusBuilder .WithEpochOfLastBackupRecord(updatedEpoch) .WithLsnOfLastBackupRecord(operationResult.LsnOfLastBackupRecord) .WithBackupId(operationResult.BackupId) .WithBackupLocation(operationResult.BackupLocation); } await backupPartitionStore.UpdateValueAsync(fabricUri, backupPartitionStatusBuilder.Build(), transaction); await transaction.CommitAsync(); BackupRestoreTrace.TraceSource.WriteInfo(TraceType, "Updated the Backup Request for Partition Id {0} ", operationResult.PartitionId); } else { transaction.Abort(); } } }); }
/// <summary> /// Serializes the object to JSON. /// </summary> /// <param name="writer">The <see cref="T: Newtonsoft.Json.JsonWriter" /> to write to.</param> /// <param name="obj">The object to serialize to JSON.</param> internal static void Serialize(JsonWriter writer, BackupEpoch obj) { // Required properties are always serialized, optional properties are serialized when not null. writer.WriteStartObject(); if (obj.ConfigurationNumber != null) { writer.WriteProperty(obj.ConfigurationNumber, "ConfigurationNumber", JsonWriterExtensions.WriteStringValue); } if (obj.DataLossNumber != null) { writer.WriteProperty(obj.DataLossNumber, "DataLossNumber", JsonWriterExtensions.WriteStringValue); } writer.WriteEndObject(); }