finishes implement of requeststore

This commit is contained in:
thatben 2025-03-19 15:34:04 +01:00
parent de22684ff3
commit 9f8ba85d35
No known key found for this signature in database
GPG Key ID: 62C543548433D43E
2 changed files with 63 additions and 56 deletions

View File

@ -62,80 +62,61 @@ proc decode*(T: type RequestEntry, bytes: seq[byte]): ?!T =
return success(RequestEntry(lastSeen: 0)) return success(RequestEntry(lastSeen: 0))
return RequestEntry.fromBytes(bytes) return RequestEntry.fromBytes(bytes)
proc update*(s: RequestStore, rid: Rid): Future[?!void] {.async.} = method update*(
s: RequestStore, rid: Rid
): Future[?!void] {.async: (raises: []), base.} =
without key =? Key.init(requeststoreName / $rid), err: without key =? Key.init(requeststoreName / $rid), err:
error "failed to format key", err = err.msg error "failed to format key", err = err.msg
return failure(err) return failure(err)
let entry = RequestEntry(id: rid, lastSeen: s.clock.now) let entry = RequestEntry(id: rid, lastSeen: s.clock.now)
try:
?await s.store.put(key, entry) ?await s.store.put(key, entry)
except CatchableError as exc:
return failure(exc.msg)
trace "Request entry updated", id = $rid trace "Request entry updated", id = $rid
return success() return success()
proc remove*(s: RequestStore, rid: Rid): Future[?!void] {.async.} = method remove*(
s: RequestStore, rid: Rid
): Future[?!void] {.async: (raises: []), base.} =
without key =? Key.init(requeststoreName / $rid), err: without key =? Key.init(requeststoreName / $rid), err:
error "failed to format key", err = err.msg error "failed to format key", err = err.msg
return failure(err) return failure(err)
try:
?await s.store.delete(key) ?await s.store.delete(key)
except CatchableError as exc:
return failure(exc.msg)
trace "Request entry removed", id = $rid trace "Request entry removed", id = $rid
return success() return success()
# proc storeNodeIsNew(s: RequestStore, nid: Nid): Future[?!bool] {.async.} = method iterateAll*(
# without key =? Key.init(requeststoreName / $nid), err: s: RequestStore, onNode: OnRequestEntry
# error "failed to format key", err = err.msg ): Future[?!void] {.async: (raises: []), base.} =
# return failure(err) without queryKey =? Key.init(requeststoreName), err:
# without exists =? (await s.store.has(key)), err: error "failed to format key", err = err.msg
# error "failed to check store for key", err = err.msg return failure(err)
# return failure(err) try:
without iter =? (await query[RequestEntry](s.store, Query.init(queryKey))), err:
error "failed to create query", err = err.msg
return failure(err)
# if not exists: while not iter.finished:
# let entry = RequestEntry(id: nid, lastVisit: 0, firstInactive: 0) without item =? (await iter.next()), err:
# ?await s.store.put(key, entry) error "failure during query iteration", err = err.msg
# info "New node", nodeId = $nid return failure(err)
without value =? item.value, err:
error "failed to get value from iterator", err = err.msg
return failure(err)
# return success(not exists) if value.lastSeen > 0:
?await onNode(value)
# proc deleteEntry(s: RequestStore, nid: Nid): Future[?!bool] {.async.} = await sleepAsync(1.millis)
# without key =? Key.init(requeststoreName / $nid), err: except CatchableError as exc:
# error "failed to format key", err = err.msg return failure(exc.msg)
# return failure(err) return success()
# without exists =? (await s.store.has(key)), err:
# error "failed to check store for key", err = err.msg, key = $key
# return failure(err)
# if exists:
# ?await s.store.delete(key)
# return success(exists)
# method iterateAll*(
# s: RequestStore, onNode: OnRequestEntry
# ): Future[?!void] {.async: (raises: []), base.} =
# without queryKey =? Key.init(requeststoreName), err:
# error "failed to format key", err = err.msg
# return failure(err)
# try:
# without iter =? (await query[RequestEntry](s.store, Query.init(queryKey))), err:
# error "failed to create query", err = err.msg
# return failure(err)
# while not iter.finished:
# without item =? (await iter.next()), err:
# error "failure during query iteration", err = err.msg
# return failure(err)
# without value =? item.value, err:
# error "failed to get value from iterator", err = err.msg
# return failure(err)
# if value.lastSeen > 0:
# ?await onNode(value)
# await sleepAsync(1.millis)
# except CatchableError as exc:
# return failure(exc.msg)
# return success()
method start*(s: RequestStore): Future[?!void] {.async.} = method start*(s: RequestStore): Future[?!void] {.async.} =
info "Starting..." info "Starting..."

View File

@ -87,3 +87,29 @@ suite "Requeststore":
check: check:
isStored == false isStored == false
test "iterateAll yields all entries":
let
rid1 = genRid()
rid2 = genRid()
rid3 = genRid()
(await store.update(rid1)).tryGet()
(await store.update(rid2)).tryGet()
(await store.update(rid3)).tryGet()
var entries = newSeq[RequestEntry]()
proc onEntry(entry: RequestEntry): Future[?!void] {.async: (raises: []), gcsafe.} =
entries.add(entry)
return success()
(await store.iterateAll(onEntry)).tryGet()
check:
entries.len == 3
entries[0].id == rid1
entries[0].lastSeen == clock.setNow
entries[1].id == rid2
entries[1].lastSeen == clock.setNow
entries[2].id == rid3
entries[2].lastSeen == clock.setNow