]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Track chunks read for webseed peers too
authorMatt Joiner <anacrolix@gmail.com>
Fri, 21 May 2021 01:49:57 +0000 (11:49 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Mon, 7 Jun 2021 03:01:40 +0000 (13:01 +1000)
conn_stats.go
peerconn.go
webseed-peer.go

index d2d52003d552bfabfd39ce3e020314d58cf21b8c..0c5bfc784e88d4ce142cff68bb552e681cac9e1e 100644 (file)
@@ -79,14 +79,9 @@ func (cs *ConnStats) wroteMsg(msg *pp.Message) {
        }
 }
 
-func (cs *ConnStats) readMsg(msg *pp.Message) {
-       // We want to also handle extended metadata pieces here, but we wouldn't
-       // have decoded the extended payload yet.
-       switch msg.Type {
-       case pp.Piece:
-               cs.ChunksRead.Add(1)
-               cs.BytesReadData.Add(int64(len(msg.Piece)))
-       }
+func (cs *ConnStats) receivedChunk(size int64) {
+       cs.ChunksRead.Add(1)
+       cs.BytesReadData.Add(size)
 }
 
 func (cs *ConnStats) incrementPiecesDirtiedGood() {
index 40848e37e2c5e136991323cf9cefb5dc1bf35aaf..46756320a2ad52fb9e48c29974d209583e96fa06 100644 (file)
@@ -856,10 +856,6 @@ func (cn *PeerConn) wroteMsg(msg *pp.Message) {
        cn.allStats(func(cs *ConnStats) { cs.wroteMsg(msg) })
 }
 
-func (cn *PeerConn) readMsg(msg *pp.Message) {
-       cn.allStats(func(cs *ConnStats) { cs.readMsg(msg) })
-}
-
 // After handshake, we know what Torrent and Client stats to include for a
 // connection.
 func (cn *Peer) postHandshakeStats(f func(*ConnStats)) {
@@ -1065,7 +1061,6 @@ func (c *PeerConn) mainReadLoop() (err error) {
                if err != nil {
                        return err
                }
-               c.readMsg(&msg)
                c.lastMessageReceived = time.Now()
                if msg.Keepalive {
                        receivedKeepalives.Add(1)
@@ -1105,6 +1100,7 @@ func (c *PeerConn) mainReadLoop() (err error) {
                        r := newRequestFromMessage(&msg)
                        err = c.onReadRequest(r)
                case pp.Piece:
+                       c.doChunkReadStats(int64(len(msg.Piece)))
                        err = c.receiveChunk(&msg)
                        if len(msg.Piece) == int(t.chunkSize) {
                                t.chunkPool.Put(&msg.Piece)
@@ -1253,10 +1249,12 @@ func (cn *PeerConn) rw() io.ReadWriter {
        }{cn.r, cn.w}
 }
 
+func (c *Peer) doChunkReadStats(size int64) {
+       c.allStats(func(cs *ConnStats) { cs.receivedChunk(size) })
+}
+
 // Handle a received chunk from a peer.
 func (c *Peer) receiveChunk(msg *pp.Message) error {
-       t := c.t
-       cl := t.cl
        chunksReceived.Add("total", 1)
 
        req := newRequestFromMessage(msg)
@@ -1296,6 +1294,9 @@ func (c *Peer) receiveChunk(msg *pp.Message) error {
                }
        }
 
+       t := c.t
+       cl := t.cl
+
        // Do we actually want this chunk?
        if t.haveChunk(req) {
                chunksReceived.Add("wasted", 1)
index 7af892f0ff09579a011f0a3b628a869456c135ee..f2ccbff5550df6cc414ad5f5f5b3e96dd35527af 100644 (file)
@@ -110,6 +110,10 @@ func (ws *webseedPeer) onClose() {
 
 func (ws *webseedPeer) requestResultHandler(r Request, webseedRequest webseed.Request) {
        result := <-webseedRequest.Result
+       // We do this here rather than inside receiveChunk, since we want to count errors too. I'm not
+       // sure if we can divine which errors indicate cancellation on our end without hitting the
+       // network though.
+       ws.peer.doChunkReadStats(int64(len(result.Bytes)))
        ws.peer.t.cl.lock()
        defer ws.peer.t.cl.unlock()
        if result.Err != nil {