@@ -243,6 +243,7 @@ type testServerArgs struct {
243
243
envVars []string // to be passed to cmd.Env
244
244
localityFlags []string
245
245
cockroachLogsDir string
246
+ demoMode bool // run in "demo" mode
246
247
}
247
248
248
249
// CockroachBinaryPathOpt is a TestServer option that can be passed to
@@ -430,6 +431,12 @@ func CockroachLogsDirOpt(dir string) TestServerOpt {
430
431
}
431
432
}
432
433
434
+ func DemoModeOpt () TestServerOpt {
435
+ return func (args * testServerArgs ) {
436
+ args .demoMode = true
437
+ }
438
+ }
439
+
433
440
const (
434
441
logsDirName = "logs"
435
442
certsDirName = "certs"
@@ -559,12 +566,7 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
559
566
return nil , fmt .Errorf ("%s failed to parse version: %w" , testserverMessagePrefix , err )
560
567
}
561
568
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
568
570
if len (serverArgs .httpPorts ) == 0 {
569
571
serverArgs .httpPorts = make ([]int , serverArgs .numNodes )
570
572
}
@@ -573,60 +575,102 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
573
575
serverArgs .externalIODir = "disabled"
574
576
}
575
577
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" )
580
583
if err != nil {
581
584
return nil , err
582
585
}
583
- if serverArgs .storeOnDisk {
584
- storeArg = fmt .Sprintf ("--store=path=%s" , nodeBaseDir )
585
- }
586
+
586
587
// TODO(janexing): Make sure the log is written to logDir instead of shown in console.
587
588
// Should be done once issue #109 is solved:
588
589
// 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
612
624
}
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 ]))
626
673
}
627
- }
628
- if 0 < len (serverArgs .localityFlags ) {
629
- nodes [i ].startCmdArgs = append (nodes [i ].startCmdArgs , fmt .Sprintf ("--locality=%s" , serverArgs .localityFlags [i ]))
630
674
}
631
675
}
632
676
@@ -638,11 +682,6 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
638
682
secureOpt ,
639
683
}
640
684
641
- states := make ([]int , serverArgs .numNodes )
642
- for i := 0 ; i < serverArgs .numNodes ; i ++ {
643
- states [i ] = stateNew
644
- }
645
-
646
685
ts := & testServerImpl {
647
686
serverArgs : * serverArgs ,
648
687
version : v ,
@@ -844,13 +883,13 @@ func (ts *testServerImpl) Start() error {
844
883
ts .serverState = stateRunning
845
884
ts .mu .Unlock ()
846
885
847
- for i := 0 ; i < ts .serverArgs . numNodes ; i ++ {
886
+ for i := 0 ; i < len ( ts .nodes ) ; i ++ {
848
887
if err := ts .StartNode (i ); err != nil {
849
888
return err
850
889
}
851
890
}
852
891
853
- if ts .serverArgs .numNodes > 1 {
892
+ if ts .serverArgs .numNodes > 1 && ! ts . serverArgs . demoMode {
854
893
err := ts .CockroachInit ()
855
894
if err != nil {
856
895
return err
0 commit comments