aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Marius Venstad <jonmv@users.noreply.github.com>2023-08-22 11:45:48 +0200
committerGitHub <noreply@github.com>2023-08-22 11:45:48 +0200
commit3ed739122e2bd5f029a7a68cfa99dafaa6ddefd5 (patch)
treeaa702aacf0da1a12cf4718c389189984b56f9df9
parentfd3ae15ce63834d56e04b06843b15d1cb9bd3420 (diff)
parent7717c515744f3ebeccba273de55b2414cc050a92 (diff)
Merge pull request #28100 from vespa-engine/hmusum/stabilize-testv8.216.8
Make sure we use a free port when creating RpcServer
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java78
1 files changed, 46 insertions, 32 deletions
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java
index 8770970308a..54f6cf73356 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java
@@ -22,12 +22,12 @@ import com.yahoo.vespa.config.server.filedistribution.FileServer;
import com.yahoo.vespa.config.server.host.HostRegistry;
import com.yahoo.vespa.config.server.monitoring.Metrics;
import com.yahoo.vespa.config.server.rpc.security.NoopRpcAuthorizer;
-import com.yahoo.vespa.config.server.tenant.Tenant;
import com.yahoo.vespa.config.server.tenant.TenantRepository;
import com.yahoo.vespa.config.server.tenant.TestTenantRepository;
import com.yahoo.vespa.flags.InMemoryFlagSource;
import org.junit.After;
import org.junit.rules.TemporaryFolder;
+
import java.io.IOException;
import java.time.Duration;
import java.time.Instant;
@@ -53,13 +53,11 @@ public class RpcTester implements AutoCloseable {
private Supervisor sup;
private final ApplicationId applicationId;
private final TenantName tenantName;
- private final TenantRepository tenantRepository;
final HostRegistry hostRegistry = new HostRegistry();
private final ApplicationRepository applicationRepository;
private final List<Integer> allocatedPorts = new ArrayList<>();
private final TemporaryFolder temporaryFolder;
- private final ConfigserverConfig configserverConfig;
RpcTester(ApplicationId applicationId, TemporaryFolder temporaryFolder) throws InterruptedException, IOException {
this(applicationId, temporaryFolder, new ConfigserverConfig.Builder());
@@ -69,20 +67,39 @@ public class RpcTester implements AutoCloseable {
this.temporaryFolder = temporaryFolder;
this.applicationId = applicationId;
this.tenantName = applicationId.tenant();
- int port = allocatePort();
- spec = createSpec(port);
- configBuilder.rpcport(port)
- .configServerDBDir(temporaryFolder.newFolder().getAbsolutePath())
- .configDefinitionsDir(temporaryFolder.newFolder().getAbsolutePath())
- .fileReferencesDir(temporaryFolder.newFolder().getAbsolutePath());
- configserverConfig = new ConfigserverConfig(configBuilder);
- rpcServer = createRpcServer(configserverConfig);
- tenantRepository = new TestTenantRepository.Builder()
- .withHostRegistry(hostRegistry)
- .withConfigserverConfig(configserverConfig)
- .build();
- tenantRepository.addTenant(tenantName);
- startRpcServer();
+
+ Spec tempSpec;
+ ConfigserverConfig tempConfig;
+ RpcServer tempRpcServer;
+ TenantRepository tempTenantRepository;
+
+ int iterations = 0;
+ // Need to loop because we might get a port that is in use
+ do {
+ int port = allocatePort();
+ tempSpec = createSpec(port);
+ configBuilder.rpcport(port)
+ .configServerDBDir(temporaryFolder.newFolder().getAbsolutePath())
+ .configDefinitionsDir(temporaryFolder.newFolder().getAbsolutePath())
+ .fileReferencesDir(temporaryFolder.newFolder().getAbsolutePath());
+ tempConfig = new ConfigserverConfig(configBuilder);
+ tempRpcServer = createRpcServer(tempConfig);
+ tempTenantRepository = new TestTenantRepository.Builder()
+ .withHostRegistry(hostRegistry)
+ .withConfigserverConfig(tempConfig)
+ .build();
+ tempTenantRepository.addTenant(tenantName);
+ startRpcServer(tempRpcServer, tempTenantRepository, tempSpec);
+ iterations++;
+ } while (!tempRpcServer.isRunning() && iterations < 10);
+
+ assertTrue("server is not running", tempRpcServer.isRunning());
+
+ spec = tempSpec;
+ ConfigserverConfig configserverConfig = tempConfig;
+ rpcServer = tempRpcServer;
+ TenantRepository tenantRepository = tempTenantRepository;
+
applicationRepository = new ApplicationRepository.Builder()
.withTenantRepository(tenantRepository)
.withConfigserverConfig(configserverConfig)
@@ -90,11 +107,12 @@ public class RpcTester implements AutoCloseable {
.build();
}
- public void close() {
+ public void close() throws InterruptedException {
rpcServer.stop();
for (Integer port : allocatedPorts) {
PortRangeAllocator.releasePort(port);
}
+ t.join();
}
private int allocatePort() throws InterruptedException {
@@ -107,7 +125,7 @@ public class RpcTester implements AutoCloseable {
InMemoryFlagSource flagSource = new InMemoryFlagSource();
RpcServer rpcServer = new RpcServer(config,
new SuperModelRequestHandler(new TestConfigDefinitionRepo(),
- configserverConfig,
+ config,
new SuperModelManager(
config,
Zone.defaultZone(),
@@ -115,37 +133,31 @@ public class RpcTester implements AutoCloseable {
flagSource)),
Metrics.createTestMetrics(),
hostRegistry,
- new FileServer(configserverConfig, new FileDirectory(temporaryFolder.newFolder())),
+ new FileServer(config, new FileDirectory(temporaryFolder.newFolder())),
new NoopRpcAuthorizer(),
new RpcRequestHandlerProvider());
rpcServer.setUpGetConfigHandlers();
return rpcServer;
}
- void startRpcServer() {
+ void startRpcServer(RpcServer rpcServer, TenantRepository tenantRepository, Spec spec) {
hostRegistry.update(applicationId, List.of("localhost"));
rpcServer.onTenantCreate(tenantRepository.getTenant(tenantName));
t = new Thread(rpcServer);
t.start();
sup = new Supervisor(new Transport());
- pingServer();
- }
-
- @After
- public void stopRpc() throws InterruptedException {
- rpcServer.stop();
- t.join();
+ pingServer(spec);
}
private Spec createSpec(int port) {
return new Spec("tcp/localhost:" + port);
}
- private void pingServer() {
+ private void pingServer(Spec spec) {
long endTime = System.currentTimeMillis() + 60_000;
Request req = new Request("ping");
while (System.currentTimeMillis() < endTime) {
- performRequest(req);
+ performRequest(req, spec);
if (!req.isError() && req.returnValues().size() > 0 && req.returnValues().get(0).asInt32() == 0) {
break;
}
@@ -157,6 +169,10 @@ public class RpcTester implements AutoCloseable {
}
void performRequest(Request req) {
+ performRequest(req, spec);
+ }
+
+ void performRequest(Request req, Spec spec) {
clock.advance(Duration.ofMillis(10));
sup.connect(spec).invokeSync(req, Duration.ofSeconds(10));
}
@@ -165,8 +181,6 @@ public class RpcTester implements AutoCloseable {
return rpcServer;
}
- Tenant tenant() { return tenantRepository.getTenant(tenantName); }
-
public ApplicationRepository applicationRepository() { return applicationRepository; }
}