From: Matt Joiner Date: Mon, 15 Jan 2024 01:43:55 +0000 (+1100) Subject: Expect cancel acknowledgement from Transmission v4 clients X-Git-Tag: v1.53.3~7 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=70ce33cab3caf8a53688c7b31b646393de567b70;p=btrtrc.git Expect cancel acknowledgement from Transmission v4 clients --- diff --git a/peer.go b/peer.go index 7d524b7f..c4b4fb9e 100644 --- a/peer.go +++ b/peer.go @@ -465,6 +465,7 @@ func (me *Peer) cancel(r RequestIndex) { panic("request not existing should have been guarded") } if me._cancel(r) { + // Record that we expect to get a cancel ack. if !me.requestState.Cancelled.CheckedAdd(r) { panic("request already cancelled") } diff --git a/peerconn.go b/peerconn.go index e2d944ff..7a1639f2 100644 --- a/peerconn.go +++ b/peerconn.go @@ -297,9 +297,23 @@ func (me *PeerConn) _request(r Request) bool { func (me *PeerConn) _cancel(r RequestIndex) bool { me.write(makeCancelMessage(me.t.requestIndexToRequest(r))) - // Transmission does not send rejects for received cancels. See - // https://github.com/transmission/transmission/pull/2275. - return me.fastEnabled() && !me.remoteIsTransmission() + return me.remoteRejectsCancels() +} + +// Whether we should expect a reject message after sending a cancel. +func (me *PeerConn) remoteRejectsCancels() bool { + if !me.fastEnabled() { + return false + } + if me.remoteIsTransmission() { + // Transmission did not send rejects for received cancels. See + // https://github.com/transmission/transmission/pull/2275. Fixed in 4.0.0-beta.1 onward in + // https://github.com/transmission/transmission/commit/76719bf34c255da4fca991c2ad3fa4b65d2154b1. + // Peer ID prefix scheme described + // https://github.com/transmission/transmission/blob/7ec7607bbcf0fa99bd4b157b9b0f0c411d59f45d/CMakeLists.txt#L128-L149. + return me.PeerID[3] >= '4' + } + return true } func (cn *PeerConn) fillWriteBuffer() {