@@ -243,6 +243,7 @@ type testServerArgs struct {
243243 envVars []string // to be passed to cmd.Env
244244 localityFlags []string
245245 cockroachLogsDir string
246+ demoMode bool // run in "demo" mode
246247}
247248
248249// CockroachBinaryPathOpt is a TestServer option that can be passed to
@@ -430,6 +431,12 @@ func CockroachLogsDirOpt(dir string) TestServerOpt {
430431 }
431432}
432433
434+ func DemoModeOpt () TestServerOpt {
435+ return func (args * testServerArgs ) {
436+ args .demoMode = true
437+ }
438+ }
439+
433440const (
434441 logsDirName = "logs"
435442 certsDirName = "certs"
@@ -559,12 +566,7 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
559566 return nil , fmt .Errorf ("%s failed to parse version: %w" , testserverMessagePrefix , err )
560567 }
561568
562- startCmd := "start-single-node"
563- if ! v .AtLeast (version .MustParse ("v19.2.0-alpha" )) || serverArgs .numNodes > 1 {
564- startCmd = "start"
565- }
566-
567- nodes := make ([]nodeInfo , serverArgs .numNodes )
569+ var nodes []nodeInfo
568570 if len (serverArgs .httpPorts ) == 0 {
569571 serverArgs .httpPorts = make ([]int , serverArgs .numNodes )
570572 }
@@ -573,60 +575,102 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
573575 serverArgs .externalIODir = "disabled"
574576 }
575577
576- for i := 0 ; i < serverArgs .numNodes ; i ++ {
577- storeArg := fmt .Sprintf ("--store=type=mem,size=%.2f" , serverArgs .storeMemSize )
578- logsBaseDir := filepath .Join (serverArgs .cockroachLogsDir , strconv .Itoa (i ))
579- nodeBaseDir , err := mkDir (strconv .Itoa (i ))
578+ if serverArgs .demoMode {
579+ startCmd := "demo"
580+ nodes = make ([]nodeInfo , 1 )
581+ logsBaseDir := filepath .Join (serverArgs .cockroachLogsDir , "0" )
582+ nodeBaseDir , err := mkDir ("0" )
580583 if err != nil {
581584 return nil , err
582585 }
583- if serverArgs .storeOnDisk {
584- storeArg = fmt .Sprintf ("--store=path=%s" , nodeBaseDir )
585- }
586+
586587 // TODO(janexing): Make sure the log is written to logDir instead of shown in console.
587588 // Should be done once issue #109 is solved:
588589 // https://github.com/cockroachdb/cockroach-go/issues/109
589- nodes [i ].stdout = filepath .Join (logsBaseDir , "cockroach.stdout" )
590- nodes [i ].stderr = filepath .Join (logsBaseDir , "cockroach.stderr" )
591- nodes [i ].listeningURLFile = filepath .Join (nodeBaseDir , "listen-url" )
592- nodes [i ].state = stateNew
593- if serverArgs .numNodes > 1 {
594- nodes [i ].startCmdArgs = []string {
595- serverArgs .cockroachBinary ,
596- startCmd ,
597- "--logtostderr" ,
598- secureOpt ,
599- storeArg ,
600- fmt .Sprintf (
601- "--listen-addr=%s:%d" ,
602- serverArgs .listenAddrHost ,
603- serverArgs .listenAddrPorts [i ],
604- ),
605- fmt .Sprintf (
606- "--http-addr=%s:%d" ,
607- serverArgs .listenAddrHost ,
608- serverArgs .httpPorts [i ],
609- ),
610- "--listening-url-file=" + nodes [i ].listeningURLFile ,
611- "--external-io-dir=" + serverArgs .externalIODir ,
590+ nodes [0 ].stdout = filepath .Join (logsBaseDir , "cockroach.stdout" )
591+ nodes [0 ].stderr = filepath .Join (logsBaseDir , "cockroach.stderr" )
592+ nodes [0 ].listeningURLFile = filepath .Join (nodeBaseDir , "listen-url" )
593+ nodes [0 ].state = stateNew
594+
595+ // Note the flags in demo mode are slightly different than single-node mode.
596+ // There's no external-io-dir flag, --port becomes --sql-port, and --nodes exists.
597+ nodes [0 ].startCmdArgs = []string {
598+ serverArgs .cockroachBinary ,
599+ startCmd ,
600+ "--logtostderr" ,
601+ secureOpt ,
602+ "--sql-port=" + strconv .Itoa (serverArgs .listenAddrPorts [0 ]),
603+ "--http-port=" + strconv .Itoa (serverArgs .httpPorts [0 ]),
604+ "--cache=" + strconv .FormatFloat (serverArgs .cacheSize , 'f' , 4 , 64 ),
605+ "--listening-url-file=" + nodes [0 ].listeningURLFile ,
606+ "--nodes=" + strconv .Itoa (serverArgs .numNodes ),
607+ }
608+
609+ if len (serverArgs .localityFlags ) > 0 {
610+ nodes [0 ].startCmdArgs = append (nodes [0 ].startCmdArgs , fmt .Sprintf ("--demo-locality=%s" , strings .Join (serverArgs .localityFlags , ":" )))
611+ }
612+ } else {
613+ startCmd := "start-single-node"
614+ if ! v .AtLeast (version .MustParse ("v19.2.0-alpha" )) || serverArgs .numNodes > 1 {
615+ startCmd = "start"
616+ }
617+ nodes = make ([]nodeInfo , serverArgs .numNodes )
618+ for i := 0 ; i < serverArgs .numNodes ; i ++ {
619+ storeArg := fmt .Sprintf ("--store=type=mem,size=%.2f" , serverArgs .storeMemSize )
620+ logsBaseDir := filepath .Join (serverArgs .cockroachLogsDir , strconv .Itoa (i ))
621+ nodeBaseDir , err := mkDir (strconv .Itoa (i ))
622+ if err != nil {
623+ return nil , err
612624 }
613- } else {
614- nodes [0 ].startCmdArgs = []string {
615- serverArgs .cockroachBinary ,
616- startCmd ,
617- "--logtostderr" ,
618- secureOpt ,
619- fmt .Sprintf ("--host=%s" , serverArgs .listenAddrHost ),
620- "--port=" + strconv .Itoa (serverArgs .listenAddrPorts [0 ]),
621- "--http-port=" + strconv .Itoa (serverArgs .httpPorts [0 ]),
622- storeArg ,
623- "--cache=" + strconv .FormatFloat (serverArgs .cacheSize , 'f' , 4 , 64 ),
624- "--listening-url-file=" + nodes [i ].listeningURLFile ,
625- "--external-io-dir=" + serverArgs .externalIODir ,
625+ if serverArgs .storeOnDisk {
626+ storeArg = fmt .Sprintf ("--store=path=%s" , nodeBaseDir )
627+ }
628+
629+ // TODO(janexing): Make sure the log is written to logDir instead of shown in console.
630+ // Should be done once issue #109 is solved:
631+ // https://github.com/cockroachdb/cockroach-go/issues/109
632+ nodes [i ].stdout = filepath .Join (logsBaseDir , "cockroach.stdout" )
633+ nodes [i ].stderr = filepath .Join (logsBaseDir , "cockroach.stderr" )
634+ nodes [i ].listeningURLFile = filepath .Join (nodeBaseDir , "listen-url" )
635+ nodes [i ].state = stateNew
636+ if serverArgs .numNodes > 1 {
637+ nodes [i ].startCmdArgs = []string {
638+ serverArgs .cockroachBinary ,
639+ startCmd ,
640+ "--logtostderr" ,
641+ secureOpt ,
642+ storeArg ,
643+ fmt .Sprintf (
644+ "--listen-addr=%s:%d" ,
645+ serverArgs .listenAddrHost ,
646+ serverArgs .listenAddrPorts [i ],
647+ ),
648+ fmt .Sprintf (
649+ "--http-addr=%s:%d" ,
650+ serverArgs .listenAddrHost ,
651+ serverArgs .httpPorts [i ],
652+ ),
653+ "--listening-url-file=" + nodes [i ].listeningURLFile ,
654+ "--external-io-dir=" + serverArgs .externalIODir ,
655+ }
656+ } else {
657+ nodes [0 ].startCmdArgs = []string {
658+ serverArgs .cockroachBinary ,
659+ startCmd ,
660+ "--logtostderr" ,
661+ secureOpt ,
662+ fmt .Sprintf ("--host=%s" , serverArgs .listenAddrHost ),
663+ "--port=" + strconv .Itoa (serverArgs .listenAddrPorts [0 ]),
664+ "--http-port=" + strconv .Itoa (serverArgs .httpPorts [0 ]),
665+ storeArg ,
666+ "--cache=" + strconv .FormatFloat (serverArgs .cacheSize , 'f' , 4 , 64 ),
667+ "--listening-url-file=" + nodes [i ].listeningURLFile ,
668+ "--external-io-dir=" + serverArgs .externalIODir ,
669+ }
670+ }
671+ if len (serverArgs .localityFlags ) > 0 {
672+ nodes [i ].startCmdArgs = append (nodes [i ].startCmdArgs , fmt .Sprintf ("--locality=%s" , serverArgs .localityFlags [i ]))
626673 }
627- }
628- if 0 < len (serverArgs .localityFlags ) {
629- nodes [i ].startCmdArgs = append (nodes [i ].startCmdArgs , fmt .Sprintf ("--locality=%s" , serverArgs .localityFlags [i ]))
630674 }
631675 }
632676
@@ -638,11 +682,6 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
638682 secureOpt ,
639683 }
640684
641- states := make ([]int , serverArgs .numNodes )
642- for i := 0 ; i < serverArgs .numNodes ; i ++ {
643- states [i ] = stateNew
644- }
645-
646685 ts := & testServerImpl {
647686 serverArgs : * serverArgs ,
648687 version : v ,
@@ -844,13 +883,13 @@ func (ts *testServerImpl) Start() error {
844883 ts .serverState = stateRunning
845884 ts .mu .Unlock ()
846885
847- for i := 0 ; i < ts .serverArgs . numNodes ; i ++ {
886+ for i := 0 ; i < len ( ts .nodes ) ; i ++ {
848887 if err := ts .StartNode (i ); err != nil {
849888 return err
850889 }
851890 }
852891
853- if ts .serverArgs .numNodes > 1 {
892+ if ts .serverArgs .numNodes > 1 && ! ts . serverArgs . demoMode {
854893 err := ts .CockroachInit ()
855894 if err != nil {
856895 return err
0 commit comments