rework ds

This commit is contained in:
Jaremy Creechley 2023-08-28 17:51:48 -07:00
parent cff4540a58
commit b557d60b6a
No known key found for this signature in database
GPG Key ID: 4E66FB67B21D3300
2 changed files with 47 additions and 38 deletions

View File

@ -93,7 +93,15 @@ method close*(
self: SharedDatastore
): Future[?!void] {.async.} =
# TODO: how to handle failed close?
return success()
echo "ThreadDatastore: FREE: "
result = success()
without res =? self.tds[].ds.close(), err:
result = failure(err)
if self.tds[].tp != nil:
## this can block... how to handle? maybe just leak?
self.tds[].tp.shutdown()
proc newSharedDataStore*(
# T: typedesc[SharedDatastore],

View File

@ -56,6 +56,7 @@ type
ThreadDatastore* = object
tp*: Taskpool
backend*: ThreadBackendKind
ds*: Datastore
ThreadDatastorePtr* = SharedPtr[ThreadDatastore]
@ -64,10 +65,6 @@ type
TestPtr* = SharedPtr[Test]
var
fsDatastore {.threadvar.}: FSDatastore ##\
## TODO: figure out a better way to capture this?
proc newThreadResult*[T](
tp: typedesc[T]
): Result[TResult[T], ref CatchableError] =
@ -79,39 +76,6 @@ proc newThreadResult*[T](
res[].signal = signal.get()
ok res
proc startupDatastore(
ret: TResult[ThreadDatastorePtr],
backend: ThreadBackend,
) {.raises: [].} =
## starts up a FS instance on a give thread
echo "\n"
echo "\nstartupDatastore: threadId:", getThreadId()
print "\nstartupDatastore: backend:\n", backend
echo ""
case backend.kind:
of FSBackend:
let ds = FSDatastore.new(
root = backend.root.toString(),
depth = backend.depth,
caseSensitive = backend.caseSensitive,
ignoreProtected = backend.ignoreProtected
)
if ds.isOk:
fsDatastore = ds.get()
ret[].state = Success
else:
ret[].state = Error
ret[].state = Success
of TestBackend:
echo "startupDatastore: TestBackend"
ret[].value[].backend = TestBackend
ret[].state = Success
else:
discard
print "startupDatastore: signal", ret[].signal.fireSync()
proc getTask*(
ret: TResult[DataBuffer],
backend: ThreadBackendKind,
@ -167,6 +131,8 @@ proc put*(
tds[].tp.spawn putTask(ret, tds[].backend, bkey, bval)
proc startupDatastore(ret: TResult[ThreadDatastorePtr], backend: ThreadBackend,) {.raises: [].}
proc createThreadDatastore*(
ret: TResult[ThreadDatastorePtr],
backend: ThreadBackend,
@ -184,3 +150,38 @@ proc createThreadDatastore*(
ret[].error = exc.toBuffer()
discard
proc startupDatastore(
ret: TResult[ThreadDatastorePtr],
backend: ThreadBackend,
) {.raises: [].} =
## starts up a FS instance on a give thread
echo "\n"
echo "\nstartupDatastore: threadId:", getThreadId()
print "\nstartupDatastore: backend:\n", backend
echo ""
case backend.kind:
of FSBackend:
let ds = FSDatastore.new(
root = backend.root.toString(),
depth = backend.depth,
caseSensitive = backend.caseSensitive,
ignoreProtected = backend.ignoreProtected
)
if ds.isOk:
let ds = ds.get()
GC_ref(ds)
ret[].value[].ds = ds
ret[].state = Success
else:
ret[].state = Error
ret[].state = Success
of TestBackend:
echo "startupDatastore: TestBackend"
ret[].value[].backend = TestBackend
ret[].state = Success
else:
discard
# print "startupDatastore: signal", ret[].signal.fireSync()