diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2022-10-10 10:33:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-10 10:33:40 +0200 |
commit | ac20b0fb6f3140a5b144b34e6d3248b4bff014c1 (patch) | |
tree | bb27cbabf44d6390a51abc1fef5dc24af500e751 | |
parent | 240a62de8a9b3c93fb9f7031f5e204264d414817 (diff) | |
parent | 641bb6285c4f65db53a53370bdbbe9ad16545247 (diff) |
Merge pull request #24369 from vespa-engine/jonmv/start-then-stop-mbus-server
Jonmv/start then stop mbus server
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); |