diff options
author | Valerij Fredriksen <valerijf@oath.com> | 2017-09-20 13:44:13 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerijf@oath.com> | 2017-09-20 13:44:13 +0200 |
commit | b722a82a9d3ee3a8eaebaf45c4e4dc4e84c26327 (patch) | |
tree | 1a25fa56f48226b1290f3bbf10b34e822752e4be | |
parent | 2f4aaee0596b7a9923f50d1337888ce1c3d939a6 (diff) |
Add locks to ComponentsProviderImpl
-rwxr-xr-x | config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java | 1 | ||||
-rw-r--r-- | node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/ComponentsProviderImpl.java | 12 | ||||
-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.java | 30 | ||||
-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.java | 5 | ||||
-rw-r--r-- | zkfacade/src/main/java/com/yahoo/vespa/curator/mock/MockCurator.java | 4 |
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; |