memory: add ScrapeSwarm method
This commit is contained in:
parent
b1576da355
commit
97444f08a4
1 changed files with 35 additions and 10 deletions
|
@ -84,10 +84,13 @@ type peerStore struct {
|
||||||
|
|
||||||
var _ storage.PeerStore = &peerStore{}
|
var _ storage.PeerStore = &peerStore{}
|
||||||
|
|
||||||
func (s *peerStore) shardIndex(infoHash bittorrent.InfoHash, p bittorrent.Peer) uint32 {
|
func (s *peerStore) shardIndex(infoHash bittorrent.InfoHash, v6 bool) uint32 {
|
||||||
idx := binary.BigEndian.Uint32(infoHash[:4]) % uint32(len(s.shards))
|
// There are twice the amount of shards specified by the user, the first
|
||||||
if len(p.IP) == net.IPv6len {
|
// half is dedicated to IPv4 swarms and the second half is dedicated to
|
||||||
idx += idx + uint32(len(s.shards)/2)
|
// IPv6 swarms.
|
||||||
|
idx := binary.BigEndian.Uint32(infoHash[:4]) % (uint32(len(s.shards)) / 2)
|
||||||
|
if v6 {
|
||||||
|
idx += uint32(len(s.shards) / 2)
|
||||||
}
|
}
|
||||||
return idx
|
return idx
|
||||||
}
|
}
|
||||||
|
@ -118,7 +121,7 @@ func (s *peerStore) PutSeeder(ih bittorrent.InfoHash, p bittorrent.Peer) error {
|
||||||
|
|
||||||
pk := newPeerKey(p)
|
pk := newPeerKey(p)
|
||||||
|
|
||||||
shard := s.shards[s.shardIndex(ih, p)]
|
shard := s.shards[s.shardIndex(ih, len(p.IP) == net.IPv6len)]
|
||||||
shard.Lock()
|
shard.Lock()
|
||||||
|
|
||||||
if _, ok := shard.swarms[ih]; !ok {
|
if _, ok := shard.swarms[ih]; !ok {
|
||||||
|
@ -143,7 +146,7 @@ func (s *peerStore) DeleteSeeder(ih bittorrent.InfoHash, p bittorrent.Peer) erro
|
||||||
|
|
||||||
pk := newPeerKey(p)
|
pk := newPeerKey(p)
|
||||||
|
|
||||||
shard := s.shards[s.shardIndex(ih, p)]
|
shard := s.shards[s.shardIndex(ih, len(p.IP) == net.IPv6len)]
|
||||||
shard.Lock()
|
shard.Lock()
|
||||||
|
|
||||||
if _, ok := shard.swarms[ih]; !ok {
|
if _, ok := shard.swarms[ih]; !ok {
|
||||||
|
@ -175,7 +178,7 @@ func (s *peerStore) PutLeecher(ih bittorrent.InfoHash, p bittorrent.Peer) error
|
||||||
|
|
||||||
pk := newPeerKey(p)
|
pk := newPeerKey(p)
|
||||||
|
|
||||||
shard := s.shards[s.shardIndex(ih, p)]
|
shard := s.shards[s.shardIndex(ih, len(p.IP) == net.IPv6len)]
|
||||||
shard.Lock()
|
shard.Lock()
|
||||||
|
|
||||||
if _, ok := shard.swarms[ih]; !ok {
|
if _, ok := shard.swarms[ih]; !ok {
|
||||||
|
@ -200,7 +203,7 @@ func (s *peerStore) DeleteLeecher(ih bittorrent.InfoHash, p bittorrent.Peer) err
|
||||||
|
|
||||||
pk := newPeerKey(p)
|
pk := newPeerKey(p)
|
||||||
|
|
||||||
shard := s.shards[s.shardIndex(ih, p)]
|
shard := s.shards[s.shardIndex(ih, len(p.IP) == net.IPv6len)]
|
||||||
shard.Lock()
|
shard.Lock()
|
||||||
|
|
||||||
if _, ok := shard.swarms[ih]; !ok {
|
if _, ok := shard.swarms[ih]; !ok {
|
||||||
|
@ -232,7 +235,7 @@ func (s *peerStore) GraduateLeecher(ih bittorrent.InfoHash, p bittorrent.Peer) e
|
||||||
|
|
||||||
pk := newPeerKey(p)
|
pk := newPeerKey(p)
|
||||||
|
|
||||||
shard := s.shards[s.shardIndex(ih, p)]
|
shard := s.shards[s.shardIndex(ih, len(p.IP) == net.IPv6len)]
|
||||||
shard.Lock()
|
shard.Lock()
|
||||||
|
|
||||||
if _, ok := shard.swarms[ih]; !ok {
|
if _, ok := shard.swarms[ih]; !ok {
|
||||||
|
@ -261,7 +264,7 @@ func (s *peerStore) AnnouncePeers(ih bittorrent.InfoHash, seeder bool, numWant i
|
||||||
numWant = s.maxNumWant
|
numWant = s.maxNumWant
|
||||||
}
|
}
|
||||||
|
|
||||||
shard := s.shards[s.shardIndex(ih, announcer)]
|
shard := s.shards[s.shardIndex(ih, len(announcer.IP) == net.IPv6len)]
|
||||||
shard.RLock()
|
shard.RLock()
|
||||||
|
|
||||||
if _, ok := shard.swarms[ih]; !ok {
|
if _, ok := shard.swarms[ih]; !ok {
|
||||||
|
@ -316,6 +319,28 @@ func (s *peerStore) AnnouncePeers(ih bittorrent.InfoHash, seeder bool, numWant i
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *peerStore) ScrapeSwarm(ih bittorrent.InfoHash, v6 bool) (resp bittorrent.Scrape) {
|
||||||
|
select {
|
||||||
|
case <-s.closed:
|
||||||
|
panic("attempted to interact with stopped memory store")
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
|
||||||
|
shard := s.shards[s.shardIndex(ih, v6)]
|
||||||
|
shard.RLock()
|
||||||
|
|
||||||
|
if _, ok := shard.swarms[ih]; !ok {
|
||||||
|
shard.RUnlock()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp.Incomplete = uint32(len(shard.swarms[ih].leechers))
|
||||||
|
resp.Complete = uint32(len(shard.swarms[ih].seeders))
|
||||||
|
shard.RUnlock()
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// collectGarbage deletes all Peers from the PeerStore which are older than the
|
// collectGarbage deletes all Peers from the PeerStore which are older than the
|
||||||
// cutoff time.
|
// cutoff time.
|
||||||
//
|
//
|
||||||
|
|
Loading…
Add table
Reference in a new issue