Skip to content

Commit ea50f98

Browse files
authored
Merge pull request #186 from cockroachdb/bardin-demo
testserver: add option to run demo mode
2 parents f0f0a08 + 693a2fa commit ea50f98

File tree

4 files changed

+126
-60
lines changed

4 files changed

+126
-60
lines changed

testserver/binaries.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,8 @@ func downloadBinaryFromTar(response *http.Response, output *os.File, filePath st
403403
}
404404

405405
}
406-
return nil
406+
// Unreachable, but left present for safety in case later changes make this branch reachable again.
407+
return fmt.Errorf("could not find cockroach binary in archive")
407408
}
408409

409410
// downloadBinaryFromZip writes the binary compressed in a zip from a http response

testserver/testserver.go

Lines changed: 98 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
433440
const (
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

testserver/testserver_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,22 @@ func TestRunServer(t *testing.T) {
234234
)
235235
},
236236
},
237+
{
238+
name: "Demo mode",
239+
instantiation: func(t *testing.T) (*sql.DB, func()) {
240+
return testserver.NewDBForTest(t,
241+
testserver.DemoModeOpt(),
242+
)
243+
},
244+
},
245+
{
246+
name: "Demo mode 3-node",
247+
instantiation: func(t *testing.T) (*sql.DB, func()) {
248+
return testserver.NewDBForTest(t, testserver.ThreeNodeOpt(),
249+
testserver.DemoModeOpt(),
250+
)
251+
},
252+
},
237253
} {
238254
t.Run(tc.name, func(t *testing.T) {
239255
db, stop := tc.instantiation(t)

testserver/testservernode.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ func (ts *testServerImpl) StopNode(nodeNum int) error {
5151
return nil
5252
}
5353

54+
type blockForeverReader struct{}
55+
56+
func (blockForeverReader) Read(p []byte) (int, error) {
57+
select {} // block forever
58+
}
59+
5460
func (ts *testServerImpl) StartNode(i int) error {
5561
ts.mu.RLock()
5662
if ts.nodes[i].state == stateRunning {
@@ -122,6 +128,10 @@ func (ts *testServerImpl) StartNode(i int) error {
122128
}
123129
currCmd.Stderr = ts.nodes[i].stderrBuf
124130

131+
if ts.serverArgs.demoMode {
132+
currCmd.Stdin = blockForeverReader{}
133+
}
134+
125135
for k, v := range defaultEnv() {
126136
currCmd.Env = append(currCmd.Env, k+"="+v)
127137
}

0 commit comments

Comments
 (0)