コード例 #1
0
        public CreateSessionResult <ICacheSession> CreateSession(Context context, string name, ImplicitPin implicitPin)
        {
            Contract.Requires(ContentStore != null);
            Contract.Requires(MemoizationStore != null);

            return(Tracing.CreateSessionCall.Run(CacheTracer, context, name, () =>
            {
                var createContentResult = ContentStore.CreateSession(context, name, implicitPin);
                if (!createContentResult)
                {
                    return new CreateSessionResult <ICacheSession>(createContentResult, "Content session creation failed");
                }

                var contentSession = createContentResult.Session;

                var createMemoizationResult = _passContentToMemoization
                    ? MemoizationStore.CreateSession(context, name, contentSession)
                    : MemoizationStore.CreateSession(context, name);

                if (!createMemoizationResult)
                {
                    return new CreateSessionResult <ICacheSession>(createMemoizationResult, "Memoization session creation failed");
                }

                var memoizationSession = createMemoizationResult.Session;

                var session = new OneLevelCacheSession(name, implicitPin, memoizationSession, contentSession);
                return new CreateSessionResult <ICacheSession>(session);
            }));
        }
コード例 #2
0
 /// <inheritdoc />
 public Task <AddOrGetContentHashListResult> AddOrGetContentHashListAsync(
     Context context,
     StrongFingerprint strongFingerprint,
     ContentHashListWithDeterminism contentHashListWithDeterminism,
     CancellationToken cts,
     UrgencyHint urgencyHint)
 {
     return(MemoizationStore.AddOrGetContentHashListAsync(
                context, strongFingerprint, contentHashListWithDeterminism, _contentSession, cts));
 }
コード例 #3
0
        /// <inheritdoc />
        protected override async Task <BoolResult> StartupCoreAsync(OperationContext context)
        {
            (var contentStoreResult, var memoizationStoreResult) = await CreateAndStartStoresAsync(context);

            Contract.Assert(ContentStore != null, "Content store must be initialized");
            Contract.Assert(MemoizationStore != null, "Memoization store must be initialized");
            Contract.Assert(!ReferenceEquals(ContentStore, MemoizationStore));

            BoolResult result;

            if (!contentStoreResult.Succeeded || !memoizationStoreResult.Succeeded)
            {
                var sb = new StringBuilder();

                if (contentStoreResult.Succeeded)
                {
                    var r = await ContentStore.ShutdownAsync(context).ConfigureAwait(false);

                    if (!r.Succeeded)
                    {
                        sb.Append($"Content store shutdown failed, error=[{r}]");
                    }
                }
                else
                {
                    sb.Append($"Content store startup failed, error=[{contentStoreResult}]");
                }

                if (memoizationStoreResult.Succeeded)
                {
                    var r = await MemoizationStore.ShutdownAsync(context).ConfigureAwait(false);

                    if (!r.Succeeded)
                    {
                        sb.Append(sb.Length > 0 ? ", " : string.Empty);
                        sb.Append($"Memoization store shutdown failed, error=[{memoizationStoreResult}]");
                    }
                }
                else
                {
                    sb.Append(sb.Length > 0 ? ", " : string.Empty);
                    sb.Append($"Memoization store startup failed, error=[{memoizationStoreResult}]");
                }

                result = new BoolResult(sb.ToString());
            }
            else
            {
                result = BoolResult.Success;
            }

            return(result);
        }
コード例 #4
0
        /// <inheritdoc />
        protected override async Task <(BoolResult contentStoreResult, BoolResult memoizationStoreResult)> CreateAndStartStoresAsync(OperationContext context)
        {
            ContentStore     = _contentStoreFunc();
            MemoizationStore = _memoizationStoreFunc();

            var preStartupResult = await PreStartupAsync(context).ThrowIfFailure();

            var contentStoreTask       = Task.Run(() => ContentStore.StartupAsync(context));
            var memoizationStoreResult = await MemoizationStore.StartupAsync(context).ConfigureAwait(false);

            var contentStoreResult = await contentStoreTask.ConfigureAwait(false);

            return(contentStoreResult, memoizationStoreResult);
        }
