Skip to content

Commit

Permalink
Merge pull request #168 from cockroachdb/jeffswenson-support-locality
Browse files Browse the repository at this point in the history
testserver: add support for the --locality flag
  • Loading branch information
JeffSwenson committed Apr 20, 2023
2 parents 2c9d026 + 558bee7 commit 2a95d72
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 0 deletions.
20 changes: 20 additions & 0 deletions testserver/testserver.go
Expand Up @@ -238,6 +238,7 @@ type testServerArgs struct {
initTimeoutSeconds int
pollListenURLTimeoutSeconds int
envVars []string // to be passed to cmd.Env
localityFlags []string
}

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

// LocalityFlagsOpt is used to specify the --locality flag for each node.
//
// Example Usage:
//
// localities := LocalityFlagsOpt("region=us-west", "region=us-east", "region=us-central")
// server, err := NewTestServer(ThreeNodeOpt(), localities)
func LocalityFlagsOpt(locality ...string) TestServerOpt {
return func(args *testServerArgs) {
args.localityFlags = locality
}
}

// EnvVarOpt is a list of environment variables to be passed to the start
// command. Each entry in the slice should be in `key=value` format.
func EnvVarOpt(vars []string) TestServerOpt {
Expand Down Expand Up @@ -430,6 +443,10 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
serverArgs.numNodes, len(serverArgs.listenAddrPorts)))
}

if 0 < len(serverArgs.localityFlags) && len(serverArgs.localityFlags) != serverArgs.numNodes {
panic(fmt.Sprintf("got %d locality flags when %d are needed (one for each node)", len(serverArgs.localityFlags), serverArgs.numNodes))
}

var err error
if serverArgs.cockroachBinary != "" {
log.Printf("Using custom cockroach binary: %s", serverArgs.cockroachBinary)
Expand Down Expand Up @@ -574,6 +591,9 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
"--external-io-dir=" + serverArgs.externalIODir,
}
}
if 0 < len(serverArgs.localityFlags) {
nodes[i].startCmdArgs = append(nodes[i].startCmdArgs, fmt.Sprintf("--locality=%s", serverArgs.localityFlags[i]))
}
}

// We only need initArgs if we're creating a testserver
Expand Down
31 changes: 31 additions & 0 deletions testserver/testserver_test.go
Expand Up @@ -784,3 +784,34 @@ func removeExistingLocalFile(localFile string) error {
}
return nil
}

func TestLocalityFlagsOpt(t *testing.T) {
ts, err := testserver.NewTestServer(
testserver.ThreeNodeOpt(),
testserver.LocalityFlagsOpt("region=us-east1", "region=us-central1", "region=us-west1"))
require.NoError(t, err)

for i := 0; i < 3; i++ {
ts.WaitForInitFinishForNode(i)
}

db, err := sql.Open("postgres", ts.PGURL().String())
require.NoError(t, err)

found := map[string]bool{}

rows, err := db.Query("SELECT region FROM [SHOW REGIONS]")
require.NoError(t, err)
defer rows.Close()
for rows.Next() {
var region string
require.NoError(t, rows.Scan(&region))
found[region] = true
}

require.Equal(t, map[string]bool{
"us-east1": true,
"us-central1": true,
"us-west1": true,
}, found)
}

0 comments on commit 2a95d72

Please sign in to comment.