2020-10-27 15:53:49 +00:00
package cli
import (
"fmt"
Pruning for: exec, log_index, tx_lookup, history stages (#2399)
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* add tvm flag
* save
* db migration for storage mode
add flag --prune=
remove flag --storage-mode=
add flag --experiments=tevm,...
rename integration set_storage_mode to set_prune
* fix
* forward move of stages must skip everything before PruneTo
* keep in db progress of prune method
* keep in db progress of prune method
* simplify logs
* simplify logs
* simplify logs
* fix test
* simplify logs
* simplify logs
* simplify logs
* simplify logs
* remove callTraceSet as dupsort
use etl transform for txlookup prune
remove some logs
* cleanup tests a bit
* print_stages and eth_sync to show prune progress
* fix print_stages
* add readme about --prune.to flag
* more docs
* add --prune.history.older and other flags support
* fix migration on empty db
* better toString
* better toString
2021-07-20 20:03:19 +00:00
"strings"
2021-07-10 02:19:44 +00:00
"time"
2020-10-27 15:53:49 +00:00
"github.com/c2h5oh/datasize"
2021-05-20 18:25:53 +00:00
"github.com/ledgerwatch/erigon/cmd/utils"
"github.com/ledgerwatch/erigon/common/etl"
"github.com/ledgerwatch/erigon/eth/ethconfig"
"github.com/ledgerwatch/erigon/ethdb"
Pruning for: exec, log_index, tx_lookup, history stages (#2399)
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* add tvm flag
* save
* db migration for storage mode
add flag --prune=
remove flag --storage-mode=
add flag --experiments=tevm,...
rename integration set_storage_mode to set_prune
* fix
* forward move of stages must skip everything before PruneTo
* keep in db progress of prune method
* keep in db progress of prune method
* simplify logs
* simplify logs
* simplify logs
* fix test
* simplify logs
* simplify logs
* simplify logs
* simplify logs
* remove callTraceSet as dupsort
use etl transform for txlookup prune
remove some logs
* cleanup tests a bit
* print_stages and eth_sync to show prune progress
* fix print_stages
* add readme about --prune.to flag
* more docs
* add --prune.history.older and other flags support
* fix migration on empty db
* better toString
* better toString
2021-07-20 20:03:19 +00:00
"github.com/ledgerwatch/erigon/ethdb/prune"
2021-05-20 18:25:53 +00:00
"github.com/ledgerwatch/erigon/log"
"github.com/ledgerwatch/erigon/node"
"github.com/ledgerwatch/erigon/turbo/snapshotsync"
2021-03-23 09:00:07 +00:00
"github.com/spf13/pflag"
2020-10-27 15:53:49 +00:00
"github.com/urfave/cli"
)
var (
2021-04-27 12:31:00 +00:00
DatabaseVerbosityFlag = cli . IntFlag {
Name : "database.verbosity" ,
2021-05-11 08:22:34 +00:00
Usage : "Enabling internal db logs. Very high verbosity levels may require recompile db. Default: 2, means warning." ,
Value : 2 ,
2021-04-27 12:31:00 +00:00
}
2020-10-27 15:53:49 +00:00
BatchSizeFlag = cli . StringFlag {
Name : "batchSize" ,
Usage : "Batch size for the execution stage" ,
Value : "512M" ,
}
EtlBufferSizeFlag = cli . StringFlag {
Name : "etl.bufferSize" ,
Usage : "Buffer size for ETL operations." ,
Value : etl . BufferOptimalSize . String ( ) ,
}
2021-07-01 03:14:10 +00:00
BlockDownloaderWindowFlag = cli . IntFlag {
Name : "blockDownloaderWindow" ,
Usage : "Outstanding limit of block bodies being downloaded" ,
Value : 65536 ,
}
2020-10-27 15:53:49 +00:00
PrivateApiAddr = cli . StringFlag {
Name : "private.api.addr" ,
Usage : "private api network address, for example: 127.0.0.1:9090, empty string means not to start the listener. do not expose to public network. serves remote database interface" ,
2021-07-01 21:30:55 +00:00
Value : "127.0.0.1:9090" ,
2020-10-27 15:53:49 +00:00
}
2021-03-23 07:28:04 +00:00
PrivateApiRateLimit = cli . IntFlag {
Name : "private.api.ratelimit" ,
Usage : "Amount of requests server handle simultaneously - requests over this limit will wait. Increase it - if clients see 'request timeout' while server load is low - it means your 'hot data' is small or have much RAM. " ,
Value : 500 ,
}
2021-06-13 20:14:52 +00:00
MaxPeersFlag = cli . IntFlag {
Name : "maxpeers" ,
Usage : "Maximum number of network peers (network disabled if set to 0)" ,
Value : node . DefaultConfig . P2P . MaxPeers ,
}
Pruning for: exec, log_index, tx_lookup, history stages (#2399)
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* add tvm flag
* save
* db migration for storage mode
add flag --prune=
remove flag --storage-mode=
add flag --experiments=tevm,...
rename integration set_storage_mode to set_prune
* fix
* forward move of stages must skip everything before PruneTo
* keep in db progress of prune method
* keep in db progress of prune method
* simplify logs
* simplify logs
* simplify logs
* fix test
* simplify logs
* simplify logs
* simplify logs
* simplify logs
* remove callTraceSet as dupsort
use etl transform for txlookup prune
remove some logs
* cleanup tests a bit
* print_stages and eth_sync to show prune progress
* fix print_stages
* add readme about --prune.to flag
* more docs
* add --prune.history.older and other flags support
* fix migration on empty db
* better toString
* better toString
2021-07-20 20:03:19 +00:00
PruneFlag = cli . StringFlag {
Name : "prune" ,
Usage : ` Choose which ancient data delete from DB :
h - prune history ( ChangeSets , HistoryIndices - used by historical state access )
r - prune receipts ( Receipts , Logs , LogTopicIndex , LogAddressIndex - used by eth_getLogs and similar RPC methods )
t - prune transaction by it ' s hash index
c - prune call traces ( used by trace_ * methods )
Does delete data older than 90 K block ( can set another value by ' -- prune . * . older ' flags ) .
If item is NOT in the list - means NO pruning for this data . s
Example : -- prune = hrtc ` ,
Value : "disabled" ,
}
PruneHistoryFlag = cli . Uint64Flag {
Name : "prune.history.older" ,
Usage : ` Prune data after this amount of blocks (if --prune flag has 'h', then default is 90K) ` ,
}
PruneReceiptFlag = cli . Uint64Flag {
Name : "prune.receipt.older" ,
Usage : ` Prune data after this amount of blocks (if --prune flag has 'r', then default is 90K) ` ,
}
PruneTxIndexFlag = cli . Uint64Flag {
Name : "prune.txindex.older" ,
Usage : ` Prune data after this amount of blocks (if --prune flag has 't', then default is 90K) ` ,
}
PruneCallTracesFlag = cli . Uint64Flag {
Name : "prune.calltrace.older" ,
Usage : ` Prune data after this amount of blocks (if --prune flag has 'c', then default is 90K) ` ,
}
ExperimentsFlag = cli . StringFlag {
Name : "experiments" ,
Usage : ` Enable some experimental stages :
* tevm - write TEVM translated code to the DB ` ,
2021-05-08 22:07:16 +00:00
Value : "default" ,
2020-10-27 15:53:49 +00:00
}
Pruning for: exec, log_index, tx_lookup, history stages (#2399)
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* add tvm flag
* save
* db migration for storage mode
add flag --prune=
remove flag --storage-mode=
add flag --experiments=tevm,...
rename integration set_storage_mode to set_prune
* fix
* forward move of stages must skip everything before PruneTo
* keep in db progress of prune method
* keep in db progress of prune method
* simplify logs
* simplify logs
* simplify logs
* fix test
* simplify logs
* simplify logs
* simplify logs
* simplify logs
* remove callTraceSet as dupsort
use etl transform for txlookup prune
remove some logs
* cleanup tests a bit
* print_stages and eth_sync to show prune progress
* fix print_stages
* add readme about --prune.to flag
* more docs
* add --prune.history.older and other flags support
* fix migration on empty db
* better toString
* better toString
2021-07-20 20:03:19 +00:00
2020-10-27 15:53:49 +00:00
SnapshotModeFlag = cli . StringFlag {
2020-11-13 16:16:47 +00:00
Name : "snapshot.mode" ,
2021-02-09 15:48:55 +00:00
Usage : ` Configures the snapshot mode of the app :
2020-10-27 15:53:49 +00:00
* h - download headers snapshot
* b - download bodies snapshot
* s - download state snapshot
* r - download receipts snapshot
` ,
2020-11-13 16:16:47 +00:00
Value : snapshotsync . DefaultSnapshotMode . ToString ( ) ,
2020-10-27 15:53:49 +00:00
}
SeedSnapshotsFlag = cli . BoolTFlag {
2020-11-13 16:16:47 +00:00
Name : "snapshot.seed" ,
Usage : ` Seed snapshot seeding(default: true) ` ,
}
2021-05-08 08:45:40 +00:00
//todo replace to BoolT
SnapshotDatabaseLayoutFlag = cli . BoolFlag {
Name : "snapshot.layout" ,
Usage : ` Enable snapshot db layout(default: false) ` ,
}
2020-11-13 16:16:47 +00:00
ExternalSnapshotDownloaderAddrFlag = cli . StringFlag {
Name : "snapshot.downloader.addr" ,
Usage : ` enable external snapshot downloader ` ,
2020-10-27 15:53:49 +00:00
}
// mTLS flags
TLSFlag = cli . BoolFlag {
Name : "tls" ,
Usage : "Enable TLS handshake" ,
}
TLSCertFlag = cli . StringFlag {
Name : "tls.cert" ,
Usage : "Specify certificate" ,
Value : "" ,
}
TLSKeyFlag = cli . StringFlag {
Name : "tls.key" ,
Usage : "Specify key file" ,
Value : "" ,
}
TLSCACertFlag = cli . StringFlag {
Name : "tls.cacert" ,
Usage : "Specify certificate authority" ,
Value : "" ,
}
2021-05-23 14:53:18 +00:00
StateStreamFlag = cli . BoolFlag {
Name : "state.stream" ,
Usage : "Enable streaming of state changes from core to RPC daemon" ,
}
2021-07-10 02:19:44 +00:00
// Throttling Flags
SyncLoopThrottleFlag = cli . StringFlag {
Name : "sync.loop.throttle" ,
Usage : "Sets the minimum time between sync loop starts (e.g. 1h30m, default is none)" ,
Value : "" ,
}
2020-10-27 15:53:49 +00:00
)
2021-03-23 09:00:07 +00:00
func ApplyFlagsForEthConfig ( ctx * cli . Context , cfg * ethconfig . Config ) {
Pruning for: exec, log_index, tx_lookup, history stages (#2399)
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* add tvm flag
* save
* db migration for storage mode
add flag --prune=
remove flag --storage-mode=
add flag --experiments=tevm,...
rename integration set_storage_mode to set_prune
* fix
* forward move of stages must skip everything before PruneTo
* keep in db progress of prune method
* keep in db progress of prune method
* simplify logs
* simplify logs
* simplify logs
* fix test
* simplify logs
* simplify logs
* simplify logs
* simplify logs
* remove callTraceSet as dupsort
use etl transform for txlookup prune
remove some logs
* cleanup tests a bit
* print_stages and eth_sync to show prune progress
* fix print_stages
* add readme about --prune.to flag
* more docs
* add --prune.history.older and other flags support
* fix migration on empty db
* better toString
* better toString
2021-07-20 20:03:19 +00:00
mode , err := prune . FromCli (
ctx . GlobalString ( PruneFlag . Name ) ,
ctx . GlobalUint64 ( PruneHistoryFlag . Name ) ,
ctx . GlobalUint64 ( PruneReceiptFlag . Name ) ,
ctx . GlobalUint64 ( PruneTxIndexFlag . Name ) ,
ctx . GlobalUint64 ( PruneCallTracesFlag . Name ) ,
strings . Split ( ctx . GlobalString ( ExperimentsFlag . Name ) , "," ) ,
)
2020-10-27 15:53:49 +00:00
if err != nil {
utils . Fatalf ( fmt . Sprintf ( "error while parsing mode: %v" , err ) )
}
Pruning for: exec, log_index, tx_lookup, history stages (#2399)
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* add tvm flag
* save
* db migration for storage mode
add flag --prune=
remove flag --storage-mode=
add flag --experiments=tevm,...
rename integration set_storage_mode to set_prune
* fix
* forward move of stages must skip everything before PruneTo
* keep in db progress of prune method
* keep in db progress of prune method
* simplify logs
* simplify logs
* simplify logs
* fix test
* simplify logs
* simplify logs
* simplify logs
* simplify logs
* remove callTraceSet as dupsort
use etl transform for txlookup prune
remove some logs
* cleanup tests a bit
* print_stages and eth_sync to show prune progress
* fix print_stages
* add readme about --prune.to flag
* more docs
* add --prune.history.older and other flags support
* fix migration on empty db
* better toString
* better toString
2021-07-20 20:03:19 +00:00
cfg . Prune = mode
2020-11-13 16:16:47 +00:00
snMode , err := snapshotsync . SnapshotModeFromString ( ctx . GlobalString ( SnapshotModeFlag . Name ) )
2020-10-27 15:53:49 +00:00
if err != nil {
utils . Fatalf ( fmt . Sprintf ( "error while parsing mode: %v" , err ) )
}
2021-07-08 13:52:22 +00:00
cfg . Snapshot . Mode = snMode
cfg . Snapshot . Seeding = ctx . GlobalBool ( SeedSnapshotsFlag . Name )
cfg . Snapshot . Enabled = ctx . GlobalBool ( SnapshotDatabaseLayoutFlag . Name )
2020-10-27 15:53:49 +00:00
if ctx . GlobalString ( BatchSizeFlag . Name ) != "" {
err := cfg . BatchSize . UnmarshalText ( [ ] byte ( ctx . GlobalString ( BatchSizeFlag . Name ) ) )
if err != nil {
utils . Fatalf ( "Invalid batchSize provided: %v" , err )
}
}
if ctx . GlobalString ( EtlBufferSizeFlag . Name ) != "" {
sizeVal := datasize . ByteSize ( 0 )
size := & sizeVal
err := size . UnmarshalText ( [ ] byte ( ctx . GlobalString ( EtlBufferSizeFlag . Name ) ) )
if err != nil {
utils . Fatalf ( "Invalid batchSize provided: %v" , err )
}
etl . BufferOptimalSize = * size
}
2020-11-13 16:16:47 +00:00
cfg . ExternalSnapshotDownloaderAddr = ctx . GlobalString ( ExternalSnapshotDownloaderAddrFlag . Name )
2021-05-23 14:53:18 +00:00
cfg . StateStream = ctx . GlobalBool ( StateStreamFlag . Name )
2021-07-01 03:14:10 +00:00
cfg . BlockDownloaderWindow = ctx . GlobalInt ( BlockDownloaderWindowFlag . Name )
2021-07-10 02:19:44 +00:00
if ctx . GlobalString ( SyncLoopThrottleFlag . Name ) != "" {
syncLoopThrottle , err := time . ParseDuration ( ctx . GlobalString ( SyncLoopThrottleFlag . Name ) )
if err != nil {
utils . Fatalf ( "Invalid time duration provided in %s: %v" , SyncLoopThrottleFlag . Name , err )
}
cfg . SyncLoopThrottle = syncLoopThrottle
}
2020-10-27 15:53:49 +00:00
}
2021-07-10 02:19:44 +00:00
2021-03-23 09:00:07 +00:00
func ApplyFlagsForEthConfigCobra ( f * pflag . FlagSet , cfg * ethconfig . Config ) {
Pruning for: exec, log_index, tx_lookup, history stages (#2399)
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* add tvm flag
* save
* db migration for storage mode
add flag --prune=
remove flag --storage-mode=
add flag --experiments=tevm,...
rename integration set_storage_mode to set_prune
* fix
* forward move of stages must skip everything before PruneTo
* keep in db progress of prune method
* keep in db progress of prune method
* simplify logs
* simplify logs
* simplify logs
* fix test
* simplify logs
* simplify logs
* simplify logs
* simplify logs
* remove callTraceSet as dupsort
use etl transform for txlookup prune
remove some logs
* cleanup tests a bit
* print_stages and eth_sync to show prune progress
* fix print_stages
* add readme about --prune.to flag
* more docs
* add --prune.history.older and other flags support
* fix migration on empty db
* better toString
* better toString
2021-07-20 20:03:19 +00:00
if v := f . String ( PruneFlag . Name , PruneFlag . Value , PruneFlag . Usage ) ; v != nil {
var experiments [ ] string
if exp := f . StringSlice ( ExperimentsFlag . Name , nil , ExperimentsFlag . Usage ) ; exp != nil {
experiments = * exp
}
var exactH , exactR , exactT , exactC uint64
if v := f . Uint64 ( PruneHistoryFlag . Name , PruneHistoryFlag . Value , PruneHistoryFlag . Usage ) ; v != nil {
exactH = * v
}
if v := f . Uint64 ( PruneReceiptFlag . Name , PruneReceiptFlag . Value , PruneReceiptFlag . Usage ) ; v != nil {
exactR = * v
}
if v := f . Uint64 ( PruneTxIndexFlag . Name , PruneTxIndexFlag . Value , PruneTxIndexFlag . Usage ) ; v != nil {
exactT = * v
}
if v := f . Uint64 ( PruneCallTracesFlag . Name , PruneCallTracesFlag . Value , PruneCallTracesFlag . Usage ) ; v != nil {
exactC = * v
}
mode , err := prune . FromCli ( * v , exactH , exactR , exactT , exactC , experiments )
2021-03-23 09:00:07 +00:00
if err != nil {
utils . Fatalf ( fmt . Sprintf ( "error while parsing mode: %v" , err ) )
}
Pruning for: exec, log_index, tx_lookup, history stages (#2399)
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* Pruning for: exec, log_index, tx_lookup, history stages
* add tvm flag
* save
* db migration for storage mode
add flag --prune=
remove flag --storage-mode=
add flag --experiments=tevm,...
rename integration set_storage_mode to set_prune
* fix
* forward move of stages must skip everything before PruneTo
* keep in db progress of prune method
* keep in db progress of prune method
* simplify logs
* simplify logs
* simplify logs
* fix test
* simplify logs
* simplify logs
* simplify logs
* simplify logs
* remove callTraceSet as dupsort
use etl transform for txlookup prune
remove some logs
* cleanup tests a bit
* print_stages and eth_sync to show prune progress
* fix print_stages
* add readme about --prune.to flag
* more docs
* add --prune.history.older and other flags support
* fix migration on empty db
* better toString
* better toString
2021-07-20 20:03:19 +00:00
cfg . Prune = mode
2021-03-23 09:00:07 +00:00
}
if v := f . String ( SnapshotModeFlag . Name , SnapshotModeFlag . Value , SnapshotModeFlag . Usage ) ; v != nil {
snMode , err := snapshotsync . SnapshotModeFromString ( * v )
if err != nil {
utils . Fatalf ( fmt . Sprintf ( "error while parsing mode: %v" , err ) )
}
2021-07-08 13:52:22 +00:00
cfg . Snapshot . Mode = snMode
2021-03-23 09:00:07 +00:00
}
if v := f . Bool ( SeedSnapshotsFlag . Name , false , SeedSnapshotsFlag . Usage ) ; v != nil {
2021-07-08 13:52:22 +00:00
cfg . Snapshot . Seeding = * v
2021-03-23 09:00:07 +00:00
}
if v := f . String ( BatchSizeFlag . Name , BatchSizeFlag . Value , BatchSizeFlag . Usage ) ; v != nil {
err := cfg . BatchSize . UnmarshalText ( [ ] byte ( * v ) )
if err != nil {
utils . Fatalf ( "Invalid batchSize provided: %v" , err )
}
}
if v := f . String ( EtlBufferSizeFlag . Name , EtlBufferSizeFlag . Value , EtlBufferSizeFlag . Usage ) ; v != nil {
sizeVal := datasize . ByteSize ( 0 )
size := & sizeVal
err := size . UnmarshalText ( [ ] byte ( * v ) )
if err != nil {
utils . Fatalf ( "Invalid batchSize provided: %v" , err )
}
etl . BufferOptimalSize = * size
}
if v := f . String ( ExternalSnapshotDownloaderAddrFlag . Name , ExternalSnapshotDownloaderAddrFlag . Value , ExternalSnapshotDownloaderAddrFlag . Usage ) ; v != nil {
cfg . ExternalSnapshotDownloaderAddr = * v
}
2021-05-23 14:53:18 +00:00
if v := f . Bool ( StateStreamFlag . Name , false , StateStreamFlag . Usage ) ; v != nil {
cfg . StateStream = * v
}
2021-03-23 09:00:07 +00:00
}
2020-10-27 15:53:49 +00:00
func ApplyFlagsForNodeConfig ( ctx * cli . Context , cfg * node . Config ) {
setPrivateApi ( ctx , cfg )
2021-04-27 12:31:00 +00:00
cfg . DatabaseVerbosity = ethdb . DBVerbosityLvl ( ctx . GlobalInt ( DatabaseVerbosityFlag . Name ) )
2020-10-27 15:53:49 +00:00
}
// setPrivateApi populates configuration fields related to the remote
// read-only interface to the databae
func setPrivateApi ( ctx * cli . Context , cfg * node . Config ) {
cfg . PrivateApiAddr = ctx . GlobalString ( PrivateApiAddr . Name )
2021-03-23 07:28:04 +00:00
cfg . PrivateApiRateLimit = uint32 ( ctx . GlobalUint64 ( PrivateApiRateLimit . Name ) )
2021-07-14 14:48:20 +00:00
maxRateLimit := uint32 ( ethdb . ReadersLimit - 128 ) // leave some readers for P2P
2021-03-23 07:28:04 +00:00
if cfg . PrivateApiRateLimit > maxRateLimit {
log . Warn ( "private.api.ratelimit is too big" , "force" , maxRateLimit )
cfg . PrivateApiRateLimit = maxRateLimit
}
2020-10-27 15:53:49 +00:00
if ctx . GlobalBool ( TLSFlag . Name ) {
certFile := ctx . GlobalString ( TLSCertFlag . Name )
keyFile := ctx . GlobalString ( TLSKeyFlag . Name )
if certFile == "" {
log . Warn ( "Could not establish TLS grpc: missing certificate" )
return
} else if keyFile == "" {
log . Warn ( "Could not establish TLS grpc: missing key file" )
return
}
cfg . TLSConnection = true
cfg . TLSCertFile = certFile
cfg . TLSKeyFile = keyFile
cfg . TLSCACert = ctx . GlobalString ( TLSCACertFlag . Name )
}
}