示例#1
0
        /// <summary>
        /// Valida os dados que devem expirar.
        /// </summary>
        /// <returns></returns>
        public bool Expire()
        {
            bool flag = false;

            lock (this)
                _runCount++;
            _sleepInterval    = Convert.ToInt32(ServiceConfiguration.ExpirationBulkRemoveDelay);
            _removeThreshhold = Convert.ToInt32(ServiceConfiguration.ExpirationBulkRemoveSize);
            CacheBase cacheImpl     = _context.CacheImpl;
            CacheBase cacheInternal = _context.CacheInternal;
            Cache     cacheRoot     = _context.CacheRoot;

            if (cacheInternal == null)
            {
                throw new InvalidOperationException("No cache instance defined");
            }
            ArrayList list = new ArrayList();

            new ArrayList();
            int       num       = 0;
            Hashtable hashtable = null;

            try
            {
                this.StartLogging();
                DateTime now         = DateTime.Now;
                int      diffSeconds = CachingUtils.DiffSeconds(now);
                int      num3        = (int)Math.Ceiling((double)(cacheInternal.Count * _cleanRatio));
                if (_cacheLastAccessLoggingIntervalPassed >= _cacheLastAccessLoggingInterval)
                {
                    _cacheLastAccessLoggingInterval     = this.CacheLastAccessLoggingInterval;
                    _cacheLastAccessCountEnabled        = this.IsCacheLastAccessCountEnabled;
                    _cacheLastAccessCountLoggingEnabled = this.IsCacheLastAccessLoggingEnabled;
                    _cacheLastAccessInterval            = this.CacheLastAccessCountInterval;
                }
                else
                {
                    _cacheLastAccessLoggingIntervalPassed++;
                }
                if ((_cacheLastAccessCountEnabled && _cacheLastAccessCountLoggingEnabled) && (_cacheLastAccessLoggingIntervalPassed >= _cacheLastAccessLoggingInterval))
                {
                    _cacheLastAccessLoggingIntervalPassed = 0;
                    hashtable = new Hashtable();
                }
                lock (_mainIndex.SyncRoot)
                {
                    IDictionaryEnumerator enumerator2 = _mainIndex.GetEnumerator();
                    if (enumerator2 != null)
                    {
                        while (enumerator2.MoveNext())
                        {
                            var entry2 = enumerator2.Value as ExpiryIndexEntry;
                            var exh    = entry2.Hint;
                            if (((exh != null) && _cacheLastAccessCountEnabled) && (exh is IdleExpiration))
                            {
                                IdleExpiration expiration = exh as IdleExpiration;
                                TimeSpan       span       = (TimeSpan)(CachingUtils.GetDateTime(CachingUtils.DiffSeconds(DateTime.Now)) - CachingUtils.GetDateTime(expiration.LastAccessTime));
                                if (span.TotalMinutes >= _cacheLastAccessInterval)
                                {
                                    num++;
                                    if (hashtable != null)
                                    {
                                        hashtable.Add(enumerator2.Key, null);
                                    }
                                }
                            }
                            if ((((exh != null) && (exh.SortKey.CompareTo(diffSeconds) < 0)) && !exh.IsRoutable) && exh.DetermineExpiration(_context))
                            {
                                if (exh.NeedsReSync && (_context.DatasourceMgr != null))
                                {
                                    CacheEntry entry3 = cacheInternal.Get(enumerator2.Key, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation));
                                    if (entry3 != null)
                                    {
                                        _context.DatasourceMgr.ResyncCacheItemAsync(enumerator2.Key, exh, null, entry3.GroupInfo, entry3.QueryInfo, entry3.ResyncProviderName);
                                    }
                                    else
                                    {
                                        _context.DatasourceMgr.ResyncCacheItemAsync(enumerator2.Key, exh, null, null, null, entry3.ResyncProviderName);
                                    }
                                }
                                else
                                {
                                    list.Add(enumerator2.Key);
                                }
                                if ((num3 > 0) && (list.Count == num3))
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                this.Logger.Error(("LocalCache(Expire): " + exception.ToString()).GetFormatter());
            }
            finally
            {
                this.ApplyLoggs();
                ArrayList list4 = new ArrayList();
                ArrayList c     = null;
                DateTime  time1 = DateTime.Now;
                try
                {
                    if (list.Count > 0)
                    {
                        var list6 = new ArrayList();
                        for (int i = 0; (i < list.Count) && !_cacheCleared; i++)
                        {
                            list6.Add(list[i]);
                            if ((list6.Count % _removeThreshhold) == 0)
                            {
                                try
                                {
                                    if (this.IsDisposed)
                                    {
                                        break;
                                    }
                                    c    = cacheInternal.RemoveSync(list6.ToArray(), ItemRemoveReason.Expired, false, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation)) as ArrayList;
                                    flag = true;
                                }
                                catch (Exception exception2)
                                {
                                    this.Logger.Error(("an error occured while removing expired items. Error " + exception2.ToString()).GetFormatter());
                                }
                                list6.Clear();
                                if ((c != null) && (c.Count > 0))
                                {
                                    list4.AddRange(c);
                                }
                                System.Threading.Thread.Sleep((int)(_sleepInterval * 1000));
                            }
                        }
                        if (!this.IsDisposed && (list6.Count > 0))
                        {
                            try
                            {
                                c    = cacheInternal.RemoveSync(list6.ToArray(), ItemRemoveReason.Expired, false, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation)) as ArrayList;
                                flag = true;
                                if ((c != null) && (c.Count > 0))
                                {
                                    list4.AddRange(c);
                                }
                            }
                            catch (Exception exception3)
                            {
                                this.Logger.Error(("an error occured while removing expired items. Error " + exception3.ToString()).GetFormatter());
                            }
                        }
                    }
                    if (!this.IsDisposed && (list4.Count > 0))
                    {
                        ArrayList list7 = new ArrayList();
                        if (cacheRoot != null)
                        {
                            foreach (object obj2 in list4)
                            {
                                if (obj2 != null)
                                {
                                    list7.Add(obj2);
                                    if ((list7.Count % 100) == 0)
                                    {
                                        try
                                        {
                                            if (this.IsDisposed)
                                            {
                                                break;
                                            }
                                            cacheRoot.CascadedRemove(list7.ToArray(), ItemRemoveReason.Expired, true, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation));
                                        }
                                        catch (Exception exception4)
                                        {
                                            this.Logger.Error(("an error occured while removing dependent items. Error " + exception4.ToString()).GetFormatter());
                                        }
                                        list7.Clear();
                                    }
                                }
                            }
                            if (!this.IsDisposed && (list7.Count > 0))
                            {
                                try
                                {
                                    cacheRoot.CascadedRemove(list7.ToArray(), ItemRemoveReason.Expired, true, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation));
                                }
                                catch (Exception exception5)
                                {
                                    this.Logger.Error(("an error occured while removing dependent items. Error " + exception5.ToString()).GetFormatter());
                                }
                                list7.Clear();
                            }
                        }
                    }
                }
                finally
                {
                    _transitoryIndex.Clear();
                    lock (this)
                    {
                        _cacheCleared = false;
                    }
                    if (hashtable != null)
                    {
                        StringBuilder         builder     = new StringBuilder();
                        IDictionaryEnumerator enumerator3 = hashtable.GetEnumerator();
                        int num5 = 1;
                        while (enumerator3.MoveNext())
                        {
                            builder.Append(enumerator3.Key + ", ");
                            if ((num5 % 10) == 0)
                            {
                                builder.Append("\r\n");
                                num5 = 1;
                            }
                            else
                            {
                                num5++;
                            }
                        }
                        this.Logger.Info(builder.ToString().Trim().GetFormatter());
                    }
                }
            }
            return(flag);
        }