diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/ZookeeperLockChecker.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/ZookeeperLockChecker.java index 8d99d36a308..24b55f43fde 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/ZookeeperLockChecker.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/ZookeeperLockChecker.java @@ -18,6 +18,8 @@ */ package org.apache.accumulo.core.clientImpl; +import java.util.List; + import org.apache.accumulo.core.Constants; import org.apache.accumulo.core.clientImpl.TabletLocatorImpl.TabletServerLockChecker; import org.apache.accumulo.core.fate.zookeeper.ServiceLock; @@ -46,7 +48,14 @@ public boolean isLockHeld(String tserver, String session) { @Override public void invalidateCache(String tserver) { - zc.clear(root + "/" + tserver); + String serverPath = root + "/" + tserver; + var tserverZPath = ServiceLock.path(serverPath); + List children = + ServiceLock.validateAndSort(tserverZPath, zc.getChildren(tserverZPath.toString())); + if (!children.isEmpty()) { + String lockNode = children.get(0); + zc.clear(serverPath + "/" + lockNode); + } } } diff --git a/core/src/test/java/org/apache/accumulo/core/clientImpl/ZookeeperLockCheckerTest.java b/core/src/test/java/org/apache/accumulo/core/clientImpl/ZookeeperLockCheckerTest.java index 7776a55aa1f..8b5844564ea 100644 --- a/core/src/test/java/org/apache/accumulo/core/clientImpl/ZookeeperLockCheckerTest.java +++ b/core/src/test/java/org/apache/accumulo/core/clientImpl/ZookeeperLockCheckerTest.java @@ -23,6 +23,8 @@ import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; +import java.util.List; + import org.apache.accumulo.core.Constants; import org.apache.accumulo.core.fate.zookeeper.ZooCache; import org.junit.jupiter.api.BeforeEach; @@ -45,9 +47,31 @@ public void setUp() { @Test public void testInvalidateCache() { - zc.clear(context.getZooKeeperRoot() + Constants.ZTSERVERS + "/server"); + expect(zc.getChildren(context.getZooKeeperRoot() + Constants.ZTSERVERS + "/server")) + .andReturn(List.of("zlock#00000000-0000-0000-0000-aaaaaaaaaaaa#0000000001")); + zc.clear(context.getZooKeeperRoot() + Constants.ZTSERVERS + + "/server/zlock#00000000-0000-0000-0000-aaaaaaaaaaaa#0000000001"); + replay(zc); + zklc.invalidateCache("server"); + verify(zc); + } + + @Test + public void testInvalidateCacheInvalidLock() { + expect(zc.getChildren(context.getZooKeeperRoot() + Constants.ZTSERVERS + "/server")) + .andReturn(List.of("myLock")); replay(zc); zklc.invalidateCache("server"); verify(zc); } + + @Test + public void testInvalidateCacheNoLocks() { + expect(zc.getChildren(context.getZooKeeperRoot() + Constants.ZTSERVERS + "/server")) + .andReturn(List.of("")); + replay(zc); + zklc.invalidateCache("server"); + verify(zc); + } + }