public DistributedContentStoreFactory(DistributedCacheServiceArguments arguments) { _logger = arguments.Logger; _arguments = arguments; _distributedSettings = arguments.Configuration.DistributedContentSettings; _keySpace = string.IsNullOrWhiteSpace(_arguments.Keyspace) ? ContentLocationStoreFactory.DefaultKeySpace : _arguments.Keyspace; _fileSystem = new PassThroughFileSystem(_logger); _secretRetriever = new DistributedCacheSecretRetriever(arguments); var bandwidthCheckedCopier = new BandwidthCheckedCopier(_arguments.Copier, BandwidthChecker.Configuration.FromDistributedContentSettings(_distributedSettings)); _orderedResolvedCacheSettings = ResolveCacheSettingsInPrecedenceOrder(arguments); Contract.Assert(_orderedResolvedCacheSettings.Count != 0); RedisContentLocationStoreConfiguration = CreateRedisConfiguration(); _distributedContentStoreSettings = CreateDistributedStoreSettings(_arguments, RedisContentLocationStoreConfiguration); _copier = new DistributedContentCopier <AbsolutePath>( _distributedContentStoreSettings, _fileSystem, fileCopier: bandwidthCheckedCopier, fileExistenceChecker: _arguments.Copier, _arguments.CopyRequester, _arguments.PathTransformer, _arguments.Overrides.Clock ); _redisMemoizationStoreFactory = new Lazy <RedisMemoizationStoreFactory>(() => CreateRedisCacheFactory()); }
public IContentStore CreateContentStore(AbsolutePath localCacheRoot) { var redisContentLocationStoreFactory = CreateRedisCacheFactory(localCacheRoot, out var redisContentLocationStoreConfiguration); var localMachineLocation = _arguments.PathTransformer.GetLocalMachineLocation(localCacheRoot); ReadOnlyDistributedContentSession <AbsolutePath> .ContentAvailabilityGuarantee contentAvailabilityGuarantee; if (string.IsNullOrEmpty(_distributedSettings.ContentAvailabilityGuarantee)) { contentAvailabilityGuarantee = ReadOnlyDistributedContentSession <AbsolutePath> .ContentAvailabilityGuarantee .FileRecordsExist; } else if (!Enum.TryParse(_distributedSettings.ContentAvailabilityGuarantee, true, out contentAvailabilityGuarantee)) { throw new ArgumentException($"Unable to parse {nameof(_distributedSettings.ContentAvailabilityGuarantee)}: [{_distributedSettings.ContentAvailabilityGuarantee}]"); } PinConfiguration pinConfiguration = null; if (_distributedSettings.IsPinBetterEnabled) { pinConfiguration = new PinConfiguration(); if (_distributedSettings.PinRisk.HasValue) { pinConfiguration.PinRisk = _distributedSettings.PinRisk.Value; } if (_distributedSettings.MachineRisk.HasValue) { pinConfiguration.MachineRisk = _distributedSettings.MachineRisk.Value; } if (_distributedSettings.FileRisk.HasValue) { pinConfiguration.FileRisk = _distributedSettings.FileRisk.Value; } if (_distributedSettings.MaxIOOperations.HasValue) { pinConfiguration.MaxIOOperations = _distributedSettings.MaxIOOperations.Value; } pinConfiguration.UsePinCache = _distributedSettings.IsPinCachingEnabled; if (_distributedSettings.PinCacheReplicaCreditRetentionMinutes.HasValue) { pinConfiguration.PinCacheReplicaCreditRetentionMinutes = _distributedSettings.PinCacheReplicaCreditRetentionMinutes.Value; } if (_distributedSettings.PinCacheReplicaCreditRetentionDecay.HasValue) { pinConfiguration.PinCacheReplicaCreditRetentionDecay = _distributedSettings.PinCacheReplicaCreditRetentionDecay.Value; } } var contentHashBumpTime = TimeSpan.FromMinutes(_distributedSettings.ContentHashBumpTimeMinutes); var lazyTouchContentHashBumpTime = _distributedSettings.IsTouchEnabled ? (TimeSpan?)contentHashBumpTime : null; if (redisContentLocationStoreConfiguration.ReadMode == ContentLocationMode.LocalLocationStore) { // LocalLocationStore has its own internal notion of lazy touch/registration. We disable the lazy touch in distributed content store // because it can conflict with behavior of the local location store. lazyTouchContentHashBumpTime = null; } var contentStoreSettings = FromDistributedSettings(_distributedSettings); ConfigurationModel configurationModel = null; if (_arguments.Configuration.LocalCasSettings.CacheSettingsByCacheName.TryGetValue(_arguments.Configuration.LocalCasSettings.CasClientSettings.DefaultCacheName, out var namedCacheSettings)) { configurationModel = new ConfigurationModel(new ContentStoreConfiguration(new MaxSizeQuota(namedCacheSettings.CacheSizeQuotaString))); } var bandwidthCheckedCopier = new BandwidthCheckedCopier(_arguments.Copier, BandwidthChecker.Configuration.FromDistributedContentSettings(_distributedSettings), _logger); _logger.Debug("Creating a distributed content store for Autopilot"); var contentStore = new DistributedContentStore <AbsolutePath>( localMachineLocation, (announcer, evictionSettings, checkLocal, trimBulk) => ContentStoreFactory.CreateContentStore(_fileSystem, localCacheRoot, announcer, distributedEvictionSettings: evictionSettings, contentStoreSettings: contentStoreSettings, trimBulkAsync: trimBulk, configurationModel: configurationModel), redisContentLocationStoreFactory, _arguments.Copier, bandwidthCheckedCopier, _arguments.PathTransformer, _arguments.CopyRequester, contentAvailabilityGuarantee, localCacheRoot, _fileSystem, _distributedSettings.RedisBatchPageSize, new DistributedContentStoreSettings() { UseTrustedHash = _distributedSettings.UseTrustedHash, CleanRandomFilesAtRoot = _distributedSettings.CleanRandomFilesAtRoot, TrustedHashFileSizeBoundary = _distributedSettings.TrustedHashFileSizeBoundary, ParallelHashingFileSizeBoundary = _distributedSettings.ParallelHashingFileSizeBoundary, MaxConcurrentCopyOperations = _distributedSettings.MaxConcurrentCopyOperations, PinConfiguration = pinConfiguration, EmptyFileHashShortcutEnabled = _distributedSettings.EmptyFileHashShortcutEnabled, RetryIntervalForCopies = _distributedSettings.RetryIntervalForCopies, MaxRetryCount = _distributedSettings.MaxRetryCount, TimeoutForProactiveCopies = TimeSpan.FromMinutes(_distributedSettings.TimeoutForProactiveCopiesMinutes), ProactiveCopyMode = (ProactiveCopyMode)Enum.Parse(typeof(ProactiveCopyMode), _distributedSettings.ProactiveCopyMode), MaxConcurrentProactiveCopyOperations = _distributedSettings.MaxConcurrentProactiveCopyOperations, ProactiveCopyLocationsThreshold = _distributedSettings.ProactiveCopyLocationsThreshold, MaximumConcurrentPutFileOperations = _distributedSettings.MaximumConcurrentPutFileOperations, }, replicaCreditInMinutes: _distributedSettings.IsDistributedEvictionEnabled?_distributedSettings.ReplicaCreditInMinutes: null, enableRepairHandling: _distributedSettings.IsRepairHandlingEnabled, contentHashBumpTime: lazyTouchContentHashBumpTime, contentStoreSettings: contentStoreSettings); _logger.Debug("Created Distributed content store."); return(contentStore); }