]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Don't send constructed MetaInfo down a channel when it's available, build it on demand
authorMatt Joiner <anacrolix@gmail.com>
Mon, 1 Dec 2014 22:37:40 +0000 (16:37 -0600)
committerMatt Joiner <anacrolix@gmail.com>
Mon, 1 Dec 2014 22:37:40 +0000 (16:37 -0600)
client.go
cmd/magnet-metainfo/main.go
torrent.go

index 1e45d7dcc09b8c87d68cb5524dce7d1506a178b8..d16257fe695fe166a1cbbf6ed70fe6232cc74572 100644 (file)
--- a/client.go
+++ b/client.go
@@ -1339,21 +1339,24 @@ func (cl *Client) setMetaData(t *torrent, md metainfo.Info, bytes []byte) (err e
        cl.downloadStrategy.TorrentStarted(t)
        // TODO(anacrolix): I think this should be made available as a method, the
        // channel only acts as a signal that the metadata has become available.
-       select {
-       case t.gotMetainfo <- &metainfo.MetaInfo{
-               Info: metainfo.InfoEx{
-                       Info: md,
-               },
-               CreationDate: time.Now().Unix(),
-               Comment:      "metadata set in client",
-               CreatedBy:    "go.torrent",
-               // TODO(anacrolix): Expose trackers given when torrent added.
-       }:
-       default:
-               panic("shouldn't block")
+       // select {
+       // case t.gotMetainfo <- &metainfo.MetaInfo{
+       //      Info: metainfo.InfoEx{
+       //              Info: md,
+       //      },
+       //      CreationDate: time.Now().Unix(),
+       //      Comment:      "metadata set in client",
+       //      CreatedBy:    "go.torrent",
+       //      // TODO(anacrolix): Expose trackers given when torrent added.
+       // }:
+       // default:
+       //      panic("shouldn't block")
+       // }
+       if err := cl.saveTorrentFile(t); err != nil {
+               log.Printf("error saving torrent file for %s: %s", t, err)
        }
        close(t.gotMetainfo)
-       t.gotMetainfo = nil
+       // t.gotMetainfo = nil
        return
 }
 
@@ -1368,7 +1371,7 @@ func newTorrent(ih InfoHash, announceList [][]string, halfOpenLimit int) (t *tor
                closing:           make(chan struct{}),
                ceasingNetworking: make(chan struct{}),
 
-               gotMetainfo: make(chan *metainfo.MetaInfo, 1),
+               gotMetainfo: make(chan struct{}),
 
                HalfOpen: make(map[string]struct{}, halfOpenLimit),
        }
index 9e73c919a1f8ad23a942bbcd39b6df6772dbeb58..a356e80239d09adaf86fc9311690fd4b17d32860 100644 (file)
@@ -27,12 +27,9 @@ func main() {
                wg.Add(1)
                go func() {
                        defer wg.Done()
-                       mi, ok := <-t.GotMetainfo
+                       <-t.GotMetainfo
+                       mi := t.MetaInfo()
                        t.Close()
-                       if !ok {
-                               log.Printf("no metainfo for %q", t.Name())
-                               return
-                       }
                        f, err := os.Create(mi.Info.Name + ".torrent")
                        if err != nil {
                                log.Fatalf("error creating torrent metainfo file: %s", err)
index 1e4302b74ab6e86655741adcc91d1eec13ac5289..40fb3d580400e24e6db4112aa9acb95041ca6b1c 100644 (file)
@@ -80,8 +80,8 @@ type torrent struct {
        MetaData     []byte
        metadataHave []bool
 
-       gotMetainfo chan *metainfo.MetaInfo
-       GotMetainfo <-chan *metainfo.MetaInfo
+       gotMetainfo chan struct{}
+       GotMetainfo <-chan struct{}
 }
 
 func (t *torrent) addrActive(addr string) bool {
@@ -355,6 +355,30 @@ func (t *torrent) haveInfo() bool {
        return t.Info != nil
 }
 
+// TODO: Include URIs that weren't converted to tracker clients.
+func (t *torrent) AnnounceList() (al [][]string) {
+       for _, tier := range t.Trackers {
+               var l []string
+               for _, tr := range tier {
+                       l = append(l, tr.URL())
+               }
+               al = append(al, l)
+       }
+       return
+}
+
+func (t *torrent) MetaInfo() *metainfo.MetaInfo {
+       return &metainfo.MetaInfo{
+               Info: metainfo.InfoEx{
+                       Info: *t.Info.Info,
+               },
+               CreationDate: time.Now().Unix(),
+               Comment:      "dynamic metainfo from client",
+               CreatedBy:    "go.torrent",
+               AnnounceList: t.AnnounceList(),
+       }
+}
+
 func (t *torrent) BytesLeft() (left int64) {
        if !t.haveInfo() {
                return -1