mirror of
https://github.com/vacp2p/nim-libp2p-experimental.git
synced 2025-01-15 04:44:22 +00:00
4c6a123d31
* Add chronos trackers and used them to sanitize resource disposal * Chronos trackers for transport tests wip * No more chronos leaks in testtransport * Make tcp transport and test more robust when closing * Test async leaking tracking wip * Fix a regression in wire connect * Add chronos trackers to more tests and sanitize resource closure * Wip fixing floodsub tests * Floodsub wip * Made floodsub basically deterministic, hit a nim bug with captures tho * Wrap up floodsub tests refactor * Wrapping up * Add allFuturesThrowing utility * Fix missing allFuturesThrowing in noise tests! * Make tests green * attempt fixing gossipsub failing cases * Make sure to check also fanout in waitSub * More verbose traces * Gossipsub test improvments * Refactor TcpTransport remove asyncCheck * Add Connection trackers * Add stricter connection tracking, wip mplex fix * More asynccheck removal, in order to avoid connection leaks * bump chronicles requirement * Enable tracker dump to check CI output * Wait for more futures in testmplex * Remove tracker dump messages * add tryAndWarn utility, fix mplex issue with go interop * All allFuturesThrowing to directchat too * make sure to cleanup on transport close
59 lines
1.8 KiB
Nim
59 lines
1.8 KiB
Nim
# this module will be further extended in PR
|
|
# https://github.com/status-im/nim-libp2p/pull/107/
|
|
|
|
import chronos
|
|
import chronicles
|
|
import macros
|
|
|
|
# could not figure how to make it with a simple template
|
|
# sadly nim needs more love for hygenic templates
|
|
# so here goes the macro, its based on the proc/template version
|
|
# and uses quote do so it's quite readable
|
|
|
|
macro checkFutures*[T](futs: seq[Future[T]], exclude: untyped = []): untyped =
|
|
let nexclude = exclude.len
|
|
case nexclude
|
|
of 0:
|
|
quote do:
|
|
let pos = instantiationInfo()
|
|
for res in `futs`:
|
|
if res.failed:
|
|
let exc = res.readError()
|
|
# We still don't abort but warn
|
|
warn "Something went wrong in a future",
|
|
error=exc.name, file=pos.filename, line=pos.line
|
|
else:
|
|
quote do:
|
|
let pos = instantiationInfo()
|
|
for res in `futs`:
|
|
block check:
|
|
if res.failed:
|
|
let exc = res.readError()
|
|
for i in 0..<`nexclude`:
|
|
if exc of `exclude`[i]:
|
|
trace "Ignoring an error (no warning)",
|
|
error=exc.name, file=pos.filename, line=pos.line
|
|
break check
|
|
# We still don't abort but warn
|
|
warn "Something went wrong in a future",
|
|
error=exc.name, file=pos.filename, line=pos.line
|
|
|
|
proc allFuturesThrowing*[T](args: varargs[Future[T]]): Future[void] =
|
|
var futs: seq[Future[T]]
|
|
for fut in args:
|
|
futs &= fut
|
|
proc call() {.async.} =
|
|
futs = await allFinished(futs)
|
|
for fut in futs:
|
|
if fut.failed:
|
|
raise fut.readError()
|
|
return call()
|
|
|
|
template tryAndWarn*(msg: static[string]; body: untyped): untyped =
|
|
try:
|
|
body
|
|
except CancelledError as ex:
|
|
raise ex
|
|
except CatchableError as ex:
|
|
warn "ignored an error", name=ex.name, msg=msg
|