summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@oath.com>2017-09-20 13:44:13 +0200
committerValerij Fredriksen <valerijf@oath.com>2017-09-22 09:13:01 +0200
commitab9a46fd9163b2cbec7811ef6e1e405685da269d (patch)
treefeab2e862c58677149a4cc9fd2894387819bbc39
parent0589e4cdceb62e73ffbd6c620f5dea2ea6a6812e (diff)
Add locks to ComponentsProviderImpl
-rwxr-xr-xconfig-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java1
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java12
-rw-r--r--vespajlib/src/main/java/com/yahoo/concurrent/lock/Lock.java (renamed from vespajlib/src/main/java/com/yahoo/concurrent/Lock.java)2
-rw-r--r--vespajlib/src/main/java/com/yahoo/concurrent/lock/Locking.java30
-rw-r--r--vespajlib/src/main/java/com/yahoo/concurrent/lock/Locks.java (renamed from vespajlib/src/main/java/com/yahoo/concurrent/Locks.java)2
-rw-r--r--vespajlib/src/main/java/com/yahoo/concurrent/lock/package-info.java5
-rw-r--r--zkfacade/src/main/java/com/yahoo/vespa/curator/mock/MockCurator.java4
7 files changed, 49 insertions, 7 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java
index 32a9158dbcf..40e997a0d81 100755
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java
@@ -217,6 +217,7 @@ public final class ContainerCluster
addSimpleComponent(AccessLog.class);
// TODO better modelling
addSimpleComponent(ThreadPoolProvider.class);
+ addSimpleComponent(com.yahoo.concurrent.lock.Locking.class);
addSimpleComponent("com.yahoo.jdisc.http.filter.SecurityFilterInvoker");
addSimpleComponent(SIMPLE_LINGUISTICS_PROVIDER);
addSimpleComponent("com.yahoo.container.jdisc.SslKeyStoreFactoryProvider");
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java
index 73b187b7e08..512d957185b 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java
@@ -3,6 +3,8 @@ package com.yahoo.vespa.hosted.node.admin.provider;
import com.google.inject.Inject;
import com.yahoo.component.AbstractComponent;
+import com.yahoo.concurrent.lock.Lock;
+import com.yahoo.concurrent.lock.Locking;
import com.yahoo.net.HostName;
import com.yahoo.system.ProcessExecuter;
@@ -36,14 +38,17 @@ import static com.yahoo.vespa.defaults.Defaults.getDefaults;
* @author dybis
*/
public class ComponentsProviderImpl extends AbstractComponent implements ComponentsProvider {
- private final NodeAdminStateUpdater nodeAdminStateUpdater;
-
private static final int WEB_SERVICE_PORT = getDefaults().vespaWebServicePort();
private static final Duration NODE_AGENT_SCAN_INTERVAL = Duration.ofSeconds(30);
private static final Duration NODE_ADMIN_CONVERGE_STATE_INTERVAL = Duration.ofSeconds(30);
+ private final NodeAdminStateUpdater nodeAdminStateUpdater;
+ private final Lock classLock;
+
@Inject
- public ComponentsProviderImpl(Docker docker, MetricReceiverWrapper metricReceiver) {
+ public ComponentsProviderImpl(Docker docker, MetricReceiverWrapper metricReceiver, Locking locking) {
+ classLock = locking.lock(this.getClass());
+
Clock clock = Clock.systemUTC();
String dockerHostHostName = HostName.getLocalhost();
ProcessExecuter processExecuter = new ProcessExecuter();
@@ -76,5 +81,6 @@ public class ComponentsProviderImpl extends AbstractComponent implements Compone
@Override
public void deconstruct() {
nodeAdminStateUpdater.stop();
+ classLock.close();
}
}
diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/Lock.java b/vespajlib/src/main/java/com/yahoo/concurrent/lock/Lock.java
index 3b1919a987d..1273a298592 100644
--- a/vespajlib/src/main/java/com/yahoo/concurrent/Lock.java
+++ b/vespajlib/src/main/java/com/yahoo/concurrent/lock/Lock.java
@@ -1,5 +1,5 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.concurrent;
+package com.yahoo.concurrent.lock;
import java.util.concurrent.locks.ReentrantLock;
diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/lock/Locking.java b/vespajlib/src/main/java/com/yahoo/concurrent/lock/Locking.java
new file mode 100644
index 00000000000..cbfadf73a32
--- /dev/null
+++ b/vespajlib/src/main/java/com/yahoo/concurrent/lock/Locking.java
@@ -0,0 +1,30 @@
+package com.yahoo.concurrent.lock;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * @author valerijf
+ */
+public class Locking {
+ private final Map<Class<?>, ReentrantLock> locks = new ConcurrentHashMap<>();
+
+ /**
+ * Locks class. This will block until the lock is acquired.
+ * Users of this <b>must</b> close any lock acquired.
+ *
+ * @param key the key to lock
+ * @return the acquired lock
+ */
+ public Lock lock(Class<?> key) {
+ try {
+ ReentrantLock lock = locks.computeIfAbsent(key, k -> new ReentrantLock(true));
+ lock.tryLock(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
+ return new Lock(lock);
+ } catch (InterruptedException e) {
+ throw new RuntimeException("Interrupted while waiting for lock of " + key);
+ }
+ }
+}
diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/Locks.java b/vespajlib/src/main/java/com/yahoo/concurrent/lock/Locks.java
index ab167392329..0308b26c903 100644
--- a/vespajlib/src/main/java/com/yahoo/concurrent/Locks.java
+++ b/vespajlib/src/main/java/com/yahoo/concurrent/lock/Locks.java
@@ -1,5 +1,5 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.concurrent;
+package com.yahoo.concurrent.lock;
import com.google.common.util.concurrent.UncheckedTimeoutException;
diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/lock/package-info.java b/vespajlib/src/main/java/com/yahoo/concurrent/lock/package-info.java
new file mode 100644
index 00000000000..326124e600f
--- /dev/null
+++ b/vespajlib/src/main/java/com/yahoo/concurrent/lock/package-info.java
@@ -0,0 +1,5 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+@ExportPackage
+package com.yahoo.concurrent.lock;
+
+import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/mock/MockCurator.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/mock/MockCurator.java
index ccd02e5c6d6..d3950e4c221 100644
--- a/zkfacade/src/main/java/com/yahoo/vespa/curator/mock/MockCurator.java
+++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/mock/MockCurator.java
@@ -4,8 +4,8 @@ package com.yahoo.vespa.curator.mock;
import com.google.common.util.concurrent.UncheckedTimeoutException;
import com.google.inject.Inject;
import com.yahoo.collections.Pair;
-import com.yahoo.concurrent.Lock;
-import com.yahoo.concurrent.Locks;
+import com.yahoo.concurrent.lock.Lock;
+import com.yahoo.concurrent.lock.Locks;
import com.yahoo.path.Path;
import static com.yahoo.vespa.curator.mock.MemoryFileSystem.Node;