Skip to content

Commit 02f3e9d

Browse files
committed
add root log dir spec
1 parent 5cba43a commit 02f3e9d

File tree

10 files changed

+924
-808
lines changed

10 files changed

+924
-808
lines changed

client/client.go

+13
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ func (c *client) Start(ctx context.Context, execPath string, opts ...OpOption) (
131131
if ret.rootDataDir != "" {
132132
req.RootDataDir = &ret.rootDataDir
133133
}
134+
if ret.logRootDir != "" {
135+
req.LogRootDir = &ret.logRootDir
136+
}
134137
if ret.pluginDir != "" {
135138
req.PluginDir = ret.pluginDir
136139
}
@@ -387,6 +390,9 @@ func (c *client) LoadSnapshot(ctx context.Context, snapshotName string, inPlace
387390
if ret.rootDataDir != "" {
388391
req.RootDataDir = &ret.rootDataDir
389392
}
393+
if ret.logRootDir != "" {
394+
req.LogRootDir = &ret.logRootDir
395+
}
390396
if ret.globalNodeConfig != "" {
391397
req.GlobalNodeConfig = &ret.globalNodeConfig
392398
}
@@ -457,6 +463,7 @@ type Op struct {
457463
trackSubnets string
458464
globalNodeConfig string
459465
rootDataDir string
466+
logRootDir string
460467
pluginDir string
461468
blockchainSpecs []*rpcpb.BlockchainSpec
462469
customNodeConfigs map[string]string
@@ -519,6 +526,12 @@ func WithRootDataDir(rootDataDir string) OpOption {
519526
}
520527
}
521528

529+
func WithLogRootDir(logRootDir string) OpOption {
530+
return func(op *Op) {
531+
op.logRootDir = logRootDir
532+
}
533+
}
534+
522535
func WithPluginDir(pluginDir string) OpOption {
523536
return func(op *Op) {
524537
op.pluginDir = pluginDir

local/network.go

+32-4
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,10 @@ type localNetwork struct {
9797
// Set of nodes that new nodes will bootstrap from.
9898
bootstraps beacon.Set
9999
// rootDir is the root directory under which we write all node
100-
// logs, databases, etc.
100+
// databases, etc
101101
rootDir string
102+
// logRootDir is the root directory under which we write all node logs
103+
logRootDir string
102104
// directory where networks can be persistently saved
103105
snapshotsDir string
104106
// flags to apply to all nodes per default
@@ -163,6 +165,7 @@ func NewNetwork(
163165
log logging.Logger,
164166
networkConfig network.Config,
165167
rootDir string,
168+
logRootDir string,
166169
snapshotsDir string,
167170
reassignPortsIfUsed bool,
168171
redirectStdout bool,
@@ -178,6 +181,7 @@ func NewNetwork(
178181
stderr: os.Stderr,
179182
},
180183
rootDir,
184+
logRootDir,
181185
snapshotsDir,
182186
reassignPortsIfUsed,
183187
redirectStdout,
@@ -197,6 +201,7 @@ func newNetwork(
197201
newAPIClientF api.NewAPIClientF,
198202
nodeProcessCreator NodeProcessCreator,
199203
rootDir string,
204+
logRootDir string,
200205
snapshotsDir string,
201206
reassignPortsIfUsed bool,
202207
redirectStdout bool,
@@ -215,6 +220,9 @@ func newNetwork(
215220
return nil, err
216221
}
217222
}
223+
if logRootDir == "" {
224+
logRootDir = rootDir
225+
}
218226
if snapshotsDir == "" {
219227
snapshotsDir = DefaultSnapshotsDir
220228
}
@@ -233,6 +241,7 @@ func newNetwork(
233241
newAPIClientF: newAPIClientF,
234242
nodeProcessCreator: nodeProcessCreator,
235243
rootDir: rootDir,
244+
logRootDir: logRootDir,
236245
snapshotsDir: snapshotsDir,
237246
reassignPortsIfUsed: reassignPortsIfUsed,
238247
redirectStdout: redirectStdout,
@@ -269,7 +278,7 @@ func NewDefaultNetwork(
269278
if err != nil {
270279
return nil, err
271280
}
272-
return NewNetwork(log, config, "", "", reassignPortsIfUsed, redirectStdout, redirectStderr)
281+
return NewNetwork(log, config, "", "", "", reassignPortsIfUsed, redirectStdout, redirectStderr)
273282
}
274283

275284
func loadDefaultNetworkFiles() (map[string]interface{}, []byte, []*utils.NodeKeys, error) {
@@ -540,6 +549,13 @@ func (ln *localNetwork) addNode(nodeConfig node.Config) (node.Node, error) {
540549
if err != nil {
541550
return nil, err
542551
}
552+
nodeLogDir := ""
553+
if ln.rootDir != ln.logRootDir {
554+
nodeLogDir, err = setNodeDir(ln.log, ln.logRootDir, nodeConfig.Name)
555+
if err != nil {
556+
return nil, err
557+
}
558+
}
543559

544560
// If config file is given, don't overwrite API port, P2P port, DB path, logs path
545561
var configFile map[string]interface{}
@@ -555,7 +571,7 @@ func (ln *localNetwork) addNode(nodeConfig node.Config) (node.Node, error) {
555571
return nil, err
556572
}
557573

558-
nodeData, err := ln.buildArgs(nodeSemVer, configFile, nodeDir, &nodeConfig)
574+
nodeData, err := ln.buildArgs(nodeSemVer, configFile, nodeDir, nodeLogDir, &nodeConfig)
559575
if err != nil {
560576
return nil, err
561577
}
@@ -1025,6 +1041,7 @@ func (ln *localNetwork) buildArgs(
10251041
nodeSemVer string,
10261042
configFile map[string]interface{},
10271043
nodeDir string,
1044+
nodeLogDir string,
10281045
nodeConfig *node.Config,
10291046
) (buildArgsReturn, error) {
10301047
// httpHost from all configs for node
@@ -1051,8 +1068,11 @@ func (ln *localNetwork) buildArgs(
10511068
return buildArgsReturn{}, err
10521069
}
10531070

1071+
if nodeLogDir == "" {
1072+
nodeLogDir = dataDir
1073+
}
10541074
// Tell the node to put the log directory in [dataDir/logs] unless given in config file
1055-
logsDir, err := getConfigEntry(nodeConfig.Flags, configFile, config.LogsDirKey, filepath.Join(dataDir, defaultLogsSubdir))
1075+
logsDir, err := getConfigEntry(nodeConfig.Flags, configFile, config.LogsDirKey, filepath.Join(nodeLogDir, defaultLogsSubdir))
10561076
if err != nil {
10571077
return buildArgsReturn{}, err
10581078
}
@@ -1193,3 +1213,11 @@ func getFlagsForAvagoVersion(avagoVersion string, givenFlags map[string]string)
11931213
}
11941214
return flags
11951215
}
1216+
1217+
func (ln *localNetwork) GetRootDir() string {
1218+
return ln.rootDir
1219+
}
1220+
1221+
func (ln *localNetwork) GetLogRootDir() string {
1222+
return ln.logRootDir
1223+
}

local/network_test.go

+17-11
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ func TestNewNetworkEmpty(t *testing.T) {
149149
&localTestProcessUndefNodeProcessCreator{},
150150
"",
151151
"",
152+
"",
152153
false,
153154
false,
154155
false,
@@ -214,6 +215,7 @@ func TestNewNetworkOneNode(t *testing.T) {
214215
creator,
215216
"",
216217
"",
218+
"",
217219
false,
218220
false,
219221
false,
@@ -244,6 +246,7 @@ func TestNewNetworkFailToStartNode(t *testing.T) {
244246
&localTestFailedStartProcessCreator{},
245247
"",
246248
"",
249+
"",
247250
false,
248251
false,
249252
false,
@@ -483,7 +486,7 @@ func TestWrongNetworkConfigs(t *testing.T) {
483486
require := require.New(t)
484487
for name, tt := range tests {
485488
t.Run(name, func(*testing.T) {
486-
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false, false, false)
489+
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", "", false, false, false)
487490
require.NoError(err)
488491
err = net.loadConfig(context.Background(), tt.config)
489492
require.Error(err)
@@ -497,7 +500,7 @@ func TestUnhealthyNetwork(t *testing.T) {
497500
t.Parallel()
498501
require := require.New(t)
499502
networkConfig := testNetworkConfig(t)
500-
net, err := newNetwork(logging.NoLog{}, newMockAPIUnhealthy, &localTestSuccessfulNodeProcessCreator{}, "", "", false, false, false)
503+
net, err := newNetwork(logging.NoLog{}, newMockAPIUnhealthy, &localTestSuccessfulNodeProcessCreator{}, "", "", "", false, false, false)
501504
require.NoError(err)
502505
err = net.loadConfig(context.Background(), networkConfig)
503506
require.NoError(err)
@@ -512,7 +515,7 @@ func TestGeneratedNodesNames(t *testing.T) {
512515
for i := range networkConfig.NodeConfigs {
513516
networkConfig.NodeConfigs[i].Name = ""
514517
}
515-
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false, false, false)
518+
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", "", false, false, false)
516519
require.NoError(err)
517520
err = net.loadConfig(context.Background(), networkConfig)
518521
require.NoError(err)
@@ -533,7 +536,7 @@ func TestGenerateDefaultNetwork(t *testing.T) {
533536
binaryPath := "pepito"
534537
networkConfig, err := NewDefaultConfig(binaryPath)
535538
require.NoError(err)
536-
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false, false, false)
539+
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", "", false, false, false)
537540
require.NoError(err)
538541
err = net.loadConfig(context.Background(), networkConfig)
539542
require.NoError(err)
@@ -583,7 +586,7 @@ func TestNetworkFromConfig(t *testing.T) {
583586
t.Parallel()
584587
require := require.New(t)
585588
networkConfig := testNetworkConfig(t)
586-
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false, false, false)
589+
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", "", false, false, false)
587590
require.NoError(err)
588591
err = net.loadConfig(context.Background(), networkConfig)
589592
require.NoError(err)
@@ -607,7 +610,7 @@ func TestNetworkNodeOps(t *testing.T) {
607610
// Start a new, empty network
608611
emptyNetworkConfig, err := emptyNetworkConfig()
609612
require.NoError(err)
610-
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false, false, false)
613+
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", "", false, false, false)
611614
require.NoError(err)
612615
err = net.loadConfig(context.Background(), emptyNetworkConfig)
613616
require.NoError(err)
@@ -645,7 +648,7 @@ func TestNodeNotFound(t *testing.T) {
645648
emptyNetworkConfig, err := emptyNetworkConfig()
646649
require.NoError(err)
647650
networkConfig := testNetworkConfig(t)
648-
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false, false, false)
651+
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", "", false, false, false)
649652
require.NoError(err)
650653
err = net.loadConfig(context.Background(), emptyNetworkConfig)
651654
require.NoError(err)
@@ -678,7 +681,7 @@ func TestStoppedNetwork(t *testing.T) {
678681
emptyNetworkConfig, err := emptyNetworkConfig()
679682
require.NoError(err)
680683
networkConfig := testNetworkConfig(t)
681-
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false, false, false)
684+
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", "", false, false, false)
682685
require.NoError(err)
683686
err = net.loadConfig(context.Background(), emptyNetworkConfig)
684687
require.NoError(err)
@@ -711,7 +714,7 @@ func TestStoppedNetwork(t *testing.T) {
711714
func TestGetAllNodes(t *testing.T) {
712715
require := require.New(t)
713716
networkConfig := testNetworkConfig(t)
714-
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false, false, false)
717+
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", "", false, false, false)
715718
require.NoError(err)
716719
err = net.loadConfig(context.Background(), networkConfig)
717720
require.NoError(err)
@@ -762,6 +765,7 @@ func TestFlags(t *testing.T) {
762765
},
763766
"",
764767
"",
768+
"",
765769
false,
766770
false,
767771
false,
@@ -793,6 +797,7 @@ func TestFlags(t *testing.T) {
793797
},
794798
"",
795799
"",
800+
"",
796801
false,
797802
false,
798803
false,
@@ -823,6 +828,7 @@ func TestFlags(t *testing.T) {
823828
},
824829
"",
825830
"",
831+
"",
826832
false,
827833
false,
828834
false,
@@ -1266,7 +1272,7 @@ func TestRemoveBeacon(t *testing.T) {
12661272
// create a network with no nodes in it
12671273
emptyNetworkConfig, err := emptyNetworkConfig()
12681274
require.NoError(err)
1269-
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", false, false, false)
1275+
net, err := newNetwork(logging.NoLog{}, newMockAPISuccessful, &localTestSuccessfulNodeProcessCreator{}, "", "", "", false, false, false)
12701276
require.NoError(err)
12711277
err = net.loadConfig(context.Background(), emptyNetworkConfig)
12721278
require.NoError(err)
@@ -1317,7 +1323,7 @@ func TestHealthyDuringNetworkStop(t *testing.T) {
13171323
require := require.New(t)
13181324
networkConfig := testNetworkConfig(t)
13191325
// Calls to a node's Healthy() function blocks until context cancelled
1320-
net, err := newNetwork(logging.NoLog{}, newMockAPIHealthyBlocks, &localTestSuccessfulNodeProcessCreator{}, "", "", false, false, false)
1326+
net, err := newNetwork(logging.NoLog{}, newMockAPIHealthyBlocks, &localTestSuccessfulNodeProcessCreator{}, "", "", "", false, false, false)
13211327
require.NoError(err)
13221328
err = net.loadConfig(context.Background(), networkConfig)
13231329
require.NoError(err)

local/snapshot.go

+23-9
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ func NewNetworkFromSnapshot(
6363
log logging.Logger,
6464
snapshotName string,
6565
rootDir string,
66+
logRootDir string,
6667
snapshotsDir string,
6768
binaryPath string,
6869
pluginDir string,
@@ -75,6 +76,12 @@ func NewNetworkFromSnapshot(
7576
redirectStderr bool,
7677
inPlace bool,
7778
) (network.Network, error) {
79+
if inPlace {
80+
if rootDir != "" {
81+
return nil, fmt.Errorf("root dir must be empty when using in place snapshot load")
82+
}
83+
rootDir = getSnapshotDir(snapshotsDir, snapshotName)
84+
}
7885
net, err := newNetwork(
7986
log,
8087
api.NewAPIClient,
@@ -85,6 +92,7 @@ func NewNetworkFromSnapshot(
8592
stderr: os.Stderr,
8693
},
8794
rootDir,
95+
logRootDir,
8896
snapshotsDir,
8997
reassignPortsIfUsed,
9098
redirectStdout,
@@ -186,7 +194,7 @@ func (ln *localNetwork) SaveSnapshot(ctx context.Context, snapshotName string, f
186194
return "", fmt.Errorf("invalid snapshotName %q", snapshotName)
187195
}
188196
// check if snapshot already exists
189-
snapshotDir := filepath.Join(ln.snapshotsDir, snapshotPrefix+snapshotName)
197+
snapshotDir := getSnapshotDir(ln.snapshotsDir, snapshotName)
190198
exists := false
191199
if _, err := os.Stat(snapshotDir); err == nil {
192200
exists = true
@@ -233,7 +241,7 @@ func (ln *localNetwork) loadSnapshot(
233241
ln.lock.Lock()
234242
defer ln.lock.Unlock()
235243

236-
snapshotDir := filepath.Join(ln.snapshotsDir, snapshotPrefix+snapshotName)
244+
snapshotDir := getSnapshotDir(ln.snapshotsDir, snapshotName)
237245
_, err := os.Stat(snapshotDir)
238246
if err != nil {
239247
if errors.Is(err, os.ErrNotExist) {
@@ -288,15 +296,14 @@ func (ln *localNetwork) loadSnapshot(
288296
}
289297
// load snapshot dir
290298
if !inPlace {
299+
if snapshotDir == ln.rootDir {
300+
return fmt.Errorf("root dir should differ from snapshot dir for not in place load")
301+
}
291302
if err := dircopy.Copy(snapshotDir, ln.rootDir); err != nil {
292303
return fmt.Errorf("failure loading snapshot root dir: %w", err)
293304
}
294-
} else {
295-
for _, nodeConfig := range networkConfig.NodeConfigs {
296-
// logs will be stored outside of the snapshot dir
297-
nodeConfig.Flags[config.LogsDirKey] = filepath.Join(ln.rootDir, nodeConfig.Name, "logs")
298-
}
299-
ln.rootDir = snapshotDir
305+
} else if snapshotDir != ln.rootDir {
306+
return fmt.Errorf("root dir should equal snapshot dir for not in place load")
300307
}
301308
// configure each node data dir
302309
for _, nodeConfig := range networkConfig.NodeConfigs {
@@ -406,8 +413,15 @@ func (ln *localNetwork) GetSnapshotNames() ([]string, error) {
406413
return GetSnapshotNames(ln.snapshotsDir)
407414
}
408415

416+
func getSnapshotDir(snapshotsDir string, snapshotName string) string {
417+
if snapshotsDir == "" {
418+
snapshotsDir = DefaultSnapshotsDir
419+
}
420+
return filepath.Join(snapshotsDir, snapshotPrefix+snapshotName)
421+
}
422+
409423
func RemoveSnapshot(snapshotsDir string, snapshotName string) error {
410-
snapshotDir := filepath.Join(snapshotsDir, snapshotPrefix+snapshotName)
424+
snapshotDir := getSnapshotDir(snapshotsDir, snapshotName)
411425
_, err := os.Stat(snapshotDir)
412426
if err != nil {
413427
if errors.Is(err, os.ErrNotExist) {

0 commit comments

Comments
 (0)