]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Store pending peers in a dict to prevent duplicates
authorMatt Joiner <anacrolix@gmail.com>
Thu, 21 Aug 2014 11:10:19 +0000 (21:10 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 21 Aug 2014 11:10:19 +0000 (21:10 +1000)
client.go
torrent.go

index 299feacf636e294c6208ea7717d1a5563c545a2e..7d0823674d2d6bfa6315a76f99a0b656cef46bc2 100644 (file)
--- a/client.go
+++ b/client.go
@@ -874,8 +874,14 @@ func (me *Client) openNewConns() {
                        if me.halfOpen >= me.halfOpenLimit {
                                return
                        }
-                       p := t.Peers[0]
-                       t.Peers = t.Peers[1:]
+                       var (
+                               k peersKey
+                               p Peer
+                       )
+                       for k, p = range t.Peers {
+                               break
+                       }
+                       delete(t.Peers, k)
                        me.initiateConn(p, t)
                }
        }
@@ -889,7 +895,7 @@ func (me *Client) AddPeers(infoHash InfoHash, peers []Peer) error {
        if t == nil {
                return errors.New("no such torrent")
        }
-       t.Peers = append(t.Peers, peers...)
+       t.AddPeers(peers)
        me.openNewConns()
        return nil
 }
@@ -920,6 +926,7 @@ func (cl *Client) setMetaData(t *torrent, md metainfo.Info, bytes []byte) (err e
 func newTorrent(ih InfoHash, announceList [][]string) (t *torrent, err error) {
        t = &torrent{
                InfoHash: ih,
+               Peers:    make(map[peersKey]Peer, 2000),
        }
        t.Trackers = make([][]tracker.Client, len(announceList))
        for tierIndex := range announceList {
index 9b586cea1ecc2dc974dfe71b64cb4228ef943d4b..7257bb30d83df6bc7033055018d15a78ee052c59 100644 (file)
@@ -38,6 +38,11 @@ type torrentPiece struct {
        bytesLeftElement *list.Element
 }
 
+type peersKey struct {
+       IPBytes string
+       Port    int
+}
+
 type torrent struct {
        closed            bool
        InfoHash          InfoHash
@@ -48,7 +53,7 @@ type torrent struct {
        dataLock sync.RWMutex
        Info     *metainfo.Info
        Conns    []*connection
-       Peers    []Peer
+       Peers    map[peersKey]Peer
        // BEP 12 Multitracker Metadata Extension. The tracker.Client instances
        // mirror their respective URLs from the announce-list key.
        Trackers     [][]tracker.Client
@@ -57,6 +62,12 @@ type torrent struct {
        metadataHave []bool
 }
 
+func (t *torrent) AddPeers(pp []Peer) {
+       for _, p := range pp {
+               t.Peers[peersKey{string(p.IP), p.Port}] = p
+       }
+}
+
 func (t *torrent) InvalidateMetadata() {
        t.MetaData = nil
        t.metadataHave = nil