[close #570] mockserver: fix unstable mock server cluster setup (#571)

This commit is contained in:
iosmanthus 2022-03-25 16:34:17 +08:00 committed by GitHub
parent 7278d5aa1d
commit f4e7c302ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 34 additions and 26 deletions

View File

@ -42,9 +42,11 @@ public class MockThreeStoresTest extends PDMockServerTest {
public void setup() throws IOException { public void setup() throws IOException {
super.setup(); super.setup();
int basePort; int[] ports = new int[3];
try (ServerSocket s = new ServerSocket(0)) { for (int i = 0; i < ports.length; i++) {
basePort = s.getLocalPort(); try (ServerSocket s = new ServerSocket(0)) {
ports[i] = s.getLocalPort();
}
} }
ImmutableList<Metapb.Peer> peers = ImmutableList<Metapb.Peer> peers =
@ -65,17 +67,17 @@ public class MockThreeStoresTest extends PDMockServerTest {
stores = stores =
ImmutableList.of( ImmutableList.of(
Metapb.Store.newBuilder() Metapb.Store.newBuilder()
.setAddress("127.0.0.1:" + basePort) .setAddress("127.0.0.1:" + ports[0])
.setVersion("5.0.0") .setVersion("5.0.0")
.setId(0x1) .setId(0x1)
.build(), .build(),
Metapb.Store.newBuilder() Metapb.Store.newBuilder()
.setAddress("127.0.0.1:" + (basePort + 1)) .setAddress("127.0.0.1:" + ports[1])
.setVersion("5.0.0") .setVersion("5.0.0")
.setId(0x2) .setId(0x2)
.build(), .build(),
Metapb.Store.newBuilder() Metapb.Store.newBuilder()
.setAddress("127.0.0.1:" + (basePort + 2)) .setAddress("127.0.0.1:" + ports[2])
.setVersion("5.0.0") .setVersion("5.0.0")
.setId(0x3) .setId(0x3)
.build()); .build());
@ -101,9 +103,9 @@ public class MockThreeStoresTest extends PDMockServerTest {
region.getPeers(0), region.getPeers(0),
region.getPeersList(), region.getPeersList(),
stores.stream().map(TiStore::new).collect(Collectors.toList())); stores.stream().map(TiStore::new).collect(Collectors.toList()));
for (int i = 0; i < 3; i++) { for (int port : ports) {
KVMockServer server = new KVMockServer(); KVMockServer server = new KVMockServer();
server.start(this.region, basePort + i); server.start(this.region, port);
servers.add(server); servers.add(server);
} }
} }

View File

@ -47,7 +47,8 @@ public class PDClientMockTest extends PDMockServerTest {
@Test @Test
public void testCreate() throws Exception { public void testCreate() throws Exception {
try (PDClient client = session.getPDClient()) { try (PDClient client = session.getPDClient()) {
assertEquals(LOCAL_ADDR + ":" + leader.port, client.getPdClientWrapper().getLeaderInfo()); assertEquals(
LOCAL_ADDR + ":" + leader.getPort(), client.getPdClientWrapper().getLeaderInfo());
assertEquals(CLUSTER_ID, client.getHeader().getClusterId()); assertEquals(CLUSTER_ID, client.getHeader().getClusterId());
} }
} }
@ -55,17 +56,19 @@ public class PDClientMockTest extends PDMockServerTest {
@Test @Test
public void testSwitchLeader() throws Exception { public void testSwitchLeader() throws Exception {
try (PDClient client = session.getPDClient()) { try (PDClient client = session.getPDClient()) {
client.trySwitchLeader(HTTP + LOCAL_ADDR + ":" + (leader.port + 1)); // Switch leader to server 1
client.trySwitchLeader(HTTP + LOCAL_ADDR + ":" + pdServers.get(1).getPort());
assertEquals( assertEquals(
client.getPdClientWrapper().getLeaderInfo(), HTTP + LOCAL_ADDR + ":" + (leader.port + 1)); client.getPdClientWrapper().getLeaderInfo(),
HTTP + LOCAL_ADDR + ":" + pdServers.get(1).getPort());
} }
tearDown(); tearDown();
setup(LOCAL_ADDR_IPV6); setup(LOCAL_ADDR_IPV6);
try (PDClient client = session.getPDClient()) { try (PDClient client = session.getPDClient()) {
client.trySwitchLeader(HTTP + LOCAL_ADDR_IPV6 + ":" + (leader.port + 2)); client.trySwitchLeader(HTTP + LOCAL_ADDR_IPV6 + ":" + pdServers.get(2).getPort());
assertEquals( assertEquals(
client.getPdClientWrapper().getLeaderInfo(), client.getPdClientWrapper().getLeaderInfo(),
HTTP + LOCAL_ADDR_IPV6 + ":" + (leader.port + 2)); HTTP + LOCAL_ADDR_IPV6 + ":" + pdServers.get(2).getPort());
} }
} }

View File

@ -37,8 +37,7 @@ import org.tikv.kvproto.Pdpb.TsoRequest;
import org.tikv.kvproto.Pdpb.TsoResponse; import org.tikv.kvproto.Pdpb.TsoResponse;
public class PDMockServer extends PDGrpc.PDImplBase { public class PDMockServer extends PDGrpc.PDImplBase {
private int port;
public int port;
private long clusterId; private long clusterId;
private Server server; private Server server;
@ -148,4 +147,8 @@ public class PDMockServer extends PDGrpc.PDImplBase {
public long getClusterId() { public long getClusterId() {
return clusterId; return clusterId;
} }
public long getPort() {
return port;
}
} }

View File

@ -38,28 +38,30 @@ public abstract class PDMockServerTest {
} }
void setup(String addr) throws IOException { void setup(String addr) throws IOException {
int basePort; int[] ports = new int[3];
try (ServerSocket s = new ServerSocket(0)) { for (int i = 0; i < ports.length; i++) {
basePort = s.getLocalPort(); try (ServerSocket s = new ServerSocket(0)) {
ports[i] = s.getLocalPort();
}
} }
for (int i = 0; i < 3; i++) { for (int i = 0; i < ports.length; i++) {
PDMockServer server = new PDMockServer(); PDMockServer server = new PDMockServer();
server.start(CLUSTER_ID, basePort + i); server.start(CLUSTER_ID, ports[i]);
server.addGetMembersListener( server.addGetMembersListener(
(request) -> (request) ->
GrpcUtils.makeGetMembersResponse( GrpcUtils.makeGetMembersResponse(
server.getClusterId(), server.getClusterId(),
GrpcUtils.makeMember(1, "http://" + addr + ":" + basePort), GrpcUtils.makeMember(1, "http://" + addr + ":" + ports[0]),
GrpcUtils.makeMember(2, "http://" + addr + ":" + (basePort + 1)), GrpcUtils.makeMember(2, "http://" + addr + ":" + ports[1]),
GrpcUtils.makeMember(3, "http://" + addr + ":" + (basePort + 2)))); GrpcUtils.makeMember(3, "http://" + addr + ":" + ports[2])));
pdServers.add(server); pdServers.add(server);
if (i == 0) { if (i == 0) {
leader = server; leader = server;
} }
} }
TiConfiguration conf = TiConfiguration.createDefault(addr + ":" + leader.port); TiConfiguration conf = TiConfiguration.createDefault(addr + ":" + ports[0]);
conf.setKvMode("RAW"); conf.setKvMode("RAW");
conf.setWarmUpEnable(false); conf.setWarmUpEnable(false);
conf.setTimeout(2000); conf.setTimeout(2000);

View File

@ -28,7 +28,6 @@ import org.tikv.kvproto.Pdpb;
import org.tikv.raw.RawKVClient; import org.tikv.raw.RawKVClient;
public class SeekLeaderStoreTest extends MockThreeStoresTest { public class SeekLeaderStoreTest extends MockThreeStoresTest {
private RawKVClient createClient() { private RawKVClient createClient() {
return session.createRawClient(); return session.createRawClient();
} }

View File

@ -24,7 +24,6 @@ import org.tikv.common.KVMockServer.State;
import org.tikv.raw.RawKVClient; import org.tikv.raw.RawKVClient;
public class SeekProxyStoreTest extends MockThreeStoresTest { public class SeekProxyStoreTest extends MockThreeStoresTest {
private RawKVClient createClient() { private RawKVClient createClient() {
return session.createRawClient(); return session.createRawClient();
} }