/// <summary> /// For revocable items , move over all revoke ids in cache index and remove them. /// </summary> private void ItemRemovedCallback(CacheEntryRemovedArguments arguments) { var cachedItem = ((AsyncCacheItem)arguments.CacheItem.Value).CurrentValueTask; if (cachedItem.Status == TaskStatus.RanToCompletion && (cachedItem.Result as IRevocable)?.RevokeKeys != null) { foreach (var revocationKey in ((IRevocable)cachedItem.Result).RevokeKeys) { HashSet <string> cacheKeys; if (RevokeKeyToCacheKeysIndex.TryGetValue(revocationKey, out cacheKeys)) { lock (cacheKeys) { cacheKeys.Remove(arguments.CacheItem.Key); if (!cacheKeys.Any()) { RevokeKeyToCacheKeysIndex.TryRemove(revocationKey, out cacheKeys); } } } } } Items.Meter(arguments.RemovedReason.ToString(), Unit.Items); }
/// <summary> /// For revocable items , move over all revoke ids in cache index and remove them. /// </summary> private void ItemRemovedCallback(CacheEntryRemovedArguments arguments) { var cacheItem = arguments.CacheItem.Value as AsyncCacheItem; var shouldLog = ShouldLog(cacheItem?.GroupName); if (shouldLog) { Log.Info(x => x("Item removed from cache", unencryptedTags: new { cacheKey = arguments.CacheItem.Key, removeReason = arguments.RemovedReason.ToString(), cacheGroup = cacheItem?.GroupName, cacheData = cacheItem?.LogData })); } var cachedItem = ((AsyncCacheItem)arguments.CacheItem.Value).CurrentValueTask; if (cachedItem.Status == TaskStatus.RanToCompletion && (cachedItem.Result as IRevocable)?.RevokeKeys != null && !MemoryCache.Contains(arguments.CacheItem.Key)) //We want to remove items from reverseIndex only if they are not in MemoryCache { //In MemoryCache.Set flow, we get here, but item is still in cache - so we skip removal foreach (var revokeKey in ((IRevocable)cachedItem.Result).RevokeKeys) { if (RevokeKeyToCacheKeysIndex.TryGetValue(revokeKey, out HashSet <string> cacheKeys)) { lock (cacheKeys) { cacheKeys.Remove(arguments.CacheItem.Key); Log.Info(x => x("RevokeKey removed from reverse index", unencryptedTags: new { cacheKey = arguments.CacheItem.Key, revokeKey = revokeKey, removeReason = arguments.RemovedReason.ToString(), cacheGroup = cacheItem?.GroupName, cacheData = cacheItem?.LogData })); if (!cacheKeys.Any()) { if (RevokeKeyToCacheKeysIndex.TryRemove(revokeKey, out _) && shouldLog) { Log.Info(x => x("Reverse index for cache item was removed", unencryptedTags: new { cacheKey = arguments.CacheItem.Key, removeReason = arguments.RemovedReason.ToString(), cacheGroup = cacheItem?.GroupName, cacheData = cacheItem?.LogData })); } } } } } } Items.Meter(arguments.RemovedReason.ToString(), Unit.Items).Mark(); }
/// <summary> /// For revocable items , move over all revoke ids in cache index and remove them. /// </summary> private void ItemRemovedCallback(CacheEntryRemovedArguments arguments) { var cacheItem = arguments.CacheItem.Value as AsyncCacheItem; var shouldLog = ShouldLog(cacheItem?.GroupName); if (shouldLog) { Log.Info(x => x("Item removed from cache", unencryptedTags: new { cacheKey = arguments.CacheItem.Key, removeReason = arguments.RemovedReason.ToString(), cacheGroup = cacheItem?.GroupName, cacheData = cacheItem?.LogData })); } var cachedItem = ((AsyncCacheItem)arguments.CacheItem.Value).CurrentValueTask; if (cachedItem.Status == TaskStatus.RanToCompletion && (cachedItem.Result as IRevocable)?.RevokeKeys != null) { foreach (var revokeKey in ((IRevocable)cachedItem.Result).RevokeKeys) { if (RevokeKeyToCacheKeysIndex.TryGetValue(revokeKey, out HashSet <string> cacheKeys)) { lock (cacheKeys) { cacheKeys.Remove(arguments.CacheItem.Key); Log.Info(x => x("RevokeKey removed from reverse index", unencryptedTags: new { cacheKey = arguments.CacheItem.Key, revokeKey = revokeKey, removeReason = arguments.RemovedReason.ToString(), cacheGroup = cacheItem?.GroupName, cacheData = cacheItem?.LogData })); if (!cacheKeys.Any()) { if (RevokeKeyToCacheKeysIndex.TryRemove(revokeKey, out _) && shouldLog) { Log.Info(x => x("Reverse index for cache item was removed", unencryptedTags: new { cacheKey = arguments.CacheItem.Key, removeReason = arguments.RemovedReason.ToString(), cacheGroup = cacheItem?.GroupName, cacheData = cacheItem?.LogData })); } } } } } } }