From c1d6176707016dc1d4b99959e30bd415485a8cd5 Mon Sep 17 00:00:00 2001 From: Melih Birim Date: Mon, 14 Jun 2021 13:04:58 +0300 Subject: [PATCH] add raftlogdir commandline option (#1110) * add raftlogdir commandline option * raft handler_test.go linter and test fix * review change fixes from Peter Fox * raft log dir set to default if there is not any parameter given * raftLogDir assignment moved to cfg.RaftLogDir forom ctx * cfg typo fix * linter for /cmd/utils/flags.go * linter for raft/handler.go Co-authored-by: hemreari Co-authored-by: H. Emre ARI <12101466+hemreari@users.noreply.github.com> --- cmd/geth/main.go | 1 + cmd/utils/flags.go | 18 ++++++++++++++++-- node/config.go | 4 ++++ raft/backend.go | 4 ++-- raft/handler.go | 8 ++++---- raft/handler_test.go | 4 ++-- 6 files changed, 29 insertions(+), 10 deletions(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index f0d3ff8d53..dcb3dd81f2 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -67,6 +67,7 @@ var ( utils.LegacyBootnodesV4Flag, utils.LegacyBootnodesV5Flag, utils.DataDirFlag, + utils.RaftLogDirFlag, utils.AncientFlag, utils.KeyStoreDirFlag, utils.ExternalSignerFlag, diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index edec59b3e0..5143db728d 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -121,6 +121,11 @@ var ( Usage: "Data directory for the databases and keystore", Value: DirectoryString(node.DefaultDataDir()), } + RaftLogDirFlag = DirectoryFlag{ + Name: "raftlogdir", + Usage: "Raft log directory for the raft-state, raft-snap and raft-wal folders", + Value: DirectoryString(node.DefaultDataDir()), + } AncientFlag = DirectoryFlag{ Name: "datadir.ancient", Usage: "Data directory for ancient chain segments (default = inside chaindata)", @@ -1386,6 +1391,7 @@ func SetNodeConfig(ctx *cli.Context, cfg *node.Config) { setWS(ctx, cfg) setNodeUserIdent(ctx, cfg) setDataDir(ctx, cfg) + setRaftLogDir(ctx, cfg) setSmartCard(ctx, cfg) if ctx.GlobalIsSet(ExternalSignerFlag.Name) { @@ -1462,6 +1468,14 @@ func setDataDir(ctx *cli.Context, cfg *node.Config) { } } +func setRaftLogDir(ctx *cli.Context, cfg *node.Config) { + if ctx.GlobalIsSet(RaftLogDirFlag.Name) { + cfg.RaftLogDir = ctx.GlobalString(RaftLogDirFlag.Name) + } else { + cfg.RaftLogDir = cfg.DataDir + } +} + // Quorum // // Read plugin settings from --plugins flag. Overwrite settings defined in --config if any @@ -2017,7 +2031,7 @@ func RegisterPermissionService(stack *node.Node, useDns bool) { func RegisterRaftService(stack *node.Node, ctx *cli.Context, nodeCfg *node.Config, ethService *eth.Ethereum) { blockTimeMillis := ctx.GlobalInt(RaftBlockTimeFlag.Name) - datadir := ctx.GlobalString(DataDirFlag.Name) + raftLogDir := nodeCfg.RaftLogDir // default value is set either 'datadir' or 'raftlogdir' joinExistingId := ctx.GlobalInt(RaftJoinExistingFlag.Name) useDns := ctx.GlobalBool(RaftDNSEnabledFlag.Name) raftPort := uint16(ctx.GlobalInt(RaftPortFlag.Name)) @@ -2055,7 +2069,7 @@ func RegisterRaftService(stack *node.Node, ctx *cli.Context, nodeCfg *node.Confi } } - _, err := raft.New(stack, ethService.BlockChain().Config(), myId, raftPort, joinExisting, blockTimeNanos, ethService, peers, datadir, useDns) + _, err := raft.New(stack, ethService.BlockChain().Config(), myId, raftPort, joinExisting, blockTimeNanos, ethService, peers, raftLogDir, useDns) if err != nil { Fatalf("raft: Failed to register the Raft service: %v", err) } diff --git a/node/config.go b/node/config.go index 6862129dc5..eb3021e3c5 100644 --- a/node/config.go +++ b/node/config.go @@ -73,6 +73,10 @@ type Config struct { // in memory. DataDir string + // RaftLogDir is the file system folder the node use for raft-state, raft-snap and + // raft-wal folders. + RaftLogDir string + // Configuration of peer-to-peer networking. P2P p2p.Config diff --git a/raft/backend.go b/raft/backend.go index b139cfd11c..c5d75d7cbd 100644 --- a/raft/backend.go +++ b/raft/backend.go @@ -39,7 +39,7 @@ type RaftService struct { pendingLogsFeed *event.Feed } -func New(stack *node.Node, chainConfig *params.ChainConfig, raftId, raftPort uint16, joinExisting bool, blockTime time.Duration, e *eth.Ethereum, startPeers []*enode.Node, datadir string, useDns bool) (*RaftService, error) { +func New(stack *node.Node, chainConfig *params.ChainConfig, raftId, raftPort uint16, joinExisting bool, blockTime time.Duration, e *eth.Ethereum, startPeers []*enode.Node, raftLogDir string, useDns bool) (*RaftService, error) { service := &RaftService{ eventMux: stack.EventMux(), chainDb: e.ChainDb(), @@ -56,7 +56,7 @@ func New(stack *node.Node, chainConfig *params.ChainConfig, raftId, raftPort uin service.minter = newMinter(chainConfig, service, blockTime) var err error - if service.raftProtocolManager, err = NewProtocolManager(raftId, raftPort, service.blockchain, service.eventMux, startPeers, joinExisting, datadir, service.minter, service.downloader, useDns, stack.Server()); err != nil { + if service.raftProtocolManager, err = NewProtocolManager(raftId, raftPort, service.blockchain, service.eventMux, startPeers, joinExisting, raftLogDir, service.minter, service.downloader, useDns, stack.Server()); err != nil { return nil, err } diff --git a/raft/handler.go b/raft/handler.go index eaaa46da3e..f8833e7b46 100644 --- a/raft/handler.go +++ b/raft/handler.go @@ -99,10 +99,10 @@ var errNoLeaderElected = errors.New("no leader is currently elected") // Public interface // -func NewProtocolManager(raftId uint16, raftPort uint16, blockchain *core.BlockChain, mux *event.TypeMux, bootstrapNodes []*enode.Node, joinExisting bool, datadir string, minter *minter, downloader *downloader.Downloader, useDns bool, p2pServer *p2p.Server) (*ProtocolManager, error) { - waldir := fmt.Sprintf("%s/raft-wal", datadir) - snapdir := fmt.Sprintf("%s/raft-snap", datadir) - quorumRaftDbLoc := fmt.Sprintf("%s/quorum-raft-state", datadir) +func NewProtocolManager(raftId uint16, raftPort uint16, blockchain *core.BlockChain, mux *event.TypeMux, bootstrapNodes []*enode.Node, joinExisting bool, raftLogDir string, minter *minter, downloader *downloader.Downloader, useDns bool, p2pServer *p2p.Server) (*ProtocolManager, error) { + waldir := fmt.Sprintf("%s/raft-wal", raftLogDir) + snapdir := fmt.Sprintf("%s/raft-snap", raftLogDir) + quorumRaftDbLoc := fmt.Sprintf("%s/quorum-raft-state", raftLogDir) manager := &ProtocolManager{ bootstrapNodes: bootstrapNodes, diff --git a/raft/handler_test.go b/raft/handler_test.go index 18afc4b8a8..7557ae1ca3 100644 --- a/raft/handler_test.go +++ b/raft/handler_test.go @@ -152,7 +152,7 @@ func prepareServiceContext(key *ecdsa.PrivateKey) (stack *node.Node, cfg *node.C } func startRaftNode(id, port uint16, tmpWorkingDir string, key *ecdsa.PrivateKey, nodes []*enode.Node) (*RaftService, error) { - datadir := fmt.Sprintf("%s/node%d", tmpWorkingDir, id) + raftlogdir := fmt.Sprintf("%s/node%d", tmpWorkingDir, id) stack, _, err := prepareServiceContext(key) if err != nil { @@ -166,7 +166,7 @@ func startRaftNode(id, port uint16, tmpWorkingDir string, key *ecdsa.PrivateKey, return nil, err } - s, err := New(stack, params.QuorumTestChainConfig, id, port, false, 100*time.Millisecond, e, nodes, datadir, false) + s, err := New(stack, params.QuorumTestChainConfig, id, port, false, 100*time.Millisecond, e, nodes, raftlogdir, false) if err != nil { return nil, err }