ENT-8817 OS port of compute deadlock changes

This commit is contained in:
rick.parker 2022-11-25 09:31:41 +00:00
parent 0131163db0
commit 3e25f7fd1a
2 changed files with 10 additions and 2 deletions

View File

@ -73,7 +73,7 @@ class InfrequentlyMutatedCache<K : Any, V : Any>(name: String, cacheFactory: Nam
backingCache.invalidateAll()
}
private fun invalidate(key: K, value: Wrapper.Invalidated<V>): Wrapper.Invalidated<V> {
private fun invalidate(key: K, value: Wrapper.Invalidated<V>): Wrapper.Invalidated<V>? {
val tx = contextTransactionOrNull
value.invalidators.incrementAndGet()
currentlyInvalid[key] = value
@ -81,7 +81,10 @@ class InfrequentlyMutatedCache<K : Any, V : Any>(name: String, cacheFactory: Nam
// When we close, we can't start using caching again until all simultaneously open transactions are closed.
tx.onClose { tx.database.onAllOpenTransactionsClosed { decrementInvalidators(key, value) } }
} else {
decrementInvalidators(key, value)
if (value.invalidators.decrementAndGet() == 0) {
currentlyInvalid.remove(key)
return null
}
}
return value
}

View File

@ -25,6 +25,11 @@ class InfrequentlyMutatedCacheTest {
database.close()
}
@Test(timeout = 300_000)
fun `invalidate outside transaction should not hang`() {
cache.invalidate("Fred")
}
@Test(timeout=300_000)
fun `get from empty cache returns result of loader`() {
database.transaction {