]> Sergey Matveev's repositories - btrtrc.git/blobdiff - torrent.go
Limit simultaneous announces to the same URL
[btrtrc.git] / torrent.go
index 21069ec5fe0cd0324b42aaf2a460f01dc36a9785..3c0bcb09275282a509aac7e8cccd21dc53eba1c4 100644 (file)
@@ -1411,9 +1411,32 @@ func (t *Torrent) startScrapingTracker(_url string) {
                                return nil
                        }
                }
+               urlString := (*u).String()
+               cl := t.cl
                newAnnouncer := &trackerScraper{
                        u: *u,
                        t: t,
+                       allow: func() {
+                               cl.lock()
+                               defer cl.unlock()
+                               if cl.activeAnnounces == nil {
+                                       cl.activeAnnounces = make(map[string]struct{})
+                               }
+                               for {
+                                       if _, ok := cl.activeAnnounces[urlString]; ok {
+                                               cl.event.Wait()
+                                       } else {
+                                               break
+                                       }
+                               }
+                               cl.activeAnnounces[urlString] = struct{}{}
+                       },
+                       done: func() {
+                               cl.lock()
+                               defer cl.unlock()
+                               delete(cl.activeAnnounces, urlString)
+                               cl.event.Broadcast()
+                       },
                }
                go newAnnouncer.Run()
                return newAnnouncer