From a10563d12a04d304defba2b4a1e2802632516eea Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Wed, 29 Jul 2026 13:20:29 -0500 Subject: [PATCH 1/6] Remove TODO's from RootTabletMutatorImpl.java --- .../metadata/RootTabletMutatorImpl.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java index 5d65ed33dce..aad16412a99 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java @@ -100,17 +100,14 @@ public void mutate() { context.getZooCache().clear(RootTable.ZROOT_TABLET); - // TODO examine implementation of getZooReaderWriter().mutate() - // TODO for efficiency this should maybe call mutateExisting - context.getZooSession().asReaderWriter().mutateOrCreate(RootTable.ZROOT_TABLET, new byte[0], - currVal -> { - String currJson = new String(currVal, UTF_8); - var rtm = new RootTabletMetadata(currJson); - rtm.update(mutation); - String newJson = rtm.toJson(); - log.debug("mutation: from:[{}] to: [{}]", currJson, newJson); - return newJson.getBytes(UTF_8); - }); + context.getZooSession().asReaderWriter().mutateExisting(RootTable.ZROOT_TABLET, currVal -> { + String currJson = new String(currVal, UTF_8); + var rtm = new RootTabletMetadata(currJson); + rtm.update(mutation); + String newJson = rtm.toJson(); + log.debug("mutation: from:[{}] to: [{}]", currJson, newJson); + return newJson.getBytes(UTF_8); + }); // TODO this is racy... context.getZooCache().clear(RootTable.ZROOT_TABLET); From 83ac106be0245220bfd5394f4ed9a381cd764d24 Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Wed, 29 Jul 2026 15:47:29 -0500 Subject: [PATCH 2/6] Wait for ZROOT_TABLET to empty before calling clear() again --- .../accumulo/server/metadata/RootTabletMutatorImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java index aad16412a99..929f6bddad4 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java @@ -100,6 +100,12 @@ public void mutate() { context.getZooCache().clear(RootTable.ZROOT_TABLET); + // In order to avoid race condition, wait for ZROOT_TABLET to clear before attempting another + // clear() below. + while (context.getZooCache().get(RootTable.ZROOT_TABLET).length != 0) { + Thread.sleep(100); + } + context.getZooSession().asReaderWriter().mutateExisting(RootTable.ZROOT_TABLET, currVal -> { String currJson = new String(currVal, UTF_8); var rtm = new RootTabletMetadata(currJson); @@ -109,7 +115,6 @@ public void mutate() { return newJson.getBytes(UTF_8); }); - // TODO this is racy... context.getZooCache().clear(RootTable.ZROOT_TABLET); if (closeAfterMutate != null) { From 429af37750b631dc447a52e89f887935a0dd7c82 Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Thu, 30 Jul 2026 10:59:50 -0500 Subject: [PATCH 3/6] Add temporary wait for ZROOT_TABLET to clear --- .../accumulo/server/metadata/RootTabletMutatorImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java index 929f6bddad4..7e8cd781c42 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java @@ -97,14 +97,14 @@ public void mutate() { } try { - context.getZooCache().clear(RootTable.ZROOT_TABLET); - - // In order to avoid race condition, wait for ZROOT_TABLET to clear before attempting another + // Avoid race condition, wait for ZROOT_TABLET to clear before attempting another // clear() below. + final Object lock = new Object(); while (context.getZooCache().get(RootTable.ZROOT_TABLET).length != 0) { - Thread.sleep(100); + lock.wait(); } + lock.notifyAll(); context.getZooSession().asReaderWriter().mutateExisting(RootTable.ZROOT_TABLET, currVal -> { String currJson = new String(currVal, UTF_8); From 734e724ea6597ee27564e843b16eadad127b73c1 Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Thu, 30 Jul 2026 15:18:40 -0500 Subject: [PATCH 4/6] Add Thread.sleep after 2 zooCache clears to remove 2 TODOs --- .../server/metadata/RootConditionalWriter.java | 12 +++++++++++- .../server/metadata/RootTabletMutatorImpl.java | 7 +++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootConditionalWriter.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootConditionalWriter.java index fcc8b300f88..b71f64d55c9 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootConditionalWriter.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootConditionalWriter.java @@ -89,7 +89,17 @@ public Result write(ConditionalMutation mutation) { ServerConditionalMutation scm = new ServerConditionalMutation(tcm); - context.getZooCache().clear(RootTable.ZROOT_TABLET); + try { + context.getZooCache().clear(RootTable.ZROOT_TABLET); + + // In order to avoid race condition, wait for ZROOT_TABLET to clear before attempting another + // clear() below. + while (context.getZooCache().get(RootTable.ZROOT_TABLET).length != 0) { + Thread.sleep(100); + } + } catch (InterruptedException e) { + throw new RuntimeException(e); + } List okMutations = new ArrayList<>(); List results = new ArrayList<>(); diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java index 7e8cd781c42..baa640f3b7d 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java @@ -98,13 +98,12 @@ public void mutate() { try { context.getZooCache().clear(RootTable.ZROOT_TABLET); - // Avoid race condition, wait for ZROOT_TABLET to clear before attempting another + + // In order to avoid race condition, wait for ZROOT_TABLET to clear before attempting another // clear() below. - final Object lock = new Object(); while (context.getZooCache().get(RootTable.ZROOT_TABLET).length != 0) { - lock.wait(); + Thread.sleep(100); } - lock.notifyAll(); context.getZooSession().asReaderWriter().mutateExisting(RootTable.ZROOT_TABLET, currVal -> { String currJson = new String(currVal, UTF_8); From 6b0ae0f4aa60974ce37820c0c4b27b5b0036fc11 Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Wed, 5 Aug 2026 09:25:05 -0500 Subject: [PATCH 5/6] Remove zooCache.clear()s to avoid redundancy --- .../server/metadata/RootConditionalWriter.java | 16 ---------------- .../server/metadata/RootTabletMutatorImpl.java | 10 ---------- 2 files changed, 26 deletions(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootConditionalWriter.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootConditionalWriter.java index b71f64d55c9..6fb9532ba14 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootConditionalWriter.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootConditionalWriter.java @@ -89,18 +89,6 @@ public Result write(ConditionalMutation mutation) { ServerConditionalMutation scm = new ServerConditionalMutation(tcm); - try { - context.getZooCache().clear(RootTable.ZROOT_TABLET); - - // In order to avoid race condition, wait for ZROOT_TABLET to clear before attempting another - // clear() below. - while (context.getZooCache().get(RootTable.ZROOT_TABLET).length != 0) { - Thread.sleep(100); - } - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - List okMutations = new ArrayList<>(); List results = new ArrayList<>(); @@ -139,10 +127,6 @@ public Result write(ConditionalMutation mutation) { } catch (Exception e) { throw new RuntimeException(e); } - - // TODO this is racy... - context.getZooCache().clear(RootTable.ZROOT_TABLET); - return getResult(okMutations, results, mutation); } diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java index baa640f3b7d..1842e0fcbbb 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java @@ -97,14 +97,6 @@ public void mutate() { } try { - context.getZooCache().clear(RootTable.ZROOT_TABLET); - - // In order to avoid race condition, wait for ZROOT_TABLET to clear before attempting another - // clear() below. - while (context.getZooCache().get(RootTable.ZROOT_TABLET).length != 0) { - Thread.sleep(100); - } - context.getZooSession().asReaderWriter().mutateExisting(RootTable.ZROOT_TABLET, currVal -> { String currJson = new String(currVal, UTF_8); var rtm = new RootTabletMetadata(currJson); @@ -114,8 +106,6 @@ public void mutate() { return newJson.getBytes(UTF_8); }); - context.getZooCache().clear(RootTable.ZROOT_TABLET); - if (closeAfterMutate != null) { closeAfterMutate.close(); } From 43b853ccec016cb4ca4de2307f2eef84c5d05d8e Mon Sep 17 00:00:00 2001 From: Amanda Villarreal Date: Fri, 7 Aug 2026 12:33:42 -0500 Subject: [PATCH 6/6] Add back 1 zooCache().clear() in 2 files where previously removed --- .../apache/accumulo/server/metadata/RootConditionalWriter.java | 1 + .../apache/accumulo/server/metadata/RootTabletMutatorImpl.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootConditionalWriter.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootConditionalWriter.java index 6fb9532ba14..f214ee8090e 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootConditionalWriter.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootConditionalWriter.java @@ -127,6 +127,7 @@ public Result write(ConditionalMutation mutation) { } catch (Exception e) { throw new RuntimeException(e); } + context.getZooCache().clear(RootTable.ZROOT_TABLET); return getResult(okMutations, results, mutation); } diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java index 1842e0fcbbb..986f5d75f35 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/RootTabletMutatorImpl.java @@ -106,6 +106,8 @@ public void mutate() { return newJson.getBytes(UTF_8); }); + context.getZooCache().clear(RootTable.ZROOT_TABLET); + if (closeAfterMutate != null) { closeAfterMutate.close(); }