This commit is contained in:
Jaremy Creechley 2023-10-20 15:56:22 -07:00
parent 7d98f5ed9d
commit a626a03a8c
No known key found for this signature in database
GPG Key ID: 4E66FB67B21D3300
3 changed files with 29 additions and 27 deletions

View File

@ -8,6 +8,8 @@ import ./types
export key, query, types
const datastoreUseSync* {.booldefine.} = false
push: {.upraises: [].}
type

View File

@ -67,6 +67,7 @@ proc new*(
let
backend = ? newFSBackend[KeyId, DataBuffer](
root=root, depth=depth, caseSensitive=caseSensitive, ignoreProtected=ignoreProtected)
root = root, depth = depth, caseSensitive = caseSensitive,
ignoreProtected = ignoreProtected)
db = ? ThreadProxy.new(backend, tp = tp)
success FSDatastore(db: db)

View File

@ -40,7 +40,7 @@ type
TaskCtxObj*[T: ThreadTypes] = object
res*: ThreadResult[T]
signal: ThreadSignalPtr
running*: bool ## used to mark when a task worker is running
running*: bool ## used to mark when a task worker is running
cancelled*: bool ## used to cancel a task before it's started
nextSignal: ThreadSignalPtr
@ -60,21 +60,22 @@ proc newTaskCtx*[T](tp: typedesc[T],
newSharedPtr(TaskCtxObj[T](signal: signal, nextSignal: nextSignal))
proc setCancelled[T](ctx: TaskCtx[T]) =
ctx[].cancelled = true
ctx[].cancelled = true
proc setRunning[T](ctx: TaskCtx[T]): bool =
if ctx[].cancelled:
return false
ctx[].running = true
return true
if ctx[].cancelled:
return false
ctx[].running = true
return true
proc setDone[T](ctx: TaskCtx[T]) =
ctx[].running = false
ctx[].running = false
proc acquireSignal(): ?!ThreadSignalPtr =
# echo "signal:OPEN!"
let signal = ThreadSignalPtr.new()
if signal.isErr():
failure (ref CatchableError)(msg: "failed to aquire ThreadSignalPtr: " & signal.error())
failure (ref CatchableError)(msg: "failed to aquire ThreadSignalPtr: " &
signal.error())
else:
success signal.get()
@ -148,7 +149,7 @@ proc has*[BT](self: ThreadProxy[BT],
# without signal =? acquireSignal(), err:
# return failure err
let ctx = newTaskCtx(bool, signal=signal)
let ctx = newTaskCtx(bool, signal = signal)
dispatchTask(self, signal):
let key = KeyId.new key.id()
self.tp.spawn hasTask(ctx, ds, key)
@ -169,7 +170,7 @@ proc delete*[BT](self: ThreadProxy[BT],
# without signal =? acquireSignal(), err:
# return failure err
let ctx = newTaskCtx(void, signal=signal)
let ctx = newTaskCtx(void, signal = signal)
dispatchTask(self, signal):
let key = KeyId.new key.id()
self.tp.spawn deleteTask(ctx, ds, key)
@ -202,7 +203,7 @@ proc put*[BT](self: ThreadProxy[BT],
# without signal =? acquireSignal(), err:
# return failure err
let ctx = newTaskCtx(void, signal=signal)
let ctx = newTaskCtx(void, signal = signal)
dispatchTask(self, signal):
let key = KeyId.new key.id()
let data = DataBuffer.new data
@ -236,7 +237,7 @@ proc get*[BT](self: ThreadProxy[BT],
# without signal =? acquireSignal(), err:
# return failure err
let ctx = newTaskCtx(DataBuffer, signal=signal)
let ctx = newTaskCtx(DataBuffer, signal = signal)
dispatchTask(self, signal):
let key = KeyId.new key.id()
self.tp.spawn getTask(ctx, ds, key)
@ -261,8 +262,6 @@ proc queryTask[DB](
# we execute this all inside `executeTask`
# so we need to return a final result
let handleRes = query(ds, query)
static:
echo "HANDLE_RES: ", typeof(handleRes)
if handleRes.isErr():
# set error and exit executeTask, which will fire final signal
(?!QResult).err(handleRes.error())
@ -274,8 +273,6 @@ proc queryTask[DB](
raise newException(DeadThreadDefect, "queryTask timed out")
var handle = handleRes.get()
static:
echo "HANDLE: ", typeof(handle)
for item in handle.queryIter():
# wait for next request from async thread
@ -307,7 +304,7 @@ proc query*[BT](self: ThreadProxy[BT],
let nextSignal = acquireSignal().get()
# without nextSignal =? acquireSignal(), err:
# return failure err
let ctx = newTaskCtx(QResult, signal=signal, nextSignal=nextSignal)
let ctx = newTaskCtx(QResult, signal = signal, nextSignal = nextSignal)
proc iterDispose() {.async.} =
ctx.setCancelled()
@ -318,8 +315,8 @@ proc query*[BT](self: ThreadProxy[BT],
try:
let query = dbQuery(
key= KeyId.new q.key.id(),
value=q.value, limit=q.limit, offset=q.offset, sort=q.sort)
key = KeyId.new q.key.id(),
value = q.value, limit = q.limit, offset = q.offset, sort = q.sort)
# setup initial queryTask
dispatchTaskWrap(self, signal):
@ -337,9 +334,11 @@ proc query*[BT](self: ThreadProxy[BT],
try:
trace "About to query"
if lock.locked:
return failure (ref DatastoreError)(msg: "Should always await query features")
return failure (ref DatastoreError)(
msg: "Should always await query features")
if iter.finished == true:
return failure (ref QueryEndedError)(msg: "Calling next on a finished query!")
return failure (ref QueryEndedError)(
msg: "Calling next on a finished query!")
await wait(ctx[].signal)
if not ctx[].running: