/// <summary> /// Creates <see cref="JobBlockingPolicyManager"/>. /// Specify <see cref="oldVersionedPropertyStore"/> when IS is used in a multi-tenant cluster (E.g. RP cluster) /// where each IS service communicates with one FC. In that case, we want individual job blocking policies for each IS service. /// If this parameter is <c>null</c>, then the same job blocking policy is shared across all IS services in a multi-tenant cluster. /// </summary> public static async Task <IJobBlockingPolicyManager> CreateAsync( TraceType traceType, IVersionedPropertyStore versionedPropertyStore, IVersionedPropertyStore oldVersionedPropertyStore = null) { traceType.Validate("traceType"); versionedPropertyStore.Validate("versionedPropertyStore"); traceType.WriteInfo("Starting creation of {0}", typeof(JobBlockingPolicyManager).Name); var manager = new JobBlockingPolicyManager(versionedPropertyStore); var activityId = Guid.NewGuid(); var versionedKeyValue = await ReadPropertyAsync(traceType, versionedPropertyStore, activityId).ConfigureAwait(false); if (versionedKeyValue == null) { string defaultPolicyValue = JobBlockingPolicy.BlockNone.ToString(); if (oldVersionedPropertyStore != null) { var oldVersionedKeyValue = await ReadPropertyAsync(traceType, oldVersionedPropertyStore, activityId).ConfigureAwait(false); if (oldVersionedKeyValue != null) { defaultPolicyValue = oldVersionedKeyValue.Value; } traceType.WriteInfo( "{0} properties '{1}={2}' and '{3}' {4} newer versioned property store.", oldVersionedKeyValue != null ? "Migrating" : "Creating", PolicyPropertyName, defaultPolicyValue, PolicyVersionName, oldVersionedKeyValue != null ? "to" : "in"); } try { await versionedPropertyStore.UpdateValueAsync( activityId, PolicyPropertyName, PolicyVersionName, defaultPolicyValue).ConfigureAwait(false); } catch (FabricException ex) { if (ex.ErrorCode != FabricErrorCode.WriteConflict) { traceType.WriteError("Properties '{0}' and '{1}' could not be updated. Exception: {2}", PolicyPropertyName, PolicyVersionName, ex); throw; } } } traceType.WriteInfo("Successfully created {0}", typeof(JobBlockingPolicyManager).Name); return(manager); }
public IInfrastructureCoordinator Create() { IManagementClient managementClient; try { managementClient = new ManagementClientFactory().Create(); } catch (Exception ex) { Trace.WriteError(TraceType, "Error creating management client. Cannot continue further. Exception: {0}", ex); throw; } var retryPolicyFactory = new LinearRetryPolicyFactory( TraceType, Constants.BackoffPeriodInMilliseconds, Constants.MaxRetryAttempts, AzureHelper.IsRetriableException); var versionedPropertyStore = VersionedPropertyStore.CreateAsync( Guid.NewGuid(), TraceType, new Uri(Constants.StoreName), new PropertyManagerWrapper(), retryPolicyFactory).GetAwaiter().GetResult(); var configSection = new ConfigSection(TraceType, configStore, configSectionName); var jobBlockingPolicyManager = JobBlockingPolicyManager.CreateAsync(TraceType, versionedPropertyStore).GetAwaiter().GetResult(); var jobImpactManager = new JobImpactManager(configSection, new ServiceFabricQueryClient(TraceType)); var coordinator = new WindowsAzureInfrastructureCoordinator( AzureHelper.GetTenantId(configSection), managementClient, agent, configStore, configSectionName, partitionId, replicaId, new ServiceFabricHealthClient(), jobBlockingPolicyManager, jobImpactManager, this.modeDetector); return(coordinator); }