From: Matt Joiner Date: Thu, 21 Aug 2014 11:10:19 +0000 (+1000) Subject: Store pending peers in a dict to prevent duplicates X-Git-Tag: v1.0.0~1630 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=e8f184a7bffd6c91b68bad5d40b9b3b1c8928ff2;p=btrtrc.git Store pending peers in a dict to prevent duplicates --- diff --git a/client.go b/client.go index 299feacf..7d082367 100644 --- 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 { diff --git a/torrent.go b/torrent.go index 9b586cea..7257bb30 100644 --- a/torrent.go +++ b/torrent.go @@ -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