コード例 #1
0
        internal async Task <BackupMapping> GetEffectiveBackupMappingFromPartitionId(string partitionId, TimeSpan timeout, CancellationToken cancellationToken, FabricBackupResourceType fabricBackupResourceType)
        {
            string serviceNameUri = await FabricClientHelper.GetFabricServiceUriFromPartitionId(partitionId, timeout, tokenSource.Token);

            string partitionUri = await UtilityHelper.GetFabricUriFromPartitionId(partitionId, this.timeout, this.tokenSource.Token);

            var backupMappingStore = await BackupMappingStore.CreateOrGetBackupMappingStore(this.StatefulService);

            BackupMapping backupMapping = null;

            if (fabricBackupResourceType == FabricBackupResourceType.ApplicationUri)
            {
                backupMapping = (await backupMappingStore.GetValueAsync(partitionUri, timeout, this.tokenSource.Token) ??
                                 await backupMappingStore.GetValueAsync(serviceNameUri, this.timeout, tokenSource.Token));
            }
            else
            {
                backupMapping = await backupMappingStore.GetValueAsync(partitionUri, timeout, this.tokenSource.Token);
            }
            return(backupMapping);
        }
コード例 #2
0
        internal async Task <HashSet <string> > FindParititionsEnabledByPolicy(BackupPolicy backupPolicy)
        {
            BackupRestoreTrace.TraceSource.WriteInfo(TraceType, " Finding all the partitions enabled for the backupPolicy : {0}", backupPolicy.Name);

            HashSet <string> partitionsEnabledByPolicy = new HashSet <string>();
            var backupPolicyStore = await BackupPolicyStore.CreateOrGetBackupPolicyStore(this.StatefulService);

            var backupMappingStore = await BackupMappingStore.CreateOrGetBackupMappingStore(this.StatefulService);

            var backupEnabledSet = backupPolicy.BackupEnabledSet.ToList();

            foreach (var backupedUri in backupEnabledSet)
            {
                string applicationName = null;
                string serviceName     = null;
                string partitionId     = null;
                FabricBackupResourceType fabricBackupResourceType =
                    UtilityHelper.GetApplicationAndServicePartitionUri(backupedUri, out applicationName, out serviceName,
                                                                       out partitionId);

                switch (fabricBackupResourceType)
                {
                case FabricBackupResourceType.PartitionUri:
                    partitionsEnabledByPolicy.Add(partitionId);
                    break;

                default:
                    var partitionIDList = await GetPartitionsForServiceOrApplication(backupedUri, fabricBackupResourceType, this.timeout, this.tokenSource.Token);

                    foreach (var partitionID in partitionIDList)
                    {
                        partitionsEnabledByPolicy.Add(partitionID);
                        this.tokenSource.Token.ThrowIfCancellationRequested();
                    }
                    break;
                }
            }

            List <string> partitionListToRemove = new List <string>();

            foreach (var partitionId in partitionsEnabledByPolicy)
            {
                this.tokenSource.Token.ThrowIfCancellationRequested();
                string serviceNameUri = await FabricClientHelper.GetFabricServiceUriFromPartitionId(partitionId, timeout, tokenSource.Token);

                string applicationNameUri = await FabricClientHelper.GetFabricApplicationUriFromServiceUri(serviceNameUri, timeout, tokenSource.Token);

                string partitionUri = await UtilityHelper.GetFabricUriFromPartitionId(partitionId, this.timeout, this.tokenSource.Token);

                var backupMapping = (await backupMappingStore.GetValueAsync(partitionUri, timeout, this.tokenSource.Token) ??
                                     await backupMappingStore.GetValueAsync(serviceNameUri, this.timeout, tokenSource.Token)) ??
                                    await backupMappingStore.GetValueAsync(applicationNameUri, this.timeout, tokenSource.Token);

                if (backupMapping.BackupPolicyName != backupPolicy.Name)
                {
                    partitionListToRemove.Add(partitionId);
                }
            }

            foreach (var partitionId in partitionListToRemove)
            {
                partitionsEnabledByPolicy.Remove(partitionId);
            }

            return(partitionsEnabledByPolicy);
        }
