Пример #1
0
    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();
        }