diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 09d9c493d1..0e8fb02ad1 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -107,6 +107,7 @@ var ( utils.DeveloperPeriodFlag, utils.TestnetFlag, utils.RinkebyFlag, + utils.ExitWhenSyncedFlag, utils.VMEnableDebugFlag, utils.NetworkIdFlag, utils.RPCCORSDomainFlag, diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go index d934c6b021..111ad99840 100644 --- a/cmd/geth/usage.go +++ b/cmd/geth/usage.go @@ -74,6 +74,7 @@ var AppHelpFlagGroups = []flagGroup{ utils.NetworkIdFlag, utils.TestnetFlag, utils.RinkebyFlag, + utils.ExitWhenSyncedFlag, utils.SyncModeFlag, utils.GCModeFlag, utils.EthStatsURLFlag, diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index ef5f6a9f08..92a01fc2e9 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -139,6 +139,11 @@ var ( Name: "rinkeby", Usage: "Rinkeby network: pre-configured proof-of-authority test network", } + ExitWhenSyncedFlag = cli.IntFlag{ + Name: "exit-when-synced", + Usage: "Exit after the chain is in sync", + Value: 0, + } DeveloperFlag = cli.BoolFlag{ Name: "dev", Usage: "Ephemeral proof-of-authority network with a pre-funded developer account, mining enabled", @@ -1034,6 +1039,9 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { if ctx.GlobalIsSet(LightServFlag.Name) { cfg.LightServ = ctx.GlobalInt(LightServFlag.Name) } + if ctx.GlobalIsSet(ExitWhenSyncedFlag.Name) { + cfg.ExitWhenSynced = ctx.GlobalInt(ExitWhenSyncedFlag.Name) + } if ctx.GlobalIsSet(LightPeersFlag.Name) { cfg.LightPeers = ctx.GlobalInt(LightPeersFlag.Name) } diff --git a/eth/config.go b/eth/config.go index dd7f42c7d9..e8cca57831 100644 --- a/eth/config.go +++ b/eth/config.go @@ -87,6 +87,9 @@ type Config struct { LightServ int `toml:",omitempty"` // Maximum percentage of time allowed for serving LES requests LightPeers int `toml:",omitempty"` // Maximum number of LES client peers + // Exit when sycned options + ExitWhenSynced int `toml:",omitempty"` + // Database options SkipBcVersionCheck bool `toml:"-"` DatabaseHandles int `toml:"-"` diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index dc23354929..43fb0f0669 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -19,6 +19,7 @@ package downloader import ( "errors" + "os" "fmt" "math/big" "sync" @@ -1094,6 +1095,26 @@ func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliv // If there's nothing more to fetch, wait or terminate if pending() == 0 { if !inFlight() && finished { + // Exit when synced param should be executed after defined 'value' in seconds + // TODO: + // 1. Get the flag value - ctx.GlobalInt(util.ExitWhenSyncedFlag.Name) + // 2. Figure out where to put this + exitWhenSynced := 5 + if exitWhenSynced > 0 { + exitCounter := exitWhenSynced + ticker := time.NewTicker(time.Second * 1) + go func() { + for range ticker.C { + fmt.Println("Exiting sync process in ", exitCounter) + exitCounter -= 1 + } + }() + time.Sleep(time.Second * time.Duration(exitWhenSynced)) + ticker.Stop() + fmt.Println("Exiting sync process in ", exitCounter) + } + fmt.Println("Exit sync") + os.Exit(3) log.Debug("Data fetching completed", "type", kind) return nil }