@@ -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+
407417const (
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.
420430func 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 {
0 commit comments