/// <inheritdoc />
        public async Task <Possible <CasHash, Failure> > AddToCasAsync(
            string filename,
            FileState fileState,
            CasHash?hash,
            UrgencyHint urgencyHint,
            Guid activityId)
        {
            if (m_outOfSpace)
            {
                return(new CacheFailure(s_outOfSpaceError[0]));
            }

            PutResult result;

            if (hash.HasValue)
            {
                result = await CacheSession.PutFileAsync(
                    new Context(Logger),
                    hash.Value.ToContentHash(),
                    new BuildXL.Cache.ContentStore.Interfaces.FileSystem.AbsolutePath(filename),
                    fileState.ToMemoization(),
                    CancellationToken.None,
                    urgencyHint.ToMemoization());
            }
            else
            {
                result = await CacheSession.PutFileAsync(
                    new Context(Logger),
                    ContentHashingUtilities.HashInfo.HashType,
                    new BuildXL.Cache.ContentStore.Interfaces.FileSystem.AbsolutePath(filename),
                    fileState.ToMemoization(),
                    CancellationToken.None,
                    urgencyHint.ToMemoization());
            }

            if (result.Succeeded)
            {
                return(result.ContentHash.FromMemoization());
            }

            string outOfSpaceError;

            if (!m_outOfSpace && IsOutOfSpacePut(result, out outOfSpaceError))
            {
                m_outOfSpace = true;
            }

            return(new CacheFailure(result.ErrorMessage));
        }
        public async Task <Possible <FullCacheRecordWithDeterminism, Failure> > AddOrGetAsync(WeakFingerprintHash weak, CasHash casElement, Hash hashElement, CasEntries hashes, UrgencyHint urgencyHint, Guid activityId)
        {
            var addResult = await CacheSession.AddOrGetContentHashListAsync(
                new Context(Logger),
                new BuildXL.Cache.MemoizationStore.Interfaces.Sessions.StrongFingerprint(
                    weak.ToMemoization(),
                    new Selector(casElement.ToMemoization(), hashElement.RawHash.ToByteArray())),
                hashes.ToMemoization(),
                CancellationToken.None,
                urgencyHint.ToMemoization());

            var strong = new StrongFingerprint(weak, casElement, hashElement, CacheId);

            switch (addResult.Code)
            {
            case AddOrGetContentHashListResult.ResultCode.Success:
                SessionEntries?.TryAdd(strong, 1);

                return(addResult.ContentHashListWithDeterminism.ContentHashList == null
                        ? new FullCacheRecordWithDeterminism(addResult.ContentHashListWithDeterminism.Determinism.FromMemoization())
                        : new FullCacheRecordWithDeterminism(new FullCacheRecord(strong, addResult.ContentHashListWithDeterminism.FromMemoization())));

            case AddOrGetContentHashListResult.ResultCode.SinglePhaseMixingError:
                return(new SinglePhaseMixingFailure(CacheId));

            case AddOrGetContentHashListResult.ResultCode.InvalidToolDeterminismError:
                return(new NotDeterministicFailure(
                           CacheId,
                           new FullCacheRecord(strong, addResult.ContentHashListWithDeterminism.FromMemoization()),
                           new FullCacheRecord(strong, hashes)));

            case AddOrGetContentHashListResult.ResultCode.Error:
                return(new CacheFailure(addResult.ErrorMessage));

            default:
                return(new CacheFailure("Unrecognized AddOrGetContentHashListAsync result code: " + addResult.Code + ", error message: " + (addResult.ErrorMessage ?? string.Empty)));
            }
        }
        /// <inheritdoc />
        public async Task <Possible <CasHash, Failure> > AddToCasAsync(Stream filestream, CasHash?hash, UrgencyHint urgencyHint, Guid activityId)
        {
            if (m_outOfSpace)
            {
                return(new CacheFailure(s_outOfSpaceError[0]));
            }

            PutResult result;

            if (hash.HasValue)
            {
                result = await CacheSession.PutStreamAsync(new Context(Logger), hash.Value.ToContentHash(), filestream, CancellationToken.None, urgencyHint.ToMemoization());
            }
            else
            {
                result = await CacheSession.PutStreamAsync(new Context(Logger), ContentHashingUtilities.HashInfo.HashType, filestream, CancellationToken.None, urgencyHint.ToMemoization());
            }

            if (result.Succeeded)
            {
                return(result.ContentHash.FromMemoization());
            }

            string outOfSpaceError;

            if (!m_outOfSpace && IsOutOfSpacePut(result, out outOfSpaceError))
            {
                m_outOfSpace = true;
            }

            return(new CacheFailure(result.ErrorMessage));
        }