From fb2b62617563f5c314f318abe378334375eec320 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Mon, 1 Dec 2014 16:37:40 -0600 Subject: [PATCH] Don't send constructed MetaInfo down a channel when it's available, build it on demand --- client.go | 31 +++++++++++++++++-------------- cmd/magnet-metainfo/main.go | 7 ++----- torrent.go | 28 ++++++++++++++++++++++++++-- 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/client.go b/client.go index 1e45d7dc..d16257fe 100644 --- 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), } diff --git a/cmd/magnet-metainfo/main.go b/cmd/magnet-metainfo/main.go index 9e73c919..a356e802 100644 --- a/cmd/magnet-metainfo/main.go +++ b/cmd/magnet-metainfo/main.go @@ -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) diff --git a/torrent.go b/torrent.go index 1e4302b7..40fb3d58 100644 --- a/torrent.go +++ b/torrent.go @@ -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 -- 2.48.1