Add get peers limits

This commit is contained in:
Matt Joiner 2022-12-08 14:04:23 +11:00
parent 1028161833
commit acb09fcf79
No known key found for this signature in database
GPG Key ID: 6B990B8185E7F782
3 changed files with 27 additions and 5 deletions

View File

@ -9,6 +9,7 @@ import (
"strconv" "strconv"
"github.com/anacrolix/dht/v2/krpc" "github.com/anacrolix/dht/v2/krpc"
"github.com/anacrolix/generics"
"github.com/anacrolix/log" "github.com/anacrolix/log"
"github.com/anacrolix/torrent/bencode" "github.com/anacrolix/torrent/bencode"
@ -78,7 +79,8 @@ func (me Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
PeerId: peerId, PeerId: peerId,
Event: event, Event: event,
Port: addrPort.Port(), Port: addrPort.Port(),
}, addrPort) NumWant: -1,
}, addrPort, tracker.GetPeersOpts{generics.Some[uint](200)})
if err != nil { if err != nil {
log.Printf("error serving announce: %v", err) log.Printf("error serving announce: %v", err)
http.Error(w, "error handling announce", http.StatusInternalServerError) http.Error(w, "error handling announce", http.StatusInternalServerError)

View File

@ -14,7 +14,10 @@ import (
// This is reserved for stuff like filtering by IP version, avoiding an announcer's IP or key, // This is reserved for stuff like filtering by IP version, avoiding an announcer's IP or key,
// limiting return count, etc. // limiting return count, etc.
type GetPeersOpts struct{} type GetPeersOpts struct {
// Negative numbers are not allowed.
MaxCount generics.Option[uint]
}
type InfoHash = [20]byte type InfoHash = [20]byte
@ -79,7 +82,7 @@ func addMissing(orig []PeerInfo, new peerSet) {
} }
func (me *AnnounceHandler) Serve( func (me *AnnounceHandler) Serve(
ctx context.Context, req AnnounceRequest, addr AnnounceAddr, ctx context.Context, req AnnounceRequest, addr AnnounceAddr, opts GetPeersOpts,
) (peers []PeerInfo, err error) { ) (peers []PeerInfo, err error) {
err = me.AnnounceTracker.TrackAnnounce(ctx, req, addr) err = me.AnnounceTracker.TrackAnnounce(ctx, req, addr)
if err != nil { if err != nil {
@ -91,7 +94,19 @@ func (me *AnnounceHandler) Serve(
me.mu.Lock() me.mu.Lock()
op.Value, op.Ok = me.ongoingUpstreamAugmentations[infoHash] op.Value, op.Ok = me.ongoingUpstreamAugmentations[infoHash]
me.mu.Unlock() me.mu.Unlock()
peers, err = me.AnnounceTracker.GetPeers(ctx, infoHash, GetPeersOpts{}) // Apply num_want limit to max count. I really can't tell if this is the right place to do it,
// but it seems the most flexible.
if req.NumWant != -1 {
newCount := uint(req.NumWant)
if opts.MaxCount.Ok {
if newCount < opts.MaxCount.Value {
opts.MaxCount.Value = newCount
}
} else {
opts.MaxCount = generics.Some(newCount)
}
}
peers, err = me.AnnounceTracker.GetPeers(ctx, infoHash, opts)
if err != nil { if err != nil {
return return
} }

View File

@ -11,6 +11,7 @@ import (
"net/netip" "net/netip"
"github.com/anacrolix/dht/v2/krpc" "github.com/anacrolix/dht/v2/krpc"
"github.com/anacrolix/generics"
"github.com/anacrolix/log" "github.com/anacrolix/log"
"github.com/anacrolix/torrent/tracker" "github.com/anacrolix/torrent/tracker"
@ -94,7 +95,11 @@ func (me *Server) handleAnnounce(
err = fmt.Errorf("converting source net.Addr to AnnounceAddr: %w", err) err = fmt.Errorf("converting source net.Addr to AnnounceAddr: %w", err)
return err return err
} }
peers, err := me.Announce.Serve(ctx, req, announceAddr) opts := tracker.GetPeersOpts{MaxCount: generics.Some[uint](50)}
if addrFamily == udp.AddrFamilyIpv4 {
opts.MaxCount = generics.Some[uint](150)
}
peers, err := me.Announce.Serve(ctx, req, announceAddr, opts)
if err != nil { if err != nil {
return err return err
} }