mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2024-12-18 14:47:15 +00:00
fixes in locks of caches repos
This commit is contained in:
parent
e0e57f0336
commit
3d113dd31e
@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
## 0.20.3
|
## 0.20.3
|
||||||
|
|
||||||
|
* `Repos`:
|
||||||
|
* `Cache`:
|
||||||
|
* Fixes in locks of caches
|
||||||
|
|
||||||
## 0.20.2
|
## 0.20.2
|
||||||
|
|
||||||
* All main repos uses `SmartRWLocker`
|
* All main repos uses `SmartRWLocker`
|
||||||
|
@ -28,9 +28,18 @@ open class FullReadCRUDCacheRepo<ObjectType, IdType>(
|
|||||||
kvCache.action().onPresented { return it }
|
kvCache.action().onPresented { return it }
|
||||||
}
|
}
|
||||||
return parentRepo.actionElse().also {
|
return parentRepo.actionElse().also {
|
||||||
locker.withWriteLock { kvCache.actualize(it) }
|
kvCache.actualize(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
protected suspend inline fun <T> doOrTakeAndActualizeWithWriteLock(
|
||||||
|
action: KeyValueRepo<IdType, ObjectType>.() -> Optional<T>,
|
||||||
|
actionElse: ReadCRUDRepo<ObjectType, IdType>.() -> T,
|
||||||
|
actualize: KeyValueRepo<IdType, ObjectType>.(T) -> Unit
|
||||||
|
): T = doOrTakeAndActualize(
|
||||||
|
action = action,
|
||||||
|
actionElse = actionElse,
|
||||||
|
actualize = { locker.withWriteLock { actualize(it) } }
|
||||||
|
)
|
||||||
|
|
||||||
protected open suspend fun actualizeAll() {
|
protected open suspend fun actualizeAll() {
|
||||||
locker.withWriteLock { kvCache.actualizeAll(parentRepo) }
|
locker.withWriteLock { kvCache.actualizeAll(parentRepo) }
|
||||||
@ -54,22 +63,22 @@ open class FullReadCRUDCacheRepo<ObjectType, IdType>(
|
|||||||
{ if (it != 0L) actualizeAll() }
|
{ if (it != 0L) actualizeAll() }
|
||||||
)
|
)
|
||||||
|
|
||||||
override suspend fun contains(id: IdType): Boolean = doOrTakeAndActualize(
|
override suspend fun contains(id: IdType): Boolean = doOrTakeAndActualizeWithWriteLock(
|
||||||
{ contains(id).takeIf { it }.optionalOrAbsentIfNull },
|
{ contains(id).takeIf { it }.optionalOrAbsentIfNull },
|
||||||
{ contains(id) },
|
{ contains(id) },
|
||||||
{ if (it) parentRepo.getById(id) ?.let { set(id, it) } }
|
{ if (it) parentRepo.getById(id) ?.let { kvCache.set(id, it) } }
|
||||||
)
|
)
|
||||||
|
|
||||||
override suspend fun getAll(): Map<IdType, ObjectType> = doOrTakeAndActualize(
|
override suspend fun getAll(): Map<IdType, ObjectType> = doOrTakeAndActualizeWithWriteLock(
|
||||||
{ getAll().takeIf { it.isNotEmpty() }.optionalOrAbsentIfNull },
|
{ getAll().takeIf { it.isNotEmpty() }.optionalOrAbsentIfNull },
|
||||||
{ getAll() },
|
{ getAll() },
|
||||||
{ kvCache.actualizeAll(clear = true) { it } }
|
{ kvCache.actualizeAll(clear = true) { it } }
|
||||||
)
|
)
|
||||||
|
|
||||||
override suspend fun getById(id: IdType): ObjectType? = doOrTakeAndActualize(
|
override suspend fun getById(id: IdType): ObjectType? = doOrTakeAndActualizeWithWriteLock(
|
||||||
{ get(id) ?.optional ?: Optional.absent() },
|
{ get(id) ?.optional ?: Optional.absent() },
|
||||||
{ getById(id) },
|
{ getById(id) },
|
||||||
{ it ?.let { set(idGetter(it), it) } }
|
{ it ?.let { kvCache.set(idGetter(it), it) } }
|
||||||
)
|
)
|
||||||
|
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
|
@ -28,9 +28,18 @@ open class FullReadKeyValueCacheRepo<Key,Value>(
|
|||||||
kvCache.action().onPresented { return it }
|
kvCache.action().onPresented { return it }
|
||||||
}
|
}
|
||||||
return parentRepo.actionElse().also {
|
return parentRepo.actionElse().also {
|
||||||
locker.withWriteLock { kvCache.actualize(it) }
|
kvCache.actualize(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
protected suspend inline fun <T> doOrTakeAndActualizeWithWriteLock(
|
||||||
|
action: KeyValueRepo<Key, Value>.() -> Optional<T>,
|
||||||
|
actionElse: ReadKeyValueRepo<Key, Value>.() -> T,
|
||||||
|
actualize: KeyValueRepo<Key, Value>.(T) -> Unit
|
||||||
|
): T = doOrTakeAndActualize(
|
||||||
|
action = action,
|
||||||
|
actionElse = actionElse,
|
||||||
|
actualize = { locker.withWriteLock { actualize(it) } }
|
||||||
|
)
|
||||||
protected open suspend fun actualizeAll() {
|
protected open suspend fun actualizeAll() {
|
||||||
locker.withWriteLock {
|
locker.withWriteLock {
|
||||||
kvCache.clear()
|
kvCache.clear()
|
||||||
@ -38,10 +47,10 @@ open class FullReadKeyValueCacheRepo<Key,Value>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun get(k: Key): Value? = doOrTakeAndActualize(
|
override suspend fun get(k: Key): Value? = doOrTakeAndActualizeWithWriteLock(
|
||||||
{ get(k) ?.optional ?: Optional.absent() },
|
{ get(k) ?.optional ?: Optional.absent() },
|
||||||
{ get(k) },
|
{ get(k) },
|
||||||
{ set(k, it ?: return@doOrTakeAndActualize) }
|
{ kvCache.set(k, it ?: return@doOrTakeAndActualizeWithWriteLock) }
|
||||||
)
|
)
|
||||||
|
|
||||||
override suspend fun values(pagination: Pagination, reversed: Boolean): PaginationResult<Value> = doOrTakeAndActualize(
|
override suspend fun values(pagination: Pagination, reversed: Boolean): PaginationResult<Value> = doOrTakeAndActualize(
|
||||||
@ -56,13 +65,13 @@ open class FullReadKeyValueCacheRepo<Key,Value>(
|
|||||||
{ if (it != 0L) actualizeAll() }
|
{ if (it != 0L) actualizeAll() }
|
||||||
)
|
)
|
||||||
|
|
||||||
override suspend fun contains(key: Key): Boolean = doOrTakeAndActualize(
|
override suspend fun contains(key: Key): Boolean = doOrTakeAndActualizeWithWriteLock(
|
||||||
{ contains(key).takeIf { it }.optionalOrAbsentIfNull },
|
{ contains(key).takeIf { it }.optionalOrAbsentIfNull },
|
||||||
{ contains(key) },
|
{ contains(key) },
|
||||||
{ if (it) parentRepo.get(key) ?.also { kvCache.set(key, it) } }
|
{ if (it) parentRepo.get(key) ?.also { kvCache.set(key, it) } }
|
||||||
)
|
)
|
||||||
|
|
||||||
override suspend fun getAll(): Map<Key, Value> = doOrTakeAndActualize(
|
override suspend fun getAll(): Map<Key, Value> = doOrTakeAndActualizeWithWriteLock(
|
||||||
{ getAll().takeIf { it.isNotEmpty() }.optionalOrAbsentIfNull },
|
{ getAll().takeIf { it.isNotEmpty() }.optionalOrAbsentIfNull },
|
||||||
{ getAll() },
|
{ getAll() },
|
||||||
{ kvCache.actualizeAll(clear = true) { it } }
|
{ kvCache.actualizeAll(clear = true) { it } }
|
||||||
|
@ -27,9 +27,18 @@ open class FullReadKeyValuesCacheRepo<Key,Value>(
|
|||||||
kvCache.action().onPresented { return it }
|
kvCache.action().onPresented { return it }
|
||||||
}
|
}
|
||||||
return parentRepo.actionElse().also {
|
return parentRepo.actionElse().also {
|
||||||
locker.withWriteLock { kvCache.actualize(it) }
|
kvCache.actualize(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
protected suspend inline fun <T> doOrTakeAndActualizeWithWriteLock(
|
||||||
|
action: KeyValueRepo<Key, List<Value>>.() -> Optional<T>,
|
||||||
|
actionElse: ReadKeyValuesRepo<Key, Value>.() -> T,
|
||||||
|
actualize: KeyValueRepo<Key, List<Value>>.(T) -> Unit
|
||||||
|
): T = doOrTakeAndActualize(
|
||||||
|
action = action,
|
||||||
|
actionElse = actionElse,
|
||||||
|
actualize = { locker.withWriteLock { actualize(it) } }
|
||||||
|
)
|
||||||
|
|
||||||
protected open suspend fun actualizeKey(k: Key) {
|
protected open suspend fun actualizeKey(k: Key) {
|
||||||
locker.withWriteLock {
|
locker.withWriteLock {
|
||||||
|
Loading…
Reference in New Issue
Block a user