summaryrefslogtreecommitdiffstats
path: root/zkfacade
diff options
context:
space:
mode:
authorjonmv <venstad@gmail.com>2022-04-17 15:49:00 +0200
committerjonmv <venstad@gmail.com>2022-04-17 15:49:00 +0200
commit0773124206f4836c02a2b28c8aabbb2224d6d554 (patch)
tree68d41117056d88d4348b8bd7c210ca6fe483bc2e /zkfacade
parent5dd851d5c5fce2e95b236cd1f5385270077f0450 (diff)
Preserve reentrancy
Diffstat (limited to 'zkfacade')
-rw-r--r--zkfacade/src/main/java/com/yahoo/vespa/curator/MultiplePathsLock.java28
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());
+ }
}
}