public override void GetKeyList(int bucketId, bool startLogging, out ClusteredArrayList keyList) { if (startLogging) _logMgr.StartLogging(bucketId, LogMode.LogBeforeAfterActualOperation); keyList = new ClusteredArrayList(); if (_keyList != null) { if (_keyList.Contains(bucketId)) { HashVector keyTbl = _keyList[bucketId] as HashVector; keyList.AddRange(keyTbl.Keys); } } }
void IEvictionPolicy.Execute(CacheBase cache, CacheRuntimeContext context, long evictSize) { ILogger NCacheLog = cache.Context.NCacheLog; if (NCacheLog.IsInfoEnabled) NCacheLog.Info("LocalCache.Evict()", "Cache Size: {0}" + cache.Count.ToString()); //if user has updated the values in configuration file then new values will be reloaded. _sleepInterval = Convert.ToInt32(ServiceConfiguration.EvictionBulkRemoveDelay); _removeThreshhold = Convert.ToInt32(ServiceConfiguration.EvictionBulkRemoveSize); DateTime startTime = DateTime.Now; IList selectedKeys = this.GetSelectedKeys(cache, (long)Math.Ceiling(evictSize * _ratio)); DateTime endTime = DateTime.Now; if (NCacheLog.IsInfoEnabled) NCacheLog.Info("LocalCache.Evict()", String.Format("Time Span for {0} Items: " + (endTime - startTime), selectedKeys.Count)); startTime = DateTime.Now; Cache rootCache = context.CacheRoot; ClusteredArrayList keysTobeRemoved = new ClusteredArrayList(); ClusteredArrayList dependentItems = new ClusteredArrayList(); IList removedItems = null; IEnumerator e = selectedKeys.GetEnumerator(); int removedThreshhold = _removeThreshhold/300; int remIteration = 0; while (e.MoveNext()) { object key = e.Current; if (key == null) continue; keysTobeRemoved.Add(key); if (keysTobeRemoved.Count % 300 == 0) { try { OperationContext priorityEvictionOperationContext = new OperationContext(); priorityEvictionOperationContext.Add(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation); removedItems = cache.RemoveSync(keysTobeRemoved.ToArray(), ItemRemoveReason.Underused, false, priorityEvictionOperationContext) as ArrayList; context.PerfStatsColl.IncrementEvictPerSecStatsBy(keysTobeRemoved.Count); } catch (Exception ex) { NCacheLog.Error("PriorityEvictionPolicy.Execute", "an error occurred while removing items. Error " + ex.ToString()); } keysTobeRemoved.Clear(); if (removedItems != null && removedItems.Count > 0) { dependentItems.AddRange(removedItems); } remIteration++; if (remIteration >= removedThreshhold) { //put some delay so that user operations are not affected. System.Threading.Thread.Sleep(_sleepInterval*1000); remIteration = 0; } } } if (keysTobeRemoved.Count > 0) { try { OperationContext priorityEvictionOperationContext = new OperationContext(); priorityEvictionOperationContext.Add(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation); removedItems = cache.RemoveSync(keysTobeRemoved.ToArray(), ItemRemoveReason.Underused, false, priorityEvictionOperationContext) as ArrayList; context.PerfStatsColl.IncrementEvictPerSecStatsBy(keysTobeRemoved.Count); if (removedItems != null && removedItems.Count > 0) { dependentItems.AddRange(removedItems); } } catch (Exception ex) { NCacheLog.Error("PriorityEvictionPolicy.Execute", "an error occurred while removing items. Error " + ex.ToString()); } } if (dependentItems.Count > 0) { ArrayList removableList = new ArrayList(); if (rootCache != null) { foreach (object depenentItme in dependentItems) { if (depenentItme == null) continue; removableList.Add(depenentItme); if (removableList.Count % 100 == 0) { try { OperationContext priorityEvictionOperationContext = new OperationContext(); priorityEvictionOperationContext.Add(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation); rootCache.CascadedRemove(removableList, ItemRemoveReason.Underused, true, priorityEvictionOperationContext); context.PerfStatsColl.IncrementEvictPerSecStatsBy(removableList.Count); } catch (Exception exc) { NCacheLog.Error("PriorityEvictionPolicy.Execute", "an error occurred while removing dependent items. Error " + exc.ToString()); } removableList.Clear(); } } if (removableList.Count > 0) { try { OperationContext priorityEvictionOperationContext = new OperationContext(); priorityEvictionOperationContext.Add(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation); rootCache.CascadedRemove(removableList, ItemRemoveReason.Underused, true, priorityEvictionOperationContext); context.PerfStatsColl.IncrementEvictPerSecStatsBy(removableList.Count); } catch (Exception exc) { NCacheLog.Error("PriorityEvictionPolicy.Execute", "an error occurred while removing dependent items. Error " + exc.ToString()); } removableList.Clear(); } } } return; }