/// <summary> /// Constructor /// </summary> /// <param name="val">the object to be added to the cache</param> /// <param name="expiryHint">expiration hint for the object</param> /// <param name="evictionHint">eviction hint for the object</param> internal CacheEntry(object val, ExpirationHint expiryHint, EvictionHint evictionHint) : base(val) { _exh = expiryHint; _evh = evictionHint; _bitset.SetBit(FLATTENED); _creationTime = System.DateTime.Now; _lastModifiedTime = System.DateTime.Now; }
public void Notify(object key, EvictionHint oldhint, EvictionHint newHint) { Sync.AcquireWriterLock(Timeout.Infinite); try { _evctPolicy.Notify(key, oldhint, newHint); } finally { Sync.ReleaseWriterLock(); } }
public static void WriteEvcHint(CompactWriter writer, EvictionHint evcHint) { if (evcHint == null) { writer.Write((short)EvictionHintType.NULL); return; } writer.Write((short)evcHint._hintType); ((ICompactSerializable)evcHint).Serialize(writer); return; }
public void Notify(object key, EvictionHint oldhint, EvictionHint newHint) { Sync.AcquireWriterLock(Timeout.Infinite); try { _evctPolicy.Notify(key, oldhint, newHint); } finally { Sync.ReleaseWriterLock(); } }
public void Remove(object key, EvictionHint hint) { Sync.AcquireWriterLock(Timeout.Infinite); try { _evctPolicy.Remove(key, hint); } finally { Sync.ReleaseWriterLock(); } }
void IEvictionPolicy.Remove(object key, EvictionHint hint) { if (_index != null) { lock (_index.SyncRoot) { for (int i = 0; i < 5; i++) { if (_index[i] != null) { if (_index[i].Contains(key)) { _index[i].Remove(key); if (_index[i].Count == 0) { _index[i] = null; } } } } } } }
//#endregion public static EvictionHint ReadEvcHint(CompactReader reader, PoolManager poolManager) { EvictionHintType expHint = EvictionHintType.Parent; expHint = (EvictionHintType)reader.ReadInt16(); EvictionHint tmpObj = null; switch (expHint) { case EvictionHintType.NULL: return(null); case EvictionHintType.Parent: tmpObj = (EvictionHint)reader.ReadObject(); return(tmpObj); case EvictionHintType.CounterHint: var ch = CounterHint.Create(poolManager); ((ICompactSerializable)ch).Deserialize(reader); return(ch); case EvictionHintType.PriorityEvictionHint: var peh = PriorityEvictionHint.Create(poolManager); ((ICompactSerializable)peh).Deserialize(reader); return(peh); case EvictionHintType.TimestampHint: var tsh = TimestampHint.Create(poolManager); ((ICompactSerializable)tsh).Deserialize(reader); return(tsh); default: break; } return(null); }
public void Remove(object key, EvictionHint hint) { Sync.AcquireWriterLock(Timeout.Infinite); try { _evctPolicy.Remove(key, hint); } finally { Sync.ReleaseWriterLock(); } }
public EvictionHint CompatibleHint(EvictionHint eh) { return _evctPolicy.CompatibleHint(eh); }
public void Insert(object key, object value, EvictionHint evictionHint) { Insert(key, value, null, evictionHint, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation)); }
public EvictionHint CompatibleHint(EvictionHint eh) { return(_evctPolicy.CompatibleHint(eh)); }
/// <summary> /// Check if the provided eviction hint is compatible with the policy /// and return the compatible eviction hint /// </summary> /// <param name="eh">eviction hint.</param> /// <returns>a hint compatible to the eviction policy.</returns> public EvictionHint CompatibleHint(EvictionHint eh) { if (eh != null && eh is PriorityEvictionHint) { return eh; } return new PriorityEvictionHint(_priority); }
/// <summary> /// Insert array of CompactCacheEntry to cache, these may be serialized /// </summary> /// <param name="entries"></param> public IDictionary InsertEntries(object[] entries, OperationContext operationContext) { // check if cache is running. if (!IsRunning) return null; string[] keys = new string[entries.Length]; object[] values = new object[entries.Length]; CallbackEntry[] callbackEnteries = new CallbackEntry[entries.Length]; ExpirationHint[] exp = new ExpirationHint[entries.Length]; EvictionHint[] evc = new EvictionHint[entries.Length]; BitSet[] flags = new BitSet[entries.Length]; Hashtable[] queryInfo = new Hashtable[entries.Length]; CallbackEntry cbEntry = null; for (int i = 0; i < entries.Length; i++) { CompactCacheEntry cce = (CompactCacheEntry)SerializationUtil.CompactDeserialize(entries[i], _context.SerializationContext); keys[i] = cce.Key as string; CacheEntry ce = MakeCacheEntry(cce); if (ce != null) { if (ce.Value is CallbackEntry) cbEntry = ce.Value as CallbackEntry; else cbEntry = null; callbackEnteries[i] = cbEntry; object value = ce.Value as CallbackEntry; values[i] = value == null ? ce.Value : ((CallbackEntry)ce.Value).Value; exp[i] = ce.ExpirationHint; evc[i] = ce.EvictionHint; queryInfo[i] = ce.QueryInfo; flags[i] = ce.Flag; } } IDictionary items= Insert(keys, values, callbackEnteries, exp, evc, queryInfo, flags, operationContext); return items; }
/// <summary> /// Overload of Insert operation. Uses additional EvictionHint and ExpirationHint parameters. /// </summary> internal void Insert(object key, object value, ExpirationHint expiryHint, EvictionHint evictionHint, OperationContext operationContext) { Insert(key, value, expiryHint, evictionHint, null, operationContext); }
void IEvictionPolicy.Notify(object key, EvictionHint oldhint, EvictionHint newHint) { //always use the new priority eviction hint. EvictionHint hint = newHint; if (hint != null) { CacheItemPriority hintPriority = ((PriorityEvictionHint)hint).Priority; if (hintPriority == CacheItemPriority.Default) { hintPriority = this._priority;//set the default priority from the config. ((PriorityEvictionHint)hint).Priority = this._priority; } if ((oldhint != null)) { CacheItemPriority oldPriority = ((PriorityEvictionHint)oldhint).Priority; CacheItemPriority newPriority = ((PriorityEvictionHint)newHint).Priority; if (oldPriority != newPriority) { IEvictionPolicy temp = this as IEvictionPolicy; temp.Remove(key, oldhint); } } lock (_index.SyncRoot) { switch (hintPriority) { case CacheItemPriority.Low: if (_index[0] == null) { _index[0] = new HashVector(); } _index[0][key] = hint; break; case CacheItemPriority.BelowNormal: if (_index[1] == null) { _index[1] = new HashVector(); } _index[1][key] = hint; break; case CacheItemPriority.Normal: if (_index[2] == null) { _index[2] = new HashVector(); } _index[2][key] = hint; break; case CacheItemPriority.AboveNormal: if (_index[3] == null) { _index[3] = new HashVector(); } _index[3][key] = hint; break; case CacheItemPriority.High: if (_index[4] == null) { _index[4] = new HashVector(); } _index[4][key] = hint; break; } } } }
public void Insert(object key, object value, ExpirationHint expiryHint, EvictionHint evictionHint, Hashtable queryInfo, BitSet flag, OperationContext operationContext) { if (key == null) throw new ArgumentNullException("key"); if (value == null) throw new ArgumentNullException("value"); if (!key.GetType().IsSerializable) throw new ArgumentException("key is not serializable"); if (!value.GetType().IsSerializable) throw new ArgumentException("value is not serializable"); if ((expiryHint != null) && !expiryHint.GetType().IsSerializable) throw new ArgumentException("expiryHint is not not serializable"); if ((evictionHint != null) && !evictionHint.GetType().IsSerializable) throw new ArgumentException("evictionHint is not serializable"); // Cache has possibly expired so do default. if (!IsRunning) return; CacheEntry e = new CacheEntry(value, expiryHint, evictionHint); e.QueryInfo = queryInfo; e.Flag.Data |= flag.Data; // update the counters for various statistics try { CacheEntry clone; clone = e; _context.PerfStatsColl.MsecPerUpdBeginSample(); Insert(key, e, null, LockAccessType.IGNORE_LOCK, operationContext); _context.PerfStatsColl.MsecPerUpdEndSample(); } catch (Exception inner) { _context.NCacheLog.CriticalInfo("Cache.Insert():", inner.ToString()); throw; } }
internal void Insert(object key, object value, ExpirationHint expiryHint, EvictionHint evictionHint, Hashtable queryInfo, OperationContext operationContext) { Insert(key, value, expiryHint, evictionHint, queryInfo, new BitSet(), operationContext); }
/// <summary> /// Overload of Insert operation for bulk inserts. Uses EvictionHint and ExpirationHint arrays. /// </summary> public IDictionary Insert(object[] keys, object[] values, CallbackEntry[] callbackEnteries, ExpirationHint[] expirations, EvictionHint[] evictions, Hashtable[] queryInfos, BitSet[] flags,OperationContext operationContext) { if (ServerMonitor.MonitorActivity) ServerMonitor.LogClientActivity("Cache.InsertBlk", ""); if (keys == null) throw new ArgumentNullException("keys"); if (values == null) throw new ArgumentNullException("items"); if (keys.Length != values.Length) throw new ArgumentException("keys count is not equals to values count"); CacheEntry[] ce = new CacheEntry[values.Length]; long[] sizes = null; object dataSize = operationContext.GetValueByField(OperationContextFieldName.ValueDataSize); if (dataSize != null) { sizes = (long[])dataSize; } for (int i = 0; i < values.Length; i++) { if (keys[i] == null) throw new ArgumentNullException("key"); if (values[i] == null) throw new ArgumentNullException("value"); if (!keys[i].GetType().IsSerializable) throw new ArgumentException("key is not serializable"); if (!values[i].GetType().IsSerializable) throw new ArgumentException("value is not serializable"); if ((expirations[i] != null) && !expirations[i].GetType().IsSerializable) throw new ArgumentException("expiryHint is not not serializable"); if ((evictions[i] != null) && !evictions[i].GetType().IsSerializable) throw new ArgumentException("evictionHint is not serializable"); // Cache has possibly expired so do default. if (!IsRunning) return null; ce[i] = new CacheEntry(values[i], expirations[i], evictions[i]); ce[i].QueryInfo = queryInfos[i]; ce[i].Flag.Data |= flags[i].Data; if(sizes != null) ce[i].DataSize = sizes[i]; if (callbackEnteries[i] != null) { CallbackEntry cloned = callbackEnteries[i].Clone() as CallbackEntry; cloned.Value = values[i]; cloned.Flag = ce[i].Flag; ce[i].Value = cloned; } } /// update the counters for various statistics try { HPTimeStats insertTime = new HPTimeStats(); insertTime.BeginSample(); IDictionary result = Insert(keys, ce, operationContext); insertTime.EndSample(); return result; } catch (Exception inner) { throw; } }
/// <summary> /// Overload of Insert operation for bulk inserts. Uses additional EvictionHint and ExpirationHint parameters. /// </summary> public IDictionary Insert(object[] keys, object[] values, ExpirationHint expiryHint, EvictionHint evictionHint, OperationContext operationContext) { if (keys == null) throw new ArgumentNullException("keys"); if (values == null) throw new ArgumentNullException("items"); if (keys.Length != values.Length) throw new ArgumentException("keys count is not equals to values count"); CacheEntry[] ce = new CacheEntry[values.Length]; for (int i = 0; i < values.Length; i++) { object key = keys[i]; object value = values[i]; if (key == null) throw new ArgumentNullException("key"); if (value == null) throw new ArgumentNullException("value"); if (!key.GetType().IsSerializable) throw new ArgumentException("key is not serializable"); if (!value.GetType().IsSerializable) throw new ArgumentException("value is not serializable"); if ((expiryHint != null) && !expiryHint.GetType().IsSerializable) throw new ArgumentException("expiryHint is not not serializable"); if ((evictionHint != null) && !evictionHint.GetType().IsSerializable) throw new ArgumentException("evictionHint is not serializable"); // Cache has possibly expired so do default. if (!IsRunning) return null; ce[i] = new CacheEntry(value, expiryHint, evictionHint); } /// update the counters for various statistics try { return Insert(keys, ce, operationContext); } catch (Exception inner) { throw; } }
/// <summary> /// Overload of Insert operation for bulk inserts. Uses an additional EvictionHint parameter to be used /// for Item auto eviction policy. /// </summary> public IDictionary Insert(object[] keys, object[] values, EvictionHint evictionHint, OperationContext operationContext) { return Insert(keys, values, null, evictionHint, operationContext); }
void IEvictionPolicy.Notify(object key, EvictionHint oldhint, EvictionHint newHint) { //always use the new priority eviction hint. EvictionHint hint = newHint; if (hint != null) { CacheItemPriority hintPriority = ((PriorityEvictionHint)hint).Priority; if (hintPriority == CacheItemPriority.Default) { hintPriority = this._priority;//set the default priority from the config. ((PriorityEvictionHint)hint).Priority = this._priority; } if ((oldhint != null)) { CacheItemPriority oldPriority = ((PriorityEvictionHint)oldhint).Priority; CacheItemPriority newPriority = ((PriorityEvictionHint)newHint).Priority; if (oldPriority != newPriority) { IEvictionPolicy temp = this as IEvictionPolicy; temp.Remove(key, oldhint); } } lock (_index.SyncRoot) { int changedIndex = -1; switch (hintPriority) { case CacheItemPriority.Low: if (_index[0] == null) _index[0] = new Hashtable(25000, 0.7f); _index[0][key] = hint; changedIndex = 0; break; case CacheItemPriority.BelowNormal: if (_index[1] == null) _index[1] = new Hashtable(25000, 0.7f); _index[1][key] = hint; changedIndex = 1; break; case CacheItemPriority.Normal: if (_index[2] == null) _index[2] = new Hashtable(25000, 0.7f); _index[2][key] = hint; changedIndex = 2; break; case CacheItemPriority.AboveNormal: if (_index[3] == null) _index[3] = new Hashtable(25000, 0.7f); _index[3][key] = hint; changedIndex = 3; break; case CacheItemPriority.High: if (_index[4] == null) _index[4] = new Hashtable(25000, 0.7f); _index[4][key] = hint; changedIndex = 4; break; } if (changedIndex > -1 && _index[changedIndex].Count > _evictionIndexMaxCounts[changedIndex]) { _evictionIndexMaxCounts[changedIndex] = _index[changedIndex].Count; } } } }
/// <summary> /// Overload of Add operation. uses additional paramer of Flag for checking if compressed or not /// </summary> public void Add(object key, object value, ExpirationHint expiryHint, EvictionHint evictionHint, Hashtable queryInfo, BitSet flag, OperationContext operationContext) { if (key == null) throw new ArgumentNullException("key"); if (value == null) throw new ArgumentNullException("value"); if (!key.GetType().IsSerializable) throw new ArgumentException("key is not serializable"); if (!value.GetType().IsSerializable) throw new ArgumentException("value is not serializable"); if ((expiryHint != null) && !expiryHint.GetType().IsSerializable) throw new ArgumentException("expiryHint is not serializable"); if ((evictionHint != null) && !evictionHint.GetType().IsSerializable) throw new ArgumentException("evictionHint is not serializable"); // Cache has possibly expired so do default. if (!IsRunning) return; CacheEntry e = new CacheEntry(value, expiryHint, evictionHint); ////Object size for inproc object dataSize = operationContext.GetValueByField(OperationContextFieldName.ValueDataSize); if (dataSize != null) e.DataSize = Convert.ToInt64(dataSize); e.QueryInfo = queryInfo; e.Flag.Data |= flag.Data; try { HPTimeStats addTime = new HPTimeStats(); _context.PerfStatsColl.MsecPerAddBeginSample(); addTime.BeginSample(); Add(key, e, operationContext); addTime.EndSample(); _context.PerfStatsColl.MsecPerAddEndSample(); } catch (Exception inner) { throw; } }
void IEvictionPolicy.Remove(object key, EvictionHint hint) { lock (_index.SyncRoot) { if (_index != null) for (int i = 0; i < 5; i++) { if (_index[i] != null) if (_index[i].Contains(key)) { _index[i].Remove(key); if (_index[i].Count == 0) { _index[i] = null; _evictionIndexMaxCounts[i] = 0; } } } } }
public static void WriteEvcHint(CompactWriter writer, EvictionHint evcHint) { if (evcHint == null) { writer.Write((short)EvictionHintType.NULL); return; } writer.Write((short)evcHint._hintType); ((ICompactSerializable)evcHint).Serialize(writer); return; }
void ICompactSerializable.Deserialize(CompactReader reader) { lock (this) { Value = reader.ReadObject(); _bitset = new BitSet(reader.ReadByte()); _evh = EvictionHint.ReadEvcHint(reader); _exh = ExpirationHint.ReadExpHint(reader); _queryInfo = (Hashtable)reader.ReadObject(); _size = reader.ReadInt64(); lockMetaInfo = reader.ReadObject() as LockMetaInfo; _creationTime = reader.ReadDateTime(); _lastModifiedTime = reader.ReadDateTime(); _priorityValue = (CacheItemPriority)reader.ReadInt32(); _type = reader.ReadObject() as string; } }
public void Insert(object key, object value, ExpirationHint expiryHint, EvictionHint evictionHint, Hashtable queryInfo, BitSet flag, object lockId, LockAccessType accessType, OperationContext operationContext) { try { if (ServerMonitor.MonitorActivity) ServerMonitor.LogClientActivity("Cache.Insert", ""); if (key == null) throw new ArgumentNullException("key"); if (value == null) throw new ArgumentNullException("value"); if (!key.GetType().IsSerializable) throw new ArgumentException("key is not serializable"); if (!value.GetType().IsSerializable) throw new ArgumentException("value is not serializable"); if ((expiryHint != null) && !expiryHint.GetType().IsSerializable) throw new ArgumentException("expiryHint is not not serializable"); if ((evictionHint != null) && !evictionHint.GetType().IsSerializable) throw new ArgumentException("evictionHint is not serializable"); // Cache has possibly expired so do default. if (!IsRunning) return; CacheEntry e = new CacheEntry(value, expiryHint, evictionHint); e.QueryInfo = queryInfo; e.Flag.Data |= flag.Data; object dataSize = operationContext.GetValueByField(OperationContextFieldName.ValueDataSize); if (dataSize != null) e.DataSize = Convert.ToInt64(dataSize); /// update the counters for various statistics _context.PerfStatsColl.MsecPerUpdBeginSample(); Insert(key, e, lockId, accessType, operationContext); _context.PerfStatsColl.MsecPerUpdEndSample(); } catch (Exception inner) { if (_context.NCacheLog.IsErrorEnabled) _context.NCacheLog.Error("Cache.Insert():", inner.ToString()); throw; } }
/// <summary> /// Performs application-defined tasks associated with freeing, releasing, or /// resetting unmanaged resources. /// </summary> void IDisposable.Dispose() { lock (this) { if (_exh != null) { ((IDisposable)_exh).Dispose(); _exh = null; } _evh = null; } }
void IEvictionPolicy.Notify(object key, EvictionHint oldhint, EvictionHint newHint) { //always use the new priority eviction hint. EvictionHint hint = newHint; if (hint != null) { CacheItemPriority hintPriority = ((PriorityEvictionHint)hint).Priority; if (hintPriority == CacheItemPriority.Default) { hintPriority = this._priority;//set the default priority from the config. ((PriorityEvictionHint)hint).Priority = this._priority; } if ((oldhint != null)) { CacheItemPriority oldPriority = ((PriorityEvictionHint)oldhint).Priority; CacheItemPriority newPriority = ((PriorityEvictionHint)newHint).Priority; if (oldPriority != newPriority) { IEvictionPolicy temp = this as IEvictionPolicy; temp.Remove(key, oldhint); } } lock (_index.SyncRoot) { int changedIndex = -1; switch (hintPriority) { case CacheItemPriority.Low: if (_index[0] == null) { _index[0] = new Hashtable(25000, 0.7f); } _index[0][key] = hint; changedIndex = 0; break; case CacheItemPriority.BelowNormal: if (_index[1] == null) { _index[1] = new Hashtable(25000, 0.7f); } _index[1][key] = hint; changedIndex = 1; break; case CacheItemPriority.Normal: if (_index[2] == null) { _index[2] = new Hashtable(25000, 0.7f); } _index[2][key] = hint; changedIndex = 2; break; case CacheItemPriority.AboveNormal: if (_index[3] == null) { _index[3] = new Hashtable(25000, 0.7f); } _index[3][key] = hint; changedIndex = 3; break; case CacheItemPriority.High: if (_index[4] == null) { _index[4] = new Hashtable(25000, 0.7f); } _index[4][key] = hint; changedIndex = 4; break; } if (changedIndex > -1 && _index[changedIndex].Count > _evictionIndexMaxCounts[changedIndex]) { _evictionIndexMaxCounts[changedIndex] = _index[changedIndex].Count; } } } }
public EvictionHint CompatibleHint(EvictionHint eh, PoolManager poolManager) { return(_evctPolicy.CompatibleHint(eh, poolManager)); }
/// <summary> /// Overload of Add operation. Uses an additional EvictionHint parameter to be used for /// Item auto eviction policy. /// </summary> internal void Add(object key, object value, EvictionHint evictionHint) { Add(key, value, null, evictionHint, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation)); }