Exemplo n.º 1
0
        private async Task <BoolResult> PushToRemoteAsync(OperationContext context, IReadOnlyList <ContentHash> hashes)
        {
            Contract.Check(_publisher != null)?.Assert("Startup should be run before attempting to publish.");

            var pinResults = await Task.WhenAll(await _sourceContentSession.PinAsync(context, hashes, context.Token));

            var missingFromLocal = pinResults.Where(r => !r.Item.Succeeded);

            if (missingFromLocal.Any())
            {
                return(new BoolResult($"Not all contents of the content hash list are available in the cache. Missing hashes: {string.Join(", ", missingFromLocal.Select(m => hashes[m.Index].ToShortString()))}"));
            }

            // TODO: concurrency?
            foreach (var hash in hashes)
            {
                var streamResult = await _sourceContentSession.OpenStreamAsync(context, hash, context.Token).ThrowIfFailure();

                var stream = streamResult.Stream;

                var putStreamResult = await _publisher.PutStreamAsync(context, hash, stream, context.Token).ThrowIfFailure();
            }

            return(BoolResult.Success);
        }
Exemplo n.º 2
0
        private async Task UploadContent(
            Context context, ContentHash contentHash, IContentSession fromSession, IContentSession toSession)
        {
            var openStreamResult = await fromSession.OpenStreamAsync(context, contentHash, Token).ConfigureAwait(false);

            openStreamResult.Succeeded.Should().BeTrue();
            var putResult = await toSession.PutStreamAsync(context, contentHash, openStreamResult.Stream, Token).ConfigureAwait(false);

            putResult.Succeeded.Should().BeTrue();
        }
Exemplo n.º 3
0
        /// <inheritdoc />
        public async Task <OpenStreamResult> OpenStreamAsync(
            Context context,
            ContentHash contentHash,
            CancellationToken cts,
            UrgencyHint urgencyHint = UrgencyHint.Nominal)
        {
            var openStreamResult = await _sessionForStream.OpenStreamAsync(context, contentHash, cts, urgencyHint);

            if (openStreamResult.Code == OpenStreamResult.ResultCode.ContentNotFound)
            {
                openStreamResult = await _sessionForPath.OpenStreamAsync(context, contentHash, cts, urgencyHint);
            }

            return(openStreamResult);
        }
        private async Task <ObjectResult <ContentHashListWithCacheMetadata> > UnpackBlobContentHashListAsync(Context context, BlobContentHashListWithCacheMetadata blobCacheMetadata)
        {
            Contract.Assert(blobCacheMetadata != null);
            if (blobCacheMetadata.ContentHashListWithDeterminism.BlobIdentifier == null)
            {
                return(new ObjectResult <ContentHashListWithCacheMetadata>(
                           new ContentHashListWithCacheMetadata(
                               new ContentHashListWithDeterminism(null, blobCacheMetadata.Determinism),
                               blobCacheMetadata.GetRawExpirationTimeUtc(),
                               blobCacheMetadata.ContentGuarantee,
                               blobCacheMetadata.HashOfExistingContentHashList)));
            }

            BlobIdentifier blobId = blobCacheMetadata.ContentHashListWithDeterminism.BlobIdentifier;

            Func <ContentHash, CancellationToken, Task <ObjectResult <Stream> > > openStreamFunc = async(hash, cts) =>
            {
                OpenStreamResult openStreamResult = await _blobContentSession.OpenStreamAsync(context, hash, cts);

                if (openStreamResult.Succeeded)
                {
                    return(new ObjectResult <Stream>(openStreamResult.Stream));
                }

                return(new ObjectResult <Stream>(openStreamResult));
            };

            StructResult <ContentHashListWithDeterminism> contentHashListResult =
                await BlobContentHashListExtensions.UnpackFromBlob(
                    openStreamFunc,
                    blobId);

            if (contentHashListResult.Succeeded)
            {
                var contentHashListWithCacheMetadata = new ContentHashListWithCacheMetadata(
                    contentHashListResult.Data,
                    blobCacheMetadata.GetRawExpirationTimeUtc(),
                    blobCacheMetadata.ContentGuarantee,
                    blobCacheMetadata.HashOfExistingContentHashList);
                return(new ObjectResult <ContentHashListWithCacheMetadata>(contentHashListWithCacheMetadata));
            }
            else
            {
                return(new ObjectResult <ContentHashListWithCacheMetadata>(contentHashListResult));
            }
        }
        /// <inheritdoc />
        public Task <OpenStreamResult> OpenStreamAsync(
            Context context, ContentHash contentHash, CancellationToken cts, UrgencyHint urgencyHint)
        {
            return(OpenStreamCall <ContentSessionTracer> .RunAsync(Tracer.ContentSessionTracer, new OperationContext(context), contentHash, async() =>
            {
                if (WriteThroughContentSession != null)
                {
                    var result =
                        await WriteThroughContentSession.OpenStreamAsync(context, contentHash, cts, urgencyHint).ConfigureAwait(false);
                    if (result.Succeeded || result.Code != OpenStreamResult.ResultCode.ContentNotFound)
                    {
                        return result;
                    }
                }

                return await BackingContentSession.OpenStreamAsync(context, contentHash, cts, urgencyHint).ConfigureAwait(false);
            }));
        }
Exemplo n.º 6
0
 /// <inheritdoc />
 protected override Task <OpenStreamResult> OpenStreamCoreAsync(OperationContext operationContext, ContentHash contentHash, UrgencyHint urgencyHint, Counter retryCounter)
 {
     return(_innerSession.OpenStreamAsync(operationContext, contentHash, operationContext.Token, urgencyHint));
 }