private RedisMemoizationStoreConfiguration CreateRedisConfiguration() { var primaryCacheRoot = OrderedResolvedCacheSettings[0].ResolvedCacheRootPath; var redisContentLocationStoreConfiguration = new RedisMemoizationStoreConfiguration { Keyspace = _keySpace + RedisKeySpaceSalt, LogReconciliationHashes = _distributedSettings.LogReconciliationHashes, RedisBatchPageSize = _distributedSettings.RedisBatchPageSize, BlobExpiryTimeMinutes = _distributedSettings.BlobExpiryTimeMinutes, MaxBlobCapacity = _distributedSettings.MaxBlobCapacity, MaxBlobSize = _distributedSettings.MaxBlobSize, UseFullEvictionSort = _distributedSettings.UseFullEvictionSort, EvictionWindowSize = _distributedSettings.EvictionWindowSize, EvictionPoolSize = _distributedSettings.EvictionPoolSize, UpdateStaleLocalLastAccessTimes = _distributedSettings.UpdateStaleLocalLastAccessTimes, EvictionRemovalFraction = _distributedSettings.EvictionRemovalFraction, EvictionDiscardFraction = _distributedSettings.EvictionDiscardFraction, UseTieredDistributedEviction = _distributedSettings.UseTieredDistributedEviction, MemoizationExpiryTime = TimeSpan.FromMinutes(_distributedSettings.RedisMemoizationExpiryTimeMinutes), ProactiveCopyLocationsThreshold = _distributedSettings.ProactiveCopyLocationsThreshold, UseBinManager = _distributedSettings.UseBinManager || _distributedSettings.ProactiveCopyUsePreferredLocations, PreferredLocationsExpiryTime = TimeSpan.FromMinutes(_distributedSettings.PreferredLocationsExpiryTimeMinutes), PrimaryMachineLocation = OrderedResolvedCacheSettings[0].MachineLocation, MachineListPrioritizeDesignatedLocations = _distributedSettings.PrioritizeDesignatedLocationsOnCopies, MachineListDeprioritizeMaster = _distributedSettings.DeprioritizeMasterOnCopies, TouchContentHashLists = _distributedSettings.TouchContentHashLists, }; ApplyIfNotNull(_distributedSettings.BlobOperationLimitCount, v => redisContentLocationStoreConfiguration.BlobOperationLimitCount = v); ApplyIfNotNull(_distributedSettings.BlobOperationLimitSpanSeconds, v => redisContentLocationStoreConfiguration.BlobOperationLimitSpan = TimeSpan.FromSeconds(v)); ApplyIfNotNull(_distributedSettings.UseSeparateConnectionForRedisBlobs, v => redisContentLocationStoreConfiguration.UseSeparateConnectionForRedisBlobs = v); // Stop passing additional stores when fully transitioned to unified mode // since all drives appear under the same machine id if (_distributedSettings.GetMultiplexMode() != MultiplexMode.Unified) { redisContentLocationStoreConfiguration.AdditionalMachineLocations = OrderedResolvedCacheSettings.Skip(1).Select(r => r.MachineLocation).ToArray(); } ApplyIfNotNull(_distributedSettings.ThrottledEvictionIntervalMinutes, v => redisContentLocationStoreConfiguration.ThrottledEvictionInterval = TimeSpan.FromMinutes(v)); // Redis-related configuration. ApplyIfNotNull(_distributedSettings.RedisConnectionErrorLimit, v => redisContentLocationStoreConfiguration.RedisConnectionErrorLimit = v); ApplyIfNotNull(_distributedSettings.RedisReconnectionLimitBeforeServiceRestart, v => redisContentLocationStoreConfiguration.RedisReconnectionLimitBeforeServiceRestart = v); ApplyIfNotNull(_distributedSettings.DefaultRedisOperationTimeoutInSeconds, v => redisContentLocationStoreConfiguration.OperationTimeout = TimeSpan.FromSeconds(v)); ApplyIfNotNull(_distributedSettings.MinRedisReconnectInterval, v => redisContentLocationStoreConfiguration.MinRedisReconnectInterval = v); ApplyIfNotNull(_distributedSettings.CancelBatchWhenMultiplexerIsClosed, v => redisContentLocationStoreConfiguration.CancelBatchWhenMultiplexerIsClosed = v); if (_distributedSettings.RedisExponentialBackoffRetryCount != null) { var exponentialBackoffConfiguration = new ExponentialBackoffConfiguration( _distributedSettings.RedisExponentialBackoffRetryCount.Value, minBackoff: IfNotNull(_distributedSettings.RedisExponentialBackoffMinIntervalInSeconds, v => TimeSpan.FromSeconds(v)), maxBackoff: IfNotNull(_distributedSettings.RedisExponentialBackoffMaxIntervalInSeconds, v => TimeSpan.FromSeconds(v)), deltaBackoff: IfNotNull(_distributedSettings.RedisExponentialBackoffDeltaIntervalInSeconds, v => TimeSpan.FromSeconds(v)) ); redisContentLocationStoreConfiguration.ExponentialBackoffConfiguration = exponentialBackoffConfiguration; } ApplyIfNotNull(_distributedSettings.ReplicaCreditInMinutes, v => redisContentLocationStoreConfiguration.ContentLifetime = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.MachineRisk, v => redisContentLocationStoreConfiguration.MachineRisk = v); ApplyIfNotNull(_distributedSettings.LocationEntryExpiryMinutes, v => redisContentLocationStoreConfiguration.LocationEntryExpiry = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.MachineStateRecomputeIntervalMinutes, v => redisContentLocationStoreConfiguration.MachineStateRecomputeInterval = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.MachineActiveToClosedIntervalMinutes, v => redisContentLocationStoreConfiguration.MachineActiveToClosedInterval = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.MachineActiveToExpiredIntervalMinutes, v => redisContentLocationStoreConfiguration.MachineActiveToExpiredInterval = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.TouchFrequencyMinutes, v => redisContentLocationStoreConfiguration.TouchFrequency = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.ReconcileCacheLifetimeMinutes, v => redisContentLocationStoreConfiguration.ReconcileCacheLifetime = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.EvictionMinAgeMinutes, v => redisContentLocationStoreConfiguration.EvictionMinAge = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.RetryWindowSeconds, v => redisContentLocationStoreConfiguration.RetryWindow = TimeSpan.FromSeconds(v)); ApplyIfNotNull(_distributedSettings.Unsafe_MasterThroughputCheckMode, v => redisContentLocationStoreConfiguration.MasterThroughputCheckMode = v); ApplyIfNotNull(_distributedSettings.Unsafe_EventHubCursorPosition, v => redisContentLocationStoreConfiguration.EventHubCursorPosition = v); ApplyIfNotNull(_distributedSettings.RedisGetBlobTimeoutMilliseconds, v => redisContentLocationStoreConfiguration.BlobTimeout = TimeSpan.FromMilliseconds(v)); ApplyIfNotNull(_distributedSettings.RedisGetCheckpointStateTimeoutInSeconds, v => redisContentLocationStoreConfiguration.ClusterRedisOperationTimeout = TimeSpan.FromSeconds(v)); redisContentLocationStoreConfiguration.ReputationTrackerConfiguration.Enabled = _distributedSettings.IsMachineReputationEnabled; if (_distributedSettings.IsContentLocationDatabaseEnabled) { var dbConfig = RocksDbContentLocationDatabaseConfiguration.FromDistributedContentSettings( _distributedSettings, primaryCacheRoot / "LocationDb", primaryCacheRoot / "LocationDbLogs", logsKeepLongTerm: true ); redisContentLocationStoreConfiguration.Database = dbConfig; ApplySecretSettingsForLlsAsync(redisContentLocationStoreConfiguration, primaryCacheRoot, dbConfig).GetAwaiter().GetResult(); } _arguments.Overrides.Override(redisContentLocationStoreConfiguration); ConfigurationPrinter.TraceConfiguration(redisContentLocationStoreConfiguration, _logger); return(redisContentLocationStoreConfiguration); }
private RedisMemoizationStoreConfiguration CreateRedisConfiguration() { var primaryCacheRoot = OrderedResolvedCacheSettings[0].ResolvedCacheRootPath; var redisContentLocationStoreConfiguration = new RedisMemoizationStoreConfiguration { Keyspace = _keySpace + RedisKeySpaceSalt, LogReconciliationHashes = _distributedSettings.LogReconciliationHashes, RedisBatchPageSize = _distributedSettings.RedisBatchPageSize, BlobExpiryTimeMinutes = _distributedSettings.BlobExpiryTimeMinutes, MaxBlobCapacity = _distributedSettings.MaxBlobCapacity, MaxBlobSize = _distributedSettings.MaxBlobSize, UseFullEvictionSort = _distributedSettings.UseFullEvictionSort, EvictionWindowSize = _distributedSettings.EvictionWindowSize, EvictionPoolSize = _distributedSettings.EvictionPoolSize, UpdateStaleLocalLastAccessTimes = _distributedSettings.UpdateStaleLocalLastAccessTimes, EvictionRemovalFraction = _distributedSettings.EvictionRemovalFraction, EvictionDiscardFraction = _distributedSettings.EvictionDiscardFraction, UseTieredDistributedEviction = _distributedSettings.UseTieredDistributedEviction, MemoizationExpiryTime = TimeSpan.FromMinutes(_distributedSettings.RedisMemoizationExpiryTimeMinutes), ProactiveCopyLocationsThreshold = _distributedSettings.ProactiveCopyLocationsThreshold, UseBinManager = _distributedSettings.UseBinManager || _distributedSettings.ProactiveCopyUsePreferredLocations, PreferredLocationsExpiryTime = TimeSpan.FromMinutes(_distributedSettings.PreferredLocationsExpiryTimeMinutes), PrimaryMachineLocation = OrderedResolvedCacheSettings[0].MachineLocation, MachineListPrioritizeDesignatedLocations = _distributedSettings.PrioritizeDesignatedLocationsOnCopies, MachineListDeprioritizeMaster = _distributedSettings.DeprioritizeMasterOnCopies, TouchContentHashLists = _distributedSettings.TouchContentHashLists, }; ApplyIfNotNull(_distributedSettings.BlobOperationLimitCount, v => redisContentLocationStoreConfiguration.BlobOperationLimitCount = v); ApplyIfNotNull(_distributedSettings.BlobOperationLimitSpanSeconds, v => redisContentLocationStoreConfiguration.BlobOperationLimitSpan = TimeSpan.FromSeconds(v)); ApplyIfNotNull(_distributedSettings.UseSeparateConnectionForRedisBlobs, v => redisContentLocationStoreConfiguration.UseSeparateConnectionForRedisBlobs = v); // Stop passing additional stores when fully transitioned to unified mode // since all drives appear under the same machine id if (_distributedSettings.GetMultiplexMode() != MultiplexMode.Unified) { redisContentLocationStoreConfiguration.AdditionalMachineLocations = OrderedResolvedCacheSettings.Skip(1).Select(r => r.MachineLocation).ToArray(); } ApplyIfNotNull(_distributedSettings.ThrottledEvictionIntervalMinutes, v => redisContentLocationStoreConfiguration.ThrottledEvictionInterval = TimeSpan.FromMinutes(v)); // Redis-related configuration. ApplyIfNotNull(_distributedSettings.RedisConnectionErrorLimit, v => redisContentLocationStoreConfiguration.RedisConnectionErrorLimit = v); ApplyIfNotNull(_distributedSettings.RedisReconnectionLimitBeforeServiceRestart, v => redisContentLocationStoreConfiguration.RedisReconnectionLimitBeforeServiceRestart = v); ApplyIfNotNull(_distributedSettings.DefaultRedisOperationTimeoutInSeconds, v => redisContentLocationStoreConfiguration.OperationTimeout = TimeSpan.FromSeconds(v)); ApplyIfNotNull(_distributedSettings.MinRedisReconnectInterval, v => redisContentLocationStoreConfiguration.MinRedisReconnectInterval = v); ApplyIfNotNull(_distributedSettings.CancelBatchWhenMultiplexerIsClosed, v => redisContentLocationStoreConfiguration.CancelBatchWhenMultiplexerIsClosed = v); if (_distributedSettings.RedisExponentialBackoffRetryCount != null) { var exponentialBackoffConfiguration = new ExponentialBackoffConfiguration( _distributedSettings.RedisExponentialBackoffRetryCount.Value, minBackoff: IfNotNull(_distributedSettings.RedisExponentialBackoffMinIntervalInSeconds, v => TimeSpan.FromSeconds(v)), maxBackoff: IfNotNull(_distributedSettings.RedisExponentialBackoffMaxIntervalInSeconds, v => TimeSpan.FromSeconds(v)), deltaBackoff: IfNotNull(_distributedSettings.RedisExponentialBackoffDeltaIntervalInSeconds, v => TimeSpan.FromSeconds(v)) ); redisContentLocationStoreConfiguration.ExponentialBackoffConfiguration = exponentialBackoffConfiguration; } ApplyIfNotNull(_distributedSettings.ReplicaCreditInMinutes, v => redisContentLocationStoreConfiguration.ContentLifetime = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.MachineRisk, v => redisContentLocationStoreConfiguration.MachineRisk = v); ApplyIfNotNull(_distributedSettings.LocationEntryExpiryMinutes, v => redisContentLocationStoreConfiguration.LocationEntryExpiry = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.MachineStateRecomputeIntervalMinutes, v => redisContentLocationStoreConfiguration.MachineStateRecomputeInterval = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.MachineActiveToClosedIntervalMinutes, v => redisContentLocationStoreConfiguration.MachineActiveToClosedInterval = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.MachineActiveToExpiredIntervalMinutes, v => redisContentLocationStoreConfiguration.MachineActiveToExpiredInterval = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.TouchFrequencyMinutes, v => redisContentLocationStoreConfiguration.TouchFrequency = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.EvictionMinAgeMinutes, v => redisContentLocationStoreConfiguration.EvictionMinAge = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.RetryWindowSeconds, v => redisContentLocationStoreConfiguration.RetryWindow = TimeSpan.FromSeconds(v)); ApplyIfNotNull(_distributedSettings.Unsafe_MasterThroughputCheckMode, v => redisContentLocationStoreConfiguration.MasterThroughputCheckMode = v); ApplyIfNotNull(_distributedSettings.Unsafe_EventHubCursorPosition, v => redisContentLocationStoreConfiguration.EventHubCursorPosition = v); ApplyIfNotNull(_distributedSettings.RedisGetBlobTimeoutMilliseconds, v => redisContentLocationStoreConfiguration.BlobTimeout = TimeSpan.FromMilliseconds(v)); ApplyIfNotNull(_distributedSettings.RedisGetCheckpointStateTimeoutInSeconds, v => redisContentLocationStoreConfiguration.ClusterRedisOperationTimeout = TimeSpan.FromSeconds(v)); redisContentLocationStoreConfiguration.ReputationTrackerConfiguration.Enabled = _distributedSettings.IsMachineReputationEnabled; if (_distributedSettings.IsContentLocationDatabaseEnabled) { var dbConfig = new RocksDbContentLocationDatabaseConfiguration(primaryCacheRoot / "LocationDb") { LogsKeepLongTerm = true, UseContextualEntryOperationLogging = _distributedSettings.UseContextualEntryDatabaseOperationLogging, TraceTouches = _distributedSettings.TraceTouches, }; if (_distributedSettings.ContentLocationDatabaseGcIntervalMinutes != null) { dbConfig.GarbageCollectionInterval = TimeSpan.FromMinutes(_distributedSettings.ContentLocationDatabaseGcIntervalMinutes.Value); } if (_distributedSettings.EnableDistributedCache) { dbConfig.MetadataGarbageCollectionEnabled = true; dbConfig.MetadataGarbageCollectionMaximumNumberOfEntriesToKeep = _distributedSettings.MaximumNumberOfMetadataEntriesToStore; } ApplyIfNotNull( _distributedSettings.ContentLocationDatabaseOpenReadOnly, v => dbConfig.OpenReadOnly = v && !_distributedSettings.IsMasterEligible); ApplyIfNotNull( _distributedSettings.FullRangeCompactionIntervalMinutes, v => { if (v < 0) { throw new ArgumentException($"`{nameof(_distributedSettings.FullRangeCompactionIntervalMinutes)}` must be greater than or equal to 0"); } if (v > 0) { dbConfig.FullRangeCompactionInterval = TimeSpan.FromMinutes(v); } }); ApplyIfNotNull( _distributedSettings.FullRangeCompactionVariant, v => { if (!Enum.TryParse <FullRangeCompactionVariant>(v, out var variant)) { throw new ArgumentException($"Failed to parse `{nameof(_distributedSettings.FullRangeCompactionVariant)}` setting with value `{_distributedSettings.FullRangeCompactionVariant}` into type `{nameof(FullRangeCompactionVariant)}`"); } dbConfig.FullRangeCompactionVariant = variant; }); ApplyIfNotNull( _distributedSettings.FullRangeCompactionByteIncrementStep, v => dbConfig.FullRangeCompactionByteIncrementStep = v); ApplyIfNotNull(_distributedSettings.ContentLocationDatabaseEnableDynamicLevelTargetSizes, v => dbConfig.EnableDynamicLevelTargetSizes = v); if (_distributedSettings.ContentLocationDatabaseLogsBackupEnabled) { dbConfig.LogsBackupPath = primaryCacheRoot / "LocationDbLogs"; } ApplyIfNotNull(_distributedSettings.ContentLocationDatabaseLogsBackupRetentionMinutes, v => dbConfig.LogsRetention = TimeSpan.FromMinutes(v)); ApplyIfNotNull(_distributedSettings.ContentLocationDatabaseEnumerateSortedKeysFromStorageBufferSize, v => dbConfig.EnumerateSortedKeysFromStorageBufferSize = v); ApplyIfNotNull(_distributedSettings.ContentLocationDatabaseEnumerateEntriesWithSortedKeysFromStorageBufferSize, v => dbConfig.EnumerateEntriesWithSortedKeysFromStorageBufferSize = v); redisContentLocationStoreConfiguration.Database = dbConfig; ApplySecretSettingsForLlsAsync(redisContentLocationStoreConfiguration, primaryCacheRoot, dbConfig).GetAwaiter().GetResult(); } _arguments.Overrides.Override(redisContentLocationStoreConfiguration); ConfigurationPrinter.TraceConfiguration(redisContentLocationStoreConfiguration, _logger); return(redisContentLocationStoreConfiguration); }