Handle more cancellations (#733)

* Mplex: handle write cancellation
* LpChannel: Don't close connection on EOF
This commit is contained in:
Tanguy 2022-06-24 11:11:23 +02:00 committed by GitHub
parent a7e335e1bb
commit 5d7024f2e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 0 deletions

View File

@ -78,6 +78,8 @@ proc open*(s: LPChannel) {.async, gcsafe.} =
try: try:
await s.conn.writeMsg(s.id, MessageType.New, s.name) await s.conn.writeMsg(s.id, MessageType.New, s.name)
s.isOpen = true s.isOpen = true
except CancelledError as exc:
raise exc
except CatchableError as exc: except CatchableError as exc:
await s.conn.close() await s.conn.close()
raise exc raise exc
@ -221,6 +223,11 @@ proc completeWrite(
libp2p_protocols_bytes.inc(msgLen.int64, labelValues=[s.tag, "out"]) libp2p_protocols_bytes.inc(msgLen.int64, labelValues=[s.tag, "out"])
s.activity = true s.activity = true
except CancelledError as exc:
# Chronos may still send the data
raise exc
except LPStreamClosedError as exc:
raise exc
except CatchableError as exc: except CatchableError as exc:
trace "exception in lpchannel write handler", s, msg = exc.msg trace "exception in lpchannel write handler", s, msg = exc.msg
await s.reset() await s.reset()

View File

@ -152,6 +152,8 @@ method readOnce*(s: SecureConn,
s.isEof = true s.isEof = true
await s.close() await s.close()
raise err raise err
except CancelledError as exc:
raise exc
except CatchableError as err: except CatchableError as err:
debug "Error while reading message from secure connection, closing.", debug "Error while reading message from secure connection, closing.",
error = err.name, error = err.name,

View File

@ -134,6 +134,10 @@ method readOnce*(s: BufferStream,
let buf = let buf =
try: try:
await s.readQueue.popFirst() await s.readQueue.popFirst()
except CancelledError as exc:
# Not very efficient, but shouldn't happen often
s.readBuf.assign(@(p.toOpenArray(0, rbytes - 1)) & @(s.readBuf.data))
raise exc
except CatchableError as exc: except CatchableError as exc:
# When an exception happens here, the Bufferstream is effectively # When an exception happens here, the Bufferstream is effectively
# broken and no more reads will be valid - for now, return EOF if it's # broken and no more reads will be valid - for now, return EOF if it's