/// <summary> /// Método interno usado para inserir uma nova entrada no cache. /// </summary> /// <param name="key">Chave que representa a entrada.</param> /// <param name="cacheEntry">Instancia da entrada.</param> /// <param name="isUserOperation">True se for uma operação do usuário.</param> /// <param name="oldEntry">Valor da antiga entrada.</param> /// <param name="operationContext">Contexto da operação.</param> /// <returns>Resulta da operação.</returns> internal override CacheInsResult InsertInternal(object key, CacheEntry cacheEntry, bool isUserOperation, CacheEntry oldEntry, OperationContext operationContext) { if (_cacheStore == null) { throw new InvalidOperationException(); } if (cacheEntry.EvictionHint is PriorityEvictionHint) { cacheEntry.Priority = ((PriorityEvictionHint)cacheEntry.EvictionHint).Priority; } if (_evictionPolicy != null) { cacheEntry.EvictionHint = _evictionPolicy.CompatibleHint(cacheEntry.EvictionHint); } EvictionHint oldhint = (oldEntry == null) ? null : oldEntry.EvictionHint; StoreInsResult result = _cacheStore.Insert(key, cacheEntry); switch (result) { case StoreInsResult.Success: case StoreInsResult.SuccessNearEviction: if (_evictionPolicy != null) { _evictionPolicy.Notify(key, null, cacheEntry.EvictionHint); } break; case StoreInsResult.SuccessOverwrite: case StoreInsResult.SuccessOverwriteNearEviction: if (isUserOperation) { cacheEntry.UpdateVersion(oldEntry); } cacheEntry.UpdateLastModifiedTime(oldEntry); if (_evictionPolicy != null) { _evictionPolicy.Notify(key, oldhint, cacheEntry.EvictionHint); } break; } switch (result) { case StoreInsResult.Success: return(CacheInsResult.Success); case StoreInsResult.SuccessOverwrite: return(CacheInsResult.SuccessOverwrite); case StoreInsResult.SuccessNearEviction: return(CacheInsResult.SuccessNearEvicition); case StoreInsResult.SuccessOverwriteNearEviction: return(CacheInsResult.SuccessOverwriteNearEviction); case StoreInsResult.NotEnoughSpace: return(CacheInsResult.NeedsEviction); } return(CacheInsResult.Failure); }
/// <summary> /// Adds a pair of key and value to the cache. If the specified key already exists /// in the cache; it is updated, otherwise a new item is added to the cache. /// </summary> /// <param name="key">key of the entry.</param> /// <param name="cacheEntry">the cache entry.</param> /// <returns>returns the result of operation.</returns> internal override CacheInsResult InsertInternal(object key, CacheEntry cacheEntry, bool isUserOperation, CacheEntry oldEntry, OperationContext operationContext, bool updateIndex) { try { if (cacheEntry != null) { cacheEntry.MarkInUse(NCModulesConstants.LocalCache); } if (_cacheStore == null) { throw new InvalidOperationException(); } if (oldEntry != null && cacheEntry.Type != oldEntry.Type) { throw new Exception(string.Format("Cannot update '{0}' type with '{1}' type.", oldEntry.Type, cacheEntry.Type)); } if (cacheEntry.EvictionHint is PriorityEvictionHint) { cacheEntry.Priority = ((PriorityEvictionHint)cacheEntry.EvictionHint).Priority; } if (_evictionPolicy != null) { EvictionHint oldEvictionHint = cacheEntry.EvictionHint; cacheEntry.EvictionHint = _evictionPolicy.CompatibleHint(cacheEntry.EvictionHint, _context.StorePoolManager); if (oldEvictionHint != null && !ReferenceEquals(oldEvictionHint, cacheEntry.EvictionHint)) { MiscUtil.ReturnEvictionHintToPool(oldEvictionHint, _context.StorePoolManager); } } EvictionHint peEvh = oldEntry == null ? null : oldEntry.EvictionHint; // No Need to insert Eviction if Eviction is turned off it will reduce cache-entry overhead if (_evictionPolicy == null) { cacheEntry.EvictionHint = null; } CacheEntry storedEntry = _cacheStore.Get(key) as CacheEntry; StoreInsResult result = _cacheStore.Insert(key, cacheEntry, !isUserOperation); // Operation completed! if (result == StoreInsResult.Success || result == StoreInsResult.SuccessNearEviction) { //This means that entry has become part of the store cacheEntry.IsStored = true; if (_evictionPolicy != null) { _evictionPolicy.Notify(key, null, cacheEntry.EvictionHint); } if (!object.ReferenceEquals(storedEntry, cacheEntry)) { MiscUtil.ReturnEntryToPool(storedEntry, _context.StorePoolManager); } } else if (result == StoreInsResult.SuccessOverwrite || result == StoreInsResult.SuccessOverwriteNearEviction) { if (!object.ReferenceEquals(storedEntry, cacheEntry)) { MiscUtil.ReturnEntryToPool(storedEntry, _context.StorePoolManager); } //This means that entry has become part of the store cacheEntry.IsStored = true; if (oldEntry != null) { //update the cache item version... if (isUserOperation) { cacheEntry.UpdateVersion(oldEntry); } //update the cache item last modifeid time... cacheEntry.UpdateLastModifiedTime(oldEntry); } if (_evictionPolicy != null) { _evictionPolicy.Notify(key, peEvh, cacheEntry.EvictionHint); } } if (result == StoreInsResult.NotEnoughSpace && !_notifyCacheFull) { _notifyCacheFull = true; _context.NCacheLog.Error("LocalCache.InsertInternal", "The cache is full and not enough items could be evicted."); } if (_context.PerfStatsColl != null) { if (_evictionPolicy != null) { _context.PerfStatsColl.SetEvictionIndexSize((long)_evictionPolicy.IndexInMemorySize); } if (_context.ExpiryMgr != null) { _context.PerfStatsColl.SetExpirationIndexSize((long)_context.ExpiryMgr.IndexInMemorySize); } } switch (result) { case StoreInsResult.Success: return(CacheInsResult.Success); case StoreInsResult.SuccessOverwrite: return(CacheInsResult.SuccessOverwrite); case StoreInsResult.NotEnoughSpace: return(CacheInsResult.NeedsEviction); case StoreInsResult.SuccessNearEviction: return(CacheInsResult.SuccessNearEvicition); case StoreInsResult.SuccessOverwriteNearEviction: return(CacheInsResult.SuccessOverwriteNearEviction); } return(CacheInsResult.Failure); } finally { if (cacheEntry != null) { cacheEntry.MarkFree(NCModulesConstants.LocalCache); } } }
/// <summary> /// Adds a pair of key and value to the cache. If the specified key already exists /// in the cache; it is updated, otherwise a new item is added to the cache. /// </summary> /// <param name="key">key of the entry.</param> /// <param name="cacheEntry">the cache entry.</param> /// <returns>returns the result of operation.</returns> internal override CacheInsResult InsertInternal(object key, CacheEntry cacheEntry, bool isUserOperation, CacheEntry oldEntry, OperationContext operationContext, bool updateIndex) { if (ServerMonitor.MonitorActivity) { ServerMonitor.LogClientActivity("LocalCache.Insert", ""); } if (_cacheStore == null) { throw new InvalidOperationException(); } if (cacheEntry.EvictionHint is PriorityEvictionHint) { cacheEntry.Priority = ((PriorityEvictionHint)cacheEntry.EvictionHint).Priority; } if (_evictionPolicy != null) { cacheEntry.EvictionHint = _evictionPolicy.CompatibleHint(cacheEntry.EvictionHint); } EvictionHint peEvh = oldEntry == null ? null : oldEntry.EvictionHint; // No Need to insert Eviction if Eviction is turned off it will reduce cache-entry overhead if (_evictionPolicy == null) { cacheEntry.EvictionHint = null; } // StoreInsResult result = _cacheStore.Insert(key, cacheEntry, !isUserOperation); // Operation completed! if (result == StoreInsResult.Success || result == StoreInsResult.SuccessNearEviction) { if (_evictionPolicy != null) { _evictionPolicy.Notify(key, null, cacheEntry.EvictionHint); } } else if (result == StoreInsResult.SuccessOverwrite || result == StoreInsResult.SuccessOverwriteNearEviction) { //update the cache item last modifeid time... cacheEntry.UpdateLastModifiedTime(oldEntry); if (_evictionPolicy != null) { _evictionPolicy.Notify(key, peEvh, cacheEntry.EvictionHint); } } if (result == StoreInsResult.NotEnoughSpace && !_notifyCacheFull) { _notifyCacheFull = true; _context.NCacheLog.Error("LocalCache.InsertInternal", "The cache is full and not enough items could be evicted."); } if (_context.PerfStatsColl != null) { if (_evictionPolicy != null) { _context.PerfStatsColl.SetEvictionIndexSize((long)_evictionPolicy.IndexInMemorySize); } if (_context.ExpiryMgr != null) { _context.PerfStatsColl.SetExpirationIndexSize((long)_context.ExpiryMgr.IndexInMemorySize); } } switch (result) { case StoreInsResult.Success: return(CacheInsResult.Success); case StoreInsResult.SuccessOverwrite: return(CacheInsResult.SuccessOverwrite); case StoreInsResult.NotEnoughSpace: return(CacheInsResult.NeedsEviction); case StoreInsResult.SuccessNearEviction: return(CacheInsResult.SuccessNearEvicition); case StoreInsResult.SuccessOverwriteNearEviction: return(CacheInsResult.SuccessOverwriteNearEviction); } return(CacheInsResult.Failure); }