new: feat: add parallelism
This commit is contained in:
@@ -9,24 +9,29 @@ import (
|
||||
"github.com/felipemarinho97/torrent-indexer/cache"
|
||||
)
|
||||
|
||||
type peers struct {
|
||||
Seeders int `json:"seed"`
|
||||
Leechers int `json:"leech"`
|
||||
}
|
||||
|
||||
func getPeersFromCache(ctx context.Context, r *cache.Redis, infoHash string) (int, int, error) {
|
||||
// get peers and seeds from redis first
|
||||
peersCache, err := r.Get(ctx, infoHash)
|
||||
if err == nil {
|
||||
var peers map[string]int
|
||||
var peers peers
|
||||
err = json.Unmarshal(peersCache, &peers)
|
||||
if err != nil {
|
||||
return 0, 0, err
|
||||
}
|
||||
return peers["leech"], peers["seed"], nil
|
||||
return peers.Leechers, peers.Seeders, nil
|
||||
}
|
||||
return 0, 0, err
|
||||
}
|
||||
|
||||
func setPeersToCache(ctx context.Context, r *cache.Redis, infoHash string, peer, seed int) error {
|
||||
peers := map[string]int{
|
||||
"leech": peer,
|
||||
"seed": seed,
|
||||
peers := peers{
|
||||
Seeders: seed,
|
||||
Leechers: peer,
|
||||
}
|
||||
peersJSON, err := json.Marshal(peers)
|
||||
if err != nil {
|
||||
@@ -40,7 +45,6 @@ func setPeersToCache(ctx context.Context, r *cache.Redis, infoHash string, peer,
|
||||
}
|
||||
|
||||
func GetLeechsAndSeeds(ctx context.Context, r *cache.Redis, infoHash string, trackers []string) (int, int, error) {
|
||||
var leech, seed int
|
||||
leech, seed, err := getPeersFromCache(ctx, r, infoHash)
|
||||
if err != nil {
|
||||
fmt.Println("unable to get peers from cache for infohash:", infoHash)
|
||||
@@ -49,27 +53,44 @@ func GetLeechsAndSeeds(ctx context.Context, r *cache.Redis, infoHash string, tra
|
||||
return leech, seed, nil
|
||||
}
|
||||
|
||||
var peerChan = make(chan peers)
|
||||
var errChan = make(chan error)
|
||||
|
||||
for _, tracker := range trackers {
|
||||
// get peers and seeds from redis first
|
||||
scraper, err := New(tracker)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
continue
|
||||
}
|
||||
go func(tracker string) {
|
||||
// get peers and seeds from redis first
|
||||
scraper, err := New(tracker)
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
return
|
||||
}
|
||||
|
||||
scraper.SetTimeout(500 * time.Millisecond)
|
||||
scraper.SetTimeout(500 * time.Millisecond)
|
||||
|
||||
// get peers and seeds from redis first
|
||||
res, err := scraper.Scrape([]byte(infoHash))
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
continue
|
||||
}
|
||||
// get peers and seeds from redis first
|
||||
res, err := scraper.Scrape([]byte(infoHash))
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
return
|
||||
}
|
||||
|
||||
leech += int(res[0].Leechers)
|
||||
seed += int(res[0].Seeders)
|
||||
setPeersToCache(ctx, r, infoHash, leech, seed)
|
||||
return leech, seed, nil
|
||||
peerChan <- peers{
|
||||
Seeders: int(res[0].Seeders),
|
||||
Leechers: int(res[0].Leechers),
|
||||
}
|
||||
}(tracker)
|
||||
}
|
||||
return leech, seed, nil
|
||||
|
||||
var peer peers
|
||||
for i := 0; i < len(trackers); i++ {
|
||||
select {
|
||||
case peer = <-peerChan:
|
||||
setPeersToCache(ctx, r, infoHash, peer.Leechers, peer.Seeders)
|
||||
return peer.Leechers, peer.Seeders, nil
|
||||
case err := <-errChan:
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
||||
|
||||
return 0, 0, fmt.Errorf("unable to get peers from trackers")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user