From: Matt Joiner Date: Tue, 2 Jun 2020 06:41:49 +0000 (+1000) Subject: Handle webseed request errors X-Git-Tag: v1.16.0~16^2~1 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=d5a482e209e4d7a6b573dfdab96517871541bd70;p=btrtrc.git Handle webseed request errors --- diff --git a/peerconn.go b/peerconn.go index af98660f..4afdd8c2 100644 --- a/peerconn.go +++ b/peerconn.go @@ -1152,8 +1152,7 @@ func (c *PeerConn) mainReadLoop() (err error) { case pp.HaveNone: err = c.peerSentHaveNone() case pp.Reject: - c.deleteRequest(newRequestFromMessage(&msg)) - c.decExpectedChunkReceive(newRequestFromMessage(&msg)) + c.remoteRejectedRequest(newRequestFromMessage(&msg)) case pp.AllowedFast: torrent.Add("allowed fasts received", 1) log.Fmsg("peer allowed fast: %d", msg.Index).AddValues(c).SetLevel(log.Debug).Log(c.t.logger) @@ -1170,6 +1169,11 @@ func (c *PeerConn) mainReadLoop() (err error) { } } +func (c *peer) remoteRejectedRequest(r request) { + c.deleteRequest(r) + c.decExpectedChunkReceive(r) +} + func (c *peer) decExpectedChunkReceive(r request) { count := c.validReceiveChunks[r] if count == 1 { diff --git a/web_seed.go b/web_seed.go index 3163ac4d..297a817f 100644 --- a/web_seed.go +++ b/web_seed.go @@ -3,6 +3,7 @@ package torrent import ( "net/http" + "github.com/anacrolix/log" "github.com/anacrolix/torrent/common" "github.com/anacrolix/torrent/metainfo" pp "github.com/anacrolix/torrent/peer_protocol" @@ -76,16 +77,21 @@ func (ws *webSeed) UpdateRequests() { func (ws *webSeed) Close() {} func (ws *webSeed) requestResultHandler(r request, webseedRequest webseed.Request) { - webseedRequestResult := <-webseedRequest.Result + result := <-webseedRequest.Result ws.peer.t.cl.lock() - err := ws.peer.receiveChunk(&pp.Message{ - Type: pp.Piece, - Index: r.Index, - Begin: r.Begin, - Piece: webseedRequestResult.Bytes, - }) - ws.peer.t.cl.unlock() - if err != nil { - panic(err) + defer ws.peer.t.cl.unlock() + if result.Err != nil { + log.Printf("webseed request rejected: %v", result.Err) + ws.peer.remoteRejectedRequest(r) + } else { + err := ws.peer.receiveChunk(&pp.Message{ + Type: pp.Piece, + Index: r.Index, + Begin: r.Begin, + Piece: result.Bytes, + }) + if err != nil { + panic(err) + } } }