Skip to content

Commit 2e2ec24

Browse files
Renato Costarafiss
authored andcommitted
testserver: introduce CockroachLogsDirOpt
This new parameter allows callers to specify a root directory where logs for cockroach processes created by testserver will be located. Previously, when calling `testserver.Stop()`, *all* resources would be deleted, including cockroach logs. By allowing the caller to specify a custom directory, we allow the possibility for the logs to outlive the cockroach processes, which is especially useful when debugging test failures.
1 parent 2a95d72 commit 2e2ec24

File tree

2 files changed

+54
-10
lines changed

2 files changed

+54
-10
lines changed

testserver/testserver.go

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ type testServerArgs struct {
239239
pollListenURLTimeoutSeconds int
240240
envVars []string // to be passed to cmd.Env
241241
localityFlags []string
242+
cockroachLogsDir string
242243
}
243244

244245
// CockroachBinaryPathOpt is a TestServer option that can be passed to
@@ -404,6 +405,15 @@ func EnvVarOpt(vars []string) TestServerOpt {
404405
}
405406
}
406407

408+
// CockroachLogsDirOpt allows callers to control where the stdout and
409+
// stderr of cockroach processes created by the testserver are
410+
// located. Files will be in the format: $nodeID/cockroach.std{out,err}.
411+
func CockroachLogsDirOpt(dir string) TestServerOpt {
412+
return func(args *testServerArgs) {
413+
args.cockroachLogsDir = dir
414+
}
415+
}
416+
407417
const (
408418
logsDirName = "logs"
409419
certsDirName = "certs"
@@ -418,14 +428,21 @@ var errStoppedInMiddle = errors.New("download stopped in middle")
418428
// If the download fails, we attempt just call "cockroach", hoping it is
419429
// found in your path.
420430
func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
431+
baseDir, err := os.MkdirTemp("", "cockroach-testserver")
432+
if err != nil {
433+
return nil, fmt.Errorf("%s: could not create temp directory: %w", testserverMessagePrefix, err)
434+
}
435+
421436
serverArgs := &testServerArgs{numNodes: 1}
422437
serverArgs.storeMemSize = defaultStoreMemSize
423438
serverArgs.initTimeoutSeconds = defaultInitTimeout
424439
serverArgs.pollListenURLTimeoutSeconds = defaultPollListenURLTimeout
425440
serverArgs.listenAddrHost = defaultListenAddrHost
441+
serverArgs.cockroachLogsDir = baseDir
426442
for _, applyOptToArgs := range opts {
427443
applyOptToArgs(serverArgs)
428444
}
445+
log.Printf("cockroach logs directory: %s", serverArgs.cockroachLogsDir)
429446

430447
if serverArgs.cockroachBinary != "" {
431448
// CockroachBinaryPathOpt() overrides the flag or env variable.
@@ -447,7 +464,6 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
447464
panic(fmt.Sprintf("got %d locality flags when %d are needed (one for each node)", len(serverArgs.localityFlags), serverArgs.numNodes))
448465
}
449466

450-
var err error
451467
if serverArgs.cockroachBinary != "" {
452468
log.Printf("Using custom cockroach binary: %s", serverArgs.cockroachBinary)
453469
cockroachBinary, err := filepath.Abs(serverArgs.cockroachBinary)
@@ -470,11 +486,6 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
470486
}
471487
}
472488

473-
baseDir, err := os.MkdirTemp("", "cockroach-testserver")
474-
if err != nil {
475-
return nil, fmt.Errorf("%s: could not create temp directory: %w", testserverMessagePrefix, err)
476-
}
477-
478489
mkDir := func(name string) (string, error) {
479490
path := filepath.Join(baseDir, name)
480491
if err := os.MkdirAll(path, 0755); err != nil {
@@ -547,15 +558,19 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
547558

548559
for i := 0; i < serverArgs.numNodes; i++ {
549560
storeArg := fmt.Sprintf("--store=type=mem,size=%.2f", serverArgs.storeMemSize)
550-
nodeBaseDir := filepath.Join(baseDir, strconv.Itoa(i))
561+
logsBaseDir := filepath.Join(serverArgs.cockroachLogsDir, strconv.Itoa(i))
562+
nodeBaseDir, err := mkDir(strconv.Itoa(i))
563+
if err != nil {
564+
return nil, err
565+
}
551566
if serverArgs.storeOnDisk {
552567
storeArg = fmt.Sprintf("--store=path=%s", nodeBaseDir)
553568
}
554569
// TODO(janexing): Make sure the log is written to logDir instead of shown in console.
555570
// Should be done once issue #109 is solved:
556571
// https://github.com/cockroachdb/cockroach-go/issues/109
557-
nodes[i].stdout = filepath.Join(nodeBaseDir, "cockroach.stdout")
558-
nodes[i].stderr = filepath.Join(nodeBaseDir, "cockroach.stderr")
572+
nodes[i].stdout = filepath.Join(logsBaseDir, "cockroach.stdout")
573+
nodes[i].stderr = filepath.Join(logsBaseDir, "cockroach.stderr")
559574
nodes[i].listeningURLFile = filepath.Join(nodeBaseDir, "listen-url")
560575
nodes[i].state = stateNew
561576
if serverArgs.numNodes > 1 {
@@ -831,7 +846,6 @@ func (ts *testServerImpl) Stop() {
831846
testserverMessagePrefix,
832847
ts.Stdout(),
833848
ts.Stderr())
834-
return
835849
}
836850

837851
if ts.serverState != stateStopped {

testserver/testserver_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -815,3 +815,33 @@ func TestLocalityFlagsOpt(t *testing.T) {
815815
"us-west1": true,
816816
}, found)
817817
}
818+
819+
func TestCockroachLogsDirOpt(t *testing.T) {
820+
logsDir, err := os.MkdirTemp("", "logs-dir-opt")
821+
require.NoError(t, err)
822+
defer require.NoError(t, os.RemoveAll(logsDir))
823+
824+
ts, err := testserver.NewTestServer(
825+
testserver.ThreeNodeOpt(),
826+
testserver.CockroachLogsDirOpt(logsDir))
827+
require.NoError(t, err)
828+
829+
for i := 0; i < 3; i++ {
830+
if err := ts.WaitForInitFinishForNode(i); err != nil {
831+
// Make sure we stop the testserver in this case as well.
832+
ts.Stop()
833+
require.NoError(t, err)
834+
}
835+
}
836+
837+
// This should delete all resources, but log files should
838+
// continue to exist under `logsDir`.
839+
ts.Stop()
840+
841+
for _, nodeID := range []string{"0", "1", "2"} {
842+
for _, logFile := range []string{"cockroach.stdout", "cockroach.stderr"} {
843+
_, err := os.Stat(filepath.Join(logsDir, nodeID, logFile))
844+
require.NoError(t, err)
845+
}
846+
}
847+
}

0 commit comments

Comments
 (0)