forked from cerc-io/plugeth
cmd,eth: 16400 Add an option to stop geth once in sync. WIP for light mode (#17321)
* cmd, eth: Added in the flag to step geth once sync based on input * cmd, eth: 16400 Add an option to stop geth once in sync. * cmd: 16400 Add an option to stop geth once in sync. WIP * cmd/geth/main, les/fletcher: added in light mode support * cmd/geth/main, les/fletcher: Cleaned Comments and code for light mode * cmd: 16400 Fixed formatting issue and cleaned code * cmd, eth, les: 16400 Fixed formatting issues * cmd, eth, les: Performed gofmt to update formatting * cmd, eth, les: Fixed bugs resulting formatting * cmd/geth, eth/, les: switched to downloader event * eth: Fixed styling and gen_config * eth/: Fix nil error in config file * cmd/geth: Updated countdown log * les/fetcher.go: Removed depcreated channel * eth/downloader.go: Removed deprecated select * cmd/geth, cmd/utils: Fixed minor issues * eth: Reverted config files to proper format * eth: Fixed typo in config file * cmd/geth, eth/down: Updated code to use header time stamp * eth/downloader: Changed the time threshold to 10 minutes * cmd/geth, eth/downloader: Updated downloading event to pass latest header * cmd/geth: Updated main to use right timer object * cmd/geth: Removed unused failed event * cmd/geth: added in correct time field with type assertion * cmd/geth, cmd/utils: Updated flag to use boolean * cmd/geth, cmd/utils, eth/downloader: Cleaned up code based on recommendations * cmd/geth: Removed unneeded import * cmd/geth, eth/downloader: fixed event field and suggested changes * cmd/geth, cmd/utils: Updated flag and linting issue
This commit is contained in:
parent
f4094d09cd
commit
d88441025f
@ -31,8 +31,10 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/accounts"
|
"github.com/ethereum/go-ethereum/accounts"
|
||||||
"github.com/ethereum/go-ethereum/accounts/keystore"
|
"github.com/ethereum/go-ethereum/accounts/keystore"
|
||||||
"github.com/ethereum/go-ethereum/cmd/utils"
|
"github.com/ethereum/go-ethereum/cmd/utils"
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/console"
|
"github.com/ethereum/go-ethereum/console"
|
||||||
"github.com/ethereum/go-ethereum/eth"
|
"github.com/ethereum/go-ethereum/eth"
|
||||||
|
"github.com/ethereum/go-ethereum/eth/downloader"
|
||||||
"github.com/ethereum/go-ethereum/ethclient"
|
"github.com/ethereum/go-ethereum/ethclient"
|
||||||
"github.com/ethereum/go-ethereum/internal/debug"
|
"github.com/ethereum/go-ethereum/internal/debug"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
@ -87,6 +89,7 @@ var (
|
|||||||
utils.ULCTrustedNodesFlag,
|
utils.ULCTrustedNodesFlag,
|
||||||
utils.ULCMinTrustedFractionFlag,
|
utils.ULCMinTrustedFractionFlag,
|
||||||
utils.SyncModeFlag,
|
utils.SyncModeFlag,
|
||||||
|
utils.ExitWhenSyncedFlag,
|
||||||
utils.GCModeFlag,
|
utils.GCModeFlag,
|
||||||
utils.LightServFlag,
|
utils.LightServFlag,
|
||||||
utils.LightPeersFlag,
|
utils.LightPeersFlag,
|
||||||
@ -339,6 +342,32 @@ func startNode(ctx *cli.Context, stack *node.Node) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
// Spawn a standalone goroutine for status synchronization monitoring,
|
||||||
|
// close the node when synchronization is complete if user required.
|
||||||
|
if ctx.GlobalBool(utils.ExitWhenSyncedFlag.Name) {
|
||||||
|
go func() {
|
||||||
|
sub := stack.EventMux().Subscribe(downloader.DoneEvent{})
|
||||||
|
defer sub.Unsubscribe()
|
||||||
|
for {
|
||||||
|
event := <-sub.Chan()
|
||||||
|
if event == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
done, ok := event.Data.(downloader.DoneEvent)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if timestamp := time.Unix(done.Latest.Time.Int64(), 0); time.Since(timestamp) < 10*time.Minute {
|
||||||
|
log.Info("Synchronisation completed", "latestnum", done.Latest.Number, "latesthash", done.Latest.Hash(),
|
||||||
|
"age", common.PrettyAge(timestamp))
|
||||||
|
stack.Stop()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
// Start auxiliary services if enabled
|
// Start auxiliary services if enabled
|
||||||
if ctx.GlobalBool(utils.MiningEnabledFlag.Name) || ctx.GlobalBool(utils.DeveloperFlag.Name) {
|
if ctx.GlobalBool(utils.MiningEnabledFlag.Name) || ctx.GlobalBool(utils.DeveloperFlag.Name) {
|
||||||
// Mining only makes sense if a full Ethereum node is running
|
// Mining only makes sense if a full Ethereum node is running
|
||||||
|
@ -75,6 +75,7 @@ var AppHelpFlagGroups = []flagGroup{
|
|||||||
utils.TestnetFlag,
|
utils.TestnetFlag,
|
||||||
utils.RinkebyFlag,
|
utils.RinkebyFlag,
|
||||||
utils.SyncModeFlag,
|
utils.SyncModeFlag,
|
||||||
|
utils.ExitWhenSyncedFlag,
|
||||||
utils.GCModeFlag,
|
utils.GCModeFlag,
|
||||||
utils.EthStatsURLFlag,
|
utils.EthStatsURLFlag,
|
||||||
utils.IdentityFlag,
|
utils.IdentityFlag,
|
||||||
|
@ -162,6 +162,10 @@ var (
|
|||||||
Usage: "Document Root for HTTPClient file scheme",
|
Usage: "Document Root for HTTPClient file scheme",
|
||||||
Value: DirectoryString{homeDir()},
|
Value: DirectoryString{homeDir()},
|
||||||
}
|
}
|
||||||
|
ExitWhenSyncedFlag = cli.BoolFlag{
|
||||||
|
Name: "exitwhensynced",
|
||||||
|
Usage: "Exists syncing after block synchronisation",
|
||||||
|
}
|
||||||
ULCModeConfigFlag = cli.StringFlag{
|
ULCModeConfigFlag = cli.StringFlag{
|
||||||
Name: "ulc.config",
|
Name: "ulc.config",
|
||||||
Usage: "Config file to use for ultra light client mode",
|
Usage: "Config file to use for ultra light client mode",
|
||||||
@ -178,7 +182,6 @@ var (
|
|||||||
Name: "ulc.trusted",
|
Name: "ulc.trusted",
|
||||||
Usage: "List of trusted ULC servers",
|
Usage: "List of trusted ULC servers",
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultSyncMode = eth.DefaultConfig.SyncMode
|
defaultSyncMode = eth.DefaultConfig.SyncMode
|
||||||
SyncModeFlag = TextMarshalerFlag{
|
SyncModeFlag = TextMarshalerFlag{
|
||||||
Name: "syncmode",
|
Name: "syncmode",
|
||||||
|
@ -415,7 +415,8 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
d.mux.Post(FailedEvent{err})
|
d.mux.Post(FailedEvent{err})
|
||||||
} else {
|
} else {
|
||||||
d.mux.Post(DoneEvent{})
|
latest := d.lightchain.CurrentHeader()
|
||||||
|
d.mux.Post(DoneEvent{latest})
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
if p.version < 62 {
|
if p.version < 62 {
|
||||||
@ -1369,7 +1370,6 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er
|
|||||||
}
|
}
|
||||||
// Otherwise split the chunk of headers into batches and process them
|
// Otherwise split the chunk of headers into batches and process them
|
||||||
gotHeaders = true
|
gotHeaders = true
|
||||||
|
|
||||||
for len(headers) > 0 {
|
for len(headers) > 0 {
|
||||||
// Terminate if something failed in between processing chunks
|
// Terminate if something failed in between processing chunks
|
||||||
select {
|
select {
|
||||||
@ -1432,7 +1432,6 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er
|
|||||||
headers = headers[limit:]
|
headers = headers[limit:]
|
||||||
origin += uint64(limit)
|
origin += uint64(limit)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the highest block number we know if a higher one is found.
|
// Update the highest block number we know if a higher one is found.
|
||||||
d.syncStatsLock.Lock()
|
d.syncStatsLock.Lock()
|
||||||
if d.syncStatsChainHeight < origin {
|
if d.syncStatsChainHeight < origin {
|
||||||
|
@ -16,6 +16,10 @@
|
|||||||
|
|
||||||
package downloader
|
package downloader
|
||||||
|
|
||||||
type DoneEvent struct{}
|
import "github.com/ethereum/go-ethereum/core/types"
|
||||||
|
|
||||||
|
type DoneEvent struct {
|
||||||
|
Latest *types.Header
|
||||||
|
}
|
||||||
type StartEvent struct{}
|
type StartEvent struct{}
|
||||||
type FailedEvent struct{ Err error }
|
type FailedEvent struct{ Err error }
|
||||||
|
Loading…
Reference in New Issue
Block a user