NuCache: rename things
This commit is contained in:
@@ -388,8 +388,8 @@ namespace Umbraco.Tests.Cache
|
||||
// collect liveGen
|
||||
GC.Collect();
|
||||
|
||||
SnapDictionary<int, string>.GenerationObject genObj;
|
||||
Assert.IsTrue(d.Test.GenerationObjects.TryPeek(out genObj));
|
||||
SnapDictionary<int, string>.GenObj genObj;
|
||||
Assert.IsTrue(d.Test.GenObjs.TryPeek(out genObj));
|
||||
genObj = null;
|
||||
|
||||
// in Release mode, it works, but in Debug mode, the weak reference is still alive
|
||||
@@ -399,14 +399,14 @@ namespace Umbraco.Tests.Cache
|
||||
GC.Collect();
|
||||
#endif
|
||||
|
||||
Assert.IsTrue(d.Test.GenerationObjects.TryPeek(out genObj));
|
||||
Assert.IsFalse(genObj.WeakReference.IsAlive); // snapshot is gone, along with its reference
|
||||
Assert.IsTrue(d.Test.GenObjs.TryPeek(out genObj));
|
||||
Assert.IsFalse(genObj.WeakGenRef.IsAlive); // snapshot is gone, along with its reference
|
||||
|
||||
await d.CollectAsync();
|
||||
|
||||
Assert.AreEqual(0, d.Test.GetValues(1).Length); // null value is gone
|
||||
Assert.AreEqual(0, d.Count); // item is gone
|
||||
Assert.AreEqual(0, d.Test.GenerationObjects.Count);
|
||||
Assert.AreEqual(0, d.Test.GenObjs.Count);
|
||||
Assert.AreEqual(0, d.SnapCount); // snapshot is gone
|
||||
Assert.AreEqual(0, d.GenCount); // and generation has been dequeued
|
||||
}
|
||||
|
||||
@@ -29,8 +29,8 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
|
||||
private readonly ILogger _logger;
|
||||
private BPlusTree<int, ContentNodeKit> _localDb;
|
||||
private readonly ConcurrentQueue<GenRefRef> _genRefRefs;
|
||||
private GenRefRef _genRefRef;
|
||||
private readonly ConcurrentQueue<GenObj> _genObjs;
|
||||
private GenObj _genObj;
|
||||
private readonly object _wlocko = new object();
|
||||
private readonly object _rlocko = new object();
|
||||
private long _liveGen, _floorGen;
|
||||
@@ -64,8 +64,8 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
_contentTypesByAlias = new ConcurrentDictionary<string, LinkedNode<PublishedContentType>>(StringComparer.InvariantCultureIgnoreCase);
|
||||
_xmap = new ConcurrentDictionary<Guid, int>();
|
||||
|
||||
_genRefRefs = new ConcurrentQueue<GenRefRef>();
|
||||
_genRefRef = null; // no initial gen exists
|
||||
_genObjs = new ConcurrentQueue<GenObj>();
|
||||
_genObj = null; // no initial gen exists
|
||||
_liveGen = _floorGen = 0;
|
||||
_nextGen = false; // first time, must create a snapshot
|
||||
_collectAuto = true; // collect automatically by default
|
||||
@@ -836,8 +836,8 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
|
||||
// if no next generation is required, and we already have one,
|
||||
// use it and create a new snapshot
|
||||
if (_nextGen == false && _genRefRef != null)
|
||||
return new Snapshot(this, _genRefRef.GetGenRef()
|
||||
if (_nextGen == false && _genObj != null)
|
||||
return new Snapshot(this, _genObj.GetGenRef()
|
||||
#if DEBUG
|
||||
, _logger
|
||||
#endif
|
||||
@@ -852,15 +852,15 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
var snapGen = _nextGen ? _liveGen - 1 : _liveGen;
|
||||
|
||||
// create a new gen ref unless we already have it
|
||||
if (_genRefRef == null)
|
||||
_genRefRefs.Enqueue(_genRefRef = new GenRefRef(snapGen));
|
||||
else if (_genRefRef.Gen != snapGen)
|
||||
if (_genObj == null)
|
||||
_genObjs.Enqueue(_genObj = new GenObj(snapGen));
|
||||
else if (_genObj.Gen != snapGen)
|
||||
throw new Exception("panic");
|
||||
}
|
||||
else
|
||||
{
|
||||
// not write-locked, can use latest gen, create a new gen ref
|
||||
_genRefRefs.Enqueue(_genRefRef = new GenRefRef(_liveGen));
|
||||
_genObjs.Enqueue(_genObj = new GenObj(_liveGen));
|
||||
_nextGen = false; // this is the ONLY thing that triggers a _liveGen++
|
||||
}
|
||||
|
||||
@@ -873,7 +873,7 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
// - the genRefRef weak ref is dead because all snapshots have been collected
|
||||
// in both cases, we will dequeue and collect
|
||||
|
||||
var snapshot = new Snapshot(this, _genRefRef.GetGenRef()
|
||||
var snapshot = new Snapshot(this, _genObj.GetGenRef()
|
||||
#if DEBUG
|
||||
, _logger
|
||||
#endif
|
||||
@@ -930,10 +930,10 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
#if DEBUG
|
||||
_logger.Debug<ContentStore>("Collect.");
|
||||
#endif
|
||||
while (_genRefRefs.TryPeek(out GenRefRef genRefRef) && (genRefRef.Count == 0 || genRefRef.WGenRef.IsAlive == false))
|
||||
while (_genObjs.TryPeek(out var genObj) && (genObj.Count == 0 || genObj.WeakGenRef.IsAlive == false))
|
||||
{
|
||||
_genRefRefs.TryDequeue(out genRefRef); // cannot fail since TryPeek has succeeded
|
||||
_floorGen = genRefRef.Gen;
|
||||
_genObjs.TryDequeue(out genObj); // cannot fail since TryPeek has succeeded
|
||||
_floorGen = genObj.Gen;
|
||||
#if DEBUG
|
||||
//_logger.Debug<ContentStore>("_floorGen=" + _floorGen + ", _liveGen=" + _liveGen);
|
||||
#endif
|
||||
@@ -1009,9 +1009,9 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
await task;
|
||||
}
|
||||
|
||||
public long GenCount => _genRefRefs.Count;
|
||||
public long GenCount => _genObjs.Count;
|
||||
|
||||
public long SnapCount => _genRefRefs.Sum(x => x.Count);
|
||||
public long SnapCount => _genObjs.Sum(x => x.Count);
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -1100,7 +1100,7 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
_store = store;
|
||||
_genRef = genRef;
|
||||
_gen = genRef.Gen;
|
||||
Interlocked.Increment(ref genRef.GenRefRef.Count);
|
||||
Interlocked.Increment(ref genRef.GenObj.Count);
|
||||
//_thisCount = _count++;
|
||||
|
||||
#if DEBUG
|
||||
@@ -1201,46 +1201,46 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
{
|
||||
if (_gen < 0) return;
|
||||
#if DEBUG
|
||||
_logger.Debug<Snapshot>("Dispose snapshot ({Snapshot})", _genRef?.GenRefRef.Count.ToString() ?? "live");
|
||||
_logger.Debug<Snapshot>("Dispose snapshot ({Snapshot})", _genRef?.GenObj.Count.ToString() ?? "live");
|
||||
#endif
|
||||
_gen = -1;
|
||||
if (_genRef != null)
|
||||
Interlocked.Decrement(ref _genRef.GenRefRef.Count);
|
||||
Interlocked.Decrement(ref _genRef.GenObj.Count);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
}
|
||||
|
||||
internal class GenRefRef
|
||||
internal class GenObj
|
||||
{
|
||||
public GenRefRef(long gen)
|
||||
public GenObj(long gen)
|
||||
{
|
||||
Gen = gen;
|
||||
WGenRef = new WeakReference(null);
|
||||
WeakGenRef = new WeakReference(null);
|
||||
}
|
||||
|
||||
public GenRef GetGenRef()
|
||||
{
|
||||
// not thread-safe but always invoked from within a lock
|
||||
var genRef = (GenRef) WGenRef.Target;
|
||||
var genRef = (GenRef) WeakGenRef.Target;
|
||||
if (genRef == null)
|
||||
WGenRef.Target = genRef = new GenRef(this, Gen);
|
||||
WeakGenRef.Target = genRef = new GenRef(this, Gen);
|
||||
return genRef;
|
||||
}
|
||||
|
||||
public readonly long Gen;
|
||||
public readonly WeakReference WGenRef;
|
||||
public readonly WeakReference WeakGenRef;
|
||||
public int Count;
|
||||
}
|
||||
|
||||
internal class GenRef
|
||||
{
|
||||
public GenRef(GenRefRef genRefRef, long gen)
|
||||
public GenRef(GenObj genObj, long gen)
|
||||
{
|
||||
GenRefRef = genRefRef;
|
||||
GenObj = genObj;
|
||||
Gen = gen;
|
||||
}
|
||||
|
||||
public readonly GenRefRef GenRefRef;
|
||||
public readonly GenObj GenObj;
|
||||
public readonly long Gen;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,8 +21,8 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
// Readers are lock-free
|
||||
|
||||
private readonly ConcurrentDictionary<TKey, LinkedNode> _items;
|
||||
private readonly ConcurrentQueue<GenerationObject> _generationObjects;
|
||||
private GenerationObject _generationObject;
|
||||
private readonly ConcurrentQueue<GenObj> _genObjs;
|
||||
private GenObj _genObj;
|
||||
private readonly object _wlocko = new object();
|
||||
private readonly object _rlocko = new object();
|
||||
private long _liveGen, _floorGen;
|
||||
@@ -41,8 +41,8 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
public SnapDictionary()
|
||||
{
|
||||
_items = new ConcurrentDictionary<TKey, LinkedNode>();
|
||||
_generationObjects = new ConcurrentQueue<GenerationObject>();
|
||||
_generationObject = null; // no initial gen exists
|
||||
_genObjs = new ConcurrentQueue<GenObj>();
|
||||
_genObj = null; // no initial gen exists
|
||||
_liveGen = _floorGen = 0;
|
||||
_nextGen = false; // first time, must create a snapshot
|
||||
_collectAuto = true; // collect automatically by default
|
||||
@@ -339,8 +339,8 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
|
||||
// if no next generation is required, and we already have one,
|
||||
// use it and create a new snapshot
|
||||
if (_nextGen == false && _generationObject != null)
|
||||
return new Snapshot(this, _generationObject.GetReference());
|
||||
if (_nextGen == false && _genObj != null)
|
||||
return new Snapshot(this, _genObj.GetGenRef());
|
||||
|
||||
// else we need to try to create a new gen ref
|
||||
// whether we are wlocked or not, noone can rlock while we do,
|
||||
@@ -351,15 +351,15 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
var snapGen = _nextGen ? _liveGen - 1 : _liveGen;
|
||||
|
||||
// create a new gen ref unless we already have it
|
||||
if (_generationObject == null)
|
||||
_generationObjects.Enqueue(_generationObject = new GenerationObject(snapGen));
|
||||
else if (_generationObject.Gen != snapGen)
|
||||
if (_genObj == null)
|
||||
_genObjs.Enqueue(_genObj = new GenObj(snapGen));
|
||||
else if (_genObj.Gen != snapGen)
|
||||
throw new Exception("panic");
|
||||
}
|
||||
else
|
||||
{
|
||||
// not write-locked, can use latest gen, create a new gen ref
|
||||
_generationObjects.Enqueue(_generationObject = new GenerationObject(_liveGen));
|
||||
_genObjs.Enqueue(_genObj = new GenObj(_liveGen));
|
||||
_nextGen = false; // this is the ONLY thing that triggers a _liveGen++
|
||||
}
|
||||
|
||||
@@ -372,7 +372,7 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
// - the genRefRef weak ref is dead because all snapshots have been collected
|
||||
// in both cases, we will dequeue and collect
|
||||
|
||||
var snapshot = new Snapshot(this, _generationObject.GetReference());
|
||||
var snapshot = new Snapshot(this, _genObj.GetGenRef());
|
||||
|
||||
// reading _floorGen is safe if _collectTask is null
|
||||
if (_collectTask == null && _collectAuto && _liveGen - _floorGen > CollectMinGenDelta)
|
||||
@@ -416,10 +416,10 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
private void Collect()
|
||||
{
|
||||
// see notes in CreateSnapshot
|
||||
while (_generationObjects.TryPeek(out GenerationObject generationObject) && (generationObject.Count == 0 || generationObject.WeakReference.IsAlive == false))
|
||||
while (_genObjs.TryPeek(out var genObj) && (genObj.Count == 0 || genObj.WeakGenRef.IsAlive == false))
|
||||
{
|
||||
_generationObjects.TryDequeue(out generationObject); // cannot fail since TryPeek has succeeded
|
||||
_floorGen = generationObject.Gen;
|
||||
_genObjs.TryDequeue(out genObj); // cannot fail since TryPeek has succeeded
|
||||
_floorGen = genObj.Gen;
|
||||
}
|
||||
|
||||
Collect(_items);
|
||||
@@ -490,9 +490,9 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
// await task;
|
||||
}
|
||||
|
||||
public long GenCount => _generationObjects.Count;
|
||||
public long GenCount => _genObjs.Count;
|
||||
|
||||
public long SnapCount => _generationObjects.Sum(x => x.Count);
|
||||
public long SnapCount => _genObjs.Sum(x => x.Count);
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -520,7 +520,7 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
set => _dict._collectAuto = value;
|
||||
}
|
||||
|
||||
public ConcurrentQueue<GenerationObject> GenerationObjects => _dict._generationObjects;
|
||||
public ConcurrentQueue<GenObj> GenObjs => _dict._genObjs;
|
||||
|
||||
public Snapshot LiveSnapshot => new Snapshot(_dict, _dict._liveGen);
|
||||
|
||||
@@ -586,8 +586,8 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
{
|
||||
_store = store;
|
||||
_generationReference = generationReference;
|
||||
_gen = generationReference.GenerationObject.Gen;
|
||||
_generationReference.GenerationObject.Reference();
|
||||
_gen = generationReference.GenObj.Gen;
|
||||
_generationReference.GenObj.Reference();
|
||||
}
|
||||
|
||||
internal Snapshot(SnapDictionary<TKey, TValue> store, long gen)
|
||||
@@ -634,30 +634,30 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
{
|
||||
if (_gen < 0) return;
|
||||
_gen = -1;
|
||||
_generationReference?.GenerationObject.Release();
|
||||
_generationReference?.GenObj.Release();
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
}
|
||||
|
||||
internal class GenerationObject
|
||||
internal class GenObj
|
||||
{
|
||||
public GenerationObject(long gen)
|
||||
public GenObj(long gen)
|
||||
{
|
||||
Gen = gen;
|
||||
WeakReference = new WeakReference(null);
|
||||
WeakGenRef = new WeakReference(null);
|
||||
}
|
||||
|
||||
public GenerationReference GetReference()
|
||||
public GenerationReference GetGenRef()
|
||||
{
|
||||
// not thread-safe but always invoked from within a lock
|
||||
var generationReference = (GenerationReference) WeakReference.Target;
|
||||
var generationReference = (GenerationReference) WeakGenRef.Target;
|
||||
if (generationReference == null)
|
||||
WeakReference.Target = generationReference = new GenerationReference(this);
|
||||
WeakGenRef.Target = generationReference = new GenerationReference(this);
|
||||
return generationReference;
|
||||
}
|
||||
|
||||
public readonly long Gen;
|
||||
public readonly WeakReference WeakReference;
|
||||
public readonly WeakReference WeakGenRef;
|
||||
public int Count;
|
||||
|
||||
public void Reference()
|
||||
@@ -673,12 +673,12 @@ namespace Umbraco.Web.PublishedCache.NuCache
|
||||
|
||||
internal class GenerationReference
|
||||
{
|
||||
public GenerationReference(GenerationObject generationObject)
|
||||
public GenerationReference(GenObj genObj)
|
||||
{
|
||||
GenerationObject = generationObject;
|
||||
GenObj = genObj;
|
||||
}
|
||||
|
||||
public readonly GenerationObject GenerationObject;
|
||||
public readonly GenObj GenObj;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
Reference in New Issue
Block a user