fix occasional deadlock

This commit is contained in:
Jaremy Creechley 2023-09-26 19:21:09 -07:00
parent 317d42c511
commit dacc28ab02
No known key found for this signature in database
GPG Key ID: 4E66FB67B21D3300

View File

@ -245,6 +245,8 @@ method close*(self: ThreadDatastore): Future[?!void] {.async.} =
type type
QResult = DbQueryResponse[KeyId, DataBuffer] QResult = DbQueryResponse[KeyId, DataBuffer]
import os
proc queryTask[DB]( proc queryTask[DB](
ctx: TaskCtx[QResult], ctx: TaskCtx[QResult],
ds: DB, ds: DB,
@ -265,6 +267,8 @@ proc queryTask[DB](
ctx[].res.ok (KeyId.none, DataBuffer(), ) ctx[].res.ok (KeyId.none, DataBuffer(), )
echo "\tqueryTask:query:fireSync " echo "\tqueryTask:query:fireSync "
discard ctx[].signal.fireSync() discard ctx[].signal.fireSync()
echo "\tqueryTask:query:nextSignal:wait "
discard nextSignal.waitSync().get()
var handle = handleRes.get() var handle = handleRes.get()
for item in handle.iter(): for item in handle.iter():
@ -314,6 +318,10 @@ method query*(
echo "query:init:dispatch:queryTask" echo "query:init:dispatch:queryTask"
self.tp.spawn queryTask(ctx, ds, query, nextSignal) self.tp.spawn queryTask(ctx, ds, query, nextSignal)
# await wait(ctx[].signal)
await nextSignal.fire()
# await wait(ctx[].signal)
echo "query:init:dispatch:res: ", ctx[].res echo "query:init:dispatch:res: ", ctx[].res
var var
@ -328,9 +336,6 @@ method query*(
proc next(): Future[?!QueryResponse] {.async.} = proc next(): Future[?!QueryResponse] {.async.} =
echo "\n\nquery:next:exec: " echo "\n\nquery:next:exec: "
let ctx = ctx let ctx = ctx
# defer:
# if lock.locked:
# lock.release()
trace "About to query" trace "About to query"
if lock.locked: if lock.locked:
@ -340,9 +345,6 @@ method query*(
echo "query:next:iter:finished" echo "query:next:iter:finished"
return failure (ref QueryEndedError)(msg: "Calling next on a finished query!") return failure (ref QueryEndedError)(msg: "Calling next on a finished query!")
# echo "query:next:acquire:lock"
# await lock.acquire()
echo "query:next:wait:signal" echo "query:next:wait:signal"
await wait(ctx[].signal) await wait(ctx[].signal)