コード例 #3
0
        internal override async Task <HttpResponseMessage> RunAsync(TimeSpan timeout, CancellationToken cancellationToken)
        {
            string applicationNameUri;
            string serviceNameUri;
            string partitionId;
            var    fabricUri = await UtilityHelper.GetFabricUriFromRequstHeader(this.fabricRequestHeader, timeout, cancellationToken);

            WorkItem workItem = null;
            FabricBackupResourceType fabricBackupResourceType =
                UtilityHelper.GetApplicationAndServicePartitionUri(fabricUri, out applicationNameUri, out serviceNameUri,
                                                                   out partitionId);

            bool isApplicationOrServiceExisting;

            switch (fabricBackupResourceType)
            {
            case FabricBackupResourceType.ApplicationUri:
                isApplicationOrServiceExisting =
                    await this.IsApplicationOrServiceExisting(fabricBackupResourceType, applicationNameUri, null, timeout, cancellationToken);

                if (isApplicationOrServiceExisting)
                {
                    workItem = new ResolveToPartitionWorkItem(FabricBackupResourceType.ApplicationUri,
                                                              applicationNameUri,
                                                              new WorkItemInfo
                    {
                        WorkItemType = WorkItemPropogationType.Disable,
                    });
                }

                break;

            case FabricBackupResourceType.ServiceUri:
                isApplicationOrServiceExisting =
                    await this.IsApplicationOrServiceExisting(fabricBackupResourceType, serviceNameUri, null, timeout, cancellationToken);

                if (isApplicationOrServiceExisting)
                {
                    workItem = new ResolveToPartitionWorkItem(FabricBackupResourceType.ServiceUri, serviceNameUri,
                                                              new WorkItemInfo
                    {
                        WorkItemType = WorkItemPropogationType.Disable,
                    });
                }

                break;

            case FabricBackupResourceType.PartitionUri:
                isApplicationOrServiceExisting =
                    await this.IsApplicationOrServiceExisting(fabricBackupResourceType, serviceNameUri, partitionId, timeout, cancellationToken);

                if (isApplicationOrServiceExisting)
                {
                    serviceNameUri =
                        await
                        FabricClientHelper.GetFabricServiceUriFromPartitionId(partitionId, timeout,
                                                                              cancellationToken);

                    workItem = new SendToServiceNodeWorkItem(serviceNameUri, partitionId,
                                                             new WorkItemInfo
                    {
                        WorkItemType = WorkItemPropogationType.Disable,
                    });
                }

                break;

            case FabricBackupResourceType.Error:
                throw new ArgumentException(StringResources.InvalidArguments);
            }

            if (workItem == null)
            {
                using (var transaction = this.StatefulService.StateManager.CreateTransaction())
                {
                    var backupMapping = await this.BackupMappingStore.GetValueWithUpdateLockModeAsync(fabricUri, timeout, cancellationToken, transaction);

                    if (backupMapping == null)
                    {
                        throw new FabricPeriodicBackupNotEnabledException();
                    }

                    var assignedBackupPolicy =
                        await this.BackupPolicyStore.GetValueWithUpdateLockModeAsync(backupMapping.BackupPolicyName, timeout,
                                                                                     cancellationToken, transaction);

                    await this.BackupMappingStore.DeleteValueAsync(fabricUri, timeout, cancellationToken, transaction);

                    await this.BackupPolicyStore.RemoveProtectionEntity(assignedBackupPolicy, fabricUri, timeout, cancellationToken, transaction);

                    await transaction.CommitAsync();
                }
            }
            else
            {
                RetentionManager retentionManager = await RetentionManager.CreateOrGetRetentionManager(this.StatefulService);

                using (var transaction = this.StatefulService.StateManager.CreateTransaction())
                {
                    var backupMapping = await this.BackupMappingStore.GetValueWithUpdateLockModeAsync(fabricUri, timeout, cancellationToken, transaction);

                    if (backupMapping == null)
                    {
                        throw new FabricPeriodicBackupNotEnabledException();
                    }

                    var assignedBackupPolicy = await this.BackupPolicyStore.GetValueWithUpdateLockModeAsync(backupMapping.BackupPolicyName, timeout,
                                                                                                            cancellationToken, transaction);

                    await this.BackupMappingStore.DeleteValueAsync(fabricUri, timeout, cancellationToken, transaction);

                    await this.BackupPolicyStore.RemoveProtectionEntity(assignedBackupPolicy, fabricUri, timeout, cancellationToken, transaction);

                    await this.WorkItemQueue.AddWorkItem(workItem, timeout, cancellationToken, transaction);

                    if (cleanBackups)
                    {
                        await retentionManager.DisablePolicyAsync(fabricUri, backupMapping, timeout, cancellationToken, transaction);
                    }
                    await transaction.CommitAsync();
                }
            }
            return(new HttpResponseMessage(HttpStatusCode.Accepted));
        }