/// <inheritdoc /> protected override async Task <BoolResult> StartupCoreAsync(OperationContext context) { await _distributedCopier.StartupAsync(context).ThrowIfFailure(); // NOTE: We create and start the content location store before the inner content store just in case the // inner content store starts background eviction after startup. We need the content store to be initialized // so that it can be queried and used to unregister content. await _contentLocationStoreFactory.StartupAsync(context).ThrowIfFailure(); _contentLocationStore = await _contentLocationStoreFactory.CreateAsync(LocalMachineLocation, InnerContentStore as ILocalContentStore); // Initializing inner store before initializing LocalLocationStore because // LocalLocationStore may use inner store for reconciliation purposes await InnerContentStore.StartupAsync(context).ThrowIfFailure(); await _contentLocationStore.StartupAsync(context).ThrowIfFailure(); if (_settings.EnableProactiveReplication && _contentLocationStore is TransitioningContentLocationStore tcs && InnerContentStore is ILocalContentStore localContentStore) { await ProactiveReplicationAsync(context.CreateNested(nameof(DistributedContentStore)), localContentStore, tcs).ThrowIfFailure(); } return(BoolResult.Success); }
/// <inheritdoc /> protected override async Task <BoolResult> StartupCoreAsync(OperationContext context) { // NOTE: We create and start the content location store before the inner content store just in case the // inner content store starts background eviction after startup. We need the content store to be initialized // so that it can be queried and used to unregister content. await _contentLocationStoreFactory.StartupAsync(context).ThrowIfFailure(); _contentLocationStore = await _contentLocationStoreFactory.CreateAsync(); _distributedCopier = _distributedCopierFactory(_contentLocationStore); await _distributedCopier.StartupAsync(context).ThrowIfFailure(); if (_contentLocationStore is TransitioningContentLocationStore tcs) { tcs.LocalLocationStore.PreStartupInitialize(context, InnerContentStore as ILocalContentStore, _distributedCopier); } // Initializing inner store before initializing LocalLocationStore because // LocalLocationStore may use inner store for reconciliation purposes await InnerContentStore.StartupAsync(context).ThrowIfFailure(); await _contentLocationStore.StartupAsync(context).ThrowIfFailure(); Func <ContentHash[], Task> evictionHandler; var localContext = new Context(context); if (_enableDistributedEviction) { evictionHandler = hashes => EvictContentAsync(localContext, hashes); } else { evictionHandler = hashes => DistributedGarbageCollectionAsync(localContext, hashes); } // Queue is created in unstarted state because the eviction function // requires the context passed at startup. So we start the queue here. _evictionNagleQueue.Start(evictionHandler); var touchContext = new Context(context); _touchNagleQueue = NagleQueue <ContentHashWithSize> .Create( hashes => TouchBulkAsync(touchContext, hashes), Redis.RedisContentLocationStoreConstants.BatchDegreeOfParallelism, Redis.RedisContentLocationStoreConstants.BatchInterval, batchSize : _locationStoreBatchSize); return(BoolResult.Success); }
/// <inheritdoc /> protected override async Task <BoolResult> StartupCoreAsync(OperationContext context) { // NOTE: We create and start the content location store before the inner content store just in case the // inner content store starts background eviction after startup. We need the content store to be initialized // so that it can be queried and used to unregister content. await _contentLocationStoreFactory.StartupAsync(context).ThrowIfFailure(); _contentLocationStore = await _contentLocationStoreFactory.CreateAsync(LocalMachineLocation); _distributedCopier = _distributedCopierFactory(_contentLocationStore); await _distributedCopier.StartupAsync(context).ThrowIfFailure(); if (_contentLocationStore is TransitioningContentLocationStore tcs && tcs.IsLocalLocationStoreEnabled) { // Define proactive copy logic. async Task <ResultBase> proactiveCopyTaskFactory(OperationContext operationContext, ContentHash hash) { var sessionResult = await _proactiveCopySession.Value; if (sessionResult) { return(await sessionResult.Value.ProactiveCopyIfNeededAsync(operationContext, hash, tryBuildRing : false)); } return(new BoolResult("Failed to retrieve session for proactive copies.")); } tcs.LocalLocationStore.PreStartupInitialize(context, InnerContentStore as ILocalContentStore, _distributedCopier, proactiveCopyTaskFactory); } // Initializing inner store before initializing LocalLocationStore because // LocalLocationStore may use inner store for reconciliation purposes await InnerContentStore.StartupAsync(context).ThrowIfFailure(); await _contentLocationStore.StartupAsync(context).ThrowIfFailure(); Func <ContentHash[], Task> evictionHandler; var localContext = context.CreateNested(); if (_enableDistributedEviction) { evictionHandler = hashes => EvictContentAsync(localContext, hashes); } else { evictionHandler = hashes => DistributedGarbageCollectionAsync(localContext, hashes); } // Queue is created in unstarted state because the eviction function // requires the context passed at startup. So we start the queue here. _evictionNagleQueue.Start(evictionHandler); var touchContext = context.CreateNested(); _touchNagleQueue = NagleQueue <ContentHashWithSize> .Create( hashes => TouchBulkAsync(touchContext, hashes), Redis.RedisContentLocationStoreConstants.BatchDegreeOfParallelism, Redis.RedisContentLocationStoreConstants.BatchInterval, batchSize : _locationStoreBatchSize); return(BoolResult.Success); }