}
}
-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() {
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)) {
if err != nil {
return err
}
- c.readMsg(&msg)
c.lastMessageReceived = time.Now()
if msg.Keepalive {
receivedKeepalives.Add(1)
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)
}{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)
}
}
+ t := c.t
+ cl := t.cl
+
// Do we actually want this chunk?
if t.haveChunk(req) {
chunksReceived.Add("wasted", 1)
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 {