]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Track peer sources with a dict, and don't exceed high water mark
authorMatt Joiner <anacrolix@gmail.com>
Mon, 28 Sep 2015 05:30:13 +0000 (15:30 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Mon, 28 Sep 2015 05:30:13 +0000 (15:30 +1000)
client.go
connection.go
torrent.go

index f11e892b81dad5ff136e378426a28a73ad1ad418..898ee23a36cb9c397e89a33726dd1bd946d9143b 100644 (file)
--- a/client.go
+++ b/client.go
@@ -48,9 +48,7 @@ var (
        unexpectedChunksReceived = expvar.NewInt("chunksReceivedUnexpected")
        chunksReceived           = expvar.NewInt("chunksReceived")
 
-       peersFoundByDHT     = expvar.NewInt("peersFoundByDHT")
-       peersFoundByPEX     = expvar.NewInt("peersFoundByPEX")
-       peersFoundByTracker = expvar.NewInt("peersFoundByTracker")
+       peersAddedBySource = expvar.NewMap("peersAddedBySource")
 
        uploadChunksPosted    = expvar.NewInt("uploadChunksPosted")
        unexpectedCancels     = expvar.NewInt("unexpectedCancels")
@@ -1700,7 +1698,6 @@ func (me *Client) connectionLoop(t *torrent, c *connection) error {
                                                return
                                        }())
                                        me.mu.Unlock()
-                                       peersFoundByPEX.Add(int64(len(pexMsg.Added)))
                                }()
                        default:
                                err = fmt.Errorf("unexpected extended message ID: %v", msg.ExtendedID)
@@ -1883,9 +1880,8 @@ func (me *Client) addPeers(t *torrent, peers []Peer) {
                        // The spec says to scrub these yourselves. Fine.
                        continue
                }
-               t.addPeer(p)
+               t.addPeer(p, me)
        }
-       me.openNewConns(t)
 }
 
 func (cl *Client) cachedMetaInfoFilename(ih InfoHash) string {
@@ -2331,7 +2327,6 @@ func (cl *Client) announceTorrentDHT(t *torrent, impliedPort bool) {
                                        }).String()
                                        allAddrs[key] = struct{}{}
                                }
-                               peersFoundByDHT.Add(int64(len(addPeers)))
                                cl.mu.Lock()
                                cl.addPeers(t, addPeers)
                                numPeers := len(t.Peers)
@@ -2399,7 +2394,6 @@ func (cl *Client) announceTorrentSingleTracker(tr tracker.Client, req *tracker.A
        cl.mu.Unlock()
 
        // log.Printf("%s: %d new peers from %s", t, len(peers), tr)
-       peersFoundByTracker.Add(int64(len(peers)))
 
        time.Sleep(time.Second * time.Duration(resp.Interval))
        return nil
index bedb1a9b9209311b86fde72f849733cefaddeb8d..0edda653c6420321fefe40ce31de6fa99849d39d 100644 (file)
@@ -23,6 +23,7 @@ var optimizedCancels = expvar.NewInt("optimizedCancels")
 type peerSource byte
 
 const (
+       peerSourceTracker  = '\x00' // It's the default.
        peerSourceIncoming = 'I'
        peerSourceDHT      = 'H'
        peerSourcePEX      = 'X'
index 79a6a1599aedf76501eea19ae2c7cc3693ec3483..82d97a49051def3514e0de8c219be56a80f4ebb9 100644 (file)
@@ -181,8 +181,19 @@ func (t *torrent) ceaseNetworking() {
        }
 }
 
-func (t *torrent) addPeer(p Peer) {
-       t.Peers[peersKey{string(p.IP), p.Port}] = p
+func (t *torrent) addPeer(p Peer, cl *Client) {
+       cl.openNewConns(t)
+       if len(t.Peers) >= torrentPeersHighWater {
+               return
+       }
+       key := peersKey{string(p.IP), p.Port}
+       if _, ok := t.Peers[key]; ok {
+               return
+       }
+       t.Peers[key] = p
+       peersAddedBySource.Add(string(p.Source), 1)
+       cl.openNewConns(t)
+
 }
 
 func (t *torrent) invalidateMetadata() {