diff options
author | Jon Marius Venstad <jvenstad@yahoo-inc.com> | 2019-02-22 16:29:53 +0100 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2019-02-26 10:29:59 +0100 |
commit | fd0283264184ceabbd6834bd0919f7923851bdfb (patch) | |
tree | 709a0a0d3f1e51dd9b6fbea1e5394d8b3c1429e4 /configserver | |
parent | d01ed036f6a654ee8bd371cdbf269f760b7c17e0 (diff) |
Replace CuratorLock with Lock
Diffstat (limited to 'configserver')
3 files changed, 19 insertions, 70 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java index 06b413a97ce..a59d38c7603 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java @@ -16,8 +16,8 @@ import com.yahoo.vespa.config.server.session.LocalSession; import com.yahoo.vespa.config.server.session.PrepareParams; import com.yahoo.vespa.config.server.session.Session; import com.yahoo.vespa.config.server.session.SilentDeployLogger; -import com.yahoo.vespa.config.server.tenant.ActivateLock; import com.yahoo.vespa.config.server.tenant.Tenant; +import com.yahoo.vespa.curator.Lock; import java.time.Clock; import java.time.Duration; @@ -128,16 +128,7 @@ public class Deployment implements com.yahoo.config.provision.Deployment { TimeoutBudget timeoutBudget = new TimeoutBudget(clock, timeout); long sessionId = session.getSessionId(); validateSessionStatus(session); - ActivateLock activateLock = tenant.getActivateLock(); - boolean activateLockAcquired = false; - try { - log.log(LogLevel.DEBUG, "Trying to acquire lock " + activateLock + " for session " + sessionId); - activateLockAcquired = activateLock.acquire(timeoutBudget, ignoreLockFailure); - if ( ! activateLockAcquired) { - throw new ActivationConflictException("Did not get activate lock for session " + sessionId + " within " + timeout); - } - - log.log(LogLevel.DEBUG, "Lock acquired " + activateLock + " for session " + sessionId); + try (Lock lock = tenant.getSessionLock(timeout)) { NestedTransaction transaction = new NestedTransaction(); transaction.add(deactivateCurrentActivateNew(applicationRepository.getActiveSession(session.getApplicationId()), session, ignoreSessionStaleFailure)); @@ -150,12 +141,6 @@ public class Deployment implements com.yahoo.config.provision.Deployment { throw e; } catch (Exception e) { throw new InternalServerException("Error activating application", e); - } finally { - if (activateLockAcquired) { - log.log(LogLevel.DEBUG, "Trying to release lock " + activateLock + " for session " + sessionId); - activateLock.release(); - log.log(LogLevel.DEBUG, "Lock released " + activateLock + " for session " + sessionId); - } } log.log(LogLevel.INFO, session.logPre() + "Session " + sessionId + " activated successfully using " + diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/ActivateLock.java b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/ActivateLock.java deleted file mode 100644 index 2fa6c57d9b0..00000000000 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/ActivateLock.java +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.config.server.tenant; - -import com.yahoo.path.Path; -import com.yahoo.vespa.config.server.TimeoutBudget; -import com.yahoo.vespa.curator.Curator; -import com.yahoo.vespa.curator.recipes.CuratorLock; - -import java.util.concurrent.TimeUnit; - -/** - * A lock to protect session activation. - * - * @author Ulf Lilleengen - */ -public class ActivateLock { - - private static final String ACTIVATE_LOCK_NAME = "activateLock"; - private final CuratorLock curatorLock; - - public ActivateLock(Curator curator, Path rootPath) { - this.curatorLock = new CuratorLock(curator, rootPath.append(ACTIVATE_LOCK_NAME).getAbsolute()); - } - - public boolean acquire(TimeoutBudget timeoutBudget, boolean ignoreLockError) { - try { - return curatorLock.tryLock(timeoutBudget.timeLeft().toMillis(), TimeUnit.MILLISECONDS); - } catch (Exception e) { - if (!ignoreLockError) { - throw new RuntimeException(e); - } - return false; - } - } - - public void release() { - curatorLock.unlock(); - } - - @Override - public String toString() { - return "ActivateLock (" + curatorLock + "), has lock: " + curatorLock.hasLock(); - } - -} diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenant.java b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenant.java index 1e4c19f5f46..a68f4a396cd 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenant.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenant.java @@ -11,8 +11,10 @@ import com.yahoo.vespa.config.server.session.LocalSessionRepo; import com.yahoo.vespa.config.server.session.RemoteSessionRepo; import com.yahoo.vespa.config.server.session.SessionFactory; import com.yahoo.vespa.curator.Curator; +import com.yahoo.vespa.curator.Lock; import org.apache.zookeeper.data.Stat; +import java.time.Duration; import java.time.Instant; import java.util.Optional; @@ -26,8 +28,9 @@ import java.util.Optional; */ public class Tenant implements TenantHandlerProvider { - public static final String SESSIONS = "sessions"; - public static final String APPLICATIONS = "applications"; + static final String SESSIONS = "sessions"; + static final String APPLICATIONS = "applications"; + static final String SESSION_LOCK_PATH = "activateLock"; private final TenantName name; private final RemoteSessionRepo remoteSessionRepo; @@ -35,7 +38,7 @@ public class Tenant implements TenantHandlerProvider { private final SessionFactory sessionFactory; private final LocalSessionRepo localSessionRepo; private final TenantApplications applicationRepo; - private final ActivateLock activateLock; + private final Lock sessionLock; private final RequestHandler requestHandler; private final ReloadHandler reloadHandler; private final TenantFileSystemDirs tenantFileSystemDirs; @@ -58,7 +61,7 @@ public class Tenant implements TenantHandlerProvider { this.remoteSessionRepo = remoteSessionRepo; this.sessionFactory = sessionFactory; this.localSessionRepo = localSessionRepo; - this.activateLock = new ActivateLock(curator, path); + this.sessionLock = createLock(curator, path); this.applicationRepo = applicationRepo; this.tenantFileSystemDirs = tenantFileSystemDirs; this.curator = curator; @@ -108,11 +111,11 @@ public class Tenant implements TenantHandlerProvider { } /** - * The activation lock for this - * @return lock + * This lock allows activation and deactivation of sessions under this tenant. */ - public ActivateLock getActivateLock() { - return activateLock; + public Lock getSessionLock(Duration timeout) { + sessionLock.acquire(timeout); + return sessionLock; } @Override @@ -162,4 +165,10 @@ public class Tenant implements TenantHandlerProvider { curator.delete(path); } + private static Lock createLock(Curator curator, Path tenantPath) { + Path lockPath = tenantPath.append(SESSION_LOCK_PATH); + curator.create(lockPath); + return new Lock(lockPath.getAbsolute(), curator); + } + } |