summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-10-10 10:33:40 +0200
committerGitHub <noreply@github.com>2022-10-10 10:33:40 +0200
commitac20b0fb6f3140a5b144b34e6d3248b4bff014c1 (patch)
treebb27cbabf44d6390a51abc1fef5dc24af500e751
parent240a62de8a9b3c93fb9f7031f5e204264d414817 (diff)
parent641bb6285c4f65db53a53370bdbbe9ad16545247 (diff)
Merge pull request #24369 from vespa-engine/jonmv/start-then-stop-mbus-server
Jonmv/start then stop mbus server
-rw-r--r--container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java8
-rw-r--r--container-messagebus/src/main/java/com/yahoo/messagebus/jdisc/MbusServer.java5
-rw-r--r--jdisc_core/abi-spec.json3
-rw-r--r--jdisc_core/src/main/java/com/yahoo/jdisc/service/ServerProvider.java8
-rw-r--r--messagebus/src/main/java/com/yahoo/messagebus/network/NetworkMultiplexer.java17
-rw-r--r--messagebus/src/test/java/com/yahoo/messagebus/network/NetworkMultiplexerTest.java3
6 files changed, 30 insertions, 14 deletions
diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java b/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java
index 7ea91726673..625bd87c2db 100644
--- a/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java
+++ b/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java
@@ -366,6 +366,12 @@ public final class ConfiguredApplication implements Application {
synchronized (monitor) {
Set<ServerProvider> serversToClose = createIdentityHashSet(startedServers);
serversToClose.removeAll(currentServers);
+ for (ServerProvider server : currentServers) {
+ if ( ! startedServers.contains(server) && server.isMultiplexed()) {
+ server.start();
+ startedServers.add(server);
+ }
+ }
if (serversToClose.size() > 0) {
log.info(String.format("Closing %d server instances", serversToClose.size()));
for (ServerProvider server : serversToClose) {
@@ -374,7 +380,7 @@ public final class ConfiguredApplication implements Application {
}
}
for (ServerProvider server : currentServers) {
- if (!startedServers.contains(server)) {
+ if ( ! startedServers.contains(server)) {
server.start();
startedServers.add(server);
}
diff --git a/container-messagebus/src/main/java/com/yahoo/messagebus/jdisc/MbusServer.java b/container-messagebus/src/main/java/com/yahoo/messagebus/jdisc/MbusServer.java
index 8f21cb227d8..3cf3b4bf8b0 100644
--- a/container-messagebus/src/main/java/com/yahoo/messagebus/jdisc/MbusServer.java
+++ b/container-messagebus/src/main/java/com/yahoo/messagebus/jdisc/MbusServer.java
@@ -60,6 +60,11 @@ public final class MbusServer extends AbstractResource implements ServerProvider
}
@Override
+ public boolean isMultiplexed() {
+ return true;
+ }
+
+ @Override
protected void destroy() {
log.log(Level.FINE, "Destroying message bus server.");
runState.set(State.STOPPED);
diff --git a/jdisc_core/abi-spec.json b/jdisc_core/abi-spec.json
index 5beb723465b..8171b416b0c 100644
--- a/jdisc_core/abi-spec.json
+++ b/jdisc_core/abi-spec.json
@@ -905,7 +905,8 @@
],
"methods": [
"public abstract void start()",
- "public abstract void close()"
+ "public abstract void close()",
+ "public boolean isMultiplexed()"
],
"fields": []
}
diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/service/ServerProvider.java b/jdisc_core/src/main/java/com/yahoo/jdisc/service/ServerProvider.java
index ef72e643dae..ecdc30400f1 100644
--- a/jdisc_core/src/main/java/com/yahoo/jdisc/service/ServerProvider.java
+++ b/jdisc_core/src/main/java/com/yahoo/jdisc/service/ServerProvider.java
@@ -49,4 +49,12 @@ public interface ServerProvider extends SharedResource {
* Application} shutdown code.</p>
*/
void close();
+
+ /**
+ * Whether multiple instances of this can coexist, by means of a multiplexer on top of any exclusive resource.
+ * If this is true, new instances to replace old ones, during a graph generation switch, will be started before
+ * the obsolete ones are stopped; otherwise, the old will be stopped, and then the new ones started.
+ */
+ default boolean isMultiplexed() { return false; }
+
}
diff --git a/messagebus/src/main/java/com/yahoo/messagebus/network/NetworkMultiplexer.java b/messagebus/src/main/java/com/yahoo/messagebus/network/NetworkMultiplexer.java
index d36579d5be1..959fff488b1 100644
--- a/messagebus/src/main/java/com/yahoo/messagebus/network/NetworkMultiplexer.java
+++ b/messagebus/src/main/java/com/yahoo/messagebus/network/NetworkMultiplexer.java
@@ -59,7 +59,7 @@ public class NetworkMultiplexer implements NetworkOwner {
net.registerSession(session);
}
else if (owners.contains(owner))
- throw new IllegalArgumentException("Session '" + session + "' with owner '" + owner + "' already registered with this");
+ throw new IllegalArgumentException("Session '" + session + "' with owner '" + owner + "' already registered with " + this);
owners.push(owner);
return owners;
@@ -68,12 +68,12 @@ public class NetworkMultiplexer implements NetworkOwner {
public void unregisterSession(String session, NetworkOwner owner, boolean broadcast) {
sessions.computeIfPresent(session, (name, owners) -> {
- owners.remove(owner);
- if (owners.isEmpty()) {
+ if (owners.size() == 1 && owners.contains(owner)) {
if (broadcast)
net.unregisterSession(session);
return null;
}
+ owners.remove(owner);
return owners;
});
}
@@ -103,7 +103,7 @@ public class NetworkMultiplexer implements NetworkOwner {
/** Attach the network owner to this, allowing this to forward messages to it. */
public void attach(NetworkOwner owner) {
if (owners.contains(owner))
- throw new IllegalArgumentException(owner + " is already attached to this");
+ throw new IllegalArgumentException(owner + " is already attached to " + this);
owners.add(owner);
}
@@ -111,7 +111,7 @@ public class NetworkMultiplexer implements NetworkOwner {
/** Detach the network owner from this, no longer allowing messages to it, and shutting down this is ownerless. */
public void detach(NetworkOwner owner) {
if ( ! owners.remove(owner))
- throw new IllegalArgumentException(owner + " not attached to this");
+ throw new IllegalArgumentException(owner + " not attached to " + this);
destroyIfOwnerless();
}
@@ -137,12 +137,7 @@ public class NetworkMultiplexer implements NetworkOwner {
@Override
public String toString() {
- return "NetworkMultiplexer{" +
- "net=" + net +
- ", owners=" + owners +
- ", sessions=" + sessions +
- ", destructible=" + disowned +
- '}';
+ return "network multiplexer with owners: " + owners + ", sessions: " + sessions + " and destructible: " + disowned.get();
}
} \ No newline at end of file
diff --git a/messagebus/src/test/java/com/yahoo/messagebus/network/NetworkMultiplexerTest.java b/messagebus/src/test/java/com/yahoo/messagebus/network/NetworkMultiplexerTest.java
index 60da1b49d90..57ded9f750d 100644
--- a/messagebus/src/test/java/com/yahoo/messagebus/network/NetworkMultiplexerTest.java
+++ b/messagebus/src/test/java/com/yahoo/messagebus/network/NetworkMultiplexerTest.java
@@ -43,7 +43,8 @@ public class NetworkMultiplexerTest {
fail("Illegal to register same session multiple times with the same owner");
}
catch (IllegalArgumentException expected) {
- assertEquals("Session 's1' with owner 'mock owner' already registered with this", expected.getMessage());
+ assertEquals("Session 's1' with owner 'mock owner' already registered with network multiplexer with owners: [mock owner], sessions: {s1=[mock owner]} and destructible: false",
+ expected.getMessage());
}
assertEquals(Set.of("s1"), net.registered);