示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
                }
            }
        }
示例#3
0
        /// <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);
        }