diff options
author | jonmv <venstad@gmail.com> | 2022-04-17 15:49:00 +0200 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2022-04-17 15:49:00 +0200 |
commit | 0773124206f4836c02a2b28c8aabbb2224d6d554 (patch) | |
tree | 68d41117056d88d4348b8bd7c210ca6fe483bc2e /zkfacade | |
parent | 5dd851d5c5fce2e95b236cd1f5385270077f0450 (diff) |
Preserve reentrancy
Diffstat (limited to 'zkfacade')
-rw-r--r-- | zkfacade/src/main/java/com/yahoo/vespa/curator/MultiplePathsLock.java | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/MultiplePathsLock.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/MultiplePathsLock.java index 2520a0682ed..f71f9c6149e 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/MultiplePathsLock.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/MultiplePathsLock.java @@ -2,8 +2,10 @@ package com.yahoo.vespa.curator; import com.yahoo.path.Path; +import com.yahoo.transaction.Mutex; import java.time.Duration; +import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -14,26 +16,28 @@ import java.util.logging.Logger; * * @author hmusum */ -public class MultiplePathsLock extends Lock { +public class MultiplePathsLock implements Mutex { private static final Logger log = Logger.getLogger(MultiplePathsLock.class.getName()); - private final Lock oldLock; + private final List<Lock> locks; - public MultiplePathsLock(Path newLockPath, Path oldLockPath, Duration timeout, Curator curator) { - super(newLockPath.getAbsolute(), curator); - log.log(Level.INFO, "Acquiring lock " + oldLockPath); - this.oldLock = curator.lock(oldLockPath, timeout);; - log.log(Level.INFO, "Acquiring lock " + lockPath()); - super.acquire(timeout); + /** Wrapped locks, in acquisition order. */ + public MultiplePathsLock(Lock... locks) { + this.locks = List.of(locks); } @Override public void close() { - log.log(Level.INFO, "Closing lock " + lockPath()); - super.close(); - log.log(Level.INFO, "Closing lock " + oldLock.lockPath()); - oldLock.close(); + close(0); + } + + private void close(int i) { + if (i < locks.size()) + try (Lock lock = locks.get(i)) { + close(i + 1); + log.log(Level.INFO, "Closing lock " + lock.lockPath()); + } } } |