]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Track v2 state in peer conn
authorMatt Joiner <anacrolix@gmail.com>
Tue, 19 Mar 2024 04:21:48 +0000 (15:21 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Tue, 19 Mar 2024 04:21:48 +0000 (15:21 +1100)
client.go
logging.go [new file with mode: 0644]
peer.go
peerconn.go

index ed1a0c714c85fb382af45cde52ebdcf2d07d0b1d..f0587686502ce6bdfab0339874287626eca845ea 100644 (file)
--- a/client.go
+++ b/client.go
@@ -1016,6 +1016,10 @@ func (cl *Client) receiveHandshakes(c *PeerConn) (t *Torrent, err error) {
        }
        cl.lock()
        t = cl.torrentsByShortHash[ih]
+       if t.infoHashV2.Ok && *t.infoHashV2.Value.ToShort() == ih {
+               torrent.Add("v2 handshakes received", 1)
+               c.v2 = true
+       }
        cl.unlock()
        return
 }
@@ -1662,7 +1666,7 @@ func (cl *Client) newConnection(nc net.Conn, opts newConnectionOpts) (c *PeerCon
        }
        c.peerImpl = c
        c.logger = cl.logger.WithDefaultLevel(log.Warning)
-       c.logger = c.logger.WithContextText(fmt.Sprintf("%T %p", c, c))
+       c.logger = c.logger.WithContextText(fmt.Sprintf("%T %p", c, c)).WithNames(protocolLoggingName)
        c.setRW(connStatsReadWriter{nc, c})
        c.r = &rateLimitedReader{
                l: cl.config.DownloadRateLimiter,
diff --git a/logging.go b/logging.go
new file mode 100644 (file)
index 0000000..bfc985c
--- /dev/null
@@ -0,0 +1,3 @@
+package torrent
+
+const protocolLoggingName = "protocol"
diff --git a/peer.go b/peer.go
index 37d7ca57f02914ccf59059ecff8a0fe570a91b2d..71b8e855f9c6d5a27f569ab4b64a40a398f882cc 100644 (file)
--- a/peer.go
+++ b/peer.go
@@ -96,7 +96,8 @@ type (
 
                PeerMaxRequests maxRequests // Maximum pending requests the peer allows.
 
-               logger log.Logger
+               logger         log.Logger
+               protocolLogger log.Logger
        }
 
        PeerSource string
@@ -225,9 +226,9 @@ func (cn *Peer) statusFlags() (ret string) {
        if cn.choking {
                c('c')
        }
-       c('-')
+       c(':')
        ret += cn.connectionFlags()
-       c('-')
+       c(':')
        if cn.peerInterested {
                c('i')
        }
index 232da671be70202ece82f730dd6fa81c9e5ceb22..8bf510ead59dd072e2c891ac25157af9baa222b9 100644 (file)
@@ -183,20 +183,30 @@ func (cn *PeerConn) peerPieces() *roaring.Bitmap {
        return &cn._peerPieces
 }
 
-func (cn *PeerConn) connectionFlags() (ret string) {
-       c := func(b byte) {
-               ret += string([]byte{b})
+func (cn *PeerConn) connectionFlags() string {
+       var sb strings.Builder
+       add := func(s string) {
+               if sb.Len() > 0 {
+                       sb.WriteByte(',')
+               }
+               sb.WriteString(s)
+       }
+       // From first relevant to last.
+       add(string(cn.Discovery))
+       if cn.utp() {
+               add("U")
        }
        if cn.cryptoMethod == mse.CryptoMethodRC4 {
-               c('E')
+               add("E")
        } else if cn.headerEncrypted {
-               c('e')
+               add("e")
        }
-       ret += string(cn.Discovery)
-       if cn.utp() {
-               c('U')
+       if cn.v2 {
+               add("v2")
+       } else {
+               add("v1")
        }
-       return
+       return sb.String()
 }
 
 func (cn *PeerConn) utp() bool {
@@ -883,7 +893,7 @@ func (c *PeerConn) mainReadLoop() (err error) {
                case pp.Hashes:
                        err = c.onReadHashes(&msg)
                case pp.HashRequest, pp.HashReject:
-                       c.logger.Levelf(log.Info, "received unimplemented BitTorrent v2 message: %v", msg.Type)
+                       c.protocolLogger.Levelf(log.Info, "received unimplemented BitTorrent v2 message: %v", msg.Type)
                default:
                        err = fmt.Errorf("received unknown message type: %#v", msg.Type)
                }
@@ -1243,6 +1253,9 @@ func (pc *PeerConn) requestMissingHashes() {
        if !info.HasV2() {
                return
        }
+       if !pc.v2 {
+               return
+       }
        baseLayer := pp.Integer(merkle.Log2RoundingUp(merkle.RoundUpToPowerOfTwo(
                uint((pc.t.usualPieceSize() + merkle.BlockSize - 1) / merkle.BlockSize)),
        ))