aboutsummaryrefslogtreecommitdiffstats
path: root/documentapi/src
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-04-26 10:58:39 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2019-04-26 10:58:39 +0200
commit15eda83e70355d05045226a33cad914762e4de0e (patch)
tree4cb96e91311eeb3658e61f317fa00fb9c5a01b70 /documentapi/src
parent7466ce4cb8aa055137b79cfc1c719d68527b0164 (diff)
Add some more synchronized to ensure thread visibility
Diffstat (limited to 'documentapi/src')
-rw-r--r--documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/AsyncInitializationPolicy.java4
-rw-r--r--documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ExternalSlobrokPolicy.java29
2 files changed, 19 insertions, 14 deletions
diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/AsyncInitializationPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/AsyncInitializationPolicy.java
index 90fc6de57c7..b88c8cc3b00 100644
--- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/AsyncInitializationPolicy.java
+++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/AsyncInitializationPolicy.java
@@ -58,7 +58,7 @@ public abstract class AsyncInitializationPolicy implements DocumentProtocolRouti
initState = InitState.NOT_STARTED;
}
- void needAsynchronousInitialization() {
+ synchronized void needAsynchronousInitialization() {
syncInit = false;
}
@@ -117,7 +117,7 @@ public abstract class AsyncInitializationPolicy implements DocumentProtocolRouti
}
@Override
- public void destroy() {
+ public synchronized void destroy() {
if (executor != null) {
executor.shutdownNow();
}
diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ExternalSlobrokPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ExternalSlobrokPolicy.java
index 39242bb6cab..d8fb87af9a0 100644
--- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ExternalSlobrokPolicy.java
+++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ExternalSlobrokPolicy.java
@@ -13,6 +13,8 @@ import com.yahoo.cloud.config.SlobroksConfig;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
/**
* Abstract class for policies that allow you to specify which slobrok to use for the
@@ -21,9 +23,9 @@ import java.util.Map;
public abstract class ExternalSlobrokPolicy extends AsyncInitializationPolicy implements ConfigSubscriber.SingleSubscriber<SlobroksConfig> {
String error;
private Supervisor orb = null;
- private Mirror mirror = null;
+ private final AtomicReference<Mirror> safeMirror = new AtomicReference<>(null);
private SlobrokList slobroks = null;
- private boolean firstTry = true;
+ private final AtomicBoolean firstTry = new AtomicBoolean(true);
private ConfigSubscriber subscriber;
String[] configSources = null;
private final static String slobrokConfigId = "admin/slobrok.0";
@@ -49,14 +51,14 @@ public abstract class ExternalSlobrokPolicy extends AsyncInitializationPolicy im
}
@Override
- public void init() {
+ public synchronized void init() {
if (slobroks != null) {
orb = new Supervisor(new Transport());
- mirror = new Mirror(orb, slobroks);
+ safeMirror.set(new Mirror(orb, slobroks));
}
if (configSources != null) {
- if (mirror == null) {
+ if (safeMirror.get() == null) {
orb = new Supervisor(new Transport());
subscriber = subscribe(slobrokConfigId, new ConfigSourceSet(configSources));
}
@@ -70,15 +72,18 @@ public abstract class ExternalSlobrokPolicy extends AsyncInitializationPolicy im
}
public IMirror getMirror() {
- return mirror;
+ return safeMirror.get();
}
public List<Mirror.Entry> lookup(RoutingContext context, String pattern) {
- IMirror mirror1 = (mirror != null ? mirror : context.getMirror());
+ IMirror mirror1 = getMirror();
+ if (mirror1 == null) {
+ mirror1 = context.getMirror();
+ }
List<Mirror.Entry> arr = mirror1.lookup(pattern);
- if ((arr.isEmpty()) && firstTry) {
+ if ((arr.isEmpty()) && firstTry.get()) {
synchronized(this) {
try {
int count = 0;
@@ -93,7 +98,7 @@ public abstract class ExternalSlobrokPolicy extends AsyncInitializationPolicy im
}
}
- firstTry = false;
+ firstTry.set(false);
return arr;
}
@@ -108,14 +113,14 @@ public abstract class ExternalSlobrokPolicy extends AsyncInitializationPolicy im
slobroks = new SlobrokList();
}
slobroks.setup(slist);
- if (mirror == null) {
- mirror = new Mirror(orb, slobroks);
+ if (safeMirror.get() == null) {
+ safeMirror.set(new Mirror(orb, slobroks));
}
}
@Override
- public void destroy() {
+ public synchronized void destroy() {
if (subscriber!=null) subscriber.close();
}