]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Handle webseed request errors
authorMatt Joiner <anacrolix@gmail.com>
Tue, 2 Jun 2020 06:41:49 +0000 (16:41 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Tue, 2 Jun 2020 06:41:49 +0000 (16:41 +1000)
peerconn.go
web_seed.go

index af98660fa9fa8a875a61e4624ea7fd29112283e7..4afdd8c21d2eaa968eae34a13ca66554b9a31b79 100644 (file)
@@ -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 {
index 3163ac4dc94927d0d60e9cdb15ac0c09dd9ba5c4..297a817ff88fc96b86bff518098c104262dd6e9f 100644 (file)
@@ -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)
+               }
        }
 }