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)
}
}
if t == nil {
return errors.New("no such torrent")
}
- t.Peers = append(t.Peers, peers...)
+ t.AddPeers(peers)
me.openNewConns()
return nil
}
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 {
bytesLeftElement *list.Element
}
+type peersKey struct {
+ IPBytes string
+ Port int
+}
+
type torrent struct {
closed bool
InfoHash InfoHash
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
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