コード例 #1
0
        public virtual Tuple <object, bool> Fill(FreshnessRequest freshness)
        {
            HttpCacheShim.Log("Fill", () => "(" + freshness + ") " + Name);

            var keyString = Name;
            var startTime = DateTime.UtcNow;
            var started   = s_RunningQueries.TryAdd(keyString, startTime);

            try
            {
                if (started)
                {
                    var backfilling = freshness == FreshnessRequest.AsyncBackfill;

                    if (backfilling)
                    {
                        if (NumberOfRefillsRemaining > 0)
                        {
                            NumberOfRefillsRemaining--;
                        }

                        HttpCacheShim.Log("Refiller", () => "backfilling " + Name + " remaining " + NumberOfRefillsRemaining);
                    }

                    var result = Filler(freshness);
                    return(Tuple.Create(result, false));
                }
                else
                {
                    HttpCacheShim.Log("Refiller", () => keyString + " already inflight");
                    return(Tuple.Create(default(object), true));
                }
            }
            finally
            {
                if (started)
                {
                    var endTime = DateTime.UtcNow;
                    s_RunningQueries.TryRemove(keyString, out startTime);
                    HttpCacheShim.Log("Refiller", () => keyString + " @" + startTime + " [" + (endTime - startTime) + "]");
                }
            }
        }
コード例 #2
0
 public static bool TryParse(this string value, out FreshnessRequest desiredFreshness)
 {
     return value.TryParse(out desiredFreshness, FreshnessRequest.Normal);
 }
コード例 #3
0
        public new Tuple <T, bool> Fill(FreshnessRequest freshness)
        {
            var result = base.Fill(freshness);

            return(Tuple.Create <T, bool>(result.Item1 as T, result.Item2));
        }
コード例 #4
0
        private IList <IBaseCacheKey> Refiller <TElement>(
            FreshnessRequest freshness,
            IBaseCacheKey collectionKey,
            Func <FreshnessRequest, IList <TElement> > filler,
            Func <IBaseCacheKey, TElement, IBaseCacheKey>[] keyProjections)
            where TElement : class
        {
            IList <IBaseCacheKey> keys = null;
            var parameters             = BuildParameters(collectionKey, filler);
            var result = parameters.Fill(freshness);

            if (result.Item2 || result.Item1 == null)
            {
                return(keys);
            }

            var list = result.Item1;
            // clear ALL cache if null return from backing store used to be here...

            // do NOT store in cache yet, this is not the correct answer-set type yet.
            var elementPolicies = new ICachePolicy[keyProjections.Length];

            keys = new List <IBaseCacheKey>(list.Count);

            foreach (var element in list)
            {
                var collectionPolicy = collectionKey.Policy;
                int whichProjection  = 0;

                foreach (var projection in keyProjections)
                {
                    var elementKey = projection(collectionKey, element);
                    if (elementKey == null) // ignore null key projections
                    {
                        continue;
                    }

                    var elementPolicy = elementPolicies[whichProjection];

                    if (elementPolicy == null)
                    {
                        elementPolicy             = elementKey.Policy.Clone();
                        elementPolicy.RefillCount = 0;  // we never refill from underneath

                        if (elementPolicy.AbsoluteSeconds > 0)
                        {
                            if (elementPolicy.AbsoluteSeconds <= collectionPolicy.AbsoluteSeconds)
                            {
                                elementPolicy.AbsoluteSeconds = collectionPolicy.AbsoluteSeconds + 10; // to help serialized expiriation!
                            }
                        }
                        else if (elementPolicy.SlidingSeconds > 0)
                        {
                            if (elementPolicy.SlidingSeconds <= collectionPolicy.SlidingSeconds)
                            {
                                elementPolicy.SlidingSeconds = collectionPolicy.SlidingSeconds + 10; // to help serialized expiriation!
                            }
                        }

                        elementPolicies[whichProjection] = elementPolicy;
                    }

                    // TODO still not right, Marc
                    InternalPut(BuildParameters(
                                    elementKey.Key
                                    , elementPolicy
                                    , ICacheHelper.Once(element))
                                , element);

                    if (whichProjection++ == 0)
                    {
                        keys.Add(elementKey);
                    }
                }
            }

            return(keys);
        }