]> Sergey Matveev's repositories - btrtrc.git/blobdiff - webseed-peer.go
Rename tracker/http package
[btrtrc.git] / webseed-peer.go
index 08a7be2cbc86c86cf7b131ff5240ce016ea6eed4..52e33c721217b51096a5d6e99c6f179233c5e23c 100644 (file)
@@ -10,16 +10,18 @@ import (
 
        "github.com/RoaringBitmap/roaring"
        "github.com/anacrolix/log"
+
        "github.com/anacrolix/torrent/metainfo"
        pp "github.com/anacrolix/torrent/peer_protocol"
        "github.com/anacrolix/torrent/webseed"
 )
 
 type webseedPeer struct {
+       // First field for stats alignment.
+       peer           Peer
        client         webseed.Client
        activeRequests map[Request]webseed.Request
        requesterCond  sync.Cond
-       peer           Peer
        // Number of requester routines.
        maxRequests int
 }
@@ -85,7 +87,7 @@ func (ws *webseedPeer) requester(i int) {
 start:
        for !ws.peer.closed.IsSet() {
                restart := false
-               ws.peer.requestState.Requests.Iterate(func(x uint32) bool {
+               ws.peer.requestState.Requests.Iterate(func(x RequestIndex) bool {
                        r := ws.peer.t.requestIndexToRequest(x)
                        if _, ok := ws.activeRequests[r]; ok {
                                return true
@@ -113,10 +115,13 @@ func (ws *webseedPeer) connectionFlags() string {
        return "WS"
 }
 
-// TODO: This is called when banning peers. Perhaps we want to be able to ban webseeds too. We could
-// return bool if this is even possible, and if it isn't, skip to the next drop candidate.
+// Maybe this should drop all existing connections, or something like that.
 func (ws *webseedPeer) drop() {}
 
+func (cn *webseedPeer) ban() {
+       cn.peer.close()
+}
+
 func (ws *webseedPeer) handleUpdateRequests() {
        // Because this is synchronous, webseed peers seem to get first dibs on newly prioritized
        // pieces.
@@ -128,11 +133,9 @@ 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()
-       }
+       ws.peer.logger.Levelf(log.Debug, "closing")
+       // Just deleting them means we would have to manually cancel active requests.
+       ws.peer.cancelAllRequests()
        ws.peer.t.iterPeers(func(p *Peer) {
                if p.isLowOnRequests() {
                        p.updateRequests("webseedPeer.onClose")
@@ -189,10 +192,6 @@ func (ws *webseedPeer) requestResultHandler(r Request, webseedRequest webseed.Re
        return err
 }
 
-func (me *webseedPeer) isLowOnRequests() bool {
-       return me.peer.requestState.Requests.GetCardinality() < uint64(me.maxRequests)
-}
-
 func (me *webseedPeer) peerPieces() *roaring.Bitmap {
        return &me.client.Pieces
 }