コード例 #5
0
        /// <inheritdoc />
        protected override async Task <BoolResult> ShutdownCoreAsync(OperationContext context)
        {
            var statsResult = await StatsAsync(context).ConfigureAwait(false);

            var contentStoreTask       = Task.Run(() => ContentStore.ShutdownAsync(context));
            var memoizationStoreResult = await MemoizationStore.ShutdownAsync(context).ConfigureAwait(false);

            var contentStoreResult = await contentStoreTask.ConfigureAwait(false);

            BoolResult result;

            if (contentStoreResult.Succeeded && memoizationStoreResult.Succeeded)
            {
                result = BoolResult.Success;
            }
            else
            {
                var sb = new StringBuilder();
                if (!contentStoreResult.Succeeded)
                {
                    sb.Append($"Content store shutdown failed, error=[{contentStoreResult}]");
                }

                if (!memoizationStoreResult.Succeeded)
                {
                    sb.Append(sb.Length > 0 ? ", " : string.Empty);
                    sb.Append($"Memoization store shutdown failed, error=[{memoizationStoreResult}]");
                }

                result = new BoolResult(sb.ToString());
            }

            if (statsResult.Succeeded)
            {
#if NET_FRAMEWORK
                LocalCacheStatsEventSource.Instance.Stats(statsResult.CounterSet);
#endif
                statsResult.CounterSet.LogOrderedNameValuePairs(s => Tracer.Debug(context, s));
            }

            return(result);
        }
コード例 #6
0
        protected override async Task <BoolResult> StartupCoreAsync(OperationContext context)
        {
            var(contentStoreResult, memoizationStoreResult) = await CreateAndStartStoresAsync(context);

            if (contentStoreResult.Succeeded && memoizationStoreResult.Succeeded)
            {
                // The properties must be initialized but only when the startup succeeded.
                Contract.Assert(ContentStore != null, "Content store must be initialized");
                Contract.Assert(MemoizationStore != null, "Memoization store must be initialized");
                Contract.Assert(!ReferenceEquals(ContentStore, MemoizationStore), "ContentStore and MemoizationStore should not be the same.");

                return(BoolResult.Success);
            }
            else
            {
                // One of the startup operations failed.
                var sb = new StringBuilder();

                AppendIfError(sb, "Content store startup", contentStoreResult);

                if (contentStoreResult)
                {
                    Contract.Assert(ContentStore != null, "Content store must be initialized");
                    var r = await ContentStore.ShutdownAsync(context).ConfigureAwait(false);

                    AppendIfError(sb, "Content store shutdown", r);
                }

                AppendIfError(sb, "Memoization store startup", memoizationStoreResult);
                if (memoizationStoreResult)
                {
                    Contract.Assert(MemoizationStore != null, "Memoization store must be initialized");
                    var r = await MemoizationStore.ShutdownAsync(context).ConfigureAwait(false);

                    AppendIfError(sb, "Memoization store shutdown", r);
                }

                return(new BoolResult(sb.ToString()));
            }
        }
コード例 #7
0
        /// <inheritdoc />
        public CreateSessionResult <IReadOnlyCacheSession> CreateReadOnlySession(Context context, string name, ImplicitPin implicitPin)
        {
            return(Tracing.CreateReadOnlySessionCall.Run(CacheTracer, context, name, () =>
            {
                var createContentResult = ContentStore.CreateReadOnlySession(context, name, implicitPin);
                if (!createContentResult.Succeeded)
                {
                    return new CreateSessionResult <IReadOnlyCacheSession>(createContentResult, "Content session creation failed");
                }
                var contentReadOnlySession = createContentResult.Session;

                var createMemoizationResult = MemoizationStore.CreateReadOnlySession(context, name);
                if (!createMemoizationResult.Succeeded)
                {
                    return new CreateSessionResult <IReadOnlyCacheSession>(createMemoizationResult, "Memoization session creation failed");
                }
                var memoizationReadOnlySession = createMemoizationResult.Session;

                var session = new ReadOnlyOneLevelCacheSession(name, implicitPin, memoizationReadOnlySession, contentReadOnlySession);
                return new CreateSessionResult <IReadOnlyCacheSession>(session);
            }));
        }
コード例 #8
0
        private async Task <GetStatsResult> StatsAsync(Context context)
        {
            var counters = new CounterSet();

            var statsResult = await ContentStore.GetStatsAsync(context).ConfigureAwait(false);

            if (!statsResult.Succeeded)
            {
                return(statsResult);
            }

            counters.Merge(statsResult.CounterSet);

            statsResult = await MemoizationStore.GetStatsAsync(context).ConfigureAwait(false);

            if (!statsResult.Succeeded)
            {
                return(statsResult);
            }

            counters.Merge(statsResult.CounterSet);

            return(new GetStatsResult(counters));
        }
コード例 #9
0
 protected override void DisposeCore()
 {
     MemoizationStore?.Dispose();
     ContentStore?.Dispose();
 }
コード例 #10
0
 public IAsyncEnumerable <StructResult <StrongFingerprint> > EnumerateStrongFingerprints(Context context)
 {
     Contract.Assert(MemoizationStore != null, "Memoization store must be initialized");
     return(MemoizationStore.EnumerateStrongFingerprints(context));
 }
コード例 #11
0
 /// <inheritdoc />
 public Async::System.Collections.Generic.IAsyncEnumerable <StructResult <StrongFingerprint> > EnumerateStrongFingerprints(Context context)
 {
     return(MemoizationStore.EnumerateStrongFingerprints(context));
 }