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); }
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); }
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)); }