summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2022-02-07 15:17:50 +0100
committerBjørn Christian Seime <bjorncs@verizonmedia.com>2022-02-07 15:17:50 +0100
commit3144aec4cff50f200115c8ed06fa34594e7f3026 (patch)
tree989a65b028ffe966a3e1c89e57788afbd1da21dd
parent5732785a8c5612c46c20c4c24d1f375ebb3e2e7f (diff)
Throw exception if subscriber is invoked after it's closed
-rw-r--r--config/abi-spec.json11
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java6
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/SubscriberClosedException.java11
-rw-r--r--container-core/src/main/java/com/yahoo/container/di/Container.java3
-rw-r--r--container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java3
-rw-r--r--standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneSubscriberFactory.java4
6 files changed, 33 insertions, 5 deletions
diff --git a/config/abi-spec.json b/config/abi-spec.json
index 844835ae1c5..e94749cfba8 100644
--- a/config/abi-spec.json
+++ b/config/abi-spec.json
@@ -297,5 +297,16 @@
"fields": [
"public final java.lang.String payload"
]
+ },
+ "com.yahoo.config.subscription.SubscriberClosedException": {
+ "superClass": "java.lang.RuntimeException",
+ "interfaces": [],
+ "attributes": [
+ "public"
+ ],
+ "methods": [
+ "public void <init>()"
+ ],
+ "fields": []
}
} \ No newline at end of file
diff --git a/config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java b/config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java
index de5eeb5649c..a89d60108ac 100644
--- a/config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java
+++ b/config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java
@@ -156,6 +156,7 @@ public class ConfigSubscriber implements AutoCloseable {
* false if this is for reconfiguration
* @return true if a config/reconfig of your system should happen
* @throws ConfigInterruptedException if thread performing this call interrupted.
+ * @throws SubscriberClosedException if subscriber is closed
*/
public boolean nextConfig(boolean isInitializing) {
return nextConfig(TimingValues.defaultNextConfigTimeout, isInitializing);
@@ -187,6 +188,7 @@ public class ConfigSubscriber implements AutoCloseable {
* false if this is for reconfiguration
* @return true if a config/reconfig of your system should happen
* @throws ConfigInterruptedException if thread performing this call interrupted.
+ * @throws SubscriberClosedException if subscriber is closed
*/
public boolean nextConfig(long timeoutMillis, boolean isInitializing) {
return acquireSnapshot(timeoutMillis, true, isInitializing);
@@ -218,6 +220,7 @@ public class ConfigSubscriber implements AutoCloseable {
* false if this is for reconfiguration
* @return true if generations for all configs have been updated.
* @throws ConfigInterruptedException if thread performing this call interrupted.
+ * @throws SubscriberClosedException if subscriber is closed
*/
public boolean nextGeneration(boolean isInitializing) {
return nextGeneration(TimingValues.defaultNextConfigTimeout, isInitializing);
@@ -249,6 +252,7 @@ public class ConfigSubscriber implements AutoCloseable {
* false if this is for reconfiguration
* @return true if generations for all configs have been updated.
* @throws ConfigInterruptedException if thread performing this call interrupted.
+ * @throws SubscriberClosedException if subscriber is closed
*/
public boolean nextGeneration(long timeoutMillis, boolean isInitializing) {
return acquireSnapshot(timeoutMillis, false, isInitializing);
@@ -271,7 +275,7 @@ public class ConfigSubscriber implements AutoCloseable {
private boolean acquireSnapshot(long timeoutInMillis, boolean requireChange, boolean isInitializing) {
boolean applyOnRestartOnly;
synchronized (monitor) {
- if (state == State.CLOSED) return false;
+ if (state == State.CLOSED) throw new SubscriberClosedException();
state = State.FROZEN;
applyOnRestartOnly = applyOnRestart;
}
diff --git a/config/src/main/java/com/yahoo/config/subscription/SubscriberClosedException.java b/config/src/main/java/com/yahoo/config/subscription/SubscriberClosedException.java
new file mode 100644
index 00000000000..f7051ab1b38
--- /dev/null
+++ b/config/src/main/java/com/yahoo/config/subscription/SubscriberClosedException.java
@@ -0,0 +1,11 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.config.subscription;
+
+/**
+ * Thrown when {@link ConfigSubscriber} is closed
+ *
+ * @author bjorncs
+ * @deprecated Will be removed in Vespa 8. Only for internal use.
+ */
+@Deprecated(forRemoval = true, since = "7")
+public class SubscriberClosedException extends RuntimeException {}
diff --git a/container-core/src/main/java/com/yahoo/container/di/Container.java b/container-core/src/main/java/com/yahoo/container/di/Container.java
index d800851c728..c30b0bfaa80 100644
--- a/container-core/src/main/java/com/yahoo/container/di/Container.java
+++ b/container-core/src/main/java/com/yahoo/container/di/Container.java
@@ -5,6 +5,7 @@ import com.google.inject.Injector;
import com.yahoo.config.ConfigInstance;
import com.yahoo.config.ConfigurationRuntimeException;
import com.yahoo.config.subscription.ConfigInterruptedException;
+import com.yahoo.config.subscription.SubscriberClosedException;
import com.yahoo.container.ComponentsConfig;
import com.yahoo.container.bundle.BundleInstantiationSpecification;
import com.yahoo.container.di.ConfigRetriever.BootstrapConfigs;
@@ -239,7 +240,7 @@ public class Container {
@SuppressWarnings("removal") // TODO Vespa 8: remove
private void invalidateGeneration(long generation, Throwable cause) {
leastGeneration = Math.max(retriever.getComponentsGeneration(), retriever.getBootstrapGeneration()) + 1;
- if (!(cause instanceof InterruptedException) && !(cause instanceof ConfigInterruptedException)) {
+ if (!(cause instanceof InterruptedException) && !(cause instanceof ConfigInterruptedException) && !(cause instanceof SubscriberClosedException)) {
log.log(Level.WARNING, newGraphErrorMessage(generation, cause), cause);
}
}
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 64e94bd5f03..f527937854f 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
@@ -10,6 +10,7 @@ import com.yahoo.component.Vtag;
import com.yahoo.component.provider.ComponentRegistry;
import com.yahoo.config.ConfigInstance;
import com.yahoo.config.subscription.ConfigInterruptedException;
+import com.yahoo.config.subscription.SubscriberClosedException;
import com.yahoo.container.Container;
import com.yahoo.container.QrConfig;
import com.yahoo.container.core.ChainsConfig;
@@ -298,7 +299,7 @@ public final class ConfiguredApplication implements Application {
// Block until new config arrives, and it should be applied
Runnable cleanupTask = configurer.waitForNextGraphGeneration(builder.guiceModules().activate(), false);
initializeAndActivateContainer(builder, cleanupTask);
- } catch (UncheckedInterruptedException | ConfigInterruptedException e) {
+ } catch (UncheckedInterruptedException | SubscriberClosedException | ConfigInterruptedException e) {
break;
} catch (Exception | LinkageError e) { // LinkageError: OSGi problems
tryReportFailedComponentGraphConstructionMetric(configurer, e);
diff --git a/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneSubscriberFactory.java b/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneSubscriberFactory.java
index 907c9649912..5555b3b4077 100644
--- a/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneSubscriberFactory.java
+++ b/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneSubscriberFactory.java
@@ -4,6 +4,7 @@ package com.yahoo.container.standalone;
import com.yahoo.config.ConfigBuilder;
import com.yahoo.config.ConfigInstance;
import com.yahoo.config.subscription.ConfigInterruptedException;
+import com.yahoo.config.subscription.SubscriberClosedException;
import com.yahoo.container.di.config.Subscriber;
import com.yahoo.container.di.config.SubscriberFactory;
import com.yahoo.vespa.config.ConfigKey;
@@ -66,8 +67,7 @@ public class StandaloneSubscriberFactory implements SubscriberFactory {
while (!shutdown && !Thread.interrupted()) {
Thread.sleep(100);
}
- if (shutdown) // Same semantics as an actual interrupt
- throw new ConfigInterruptedException(new InterruptedException());
+ if (shutdown) throw new SubscriberClosedException();
} catch (InterruptedException e) {
throw new ConfigInterruptedException(e);
}