Open csharptest opened 9 years ago
There is a possibility that CallLevel lock would never be released. And this is really happening if LockTimeout expires in NodeCache.
Here is the code in the constructor of RootLock:
_locked = _exclusive ? _tree._selfLock.TryWrite(tree._options.LockTimeout) : _tree._selfLock.TryRead(tree._options.LockTimeout); Assert(_locked); Pin = _tree._storage.LockRoot(type);
If an exception is thrown in '_tree._storage.LockRoot(type)' then '_tree._selfLock' will never be released. So the code should be enclosed by try..catch:
try { Pin = _tree._storage.LockRoot(type); } catch { if (_exclusive) _tree._selfLock.ReleaseWrite(); else _tree._selfLock.ReleaseRead(); throw; }
Fixed on /dev
There is a possibility that CallLevel lock would never be released. And this is really happening if LockTimeout expires in NodeCache.
Here is the code in the constructor of RootLock:
If an exception is thrown in '_tree._storage.LockRoot(type)' then '_tree._selfLock' will never be released. So the code should be enclosed by try..catch: