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() 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 val tx = contextTransactionOrNull
value.invalidators.incrementAndGet() value.invalidators.incrementAndGet()
currentlyInvalid[key] = value 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. // 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) } } tx.onClose { tx.database.onAllOpenTransactionsClosed { decrementInvalidators(key, value) } }
} else { } else {
decrementInvalidators(key, value) if (value.invalidators.decrementAndGet() == 0) {
currentlyInvalid.remove(key)
return null
}
} }
return value return value
} }

View File

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