From: Matt Joiner <anacrolix@gmail.com>
Date: Fri, 12 Nov 2021 03:43:22 +0000 (+1100)
Subject: Improve error handling for bad webseeds
X-Git-Tag: v1.37.0~2
X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=63b72158924f82f2febdf6d3c87bc1c8e9fa0afe;p=btrtrc.git

Improve error handling for bad webseeds

DNS "no such host" errors didn't interrupt the stream of outbound requests.
---

diff --git a/webseed-peer.go b/webseed-peer.go
index f15ecf66..0b877738 100644
--- a/webseed-peer.go
+++ b/webseed-peer.go
@@ -4,8 +4,6 @@ import (
 	"context"
 	"errors"
 	"fmt"
-	"net/http"
-	"strings"
 	"sync"
 
 	"github.com/RoaringBitmap/roaring"
@@ -118,6 +116,7 @@ func (ws *webseedPeer) handleUpdateRequests() {
 
 func (ws *webseedPeer) onClose() {
 	ws.peer.logger.WithLevel(log.Debug).Print("closing")
+	ws.peer.deleteAllRequests()
 	for _, r := range ws.activeRequests {
 		r.Cancel()
 	}
@@ -134,25 +133,15 @@ func (ws *webseedPeer) requestResultHandler(r Request, webseedRequest webseed.Re
 	ws.peer.t.cl.lock()
 	defer ws.peer.t.cl.unlock()
 	if result.Err != nil {
-		if !errors.Is(result.Err, context.Canceled) {
+		if !errors.Is(result.Err, context.Canceled) && !ws.peer.closed.IsSet() {
 			ws.peer.logger.Printf("Request %v rejected: %v", r, result.Err)
-		}
-		// We need to filter out temporary errors, but this is a nightmare in Go. Currently a bad
-		// webseed URL can starve out the good ones due to the chunk selection algorithm.
-		const closeOnAllErrors = false
-		if closeOnAllErrors ||
-			strings.Contains(result.Err.Error(), "unsupported protocol scheme") ||
-			func() bool {
-				var err webseed.ErrBadResponse
-				if !errors.As(result.Err, &err) {
-					return false
-				}
-				return err.Response.StatusCode == http.StatusNotFound
-			}() {
+			// cfg := spew.NewDefaultConfig()
+			// cfg.DisableMethods = true
+			// cfg.Dump(result.Err)
+			log.Printf("closing %v", ws)
 			ws.peer.close()
-		} else {
-			ws.peer.remoteRejectedRequest(ws.peer.t.requestIndexFromRequest(r))
 		}
+		ws.peer.remoteRejectedRequest(ws.peer.t.requestIndexFromRequest(r))
 	} else {
 		err := ws.peer.receiveChunk(&pp.Message{
 			Type:  pp.Piece,