erigon-pulse/cmd/snapshots/seeder/commands/seeder.go
b00ris 6464da7670
Remote snapshot downloader (#1343)
* save state

* save state

* save state

* refactoring

* fix

* save state

* save state

* fmt

* fix lint

* restore torrents for external downloader

* fix lint

* download

* skip debug test

* debug

* remote debug

* small cli fixes

* skip debug test

* external snapshot predownloader

* get rid of remote downloader

* fix lint

* clean makefile

* fix lint

* fix lint

* cleanup

* fix ci

* fmt

* remove proto from interfaces

* Squashed 'interfaces/' content from commit acd02bb94

git-subtree-dir: interfaces
git-subtree-split: acd02bb94c5a421aa8f8d1fd76cd8aad668e9fcb
2020-11-13 16:16:47 +00:00

121 lines
2.5 KiB
Go

package commands
import (
"context"
"fmt"
"os"
"os/signal"
"path/filepath"
"time"
lg "github.com/anacrolix/log"
"github.com/anacrolix/torrent"
"github.com/anacrolix/torrent/bencode"
"github.com/anacrolix/torrent/metainfo"
"github.com/ledgerwatch/turbo-geth/common"
"github.com/ledgerwatch/turbo-geth/log"
trnt "github.com/ledgerwatch/turbo-geth/turbo/snapshotsync/bittorrent"
)
func Seed(ctx context.Context, datadir string) error {
datadir = filepath.Dir(datadir)
ctx, cancel := context.WithCancel(ctx)
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
<-c
cancel()
}()
cfg := trnt.DefaultTorrentConfig()
cfg.NoDHT = false
cfg.DisableTrackers = false
cfg.Seed = true
cfg.Debug = false
cfg.Logger = cfg.Logger.FilterLevel(lg.Info)
cfg.DataDir = datadir
pathes := []string{
cfg.DataDir + "/headers",
cfg.DataDir + "/bodies",
//cfg.DataDir + "/state",
//cfg.DataDir+"/receipts",
}
cl, err := torrent.NewClient(cfg)
if err != nil {
return err
}
defer cl.Close()
torrents := make([]*torrent.Torrent, len(pathes))
for i, v := range pathes {
i := i
mi := &metainfo.MetaInfo{
CreationDate: time.Now().Unix(),
CreatedBy: "turbogeth",
AnnounceList: trnt.Trackers,
}
if _, err := os.Stat(v); os.IsNotExist(err) {
fmt.Println(err)
continue
} else if err != nil {
return err
}
tt := time.Now()
if common.IsCanceled(ctx) {
return common.ErrStopped
}
info, err := trnt.BuildInfoBytesForLMDBSnapshot(v)
if err != nil {
return err
}
mi.InfoBytes, err = bencode.Marshal(info)
if err != nil {
return err
}
torrents[i], _, err = cl.AddTorrentSpec(&torrent.TorrentSpec{
Trackers: trnt.Trackers,
InfoHash: mi.HashInfoBytes(),
InfoBytes: mi.InfoBytes,
ChunkSize: trnt.DefaultChunkSize,
})
if err != nil {
return err
}
log.Info("Torrent added", "name", torrents[i].Info().Name, "path", v, "t", time.Since(tt))
if !torrents[i].Seeding() {
log.Warn(torrents[i].Name() + " not seeding")
}
if common.IsCanceled(ctx) {
return common.ErrStopped
}
torrents[i].VerifyData()
}
go func() {
ticker := time.NewTicker(10 * time.Second)
for range ticker.C {
for _, t := range cl.Torrents() {
log.Info("Snapshot stats", "snapshot", t.Name(), "active peers", t.Stats().ActivePeers, "seeding", t.Seeding(), "hash", t.Metainfo().HashInfoBytes().String())
}
if common.IsCanceled(ctx) {
ticker.Stop()
return
}
}
}()
<-ctx.Done()
return nil
}