Skip to content

Commit c8da6e3

Browse files
authored
Merge pull request #145 from cockroachdb/specify_ports
Require specifying ports when using multiple nodes
2 parents f92e4fc + 1da40a5 commit c8da6e3

File tree

2 files changed

+90
-11
lines changed

2 files changed

+90
-11
lines changed

testserver/testserver.go

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,8 @@ type testServerArgs struct {
215215
rootPW string // if nonempty, set as pw for root
216216
storeOnDisk bool // to save database in disk
217217
storeMemSize float64 // the proportion of available memory allocated to test server
218-
httpPort int
218+
httpPorts []int
219+
listenAddrPorts []int
219220
testConfig TestConfig
220221
nonStableDB bool
221222
cockroachBinary string // path to cockroach executable file
@@ -287,9 +288,29 @@ func NonStableDbOpt() TestServerOpt {
287288

288289
// ExposeConsoleOpt is a TestServer option that can be passed to NewTestServer to
289290
// expose the console of the server on the given port.
291+
// Warning: This is kept around for backwards compatibility, use AddHttpPortOpt
292+
// instead.
290293
func ExposeConsoleOpt(port int) TestServerOpt {
291294
return func(args *testServerArgs) {
292-
args.httpPort = port
295+
args.httpPorts = []int{port}
296+
}
297+
}
298+
299+
// AddHttpPortOpt is a TestServer option that can be passed to NewTestServer to
300+
// specify the http ports for the Cockroach nodes.
301+
func AddHttpPortOpt(port int) TestServerOpt {
302+
return func(args *testServerArgs) {
303+
args.httpPorts = append(args.httpPorts, port)
304+
}
305+
}
306+
307+
// AddListenAddrPortOpt is a TestServer option that can be passed to NewTestServer to
308+
// specify the ports for the Cockroach nodes.
309+
// In the case of restarting nodes, it is up to the user of TestServer to make
310+
// sure the port used here cannot be re-used.
311+
func AddListenAddrPortOpt(port int) TestServerOpt {
312+
return func(args *testServerArgs) {
313+
args.listenAddrPorts = append(args.listenAddrPorts, port)
293314
}
294315
}
295316

@@ -337,6 +358,19 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
337358
serverArgs.cockroachBinary = customBinaryEnv
338359
}
339360

361+
// For backwards compatibility, in the 3 node case where no args are
362+
// specified, default to ports 26257, 26258, 26259.
363+
if serverArgs.numNodes == 3 && len(serverArgs.listenAddrPorts) == 0 {
364+
serverArgs.listenAddrPorts = []int{26257, 26258, 26259}
365+
} else if serverArgs.numNodes != 1 && len(serverArgs.listenAddrPorts) != serverArgs.numNodes {
366+
panic(fmt.Sprintf("need to specify a port for each node using AddListenAddrPortOpt, got %d nodes, need %d ports",
367+
serverArgs.numNodes, len(serverArgs.listenAddrPorts)))
368+
}
369+
370+
if len(serverArgs.listenAddrPorts) == 0 || len(serverArgs.listenAddrPorts) == 1 {
371+
serverArgs.listenAddrPorts = []int{0}
372+
}
373+
340374
var err error
341375
if serverArgs.cockroachBinary != "" {
342376
log.Printf("Using custom cockroach binary: %s", serverArgs.cockroachBinary)
@@ -445,19 +479,30 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
445479

446480
nodes := make([]nodeInfo, serverArgs.numNodes)
447481
var initArgs []string
482+
joinAddrs := make([]string, 3)
483+
hostPort := serverArgs.listenAddrPorts[0]
484+
for i, port := range serverArgs.listenAddrPorts {
485+
joinAddrs[i] = fmt.Sprintf("localhost:%d", port)
486+
}
487+
488+
if len(serverArgs.httpPorts) == 0 {
489+
serverArgs.httpPorts = make([]int, serverArgs.numNodes)
490+
}
491+
448492
for i := 0; i < serverArgs.numNodes; i++ {
449493
nodes[i].state = stateNew
450494
nodes[i].listeningURLFile = filepath.Join(baseDir, fmt.Sprintf("listen-url%d", i))
451495
if serverArgs.numNodes > 1 {
496+
joinArg := fmt.Sprintf("--join=%s", strings.Join(joinAddrs, ","))
452497
nodes[i].startCmdArgs = []string{
453498
serverArgs.cockroachBinary,
454499
startCmd,
455500
secureOpt,
456501
storeArg + strconv.Itoa(i),
457-
fmt.Sprintf("--listen-addr=localhost:%d", 26257+i),
458-
fmt.Sprintf("--http-addr=localhost:%d", 8080+i),
502+
fmt.Sprintf("--listen-addr=localhost:%d", serverArgs.listenAddrPorts[i]),
503+
fmt.Sprintf("--http-addr=localhost:%d", serverArgs.httpPorts[i]),
459504
"--listening-url-file=" + nodes[i].listeningURLFile,
460-
fmt.Sprintf("--join=localhost:%d,localhost:%d,localhost:%d", 26257, 26258, 26259),
505+
joinArg,
461506
}
462507
} else {
463508
nodes[0].startCmdArgs = []string{
@@ -467,7 +512,7 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
467512
secureOpt,
468513
"--host=localhost",
469514
"--port=0",
470-
"--http-port=" + strconv.Itoa(serverArgs.httpPort),
515+
"--http-port=" + strconv.Itoa(serverArgs.httpPorts[0]),
471516
storeArg,
472517
"--listening-url-file=" + nodes[i].listeningURLFile,
473518
}
@@ -480,7 +525,7 @@ func NewTestServer(opts ...TestServerOpt) (TestServer, error) {
480525
serverArgs.cockroachBinary,
481526
"init",
482527
secureOpt,
483-
"--host=localhost:26259",
528+
fmt.Sprintf("--host=localhost:%d", hostPort),
484529
}
485530

486531
states := make([]int, serverArgs.numNodes)

testserver/testserver_test.go

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,13 +186,38 @@ func TestRunServer(t *testing.T) {
186186
{
187187
name: "Insecure 3 Node",
188188
instantiation: func(t *testing.T) (*sql.DB, func()) {
189-
return testserver.NewDBForTest(t, testserver.ThreeNodeOpt())
189+
return testserver.NewDBForTest(t, testserver.ThreeNodeOpt(),
190+
testserver.AddListenAddrPortOpt(26257),
191+
testserver.AddListenAddrPortOpt(26258),
192+
testserver.AddListenAddrPortOpt(26259))
190193
},
191194
},
192195
{
193196
name: "Insecure 3 Node On Disk",
194197
instantiation: func(t *testing.T) (*sql.DB, func()) {
195-
return testserver.NewDBForTest(t, testserver.ThreeNodeOpt(), testserver.StoreOnDiskOpt())
198+
return testserver.NewDBForTest(t, testserver.ThreeNodeOpt(),
199+
testserver.StoreOnDiskOpt(),
200+
testserver.AddListenAddrPortOpt(26257),
201+
testserver.AddListenAddrPortOpt(26258),
202+
testserver.AddListenAddrPortOpt(26259))
203+
},
204+
},
205+
{
206+
name: "Insecure 3 Node On Disk No Ports Specified",
207+
instantiation: func(t *testing.T) (*sql.DB, func()) {
208+
return testserver.NewDBForTest(t, testserver.ThreeNodeOpt(),
209+
testserver.StoreOnDiskOpt())
210+
},
211+
},
212+
{
213+
name: "Insecure 3 Node With Http Ports",
214+
instantiation: func(t *testing.T) (*sql.DB, func()) {
215+
return testserver.NewDBForTest(t, testserver.ThreeNodeOpt(),
216+
testserver.StoreOnDiskOpt(),
217+
testserver.AddHttpPortOpt(8080),
218+
testserver.AddHttpPortOpt(8081),
219+
testserver.AddHttpPortOpt(8082),
220+
)
196221
},
197222
},
198223
} {
@@ -348,7 +373,12 @@ func TestFlockOnDownloadedCRDB(t *testing.T) {
348373
}
349374

350375
func TestRestartNode(t *testing.T) {
351-
ts, err := testserver.NewTestServer(testserver.ThreeNodeOpt(), testserver.StoreOnDiskOpt())
376+
ts, err := testserver.NewTestServer(
377+
testserver.ThreeNodeOpt(),
378+
testserver.StoreOnDiskOpt(),
379+
testserver.AddListenAddrPortOpt(26257),
380+
testserver.AddListenAddrPortOpt(26258),
381+
testserver.AddListenAddrPortOpt(26259))
352382
require.NoError(t, err)
353383
defer ts.Stop()
354384
for i := 0; i < 3; i++ {
@@ -440,14 +470,15 @@ func TestUpgradeNode(t *testing.T) {
440470
}
441471

442472
defer func() {
443-
require.NoError(t, exec.Command("rm", "-rf", "./temp_binaries").Start())
473+
require.NoError(t, exec.Command("rm", "-rf", "./temp_binaries").Run())
444474
}()
445475

446476
getBinary(oldVersionBinary)
447477
getBinary(newVersionBinary)
448478

449479
absPathOldBinary, err := filepath.Abs(fmt.Sprintf("./temp_binaries/%s/cockroach", oldVersionBinary))
450480
require.NoError(t, err)
481+
451482
absPathNewBinary, err := filepath.Abs(fmt.Sprintf("./temp_binaries/%s/cockroach", newVersionBinary))
452483
require.NoError(t, err)
453484

@@ -456,6 +487,9 @@ func TestUpgradeNode(t *testing.T) {
456487
testserver.CockroachBinaryPathOpt(absPathOldBinary),
457488
testserver.UpgradeCockroachBinaryPathOpt(absPathNewBinary),
458489
testserver.StoreOnDiskOpt(),
490+
testserver.AddListenAddrPortOpt(26257),
491+
testserver.AddListenAddrPortOpt(26258),
492+
testserver.AddListenAddrPortOpt(26259),
459493
)
460494
require.NoError(t, err)
461495
defer ts.Stop()

0 commit comments

Comments
 (0)