// scan the cacheurls table, compare uris with counts > 0 to uris in cache, if match then evict uri and decrement count public static void MaybePurgeCache(ICache cache) { try { var purgeable_entities = FetchPurgeableCacheDicts(); GenUtils.LogMsg("status", String.Format("MaybePurgeCache: {0} purgeable entities", purgeable_entities.Count), null); foreach (var purgeable_entity in purgeable_entities) { var purgeable_cache_url = (string)purgeable_entity["cached_uri"]; if (cache[purgeable_cache_url] != null) { GenUtils.LogMsg("status", "MaybePurgeCache", purgeable_cache_url); cache.Remove(purgeable_cache_url); var obj = HttpUtils.FetchUrl(new Uri(purgeable_cache_url)); // rewarm the cache var count = (int)purgeable_entity["count"]; count -= 1; if (count < 0) { count = 0; GenUtils.LogMsg("warning", "CacheUtils.MaybePurgeCache", "count went subzero, reset to zero"); } purgeable_entity["count"] = count; var rowkey = TableStorage.MakeSafeRowkeyFromUrl(purgeable_cache_url); ts.UpdateEntity(cache_control_tablename, cache_control_partkey, rowkey, purgeable_entity); } } } catch (Exception e) { GenUtils.PriorityLogMsg("exception", "MaybePurgeCache", e.Message + e.StackTrace); } }
// called from CombineZonedEventStoresToZonelessEventStore at the end of an aggregation // bumps the counters in the cacheurls table to equal the number of webroles running public static void MarkBaseCacheEntryForRemoval(string cached_uri, int instance_count) { var entity = new Dictionary <string, object>(); entity.Add("cached_uri", cached_uri); entity.Add("count", instance_count); var rowkey = TableStorage.MakeSafeRowkeyFromUrl(cached_uri); //ts.UpdateEntity(cache_control_tablename, cache_control_partkey, rowkey, entity); TableStorage.DictObjToTableStore(TableStorage.Operation.update, entity, cache_control_tablename, cache_control_partkey, rowkey); }