mirror of
https://github.com/sot-tech/mochi.git
synced 2026-06-12 07:43:32 -07:00
(tested) rollback to separate v4 and v6 keys in redis/keydb
* sanitize log fields * remove miniredis dependency * store/collect information about hybrid (v2to1) hashes
This commit is contained in:
+34
-23
@@ -30,38 +30,45 @@ type swarmInteractionHook struct {
|
||||
store storage.PeerStorage
|
||||
}
|
||||
|
||||
func (h *swarmInteractionHook) HandleAnnounce(ctx context.Context, req *bittorrent.AnnounceRequest, _ *bittorrent.AnnounceResponse) (_ context.Context, err error) {
|
||||
func (h *swarmInteractionHook) HandleAnnounce(ctx context.Context, req *bittorrent.AnnounceRequest, _ *bittorrent.AnnounceResponse) (outCtx context.Context, err error) {
|
||||
outCtx = ctx
|
||||
if ctx.Value(SkipSwarmInteractionKey) != nil {
|
||||
return ctx, nil
|
||||
return
|
||||
}
|
||||
|
||||
var storeFn func(bittorrent.InfoHash, bittorrent.Peer) error
|
||||
|
||||
switch {
|
||||
case req.Event == bittorrent.Stopped:
|
||||
err = h.store.DeleteSeeder(req.InfoHash, req.Peer)
|
||||
if err != nil && !errors.Is(err, storage.ErrResourceDoesNotExist) {
|
||||
return ctx, err
|
||||
}
|
||||
storeFn = func(hash bittorrent.InfoHash, peer bittorrent.Peer) error {
|
||||
err = h.store.DeleteSeeder(hash, peer)
|
||||
if err != nil && !errors.Is(err, storage.ErrResourceDoesNotExist) {
|
||||
return err
|
||||
}
|
||||
|
||||
err = h.store.DeleteLeecher(req.InfoHash, req.Peer)
|
||||
if err != nil && !errors.Is(err, storage.ErrResourceDoesNotExist) {
|
||||
return ctx, err
|
||||
err = h.store.DeleteLeecher(hash, peer)
|
||||
if err != nil && !errors.Is(err, storage.ErrResourceDoesNotExist) {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
case req.Event == bittorrent.Completed:
|
||||
err = h.store.GraduateLeecher(req.InfoHash, req.Peer)
|
||||
return ctx, err
|
||||
storeFn = h.store.GraduateLeecher
|
||||
case req.Left == 0:
|
||||
// Completed events will also have Left == 0, but by making this
|
||||
// an extra case we can treat "old" seeders differently from
|
||||
// graduating leechers. (Calling PutSeeder is probably faster
|
||||
// than calling GraduateLeecher.)
|
||||
err = h.store.PutSeeder(req.InfoHash, req.Peer)
|
||||
return ctx, err
|
||||
storeFn = h.store.PutSeeder
|
||||
default:
|
||||
err = h.store.PutLeecher(req.InfoHash, req.Peer)
|
||||
return ctx, err
|
||||
storeFn = h.store.PutLeecher
|
||||
}
|
||||
|
||||
return ctx, nil
|
||||
if err = storeFn(req.InfoHash, req.Peer); err == nil && len(req.InfoHash) == bittorrent.InfoHashV2Len {
|
||||
err = storeFn(req.InfoHash.TruncateV1(), req.Peer)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (h *swarmInteractionHook) HandleScrape(ctx context.Context, _ *bittorrent.ScrapeRequest, _ *bittorrent.ScrapeResponse) (context.Context, error) {
|
||||
@@ -97,6 +104,10 @@ func (h *responseHook) HandleAnnounce(ctx context.Context, req *bittorrent.Annou
|
||||
|
||||
// Add the Scrape data to the response.
|
||||
resp.Incomplete, resp.Complete, _ = h.store.ScrapeSwarm(req.InfoHash, req.Peer)
|
||||
if len(req.InfoHash) == bittorrent.InfoHashV2Len {
|
||||
incomplete, complete, _ := h.store.ScrapeSwarm(req.InfoHash.TruncateV1(), req.Peer)
|
||||
resp.Incomplete, resp.Complete = resp.Incomplete+incomplete, resp.Complete+complete
|
||||
}
|
||||
|
||||
err = h.appendPeers(req, resp)
|
||||
return ctx, err
|
||||
@@ -159,14 +170,14 @@ func (h *responseHook) HandleScrape(ctx context.Context, req *bittorrent.ScrapeR
|
||||
}
|
||||
|
||||
for _, infoHash := range req.InfoHashes {
|
||||
leechers, seeders, snatched := h.store.ScrapeSwarm(infoHash, req.Peer)
|
||||
scr := bittorrent.Scrape{InfoHash: infoHash}
|
||||
scr.Incomplete, scr.Complete, scr.Snatches = h.store.ScrapeSwarm(infoHash, req.Peer)
|
||||
if len(infoHash) == bittorrent.InfoHashV2Len {
|
||||
leechers, seeders, snatched := h.store.ScrapeSwarm(infoHash.TruncateV1(), req.Peer)
|
||||
scr.Incomplete, scr.Complete, scr.Snatches = scr.Incomplete+leechers, scr.Complete+seeders, scr.Snatches+snatched
|
||||
}
|
||||
|
||||
resp.Files = append(resp.Files, bittorrent.Scrape{
|
||||
InfoHash: infoHash,
|
||||
Snatches: snatched,
|
||||
Complete: seeders,
|
||||
Incomplete: leechers,
|
||||
})
|
||||
resp.Files = append(resp.Files, scr)
|
||||
}
|
||||
|
||||
return ctx, nil
|
||||
|
||||
Reference in New Issue
Block a user