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) + "]"); } } }
public static bool TryParse(this string value, out FreshnessRequest desiredFreshness) { return value.TryParse(out desiredFreshness, FreshnessRequest.Normal); }
public new Tuple <T, bool> Fill(FreshnessRequest freshness) { var result = base.Fill(freshness); return(Tuple.Create <T, bool>(result.Item1 as T, result.Item2)); }
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); }