Skip to content

Commit 558bee7

Browse files
committed
testserver: add support for the --locality flag
This commit adds the `testserver.LocalityFlagsOpt` option. The flag makes it possible to test multi-region primitives with the test server.
1 parent 2c9d026 commit 558bee7

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

testserver/testserver.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ type testServerArgs struct {
238238
initTimeoutSeconds int
239239
pollListenURLTimeoutSeconds int
240240
envVars []string // to be passed to cmd.Env
241+
localityFlags []string
241242
}
242243

243244
// CockroachBinaryPathOpt is a TestServer option that can be passed to
@@ -383,6 +384,18 @@ func PollListenURLTimeoutOpt(timeout int) TestServerOpt {
383384
}
384385
}
385386

387+
// LocalityFlagsOpt is used to specify the --locality flag for each node.
388+
//
389+
// Example Usage:
390+
//
391+
// localities := LocalityFlagsOpt("region=us-west", "region=us-east", "region=us-central")
392+
// server, err := NewTestServer(ThreeNodeOpt(), localities)
393+
func LocalityFlagsOpt(locality ...string) TestServerOpt {
394+
return func(args *testServerArgs) {
395+
args.localityFlags = locality
396+
}
397+
}
398+
386399
// EnvVarOpt is a list of environment variables to be passed to the start
387400
// command. Each entry in the slice should be in `key=value` format.
388401
func EnvVarOpt(vars []string) TestServerOpt {
@@ -430,6 +443,10 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
430443
serverArgs.numNodes, len(serverArgs.listenAddrPorts)))
431444
}
432445

446+
if 0 < len(serverArgs.localityFlags) && len(serverArgs.localityFlags) != serverArgs.numNodes {
447+
panic(fmt.Sprintf("got %d locality flags when %d are needed (one for each node)", len(serverArgs.localityFlags), serverArgs.numNodes))
448+
}
449+
433450
var err error
434451
if serverArgs.cockroachBinary != "" {
435452
log.Printf("Using custom cockroach binary: %s", serverArgs.cockroachBinary)
@@ -574,6 +591,9 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
574591
"--external-io-dir=" + serverArgs.externalIODir,
575592
}
576593
}
594+
if 0 < len(serverArgs.localityFlags) {
595+
nodes[i].startCmdArgs = append(nodes[i].startCmdArgs, fmt.Sprintf("--locality=%s", serverArgs.localityFlags[i]))
596+
}
577597
}
578598

579599
// We only need initArgs if we're creating a testserver

testserver/testserver_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,3 +784,34 @@ func removeExistingLocalFile(localFile string) error {
784784
}
785785
return nil
786786
}
787+
788+
func TestLocalityFlagsOpt(t *testing.T) {
789+
ts, err := testserver.NewTestServer(
790+
testserver.ThreeNodeOpt(),
791+
testserver.LocalityFlagsOpt("region=us-east1", "region=us-central1", "region=us-west1"))
792+
require.NoError(t, err)
793+
794+
for i := 0; i < 3; i++ {
795+
ts.WaitForInitFinishForNode(i)
796+
}
797+
798+
db, err := sql.Open("postgres", ts.PGURL().String())
799+
require.NoError(t, err)
800+
801+
found := map[string]bool{}
802+
803+
rows, err := db.Query("SELECT region FROM [SHOW REGIONS]")
804+
require.NoError(t, err)
805+
defer rows.Close()
806+
for rows.Next() {
807+
var region string
808+
require.NoError(t, rows.Scan(&region))
809+
found[region] = true
810+
}
811+
812+
require.Equal(t, map[string]bool{
813+
"us-east1": true,
814+
"us-central1": true,
815+
"us-west1": true,
816+
}, found)
817+
}

0 commit comments

Comments
 (0)