Skip to content

Commit 93dd5a6

Browse files
authored
chore(connmanager): specify raised exceptions (#1263)
1 parent ec43d0c commit 93dd5a6

File tree

2 files changed

+34
-28
lines changed

2 files changed

+34
-28
lines changed

libp2p/connmanager.nim

+30-24
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,9 @@ proc removeConnEventHandler*(
123123
) =
124124
c.connEvents[kind].excl(handler)
125125

126-
proc triggerConnEvent*(c: ConnManager, peerId: PeerId, event: ConnEvent) {.async.} =
126+
proc triggerConnEvent*(
127+
c: ConnManager, peerId: PeerId, event: ConnEvent
128+
) {.async: (raises: [CancelledError]).} =
127129
try:
128130
trace "About to trigger connection events", peer = peerId
129131
if c.connEvents[event.kind].len() > 0:
@@ -154,7 +156,9 @@ proc removePeerEventHandler*(
154156
) =
155157
c.peerEvents[kind].excl(handler)
156158

157-
proc triggerPeerEvents*(c: ConnManager, peerId: PeerId, event: PeerEvent) {.async.} =
159+
proc triggerPeerEvents*(
160+
c: ConnManager, peerId: PeerId, event: PeerEvent
161+
) {.async: (raises: [CancelledError]).} =
158162
trace "About to trigger peer events", peer = peerId
159163
if c.peerEvents[event.kind].len == 0:
160164
return
@@ -174,7 +178,7 @@ proc triggerPeerEvents*(c: ConnManager, peerId: PeerId, event: PeerEvent) {.asyn
174178

175179
proc expectConnection*(
176180
c: ConnManager, p: PeerId, dir: Direction
177-
): Future[Muxer] {.async.} =
181+
): Future[Muxer] {.async: (raises: [AlreadyExpectingConnectionError, CancelledError]).} =
178182
## Wait for a peer to connect to us. This will bypass the `MaxConnectionsPerPeer`
179183
let key = (p, dir)
180184
if key in c.expectedConnectionsOverLimit:
@@ -183,7 +187,7 @@ proc expectConnection*(
183187
"Already expecting an incoming connection from that peer",
184188
)
185189

186-
let future = newFuture[Muxer]()
190+
let future = Future[Muxer].Raising([CancelledError]).init()
187191
c.expectedConnectionsOverLimit[key] = future
188192

189193
try:
@@ -205,18 +209,18 @@ proc contains*(c: ConnManager, muxer: Muxer): bool =
205209
let conn = muxer.connection
206210
return muxer in c.muxed.getOrDefault(conn.peerId)
207211

208-
proc closeMuxer(muxer: Muxer) {.async.} =
212+
proc closeMuxer(muxer: Muxer) {.async: (raises: [CancelledError]).} =
209213
trace "Cleaning up muxer", m = muxer
210214

211215
await muxer.close()
212216
if not (isNil(muxer.handler)):
213217
try:
214-
await muxer.handler # TODO noraises?
218+
await muxer.handler
215219
except CatchableError as exc:
216220
trace "Exception in close muxer handler", description = exc.msg
217221
trace "Cleaned up muxer", m = muxer
218222

219-
proc muxCleanup(c: ConnManager, mux: Muxer) {.async.} =
223+
proc muxCleanup(c: ConnManager, mux: Muxer) {.async: (raises: []).} =
220224
try:
221225
trace "Triggering disconnect events", mux
222226
let peerId = mux.connection.peerId
@@ -238,7 +242,7 @@ proc muxCleanup(c: ConnManager, mux: Muxer) {.async.} =
238242
# do not need to propagate CancelledError and should handle other errors
239243
warn "Unexpected exception peer cleanup handler", mux, description = exc.msg
240244

241-
proc onClose(c: ConnManager, mux: Muxer) {.async.} =
245+
proc onClose(c: ConnManager, mux: Muxer) {.async: (raises: []).} =
242246
## connection close even handler
243247
##
244248
## triggers the connections resource cleanup
@@ -324,7 +328,9 @@ proc storeMuxer*(c: ConnManager, muxer: Muxer) {.raises: [CatchableError].} =
324328

325329
trace "Stored muxer", muxer, direction = $muxer.connection.dir, peers = c.muxed.len
326330

327-
proc getIncomingSlot*(c: ConnManager): Future[ConnectionSlot] {.async.} =
331+
proc getIncomingSlot*(
332+
c: ConnManager
333+
): Future[ConnectionSlot] {.async: (raises: [CancelledError]).} =
328334
await c.inSema.acquire()
329335
return ConnectionSlot(connManager: c, direction: In)
330336

@@ -339,25 +345,21 @@ proc getOutgoingSlot*(
339345
raise newTooManyConnectionsError()
340346
return ConnectionSlot(connManager: c, direction: Out)
341347

348+
func semaphore(c: ConnManager, dir: Direction): AsyncSemaphore {.inline.} =
349+
return if dir == In: c.inSema else: c.outSema
350+
342351
proc slotsAvailable*(c: ConnManager, dir: Direction): int =
343-
case dir
344-
of Direction.In:
345-
return c.inSema.count
346-
of Direction.Out:
347-
return c.outSema.count
352+
return semaphore(c, dir).count
348353

349354
proc release*(cs: ConnectionSlot) =
350-
if cs.direction == In:
351-
cs.connManager.inSema.release()
352-
else:
353-
cs.connManager.outSema.release()
355+
semaphore(cs.connManager, cs.direction).release()
354356

355357
proc trackConnection*(cs: ConnectionSlot, conn: Connection) =
356358
if isNil(conn):
357359
cs.release()
358360
return
359361

360-
proc semaphoreMonitor() {.async.} =
362+
proc semaphoreMonitor() {.async: (raises: [CancelledError]).} =
361363
try:
362364
await conn.join()
363365
except CatchableError as exc:
@@ -373,28 +375,32 @@ proc trackMuxer*(cs: ConnectionSlot, mux: Muxer) =
373375
return
374376
cs.trackConnection(mux.connection)
375377

376-
proc getStream*(c: ConnManager, muxer: Muxer): Future[Connection] {.async.} =
378+
proc getStream*(
379+
c: ConnManager, muxer: Muxer
380+
): Future[Connection] {.async: (raises: [LPStreamError, MuxerError, CancelledError]).} =
377381
## get a muxed stream for the passed muxer
378382
##
379383

380384
if not (isNil(muxer)):
381385
return await muxer.newStream()
382386

383-
proc getStream*(c: ConnManager, peerId: PeerId): Future[Connection] {.async.} =
387+
proc getStream*(
388+
c: ConnManager, peerId: PeerId
389+
): Future[Connection] {.async: (raises: [LPStreamError, MuxerError, CancelledError]).} =
384390
## get a muxed stream for the passed peer from any connection
385391
##
386392

387393
return await c.getStream(c.selectMuxer(peerId))
388394

389395
proc getStream*(
390396
c: ConnManager, peerId: PeerId, dir: Direction
391-
): Future[Connection] {.async.} =
397+
): Future[Connection] {.async: (raises: [LPStreamError, MuxerError, CancelledError]).} =
392398
## get a muxed stream for the passed peer from a connection with `dir`
393399
##
394400

395401
return await c.getStream(c.selectMuxer(peerId, dir))
396402

397-
proc dropPeer*(c: ConnManager, peerId: PeerId) {.async.} =
403+
proc dropPeer*(c: ConnManager, peerId: PeerId) {.async: (raises: [CancelledError]).} =
398404
## drop connections and cleanup resources for peer
399405
##
400406
trace "Dropping peer", peerId
@@ -405,7 +411,7 @@ proc dropPeer*(c: ConnManager, peerId: PeerId) {.async.} =
405411

406412
trace "Peer dropped", peerId
407413

408-
proc close*(c: ConnManager) {.async.} =
414+
proc close*(c: ConnManager) {.async: (raises: [CancelledError]).} =
409415
## cleanup resources for the connection
410416
## manager
411417
##

libp2p/utils/semaphore.nim

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,12 @@
1212
import sequtils
1313
import chronos, chronicles
1414

15-
# TODO: this should probably go in chronos
16-
1715
logScope:
1816
topics = "libp2p semaphore"
1917

2018
type AsyncSemaphore* = ref object of RootObj
2119
size*: int
22-
count: int
20+
count: int # count of available slots
2321
queue: seq[Future[void]]
2422

2523
proc newAsyncSemaphore*(size: int): AsyncSemaphore =
@@ -38,7 +36,9 @@ proc tryAcquire*(s: AsyncSemaphore): bool =
3836
trace "Acquired slot", available = s.count, queue = s.queue.len
3937
return true
4038

41-
proc acquire*(s: AsyncSemaphore): Future[void] =
39+
proc acquire*(
40+
s: AsyncSemaphore
41+
): Future[void] {.async: (raises: [CancelledError], raw: true).} =
4242
## Acquire a resource and decrement the resource
4343
## counter. If no more resources are available,
4444
## the returned future will not complete until

0 commit comments

Comments
 (0)