diff --git a/datastore/datastore.nim b/datastore/datastore.nim index 0bab3ad..b89d38f 100644 --- a/datastore/datastore.nim +++ b/datastore/datastore.nim @@ -46,7 +46,7 @@ method query*( proc contains*(self: Datastore, key: Key): Future[bool] {.async: (raises: [CancelledError]).} = return (await self.has(key)) |? false -method modify*(self: Datastore, key: Key, fn: Modify): Future[?!void] {.base, gcsafe, async: (raises: [CancelledError, AsyncLockError]), locks: "unknown".} = +method modify*(self: Datastore, key: Key, fn: Modify): Future[?!void] {.base, gcsafe, async: (raises: [CancelledError]), locks: "unknown".} = ## Concurrently safe way of modifying the value associated with the `key`. ## ## Same as `modifyGet`, but this takes `fn` that doesn't produce any auxillary value. @@ -54,7 +54,7 @@ method modify*(self: Datastore, key: Key, fn: Modify): Future[?!void] {.base, gc raiseAssert("Not implemented!") -method modifyGet*(self: Datastore, key: Key, fn: ModifyGet): Future[?!seq[byte]] {.base, gcsafe, async: (raises: [CancelledError, AsyncLockError]), locks: "unknown".} = +method modifyGet*(self: Datastore, key: Key, fn: ModifyGet): Future[?!seq[byte]] {.base, gcsafe, async: (raises: [CancelledError]), locks: "unknown".} = ## Concurrently safe way of updating value associated with the `key`. Returns auxillary value on ## successful update. ## diff --git a/datastore/defaultimpl.nim b/datastore/defaultimpl.nim index c4ae77b..72cd4b3 100644 --- a/datastore/defaultimpl.nim +++ b/datastore/defaultimpl.nim @@ -11,7 +11,7 @@ proc defaultModifyGetImpl*( lock: AsyncLock, key: Key, fn: ModifyGet - ): Future[?!seq[byte]] {.async: (raises: [CancelledError, AsyncLockError]).} = + ): Future[?!seq[byte]] {.async: (raises: [CancelledError]).} = # Default implementation, serializes all modify operations using provided lock # await lock.acquire() @@ -45,14 +45,17 @@ proc defaultModifyGetImpl*( return aux.success finally: - lock.release() + try: + lock.release() + except AsyncLockError as err: + return failure(err) proc defaultModifyImpl*( self: Datastore, lock: AsyncLock, key: Key, fn: Modify - ): Future[?!void] {.async: (raises: [CancelledError, AsyncLockError]).} = + ): Future[?!void] {.async: (raises: [CancelledError]).} = proc wrappedFn(maybeValue: ?seq[byte]): Future[(?seq[byte], seq[byte])] {.async.} = let res = await fn(maybeValue) let ignoredAux = newSeq[byte]() diff --git a/datastore/fsds.nim b/datastore/fsds.nim index a7fdb83..a073b4c 100644 --- a/datastore/fsds.nim +++ b/datastore/fsds.nim @@ -221,7 +221,7 @@ method query*( method modifyGet*( self: FSDatastore, key: Key, - fn: ModifyGet): Future[?!seq[byte]] {.async: (raises: [CancelledError, AsyncLockError]).} = + fn: ModifyGet): Future[?!seq[byte]] {.async: (raises: [CancelledError]).} = var lock: AsyncLock try: lock = self.locks.mgetOrPut(key, newAsyncLock()) @@ -233,7 +233,7 @@ method modifyGet*( method modify*( self: FSDatastore, key: Key, - fn: Modify): Future[?!void] {.async: (raises: [CancelledError, AsyncLockError]).} = + fn: Modify): Future[?!void] {.async: (raises: [CancelledError]).} = var lock: AsyncLock try: diff --git a/datastore/leveldb/leveldbds.nim b/datastore/leveldb/leveldbds.nim index e438470..fc83764 100644 --- a/datastore/leveldb/leveldbds.nim +++ b/datastore/leveldb/leveldbds.nim @@ -125,7 +125,7 @@ method query*( method modifyGet*( self: LevelDbDatastore, key: Key, - fn: ModifyGet): Future[?!seq[byte]] {.async: (raises: [CancelledError, AsyncLockError]).} = + fn: ModifyGet): Future[?!seq[byte]] {.async: (raises: [CancelledError]).} = var lock: AsyncLock try: lock = self.locks.mgetOrPut(key, newAsyncLock()) @@ -137,7 +137,7 @@ method modifyGet*( method modify*( self: LevelDbDatastore, key: Key, - fn: Modify): Future[?!void] {.async: (raises: [CancelledError, AsyncLockError]).} = + fn: Modify): Future[?!void] {.async: (raises: [CancelledError]).} = var lock: AsyncLock try: lock = self.locks.mgetOrPut(key, newAsyncLock()) diff --git a/datastore/mountedds.nim b/datastore/mountedds.nim index f4de063..cebcc4a 100644 --- a/datastore/mountedds.nim +++ b/datastore/mountedds.nim @@ -121,7 +121,7 @@ method put*( method modifyGet*( self: MountedDatastore, key: Key, - fn: ModifyGet): Future[?!seq[byte]] {.async: (raises: [CancelledError, AsyncLockError]).} = + fn: ModifyGet): Future[?!seq[byte]] {.async: (raises: [CancelledError]).} = without mounted =? self.dispatch(key), error: return failure(error) @@ -131,7 +131,7 @@ method modifyGet*( method modify*( self: MountedDatastore, key: Key, - fn: Modify): Future[?!void] {.async: (raises: [CancelledError, AsyncLockError]).} = + fn: Modify): Future[?!void] {.async: (raises: [CancelledError]).} = without mounted =? self.dispatch(key), error: return failure(error) diff --git a/datastore/sql/sqliteds.nim b/datastore/sql/sqliteds.nim index ccd9e92..7e9c9bf 100644 --- a/datastore/sql/sqliteds.nim +++ b/datastore/sql/sqliteds.nim @@ -40,7 +40,7 @@ proc newRollbackError(rbErr: ref CatchableError, opErrMsg: string): ref Rollback proc newRollbackError(rbErr: ref CatchableError, opErr: ref CatchableError): ref RollbackError = return newRollbackError(rbErr, opErr) -method modifyGet*(self: SQLiteDatastore, key: Key, fn: ModifyGet): Future[?!seq[byte]] {.async: (raises: [CancelledError, AsyncLockError]).} = +method modifyGet*(self: SQLiteDatastore, key: Key, fn: ModifyGet): Future[?!seq[byte]] {.async: (raises: [CancelledError]).} = var retriesLeft = 100 # allows reasonable concurrency, avoids infinite loop aux: seq[byte] @@ -135,7 +135,7 @@ method modifyGet*(self: SQLiteDatastore, key: Key, fn: ModifyGet): Future[?!seq[ return success(aux) -method modify*(self: SQLiteDatastore, key: Key, fn: Modify): Future[?!void] {.async: (raises: [CancelledError, AsyncLockError]).} = +method modify*(self: SQLiteDatastore, key: Key, fn: Modify): Future[?!void] {.async: (raises: [CancelledError]).} = proc wrappedFn(maybeValue: ?seq[byte]): Future[(?seq[byte], seq[byte])] {.async.} = let res = await fn(maybeValue) let ignoredAux = newSeq[byte]() diff --git a/datastore/tieredds.nim b/datastore/tieredds.nim index 2118320..eaf62be 100644 --- a/datastore/tieredds.nim +++ b/datastore/tieredds.nim @@ -133,7 +133,7 @@ method put*( method modifyGet*( self: TieredDatastore, key: Key, - fn: ModifyGet): Future[?!seq[byte]] {.async: (raises: [CancelledError, AsyncLockError]).} = + fn: ModifyGet): Future[?!seq[byte]] {.async: (raises: [CancelledError]).} = let pending = await allFinished(self.stores.mapIt(it.modifyGet(key, fn))) @@ -154,7 +154,7 @@ method modifyGet*( method modify*( self: TieredDatastore, key: Key, - fn: Modify): Future[?!void] {.async: (raises: [CancelledError, AsyncLockError]).} = + fn: Modify): Future[?!void] {.async: (raises: [CancelledError]).} = let pending = await allFinished(self.stores.mapIt(it.modify(key, fn))) diff --git a/datastore/typedds.nim b/datastore/typedds.nim index 4bf76c2..982016e 100644 --- a/datastore/typedds.nim +++ b/datastore/typedds.nim @@ -102,7 +102,7 @@ proc get*[T](self: TypedDatastore, key: Key): Future[?!T] {.async: (raises: [Can return failure(error) return T.decode(bytes) -proc modify*[T](self: TypedDatastore, key: Key, fn: Modify[T]): Future[?!void] {.async: (raises: [CancelledError, AsyncLockError]).} = +proc modify*[T](self: TypedDatastore, key: Key, fn: Modify[T]): Future[?!void] {.async: (raises: [CancelledError]).} = requireDecoder(T) requireEncoder(T) @@ -123,7 +123,7 @@ proc modify*[T](self: TypedDatastore, key: Key, fn: Modify[T]): Future[?!void] { await self.ds.modify(key, wrappedFn) -proc modifyGet*[T, U](self: TypedDatastore, key: Key, fn: ModifyGet[T, U]): Future[?!U] {.async: (raises: [CancelledError, AsyncLockError]).} = +proc modifyGet*[T, U](self: TypedDatastore, key: Key, fn: ModifyGet[T, U]): Future[?!U] {.async: (raises: [CancelledError]).} = requireDecoder(T) requireEncoder(T) requireEncoder(U)