81 lines
2.0 KiB
Nim
Raw Normal View History

2025-02-07 16:48:47 +01:00
import pkg/chronicles
import pkg/chronos
import pkg/questionable
import pkg/questionable/results
import ./dht
2025-02-10 14:49:30 +01:00
import ../list
import ../nodeentry
import ../config
import ../component
2025-02-07 16:48:47 +01:00
logScope:
topics = "timetracker"
2025-02-10 14:49:30 +01:00
type TimeTracker* = ref object of Component
config: Config
2025-02-07 16:48:47 +01:00
todoNodes: List
okNodes: List
nokNodes: List
workerDelay: int
proc processList(t: TimeTracker, list: List, expiry: uint64) {.async.} =
var toMove = newSeq[NodeEntry]()
proc onItem(item: NodeEntry) =
if item.lastVisit < expiry:
toMove.add(item)
await list.iterateAll(onItem)
if toMove.len > 0:
trace "expired node, moving to todo", nodes = $toMove.len
2025-02-07 16:48:47 +01:00
for item in toMove:
if err =? (await t.todoNodes.add(item)).errorOption:
error "Failed to add expired node to todo list", err = err.msg
return
if err =? (await list.remove(item)).errorOption:
error "Failed to remove expired node to source list", err = err.msg
proc step(t: TimeTracker) {.async.} =
let expiry = (Moment.now().epochSeconds - (t.config.revisitDelayMins * 60)).uint64
await t.processList(t.okNodes, expiry)
await t.processList(t.nokNodes, expiry)
proc worker(t: TimeTracker) {.async.} =
try:
while true:
await t.step()
await sleepAsync(t.workerDelay.minutes)
except Exception as exc:
error "Exception in timetracker worker", msg = exc.msg
quit QuitFailure
proc start*(t: TimeTracker): Future[?!void] {.async.} =
info "Starting timetracker...", revisitDelayMins = $t.workerDelay
2025-02-07 16:48:47 +01:00
asyncSpawn t.worker()
return success()
2025-02-10 14:49:30 +01:00
proc stop*(t: TimeTracker): Future[?!void] {.async.} =
return success()
2025-02-07 16:48:47 +01:00
proc new*(
T: type TimeTracker,
2025-02-10 14:49:30 +01:00
# todoNodes: List,
# okNodes: List,
# nokNodes: List,
config: Config,
2025-02-07 16:48:47 +01:00
): TimeTracker =
2025-02-10 14:49:30 +01:00
raiseAssert("todo")
# var delay = config.revisitDelayMins div 10
# if delay < 1:
# delay = 1
2025-02-07 16:48:47 +01:00
2025-02-10 14:49:30 +01:00
# TimeTracker(
# todoNodes: todoNodes,
# okNodes: okNodes,
# nokNodes: nokNodes,
# config: config,
# workerDelay: delay,
# )