From f66715e32f845c4efe7bd91918158d73176afd04 Mon Sep 17 00:00:00 2001 From: Daniel Roberts ddanielr Date: Mon, 26 Jan 2026 15:00:04 +0000 Subject: [PATCH 1/3] Fixes lock check for prune exclude actions Correctly checks the lock format so that exclude options for the prune command work correctly. --- .../apache/accumulo/server/util/ZooZap.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java b/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java index 3f8d1c0d6b0..3a29b23c9b1 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java @@ -178,9 +178,9 @@ public void zap(SiteConfiguration siteConf, String... args) { if (opts.zapGc) { String gcLockPath = Constants.ZROOT + "/" + iid + Constants.ZGC_LOCK; try { - removeSingletonLock(zoo, gcLockPath, hostPortPredicate, opts); + removeGCLock(zoo, gcLockPath, hostPortPredicate, opts); } catch (KeeperException | InterruptedException e) { - log.error("Error deleting manager lock", e); + log.error("Error deleting gc lock", e); } } @@ -283,6 +283,20 @@ static void removeLocks(ZooReaderWriter zoo, String path, ServiceLock.deleteLocks(zoo, path, hostPortPredicate, m -> message(m, opts), opts.dryRun); } + @Deprecated(since = "2.1.5") + static void removeGCLock(ZooReaderWriter zoo, String path, + Predicate hostPortPredicate, Opts ops) + throws KeeperException, InterruptedException { + var lockData = ServiceLock.getLockData(zoo.getZooKeeper(), ServiceLock.path(path)); + if (lockData != null) { + String lockContent = new String(lockData, UTF_8); + String[] parts = lockContent.split("="); + if (parts.length == 2 && hostPortPredicate.test(HostAndPort.fromString(parts[1]))) { + zapDirectory(zoo, path, ops); + } + } + } + static void removeSingletonLock(ZooReaderWriter zoo, String path, Predicate hostPortPredicate, Opts ops) throws KeeperException, InterruptedException { From 63fdff35c7e70f4bb56e2b54b0565ea096e95da6 Mon Sep 17 00:00:00 2001 From: Daniel Roberts ddanielr Date: Mon, 26 Jan 2026 15:18:43 +0000 Subject: [PATCH 2/3] Moved GCLock removal to ServiceLock --- .../core/fate/zookeeper/ServiceLock.java | 17 +++++++++++++++++ .../org/apache/accumulo/server/util/ZooZap.java | 17 ++--------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/ServiceLock.java b/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/ServiceLock.java index 42e57206e58..19fbd4f7659 100644 --- a/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/ServiceLock.java +++ b/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/ServiceLock.java @@ -18,6 +18,7 @@ */ package org.apache.accumulo.core.fate.zookeeper; +import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Objects.requireNonNull; import java.util.ArrayList; @@ -783,6 +784,22 @@ public static void deleteLock(ZooReaderWriter zk, ServiceLockPath path) } + public static void removeGCLock(ZooReaderWriter zoo, String path, + Predicate hostPortPredicate, Consumer messageOutput, Boolean dryRun) + throws KeeperException, InterruptedException { + var lockData = ServiceLock.getLockData(zoo.getZooKeeper(), ServiceLock.path(path)); + if (lockData != null) { + String lockContent = new String(lockData, UTF_8); + String[] parts = lockContent.split("="); + if (parts.length == 2 && hostPortPredicate.test(HostAndPort.fromString(parts[1]))) { + messageOutput.accept("Deleting " + path + " from zookeeper"); + if (!dryRun) { + zoo.recursiveDelete(path, NodeMissingPolicy.SKIP); + } + } + } + } + /** * Checks that the lock still exists in ZooKeeper. The typical mechanism for determining if a lock * is lost depends on a Watcher set on the lock node. There exists a case where the Watcher may diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java b/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java index 3a29b23c9b1..c1e4e03ee74 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java @@ -178,7 +178,8 @@ public void zap(SiteConfiguration siteConf, String... args) { if (opts.zapGc) { String gcLockPath = Constants.ZROOT + "/" + iid + Constants.ZGC_LOCK; try { - removeGCLock(zoo, gcLockPath, hostPortPredicate, opts); + ServiceLock.removeGCLock(zoo, gcLockPath, hostPortPredicate, m -> message(m, opts), + opts.dryRun); } catch (KeeperException | InterruptedException e) { log.error("Error deleting gc lock", e); } @@ -283,20 +284,6 @@ static void removeLocks(ZooReaderWriter zoo, String path, ServiceLock.deleteLocks(zoo, path, hostPortPredicate, m -> message(m, opts), opts.dryRun); } - @Deprecated(since = "2.1.5") - static void removeGCLock(ZooReaderWriter zoo, String path, - Predicate hostPortPredicate, Opts ops) - throws KeeperException, InterruptedException { - var lockData = ServiceLock.getLockData(zoo.getZooKeeper(), ServiceLock.path(path)); - if (lockData != null) { - String lockContent = new String(lockData, UTF_8); - String[] parts = lockContent.split("="); - if (parts.length == 2 && hostPortPredicate.test(HostAndPort.fromString(parts[1]))) { - zapDirectory(zoo, path, ops); - } - } - } - static void removeSingletonLock(ZooReaderWriter zoo, String path, Predicate hostPortPredicate, Opts ops) throws KeeperException, InterruptedException { From 900976c63caf39140c596707518d92dfbfccb1a3 Mon Sep 17 00:00:00 2001 From: Daniel Roberts ddanielr Date: Mon, 26 Jan 2026 20:32:31 +0000 Subject: [PATCH 3/3] Use ServerServices instead of parsing lock data --- .../accumulo/core/fate/zookeeper/ServiceLock.java | 12 ++++++------ .../java/org/apache/accumulo/server/util/ZooZap.java | 5 +++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/ServiceLock.java b/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/ServiceLock.java index 19fbd4f7659..e4b5cfdb617 100644 --- a/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/ServiceLock.java +++ b/core/src/main/java/org/apache/accumulo/core/fate/zookeeper/ServiceLock.java @@ -32,6 +32,7 @@ import org.apache.accumulo.core.fate.zookeeper.ZooUtil.LockID; import org.apache.accumulo.core.fate.zookeeper.ZooUtil.NodeMissingPolicy; import org.apache.accumulo.core.util.HostAndPort; +import org.apache.accumulo.core.util.ServerServices; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.KeeperException.Code; @@ -784,14 +785,13 @@ public static void deleteLock(ZooReaderWriter zk, ServiceLockPath path) } - public static void removeGCLock(ZooReaderWriter zoo, String path, - Predicate hostPortPredicate, Consumer messageOutput, Boolean dryRun) - throws KeeperException, InterruptedException { + public static void removeLock(ZooReaderWriter zoo, String path, + ServerServices.Service serviceType, Predicate hostPortPredicate, + Consumer messageOutput, Boolean dryRun) throws KeeperException, InterruptedException { var lockData = ServiceLock.getLockData(zoo.getZooKeeper(), ServiceLock.path(path)); if (lockData != null) { - String lockContent = new String(lockData, UTF_8); - String[] parts = lockContent.split("="); - if (parts.length == 2 && hostPortPredicate.test(HostAndPort.fromString(parts[1]))) { + ServerServices lock = new ServerServices(new String(lockData, UTF_8)); + if (hostPortPredicate.test(lock.getAddress(serviceType))) { messageOutput.accept("Deleting " + path + " from zookeeper"); if (!dryRun) { zoo.recursiveDelete(path, NodeMissingPolicy.SKIP); diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java b/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java index c1e4e03ee74..18a4b057474 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java @@ -39,6 +39,7 @@ import org.apache.accumulo.core.singletons.SingletonManager; import org.apache.accumulo.core.singletons.SingletonManager.Mode; import org.apache.accumulo.core.util.HostAndPort; +import org.apache.accumulo.core.util.ServerServices; import org.apache.accumulo.core.volume.VolumeConfiguration; import org.apache.accumulo.server.fs.VolumeManager; import org.apache.accumulo.server.security.SecurityUtil; @@ -178,8 +179,8 @@ public void zap(SiteConfiguration siteConf, String... args) { if (opts.zapGc) { String gcLockPath = Constants.ZROOT + "/" + iid + Constants.ZGC_LOCK; try { - ServiceLock.removeGCLock(zoo, gcLockPath, hostPortPredicate, m -> message(m, opts), - opts.dryRun); + ServiceLock.removeLock(zoo, gcLockPath, ServerServices.Service.GC_CLIENT, hostPortPredicate, + m -> message(m, opts), opts.dryRun); } catch (KeeperException | InterruptedException e) { log.error("Error deleting gc lock", e); }