Fix some code quality issues (#4934)

* Fix incorrect generics on AbstractFateTxStoreImpl (an unused generic
  type parameter was hiding the generic parameter from the FateTxStore
  interface); AbstractFateTxStoreImpl does not need, and should not
  have, a generic parameter of its own
* Remove several unused variables and imports
* Remove unrecognized nonstandard warning suppression UnstableApiUsage
* Remove unused assignment in FateCleanerTest, keeping the side-effect
* Suppress unused warnings about private no-arg constructors that
  exist only for GSon (I wonder if there's a better way to do this...
  perhaps with explicit type adaptors that use the regular
  constructors?)
* Remove unused "parent" argument and field for
  ConditionalTabletMutatorImpl
* Cast `tabletMutator` to concrete TabletMutatorImpl type, rather than
  the abstract generic `TabletMutatorBase` without a generic type
  parameter
* Avoid compiler warning for unclosed AutoCloseable ServerContext in a
  lambda inside FindSplits by assigning to a final variable outside the
  lambda, and reusing it, rather than calling `manager.getContext()`
  twice
* Substantial alterations to AmpleConditionalWriterIT in order to close
  all the unclosed AutoCloseable ConditionalTabletsMutatorImpl
  instances throughout the class; the actual implementation of this
  class' close method is empty currently, but it may not always be, and
  this resolves a bunch of unnecessary warnings about leaving them
  unclosed
* Add missing default case to switch statement in MetricsIT
* Remove a few unnecessary casts to `SortedMap<Key,Value>`
* Fix BulkNewIT warning about unclosed ClientContext that was merely
  cast from the AccumuloClient; instead, cast it in the
  try-with-resources block instead
diff --git a/core/src/main/java/org/apache/accumulo/core/fate/AbstractFateStore.java b/core/src/main/java/org/apache/accumulo/core/fate/AbstractFateStore.java
index a499e07..97b391e 100644
--- a/core/src/main/java/org/apache/accumulo/core/fate/AbstractFateStore.java
+++ b/core/src/main/java/org/apache/accumulo/core/fate/AbstractFateStore.java
@@ -283,7 +283,7 @@
 
   protected abstract FateTxStore<T> newUnreservedFateTxStore(FateId fateId);
 
-  protected abstract class AbstractFateTxStoreImpl<T> implements FateTxStore<T> {
+  protected abstract class AbstractFateTxStoreImpl implements FateTxStore<T> {
     protected final FateId fateId;
     protected boolean deleted;
     protected FateReservation reservation;
diff --git a/core/src/main/java/org/apache/accumulo/core/fate/MetaFateStore.java b/core/src/main/java/org/apache/accumulo/core/fate/MetaFateStore.java
index 555498d..08247e7 100644
--- a/core/src/main/java/org/apache/accumulo/core/fate/MetaFateStore.java
+++ b/core/src/main/java/org/apache/accumulo/core/fate/MetaFateStore.java
@@ -225,7 +225,7 @@
     return fateInstanceType;
   }
 
-  private class FateTxStoreImpl extends AbstractFateTxStoreImpl<T> {
+  private class FateTxStoreImpl extends AbstractFateTxStoreImpl {
 
     private FateTxStoreImpl(FateId fateId) {
       super(fateId);
diff --git a/core/src/main/java/org/apache/accumulo/core/fate/WrappedFateTxStore.java b/core/src/main/java/org/apache/accumulo/core/fate/WrappedFateTxStore.java
index bf0a357..f121a90 100644
--- a/core/src/main/java/org/apache/accumulo/core/fate/WrappedFateTxStore.java
+++ b/core/src/main/java/org/apache/accumulo/core/fate/WrappedFateTxStore.java
@@ -24,8 +24,6 @@
 import java.util.List;
 import java.util.Optional;
 
-import org.apache.accumulo.core.fate.ReadOnlyFateStore.TStatus;
-
 public class WrappedFateTxStore<T> implements FateStore.FateTxStore<T> {
   protected final FateStore.FateTxStore<T> wrapped;
 
diff --git a/core/src/main/java/org/apache/accumulo/core/fate/user/UserFateStore.java b/core/src/main/java/org/apache/accumulo/core/fate/user/UserFateStore.java
index a008e67..f1f8275 100644
--- a/core/src/main/java/org/apache/accumulo/core/fate/user/UserFateStore.java
+++ b/core/src/main/java/org/apache/accumulo/core/fate/user/UserFateStore.java
@@ -408,7 +408,7 @@
     return fateInstanceType;
   }
 
-  private class FateTxStoreImpl extends AbstractFateTxStoreImpl<T> {
+  private class FateTxStoreImpl extends AbstractFateTxStoreImpl {
 
     private FateTxStoreImpl(FateId fateId) {
       super(fateId);
diff --git a/core/src/main/java/org/apache/accumulo/core/metadata/schema/UnSplittableMetadata.java b/core/src/main/java/org/apache/accumulo/core/metadata/schema/UnSplittableMetadata.java
index 5c53c82..a63b09b 100644
--- a/core/src/main/java/org/apache/accumulo/core/metadata/schema/UnSplittableMetadata.java
+++ b/core/src/main/java/org/apache/accumulo/core/metadata/schema/UnSplittableMetadata.java
@@ -74,7 +74,6 @@
     return Base64.getEncoder().encodeToString(hashOfSplitParameters.asBytes());
   }
 
-  @SuppressWarnings("UnstableApiUsage")
   private static HashCode calculateSplitParamsHash(KeyExtent keyExtent, long splitThreshold,
       long maxEndRowSize, int maxFilesToOpen, Set<StoredTabletFile> files) {
     Preconditions.checkArgument(splitThreshold > 0, "splitThreshold must be greater than 0");
diff --git a/core/src/test/java/org/apache/accumulo/core/fate/FateCleanerTest.java b/core/src/test/java/org/apache/accumulo/core/fate/FateCleanerTest.java
index 8a6a69c..969a80d 100644
--- a/core/src/test/java/org/apache/accumulo/core/fate/FateCleanerTest.java
+++ b/core/src/test/java/org/apache/accumulo/core/fate/FateCleanerTest.java
@@ -20,6 +20,7 @@
 
 import static java.util.stream.Collectors.toSet;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.time.Duration;
@@ -288,7 +289,7 @@
     tts.time += Duration.ofHours(6).toNanos();
 
     FateCleaner<String> cleaner1 = new FateCleaner<>(testStore, Duration.ofHours(10), tts);
-    FateId fateId1 = testStore.create();
+    assertNotNull(testStore.create());
     cleaner1.ageOff();
     tts.time -= Duration.ofHours(3).toNanos();
     // steady time going backwards should cause an error
diff --git a/server/base/src/main/java/org/apache/accumulo/server/manager/state/TabletManagementParameters.java b/server/base/src/main/java/org/apache/accumulo/server/manager/state/TabletManagementParameters.java
index 6ccbe99..41a5998 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/manager/state/TabletManagementParameters.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/manager/state/TabletManagementParameters.java
@@ -251,6 +251,7 @@
     }
 
     // Gson requires private constructor
+    @SuppressWarnings("unused")
     private JsonData() {}
 
     JsonData(TabletManagementParameters params) {
diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletMutatorImpl.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletMutatorImpl.java
index 18739f3..9978dbb 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletMutatorImpl.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletMutatorImpl.java
@@ -75,7 +75,6 @@
 
   private final ConditionalMutation mutation;
   private final Consumer<ConditionalMutation> mutationConsumer;
-  private final Ample.ConditionalTabletsMutator parent;
 
   private final BiConsumer<KeyExtent,Ample.RejectionHandler> rejectionHandlerConsumer;
 
@@ -86,13 +85,12 @@
   private boolean sawOperationRequirement = false;
   private boolean checkPrevEndRow = true;
 
-  protected ConditionalTabletMutatorImpl(Ample.ConditionalTabletsMutator parent,
-      ServerContext context, KeyExtent extent, Consumer<ConditionalMutation> mutationConsumer,
+  protected ConditionalTabletMutatorImpl(ServerContext context, KeyExtent extent,
+      Consumer<ConditionalMutation> mutationConsumer,
       BiConsumer<KeyExtent,Ample.RejectionHandler> rejectionHandlerConsumer) {
     super(new ConditionalMutation(extent.toMetaRow()));
     this.mutation = (ConditionalMutation) super.mutation;
     this.mutationConsumer = mutationConsumer;
-    this.parent = parent;
     this.rejectionHandlerConsumer = rejectionHandlerConsumer;
     this.extent = extent;
     this.context = context;
diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletsMutatorImpl.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletsMutatorImpl.java
index ffb4791..660453f 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletsMutatorImpl.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletsMutatorImpl.java
@@ -93,8 +93,7 @@
 
     Preconditions.checkState(extents.putIfAbsent(extent.toMetaRow(), extent) == null,
         "Duplicate extents not handled %s", extent);
-    return new ConditionalTabletMutatorImpl(this, context, extent, mutations::add,
-        rejectedHandlers::put);
+    return new ConditionalTabletMutatorImpl(context, extent, mutations::add, rejectedHandlers::put);
   }
 
   protected ConditionalWriter createConditionalWriter(Ample.DataLevel dataLevel)
diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/ServerAmpleImpl.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/ServerAmpleImpl.java
index 2b39641..dcea93d 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/metadata/ServerAmpleImpl.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/ServerAmpleImpl.java
@@ -50,7 +50,6 @@
 import org.apache.accumulo.core.metadata.schema.MetadataSchema.BlipSection;
 import org.apache.accumulo.core.metadata.schema.MetadataSchema.DeletesSection;
 import org.apache.accumulo.core.metadata.schema.MetadataSchema.DeletesSection.SkewedKeyValue;
-import org.apache.accumulo.core.metadata.schema.TabletMutatorBase;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.accumulo.server.ServerContext;
 import org.apache.hadoop.io.Text;
@@ -82,7 +81,7 @@
   public Ample.TabletMutator mutateTablet(KeyExtent extent) {
     TabletsMutator tmi = mutateTablets();
     Ample.TabletMutator tabletMutator = tmi.mutateTablet(extent);
-    ((TabletMutatorBase) tabletMutator).setCloseAfterMutate(tmi);
+    ((TabletMutatorImpl) tabletMutator).setCloseAfterMutate(tmi);
     return tabletMutator;
   }
 
diff --git a/server/gc/src/test/java/org/apache/accumulo/gc/GarbageCollectWriteAheadLogsTest.java b/server/gc/src/test/java/org/apache/accumulo/gc/GarbageCollectWriteAheadLogsTest.java
index f868fd2..75707bb 100644
--- a/server/gc/src/test/java/org/apache/accumulo/gc/GarbageCollectWriteAheadLogsTest.java
+++ b/server/gc/src/test/java/org/apache/accumulo/gc/GarbageCollectWriteAheadLogsTest.java
@@ -37,7 +37,6 @@
 import org.apache.accumulo.core.metadata.TServerInstance;
 import org.apache.accumulo.core.metadata.schema.TabletMetadata;
 import org.apache.accumulo.core.metadata.schema.TabletMetadata.Location;
-import org.apache.accumulo.core.tabletserver.log.LogEntry;
 import org.apache.accumulo.core.util.Pair;
 import org.apache.accumulo.server.ServerContext;
 import org.apache.accumulo.server.fs.VolumeManager;
@@ -60,7 +59,6 @@
       Collections.singletonMap(server2, Collections.singletonList(id));
   private final Path path = new Path("hdfs://localhost:9000/accumulo/wal/localhost+1234/" + id);
   private final KeyExtent extent = KeyExtent.fromMetaRow(new Text("1<"));
-  private final List<LogEntry> walogs = Collections.emptyList();
   private final TabletMetadata tabletAssignedToServer1;
   private final TabletMetadata tabletAssignedToServer2;
 
diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/metrics/fate/FateMetricValues.java b/server/manager/src/main/java/org/apache/accumulo/manager/metrics/fate/FateMetricValues.java
index ea494bd..19ba624 100644
--- a/server/manager/src/main/java/org/apache/accumulo/manager/metrics/fate/FateMetricValues.java
+++ b/server/manager/src/main/java/org/apache/accumulo/manager/metrics/fate/FateMetricValues.java
@@ -27,8 +27,6 @@
 import org.apache.accumulo.core.fate.AdminUtil;
 import org.apache.accumulo.core.fate.ReadOnlyFateStore;
 import org.apache.accumulo.core.fate.ReadOnlyFateStore.TStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Immutable class that holds a snapshot of fate metric values - use builder to instantiate an
@@ -36,8 +34,6 @@
  */
 public abstract class FateMetricValues {
 
-  private static final Logger log = LoggerFactory.getLogger(FateMetricValues.class);
-
   protected final long updateTime;
   protected final long currentFateOps;
 
diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/availability/LockTable.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/availability/LockTable.java
index e6d099d..921a550 100644
--- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/availability/LockTable.java
+++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/availability/LockTable.java
@@ -29,12 +29,9 @@
 import org.apache.accumulo.manager.Manager;
 import org.apache.accumulo.manager.tableOps.ManagerRepo;
 import org.apache.accumulo.manager.tableOps.Utils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class LockTable extends ManagerRepo {
   private static final long serialVersionUID = 1L;
-  private static final Logger LOG = LoggerFactory.getLogger(LockTable.class);
 
   private final TableId tableId;
   private final NamespaceId namespaceId;
diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CompactRange.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CompactRange.java
index bba52a1..ac0438f 100644
--- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CompactRange.java
+++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/compact/CompactRange.java
@@ -43,13 +43,10 @@
 import org.apache.accumulo.manager.tableOps.Utils;
 import org.apache.accumulo.server.compaction.CompactionConfigStorage;
 import org.apache.hadoop.io.Text;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.MoreCollectors;
 
 public class CompactRange extends ManagerRepo {
-  private static final Logger log = LoggerFactory.getLogger(CompactRange.class);
 
   private static final long serialVersionUID = 1L;
   private final TableId tableId;
diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/delete/CleanUp.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/delete/CleanUp.java
index 9944c14..142fe47 100644
--- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/delete/CleanUp.java
+++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/delete/CleanUp.java
@@ -59,8 +59,6 @@
   private final TableId tableId;
   private final NamespaceId namespaceId;
 
-  private long creationTime;
-
   public CleanUp(TableId tableId, NamespaceId namespaceId) {
     this.tableId = tableId;
     this.namespaceId = namespaceId;
diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/FindSplits.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/FindSplits.java
index 1b790cc..60073e9 100644
--- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/FindSplits.java
+++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/FindSplits.java
@@ -117,11 +117,12 @@
         // Case 1: If a split is needed then set the unsplittable marker as no split
         // points could be found so that we don't keep trying again until the
         // split metadata is changed
-        if (SplitUtils.needsSplit(manager.getContext(), tabletMetadata)) {
+        final var context = manager.getContext();
+        if (SplitUtils.needsSplit(context, tabletMetadata)) {
           log.info("Tablet {} needs to split, but no split points could be found.",
               tabletMetadata.getExtent());
           var unSplittableMeta = computedUnsplittable
-              .orElseGet(() -> SplitUtils.toUnSplittable(manager.getContext(), tabletMetadata));
+              .orElseGet(() -> SplitUtils.toUnSplittable(context, tabletMetadata));
 
           // With the current design we don't need to require the files to be the same
           // for correctness as the TabletManagementIterator will detect the difference
diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/upgrade/Upgrader12to13.java b/server/manager/src/main/java/org/apache/accumulo/manager/upgrade/Upgrader12to13.java
index e2dce0e..91dea17 100644
--- a/server/manager/src/main/java/org/apache/accumulo/manager/upgrade/Upgrader12to13.java
+++ b/server/manager/src/main/java/org/apache/accumulo/manager/upgrade/Upgrader12to13.java
@@ -257,7 +257,6 @@
       final String ZTABLE_COMPACT_CANCEL_ID = "/compact-cancel-id";
 
       for (Entry<String,String> e : context.tableOperations().tableIdMap().entrySet()) {
-        final String tName = e.getKey();
         final String tId = e.getValue();
         final String zTablePath = zkRoot + Constants.ZTABLES + "/" + tId;
         zrw.delete(zTablePath + ZTABLE_COMPACT_ID);
diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServer.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServer.java
index 1f600c5..cb12d06 100644
--- a/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServer.java
+++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServer.java
@@ -124,7 +124,6 @@
 import org.apache.accumulo.server.rpc.ServerAddress;
 import org.apache.accumulo.server.rpc.TServerUtils;
 import org.apache.accumulo.server.rpc.ThriftProcessorTypes;
-import org.apache.accumulo.server.security.SecurityOperation;
 import org.apache.accumulo.server.security.SecurityUtil;
 import org.apache.accumulo.server.security.delegation.ZooAuthenticationKeyWatcher;
 import org.apache.accumulo.server.util.time.RelativeTime;
@@ -198,7 +197,6 @@
   final Map<KeyExtent,Long> recentlyUnloadedCache = Collections.synchronizedMap(new LRUMap<>(1000));
 
   final TabletServerResourceManager resourceManager;
-  private final SecurityOperation security;
 
   private final BlockingDeque<ManagerMessage> managerMessages = new LinkedBlockingDeque<>();
 
@@ -326,7 +324,6 @@
     logger = new TabletServerLogger(this, walMaxSize, syncCounter, flushCounter,
         walCreationRetryFactory, walWritingRetryFactory, walMaxAge);
     this.resourceManager = new TabletServerResourceManager(context, this);
-    this.security = context.getSecurityOperation();
 
     watchCriticalScheduledTask(context.getScheduledExecutor().scheduleWithFixedDelay(
         ClientTabletCache::clearInstances, jitter(), jitter(), TimeUnit.MILLISECONDS));
diff --git a/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java b/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java
index ac3ce6d..a343b94 100644
--- a/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java
@@ -163,23 +163,20 @@
 
       assertNull(context.getAmple().readTablet(e1).getLocation());
 
-      var ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
-          .putLocation(Location.future(ts1)).submit(tm -> false);
-      var results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+            .putLocation(Location.future(ts1)).submit(tm -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Location.future(ts1), context.getAmple().readTablet(e1).getLocation());
 
       // test require absent with a future location set
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
-          .putLocation(Location.future(ts2)).submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+            .putLocation(Location.future(ts2)).submit(tm -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Location.future(ts1), context.getAmple().readTablet(e1).getLocation());
-
       try (TabletsMetadata tablets =
           context.getAmple().readTablets().forTable(tid).filter(new HasCurrentFilter()).build()) {
         List<KeyExtent> actual =
@@ -187,22 +184,20 @@
         assertEquals(List.of(), actual);
       }
 
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.future(ts1))
-          .putLocation(Location.current(ts1)).deleteLocation(Location.future(ts1))
-          .submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.future(ts1))
+            .putLocation(Location.current(ts1)).deleteLocation(Location.future(ts1))
+            .submit(tm -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Location.current(ts1), context.getAmple().readTablet(e1).getLocation());
 
       // test require absent with a current location set
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
-          .putLocation(Location.future(ts2)).submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+            .putLocation(Location.future(ts2)).submit(tm -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Location.current(ts1), context.getAmple().readTablet(e1).getLocation());
 
       try (TabletsMetadata tablets =
@@ -212,79 +207,70 @@
         assertEquals(List.of(e1), actual);
       }
 
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.future(ts1))
-          .putLocation(Location.current(ts1)).deleteLocation(Location.future(ts1))
-          .submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.future(ts1))
+            .putLocation(Location.current(ts1)).deleteLocation(Location.future(ts1))
+            .submit(tm -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Location.current(ts1), context.getAmple().readTablet(e1).getLocation());
 
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.future(ts2))
-          .putLocation(Location.current(ts2)).deleteLocation(Location.future(ts2))
-          .submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.future(ts2))
+            .putLocation(Location.current(ts2)).deleteLocation(Location.future(ts2))
+            .submit(tm -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Location.current(ts1), context.getAmple().readTablet(e1).getLocation());
 
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.current(ts1))
-          .deleteLocation(Location.current(ts1)).submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.current(ts1))
+            .deleteLocation(Location.current(ts1)).submit(tm -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       assertNull(context.getAmple().readTablet(e1).getLocation());
 
       // Set two current locations, this puts the tablet in a bad state as its only expected that
       // single location should be set
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().putLocation(Location.current(ts1))
-          .putLocation(Location.current(ts2)).submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().putLocation(Location.current(ts1))
+            .putLocation(Location.current(ts2)).submit(tm -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       // When a tablet has two locations reading it should throw an exception
       assertThrows(IllegalStateException.class, () -> context.getAmple().readTablet(e1));
 
       // Try to update the tablet requiring one of the locations that is set on the tablet. Even
       // though the required location exists, the presence of the other location in the tablet
       // metadata should cause the update to fail.
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.current(ts1))
-          .deleteLocation(Location.current(ts1)).deleteLocation(Location.current(ts2))
-          .submit(tm -> false);
-      results = ctmi.process();
-      var finalResult1 = results.get(e1);
-      // The update should be rejected because of the two locations. When a conditional mutation is
-      // rejected an attempt is made to read the tablet metadata and examine. This read of the
-      // tablet metadata will fail because the tablet has two locations.
-      assertThrows(IllegalStateException.class, finalResult1::getStatus);
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(Location.current(ts1))
+            .deleteLocation(Location.current(ts1)).deleteLocation(Location.current(ts2))
+            .submit(tm -> false);
+        // The update should be rejected because of the two locations. When a conditional mutation
+        // is rejected an attempt is made to read the tablet metadata and examine. This read of the
+        // tablet metadata will fail because the tablet has two locations.
+        assertThrows(IllegalStateException.class, ctmi.process().get(e1)::getStatus);
+      }
       // tablet should still have two location set, so reading it should fail
       assertThrows(IllegalStateException.class, () -> context.getAmple().readTablet(e1));
 
       // Requiring an absent location should fail when two locations are set
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
-          .deleteLocation(Location.current(ts1)).deleteLocation(Location.current(ts2))
-          .submit(tm -> false);
-      results = ctmi.process();
-      var finalResult2 = results.get(e1);
-      assertThrows(IllegalStateException.class, finalResult2::getStatus);
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+            .deleteLocation(Location.current(ts1)).deleteLocation(Location.current(ts2))
+            .submit(tm -> false);
+        assertThrows(IllegalStateException.class, ctmi.process().get(e1)::getStatus);
+      }
       // tablet should still have two location set, so reading it should fail
       assertThrows(IllegalStateException.class, () -> context.getAmple().readTablet(e1));
 
-      // Change the tablet to have a futre and current location set.
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().deleteLocation(Location.current(ts1))
-          .putLocation(Location.future(ts1)).submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
+      // Change the tablet to have a future and current location set.
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().deleteLocation(Location.current(ts1))
+            .putLocation(Location.future(ts1)).submit(tm -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       // tablet should still have two location set, so reading it should fail
       assertThrows(IllegalStateException.class, () -> context.getAmple().readTablet(e1));
 
@@ -293,35 +279,31 @@
       // required location does not exist.
       for (var loc : List.of(Location.current(ts1), Location.current(ts2), Location.future(ts1),
           Location.future(ts2))) {
-        ctmi = new ConditionalTabletsMutatorImpl(context);
-        ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(loc)
-            .deleteLocation(Location.future(ts1)).deleteLocation(Location.current(ts2))
-            .submit(tm -> false);
-        results = ctmi.process();
-        var finalResult3 = results.get(e1);
-        // tablet should still have two location set, so reading it should fail
-        assertThrows(IllegalStateException.class, finalResult3::getStatus);
+        try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+          ctmi.mutateTablet(e1).requireAbsentOperation().requireLocation(loc)
+              .deleteLocation(Location.future(ts1)).deleteLocation(Location.current(ts2))
+              .submit(tm -> false);
+          // tablet should still have two location set, so reading it should fail
+          assertThrows(IllegalStateException.class, ctmi.process().get(e1)::getStatus);
+        }
       }
 
       // Requiring an absent location should fail when a future and current location are set
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
-          .deleteLocation(Location.current(ts1)).deleteLocation(Location.current(ts2))
-          .submit(tm -> false);
-      results = ctmi.process();
-      var finalResult4 = results.get(e1);
-      assertThrows(IllegalStateException.class, finalResult4::getStatus);
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+            .deleteLocation(Location.current(ts1)).deleteLocation(Location.current(ts2))
+            .submit(tm -> false);
+        assertThrows(IllegalStateException.class, ctmi.process().get(e1)::getStatus);
+      }
       // tablet should still have two location set, so reading it should fail
       assertThrows(IllegalStateException.class, () -> context.getAmple().readTablet(e1));
 
       // Delete one of the locations w/o any location requirements, this should succeed.
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().deleteLocation(Location.future(ts1))
-          .submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().deleteLocation(Location.future(ts1))
+            .submit(tm -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       // This check validates the expected state of the tablet as some of the previous test were
       // catching an exception and making assumption about the state of the tablet metadata based on
       // the fact that an exception was thrown.
@@ -351,56 +333,54 @@
       System.out.println(context.getAmple().readTablet(e1).getLocation());
 
       // simulate a compaction where the tablet location is not set
-      var ctmi = new ConditionalTabletsMutatorImpl(context);
-
-      var tm1 = TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2, dfv).putFile(stf3, dfv)
-          .build();
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm1, FILES)
-          .putFile(stf4, new DataFileValue(0, 0)).submit(tm -> false);
-      var results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        var tm1 = TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2, dfv)
+            .putFile(stf3, dfv).build();
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm1, FILES)
+            .putFile(stf4, new DataFileValue(0, 0)).submit(tm -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Set.of(), context.getAmple().readTablet(e1).getFiles());
 
       var tm2 = TabletMetadata.builder(e1).putLocation(Location.current(ts1)).build();
       // simulate minor compacts where the tablet location is not set
       for (StoredTabletFile file : List.of(stf1, stf2, stf3)) {
-        ctmi = new ConditionalTabletsMutatorImpl(context);
-        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm2, LOCATION)
-            .putFile(file, new DataFileValue(0, 0)).submit(tm -> false);
-        results = ctmi.process();
-        assertEquals(Status.REJECTED, results.get(e1).getStatus());
+        try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+          ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm2, LOCATION)
+              .putFile(file, new DataFileValue(0, 0)).submit(tm -> false);
+          assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+        }
       }
 
       assertEquals(Set.of(), context.getAmple().readTablet(e1).getFiles());
 
       // set the location
       var tm3 = TabletMetadata.builder(e1).build(LOCATION);
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm3, LOCATION)
-          .putLocation(Location.current(ts1)).submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm3, LOCATION)
+            .putLocation(Location.current(ts1)).submit(tm -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
 
       var tm4 = TabletMetadata.builder(e1).putLocation(Location.current(ts2)).build();
       // simulate minor compacts where the tablet location is wrong
       for (StoredTabletFile file : List.of(stf1, stf2, stf3)) {
-        ctmi = new ConditionalTabletsMutatorImpl(context);
-        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm4, LOCATION)
-            .putFile(file, new DataFileValue(0, 0)).submit(tm -> false);
-        results = ctmi.process();
-        assertEquals(Status.REJECTED, results.get(e1).getStatus());
+        try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+          ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm4, LOCATION)
+              .putFile(file, new DataFileValue(0, 0)).submit(tm -> false);
+          assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+        }
       }
 
       assertEquals(Set.of(), context.getAmple().readTablet(e1).getFiles());
 
       // simulate minor compacts where the tablet location is set
       for (StoredTabletFile file : List.of(stf1, stf2, stf3)) {
-        ctmi = new ConditionalTabletsMutatorImpl(context);
-        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm2, LOCATION)
-            .putFile(file, new DataFileValue(0, 0)).submit(tm -> false);
-        results = ctmi.process();
-        assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+        try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+          ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm2, LOCATION)
+              .putFile(file, new DataFileValue(0, 0)).submit(tm -> false);
+          assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+        }
       }
 
       assertEquals(Set.of(stf1, stf2, stf3), context.getAmple().readTablet(e1).getFiles());
@@ -410,77 +390,73 @@
           TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2, dfv).build(),
           TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2, dfv).putFile(stf3, dfv)
               .putFile(stf4, dfv).build())) {
-        ctmi = new ConditionalTabletsMutatorImpl(context);
-        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta, FILES)
-            .putFile(stf4, new DataFileValue(0, 0)).deleteFile(stf1).deleteFile(stf2)
-            .deleteFile(stf3).submit(tm -> false);
-        results = ctmi.process();
-        assertEquals(Status.REJECTED, results.get(e1).getStatus());
+        try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+          ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta, FILES)
+              .putFile(stf4, new DataFileValue(0, 0)).deleteFile(stf1).deleteFile(stf2)
+              .deleteFile(stf3).submit(tm -> false);
+          assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+        }
         assertEquals(Set.of(stf1, stf2, stf3), context.getAmple().readTablet(e1).getFiles());
       }
 
       // simulate a compaction
-      ctmi = new ConditionalTabletsMutatorImpl(context);
       var tm5 = TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2, dfv).putFile(stf3, dfv)
           .build();
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm5, FILES)
-          .putFile(stf4, new DataFileValue(0, 0)).deleteFile(stf1).deleteFile(stf2).deleteFile(stf3)
-          .submit(tm -> false);
-      results = ctmi.process();
-      // First attempt should fail because the dfvs were replaced in the test
-      // so the values of the files will not match
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm5, FILES)
+            .putFile(stf4, new DataFileValue(0, 0)).deleteFile(stf1).deleteFile(stf2)
+            .deleteFile(stf3).submit(tm -> false);
+        // First attempt should fail because the dfvs were replaced in the test
+        // so the values of the files will not match
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
 
       // Try again with the correct comapcted datafiles
       var compactedDv = new DataFileValue(0, 0);
-      ctmi = new ConditionalTabletsMutatorImpl(context);
       tm5 = TabletMetadata.builder(e1).putFile(stf1, compactedDv).putFile(stf2, compactedDv)
           .putFile(stf3, compactedDv).build();
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm5, FILES)
-          .putFile(stf4, new DataFileValue(0, 0)).deleteFile(stf1).deleteFile(stf2).deleteFile(stf3)
-          .submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm5, FILES)
+            .putFile(stf4, new DataFileValue(0, 0)).deleteFile(stf1).deleteFile(stf2)
+            .deleteFile(stf3).submit(tm -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Set.of(stf4), context.getAmple().readTablet(e1).getFiles());
 
       // simulate a bulk import
       var stf5 = StoredTabletFile
           .of(new Path("hdfs://localhost:8020/accumulo/tables/2a/b-0000009/I0000074.rf"));
-      ctmi = new ConditionalTabletsMutatorImpl(context);
       var tm6 = TabletMetadata.builder(e1).build(LOADED);
       FateInstanceType type = FateInstanceType.fromTableId(tid);
       FateId fateId = FateId.from(type, UUID.randomUUID());
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm6, LOADED)
-          .putFile(stf5, new DataFileValue(0, 0)).putBulkFile(stf5.getTabletFile(), fateId)
-          .submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm6, LOADED)
+            .putFile(stf5, new DataFileValue(0, 0)).putBulkFile(stf5.getTabletFile(), fateId)
+            .submit(tm -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Set.of(stf4, stf5), context.getAmple().readTablet(e1).getFiles());
 
       // simulate a compaction
       var stf6 = StoredTabletFile
           .of(new Path("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/A0000075.rf"));
-      ctmi = new ConditionalTabletsMutatorImpl(context);
       var tm7 =
           TabletMetadata.builder(e1).putFile(stf4, compactedDv).putFile(stf5, compactedDv).build();
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm7, FILES)
-          .putFile(stf6, new DataFileValue(0, 0)).deleteFile(stf4).deleteFile(stf5)
-          .submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm7, FILES)
+            .putFile(stf6, new DataFileValue(0, 0)).deleteFile(stf4).deleteFile(stf5)
+            .submit(tm -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Set.of(stf6), context.getAmple().readTablet(e1).getFiles());
 
       // simulate trying to re bulk import file after a compaction
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm6, LOADED)
-          .putFile(stf5, new DataFileValue(0, 0)).putBulkFile(stf5.getTabletFile(), fateId)
-          .submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm6, LOADED)
+            .putFile(stf5, new DataFileValue(0, 0)).putBulkFile(stf5.getTabletFile(), fateId)
+            .submit(tm -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Set.of(stf6), context.getAmple().readTablet(e1).getFiles());
     }
   }
@@ -493,17 +469,16 @@
     String walFilePath =
         java.nio.file.Path.of("tserver+8080", UUID.randomUUID().toString()).toString();
     final LogEntry originalLogEntry = LogEntry.fromPath(walFilePath);
-    ConditionalTabletsMutatorImpl ctmi = new ConditionalTabletsMutatorImpl(context);
     // create a tablet metadata with no write ahead logs
     var tmEmptySet = TabletMetadata.builder(e1).build(LOGS);
     // tablet should not have any logs to start with so requireSame with the empty logs should pass
     assertTrue(context.getAmple().readTablet(e1).getLogs().isEmpty());
-    ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tmEmptySet, LOGS)
-        .putWal(originalLogEntry).submit(tm -> false);
-    var results = ctmi.process();
-    assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
     Set<LogEntry> expectedLogs = new HashSet<>();
+    try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tmEmptySet, LOGS)
+          .putWal(originalLogEntry).submit(tm -> false);
+      assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+    }
     expectedLogs.add(originalLogEntry);
     assertEquals(expectedLogs, new HashSet<>(context.getAmple().readTablet(e1).getLogs()),
         "The original LogEntry should be present.");
@@ -512,10 +487,10 @@
     String walFilePath2 =
         java.nio.file.Path.of("tserver+8080", UUID.randomUUID().toString()).toString();
     LogEntry newLogEntry = LogEntry.fromPath(walFilePath2);
-    ctmi = new ConditionalTabletsMutatorImpl(context);
-    ctmi.mutateTablet(e1).requireAbsentOperation().putWal(newLogEntry).submit(tm -> false);
-    results = ctmi.process();
-    assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+    try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+      ctmi.mutateTablet(e1).requireAbsentOperation().putWal(newLogEntry).submit(tm -> false);
+      assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+    }
 
     // Verify that both the original and new WALs are present
     expectedLogs.add(newLogEntry);
@@ -541,12 +516,11 @@
       subset.forEach(builder::putWal);
       TabletMetadata tmSubset = builder.build(LOGS);
 
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tmSubset, LOGS)
-          .deleteWal(originalLogEntry).submit(t -> false);
-      results = ctmi.process();
-
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tmSubset, LOGS)
+            .deleteWal(originalLogEntry).submit(t -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
 
       // ensure the operation did not go through
       actualLogs = new HashSet<>(context.getAmple().readTablet(e1).getLogs());
@@ -557,32 +531,31 @@
     // this example)
     TabletMetadata tm2 =
         TabletMetadata.builder(e1).putWal(originalLogEntry).putWal(newLogEntry).build(LOGS);
-    ctmi = new ConditionalTabletsMutatorImpl(context);
-    ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm2, LOGS)
-        .deleteWal(originalLogEntry).submit(tm -> false);
-    results = ctmi.process();
-    assertEquals(Status.ACCEPTED, results.get(e1).getStatus(),
-        "Requiring the current WALs should result in acceptance when making an update.");
-
+    try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm2, LOGS)
+          .deleteWal(originalLogEntry).submit(tm -> false);
+      assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus(),
+          "Requiring the current WALs should result in acceptance when making an update.");
+    }
     // Verify that the update went through as expected
     assertEquals(List.of(newLogEntry), context.getAmple().readTablet(e1).getLogs(),
         "Only the new LogEntry should remain after deleting the original.");
 
     // test the requireAbsentLogs() function when logs are not present in the tablet metadata
     assertTrue(context.getAmple().readTablet(e2).getLogs().isEmpty());
-    ctmi = new ConditionalTabletsMutatorImpl(context);
-    ctmi.mutateTablet(e2).requireAbsentOperation().requireAbsentLogs().putWal(originalLogEntry)
-        .submit(tm -> false);
-    results = ctmi.process();
-    assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
+    try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+      ctmi.mutateTablet(e2).requireAbsentOperation().requireAbsentLogs().putWal(originalLogEntry)
+          .submit(tm -> false);
+      assertEquals(Status.ACCEPTED, ctmi.process().get(e2).getStatus());
+    }
 
     // test the requireAbsentLogs() function when logs are present in the tablet metadata
     assertFalse(context.getAmple().readTablet(e2).getLogs().isEmpty());
-    ctmi = new ConditionalTabletsMutatorImpl(context);
-    ctmi.mutateTablet(e2).requireAbsentOperation().requireAbsentLogs().deleteWal(originalLogEntry)
-        .submit(tm -> false);
-    results = ctmi.process();
-    assertEquals(Status.REJECTED, results.get(e2).getStatus());
+    try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+      ctmi.mutateTablet(e2).requireAbsentOperation().requireAbsentLogs().deleteWal(originalLogEntry)
+          .submit(tm -> false);
+      assertEquals(Status.REJECTED, ctmi.process().get(e2).getStatus());
+    }
     assertFalse(context.getAmple().readTablet(e2).getLogs().isEmpty());
   }
 
@@ -603,38 +576,35 @@
     System.out.println(context.getAmple().readTablet(e1).getLocation());
 
     // simulate a compaction where the tablet location is not set
-    var ctmi = new ConditionalTabletsMutatorImpl(context);
     var tm1 = TabletMetadata.builder(e1).build(FILES, SELECTED);
-    ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm1, FILES).putFile(stf1, dfv)
-        .putFile(stf2, dfv).putFile(stf3, dfv).submit(tm -> false);
-    var results = ctmi.process();
-    assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
+    try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm1, FILES).putFile(stf1, dfv)
+          .putFile(stf2, dfv).putFile(stf3, dfv).submit(tm -> false);
+      assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+    }
     assertEquals(Set.of(stf1, stf2, stf3), context.getAmple().readTablet(e1).getFiles());
 
-    ctmi = new ConditionalTabletsMutatorImpl(context);
     FateInstanceType type = FateInstanceType.fromTableId(tid);
     FateId fateId1 = FateId.from(type, UUID.randomUUID());
     FateId fateId2 = FateId.from(type, UUID.randomUUID());
     var time = SteadyTime.from(100_100, TimeUnit.NANOSECONDS);
-    ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm1, FILES, SELECTED)
-        .putSelectedFiles(new SelectedFiles(Set.of(stf1, stf2, stf3), true, fateId1, time))
-        .submit(tm -> false);
-    results = ctmi.process();
-    assertEquals(Status.REJECTED, results.get(e1).getStatus());
-
+    try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm1, FILES, SELECTED)
+          .putSelectedFiles(new SelectedFiles(Set.of(stf1, stf2, stf3), true, fateId1, time))
+          .submit(tm -> false);
+      assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+    }
     assertEquals(Set.of(stf1, stf2, stf3), context.getAmple().readTablet(e1).getFiles());
     assertNull(context.getAmple().readTablet(e1).getSelectedFiles());
 
     var tm2 = TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2, dfv).putFile(stf3, dfv)
         .build(SELECTED);
-    ctmi = new ConditionalTabletsMutatorImpl(context);
-    ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm2, FILES, SELECTED)
-        .putSelectedFiles(new SelectedFiles(Set.of(stf1, stf2, stf3), true, fateId1, time))
-        .submit(tm -> false);
-    results = ctmi.process();
-    assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
+    try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm2, FILES, SELECTED)
+          .putSelectedFiles(new SelectedFiles(Set.of(stf1, stf2, stf3), true, fateId1, time))
+          .submit(tm -> false);
+      assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+    }
     assertEquals(Set.of(stf1, stf2, stf3), context.getAmple().readTablet(e1).getFiles());
     assertEquals(Set.of(stf1, stf2, stf3),
         context.getAmple().readTablet(e1).getSelectedFiles().getFiles());
@@ -651,12 +621,11 @@
     for (var selectedFiles : expectedToFail) {
       var tm3 = TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2, dfv).putFile(stf3, dfv)
           .putSelectedFiles(selectedFiles).build();
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm3, FILES, SELECTED)
-          .deleteSelectedFiles().submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm3, FILES, SELECTED)
+            .deleteSelectedFiles().submit(tm -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Set.of(stf1, stf2, stf3), context.getAmple().readTablet(e1).getFiles());
       assertEquals(Set.of(stf1, stf2, stf3),
           context.getAmple().readTablet(e1).getSelectedFiles().getFiles());
@@ -664,12 +633,11 @@
 
     var tm5 = TabletMetadata.builder(e1).putFile(stf1, dfv).putFile(stf2, dfv).putFile(stf3, dfv)
         .putSelectedFiles(new SelectedFiles(Set.of(stf1, stf2, stf3), true, fateId1, time)).build();
-    ctmi = new ConditionalTabletsMutatorImpl(context);
-    ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm5, FILES, SELECTED)
-        .deleteSelectedFiles().submit(tm -> false);
-    results = ctmi.process();
-    assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
+    try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm5, FILES, SELECTED)
+          .deleteSelectedFiles().submit(tm -> false);
+      assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+    }
     assertEquals(Set.of(stf1, stf2, stf3), context.getAmple().readTablet(e1).getFiles());
     assertNull(context.getAmple().readTablet(e1).getSelectedFiles());
   }
@@ -696,15 +664,13 @@
       final SelectedFiles selectedFiles =
           new SelectedFiles(storedTabletFiles, initiallySelectedAll, fateId, time);
 
-      ConditionalTabletsMutatorImpl ctmi = new ConditionalTabletsMutatorImpl(context);
-
-      // write the SelectedFiles to the keyextent
-      ctmi.mutateTablet(e1).requireAbsentOperation().putSelectedFiles(selectedFiles)
-          .submit(tm -> false);
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        // write the SelectedFiles to the keyextent
+        ctmi.mutateTablet(e1).requireAbsentOperation().putSelectedFiles(selectedFiles)
+            .submit(tm -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       // verify we can read the selected files
-      Status mutationStatus = ctmi.process().get(e1).getStatus();
-      assertEquals(Status.ACCEPTED, mutationStatus, "Failed to put selected files to tablet");
       assertEquals(selectedFiles, context.getAmple().readTablet(e1).getSelectedFiles(),
           "Selected files should match those that were written");
 
@@ -759,22 +725,19 @@
       assertEquals(newJson, actualMetadataValue,
           "Value should be equal to the new json we manually wrote above");
 
-      TabletMetadata tm1 =
-          TabletMetadata.builder(e1).putSelectedFiles(selectedFiles).build(SELECTED);
-      ctmi = new ConditionalTabletsMutatorImpl(context);
+      var tm1 = TabletMetadata.builder(e1).putSelectedFiles(selectedFiles).build(SELECTED);
       StoredTabletFile stf4 = StoredTabletFile.of(new Path(pathPrefix + "F0000073.rf"));
       // submit a mutation with the condition that the selected files match what was originally
       // written
       DataFileValue dfv = new DataFileValue(100, 100);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm1, SELECTED).putFile(stf4, dfv)
-          .submit(tm -> false);
-
-      mutationStatus = ctmi.process().get(e1).getStatus();
-
-      // with a SortedFilesIterator attached to the Condition for SELECTED, the metadata should be
-      // re-ordered and once again match what was originally written meaning the conditional
-      // mutation should have been accepted and the file added should be present
-      assertEquals(Status.ACCEPTED, mutationStatus);
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tm1, SELECTED).putFile(stf4, dfv)
+            .submit(tm -> false);
+        // with a SortedFilesIterator attached to the Condition for SELECTED, the metadata should be
+        // re-ordered and once again match what was originally written meaning the conditional
+        // mutation should have been accepted and the file added should be present
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Set.of(stf4), context.getAmple().readTablet(e1).getFiles(),
           "Expected to see the file that was added by the mutation");
     }
@@ -807,55 +770,51 @@
 
       var context = cluster.getServerContext();
 
-      var ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
-          .putLocation(Location.future(ts1)).submit(tm -> false);
-      ctmi.mutateTablet(e2).requireAbsentOperation().requireAbsentLocation()
-          .putLocation(Location.future(ts2)).submit(tm -> false);
-      var results = ctmi.process();
-
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-      assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+            .putLocation(Location.future(ts1)).submit(tm -> false);
+        ctmi.mutateTablet(e2).requireAbsentOperation().requireAbsentLocation()
+            .putLocation(Location.future(ts2)).submit(tm -> false);
+        var results = ctmi.process();
+        assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+        assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
+        assertEquals(Set.of(e1, e2), results.keySet());
+      }
       assertEquals(Location.future(ts1), context.getAmple().readTablet(e1).getLocation());
       assertEquals(Location.future(ts2), context.getAmple().readTablet(e2).getLocation());
       assertNull(context.getAmple().readTablet(e3).getLocation());
       assertNull(context.getAmple().readTablet(e4).getLocation());
 
-      assertEquals(Set.of(e1, e2), results.keySet());
-
       var e5 = new KeyExtent(tid, new Text("yz"), new Text("ya"));
       assertNull(context.getAmple().readTablet(e5));
 
       // in addition to testing multiple tablets also testing requireAbsentTablet() which is
       // currently not called elsewhere in this IT
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
-          .putLocation(Location.future(ts2)).submit(tm -> false);
-      ctmi.mutateTablet(e2).requireAbsentTablet().putLocation(Location.future(ts1))
-          .submit(tm -> false);
-      ctmi.mutateTablet(e3).requireAbsentOperation().requireAbsentLocation()
-          .putLocation(Location.future(ts1)).submit(tm -> false);
-      ctmi.mutateTablet(e4).requireAbsentOperation().requireAbsentLocation()
-          .putLocation(Location.future(ts2)).submit(tm -> false);
-      ctmi.mutateTablet(e5).requireAbsentTablet().putDirName("t-54321")
-          .putPrevEndRow(e5.prevEndRow()).putTabletAvailability(TabletAvailability.ONDEMAND)
-          .submit(tm -> false);
-      results = ctmi.process();
-
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
-      assertEquals(Status.REJECTED, results.get(e2).getStatus());
-      assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
-      assertEquals(Status.ACCEPTED, results.get(e4).getStatus());
-      assertEquals(Status.ACCEPTED, results.get(e5).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+            .putLocation(Location.future(ts2)).submit(tm -> false);
+        ctmi.mutateTablet(e2).requireAbsentTablet().putLocation(Location.future(ts1))
+            .submit(tm -> false);
+        ctmi.mutateTablet(e3).requireAbsentOperation().requireAbsentLocation()
+            .putLocation(Location.future(ts1)).submit(tm -> false);
+        ctmi.mutateTablet(e4).requireAbsentOperation().requireAbsentLocation()
+            .putLocation(Location.future(ts2)).submit(tm -> false);
+        ctmi.mutateTablet(e5).requireAbsentTablet().putDirName("t-54321")
+            .putPrevEndRow(e5.prevEndRow()).putTabletAvailability(TabletAvailability.ONDEMAND)
+            .submit(tm -> false);
+        var results = ctmi.process();
+        assertEquals(Status.REJECTED, results.get(e1).getStatus());
+        assertEquals(Status.REJECTED, results.get(e2).getStatus());
+        assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
+        assertEquals(Status.ACCEPTED, results.get(e4).getStatus());
+        assertEquals(Status.ACCEPTED, results.get(e5).getStatus());
+        assertEquals(Set.of(e1, e2, e3, e4, e5), results.keySet());
+      }
       assertEquals(Location.future(ts1), context.getAmple().readTablet(e1).getLocation());
       assertEquals(Location.future(ts2), context.getAmple().readTablet(e2).getLocation());
       assertEquals(Location.future(ts1), context.getAmple().readTablet(e3).getLocation());
       assertEquals(Location.future(ts2), context.getAmple().readTablet(e4).getLocation());
       assertEquals("t-54321", context.getAmple().readTablet(e5).getDirName());
-
-      assertEquals(Set.of(e1, e2, e3, e4, e5), results.keySet());
     }
   }
 
@@ -870,15 +829,15 @@
       var opid1 = TabletOperationId.from(TabletOperationType.SPLITTING, fateId1);
       var opid2 = TabletOperationId.from(TabletOperationType.MERGING, fateId2);
 
-      var ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().putOperation(opid1).submit(tm -> false);
-      ctmi.mutateTablet(e2).requireAbsentOperation().putOperation(opid2).submit(tm -> false);
-      ctmi.mutateTablet(e3).requireOperation(opid1).deleteOperation().submit(tm -> false);
-      var results = ctmi.process();
-
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-      assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
-      assertEquals(Status.REJECTED, results.get(e3).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().putOperation(opid1).submit(tm -> false);
+        ctmi.mutateTablet(e2).requireAbsentOperation().putOperation(opid2).submit(tm -> false);
+        ctmi.mutateTablet(e3).requireOperation(opid1).deleteOperation().submit(tm -> false);
+        var results = ctmi.process();
+        assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+        assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
+        assertEquals(Status.REJECTED, results.get(e3).getStatus());
+      }
       assertEquals(TabletOperationType.SPLITTING,
           context.getAmple().readTablet(e1).getOperationId().getType());
       assertEquals(opid1, context.getAmple().readTablet(e1).getOperationId());
@@ -887,25 +846,25 @@
       assertEquals(opid2, context.getAmple().readTablet(e2).getOperationId());
       assertNull(context.getAmple().readTablet(e3).getOperationId());
 
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireOperation(opid2).deleteOperation().submit(tm -> false);
-      ctmi.mutateTablet(e2).requireOperation(opid1).deleteOperation().submit(tm -> false);
-      results = ctmi.process();
-
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
-      assertEquals(Status.REJECTED, results.get(e2).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireOperation(opid2).deleteOperation().submit(tm -> false);
+        ctmi.mutateTablet(e2).requireOperation(opid1).deleteOperation().submit(tm -> false);
+        var results = ctmi.process();
+        assertEquals(Status.REJECTED, results.get(e1).getStatus());
+        assertEquals(Status.REJECTED, results.get(e2).getStatus());
+      }
       assertEquals(TabletOperationType.SPLITTING,
           context.getAmple().readTablet(e1).getOperationId().getType());
       assertEquals(TabletOperationType.MERGING,
           context.getAmple().readTablet(e2).getOperationId().getType());
 
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireOperation(opid1).deleteOperation().submit(tm -> false);
-      ctmi.mutateTablet(e2).requireOperation(opid2).deleteOperation().submit(tm -> false);
-      results = ctmi.process();
-
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-      assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireOperation(opid1).deleteOperation().submit(tm -> false);
+        ctmi.mutateTablet(e2).requireOperation(opid2).deleteOperation().submit(tm -> false);
+        var results = ctmi.process();
+        assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+        assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
+      }
       assertNull(context.getAmple().readTablet(e1).getOperationId());
       assertNull(context.getAmple().readTablet(e2).getOperationId());
     }
@@ -937,21 +896,22 @@
 
       // Test different compaction requirement scenarios for tablets w/o any compactions in the
       // metadata table
-      var ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMetaNoCompactions, ECOMP)
-          .putExternalCompaction(ecid1, ecMeta).submit(tm -> false);
-      ctmi.mutateTablet(e2).requireAbsentOperation().requireCompaction(ecid2)
-          .putExternalCompaction(ecid1, ecMeta).submit(tm -> false);
-      ctmi.mutateTablet(e3).requireAbsentOperation().requireSame(tabletMetaNoCompactions, ECOMP)
-          .putExternalCompaction(ecid1, ecMeta).putExternalCompaction(ecid2, ecMeta)
-          .submit(tm -> false);
-      ctmi.mutateTablet(e4).requireAbsentOperation().requireSame(tabletMetaCompactions, ECOMP)
-          .putExternalCompaction(ecid1, ecMeta).submit(tm -> false);
-      var results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-      assertEquals(Status.REJECTED, results.get(e2).getStatus());
-      assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
-      assertEquals(Status.REJECTED, results.get(e4).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMetaNoCompactions, ECOMP)
+            .putExternalCompaction(ecid1, ecMeta).submit(tm -> false);
+        ctmi.mutateTablet(e2).requireAbsentOperation().requireCompaction(ecid2)
+            .putExternalCompaction(ecid1, ecMeta).submit(tm -> false);
+        ctmi.mutateTablet(e3).requireAbsentOperation().requireSame(tabletMetaNoCompactions, ECOMP)
+            .putExternalCompaction(ecid1, ecMeta).putExternalCompaction(ecid2, ecMeta)
+            .submit(tm -> false);
+        ctmi.mutateTablet(e4).requireAbsentOperation().requireSame(tabletMetaCompactions, ECOMP)
+            .putExternalCompaction(ecid1, ecMeta).submit(tm -> false);
+        var results = ctmi.process();
+        assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+        assertEquals(Status.REJECTED, results.get(e2).getStatus());
+        assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
+        assertEquals(Status.REJECTED, results.get(e4).getStatus());
+      }
       assertEquals(Set.of(ecid1),
           context.getAmple().readTablet(e1).getExternalCompactions().keySet());
       assertEquals(Set.of(), context.getAmple().readTablet(e2).getExternalCompactions().keySet());
@@ -961,14 +921,15 @@
 
       // Test compaction requirements that do not match the compaction ids that exists in the
       // metadata table.
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireCompaction(ecid2)
-          .deleteExternalCompaction(ecid1).submit(tm -> false);
-      ctmi.mutateTablet(e3).requireAbsentOperation().requireSame(tabletMetaCompactions, ECOMP)
-          .deleteExternalCompaction(ecid1).submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
-      assertEquals(Status.REJECTED, results.get(e3).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireCompaction(ecid2)
+            .deleteExternalCompaction(ecid1).submit(tm -> false);
+        ctmi.mutateTablet(e3).requireAbsentOperation().requireSame(tabletMetaCompactions, ECOMP)
+            .deleteExternalCompaction(ecid1).submit(tm -> false);
+        var results = ctmi.process();
+        assertEquals(Status.REJECTED, results.get(e1).getStatus());
+        assertEquals(Status.REJECTED, results.get(e3).getStatus());
+      }
       assertEquals(Set.of(ecid1),
           context.getAmple().readTablet(e1).getExternalCompactions().keySet());
       assertEquals(Set.of(ecid1, ecid2),
@@ -976,18 +937,18 @@
 
       // Test compaction requirements that match the compaction ids that exists in the metadata
       // table.
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMetaCompactions, ECOMP)
-          .deleteExternalCompaction(ecid1).submit(tm -> false);
-      ctmi.mutateTablet(e3).requireAbsentOperation().requireCompaction(ecid2)
-          .deleteExternalCompaction(ecid1).submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-      assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMetaCompactions, ECOMP)
+            .deleteExternalCompaction(ecid1).submit(tm -> false);
+        ctmi.mutateTablet(e3).requireAbsentOperation().requireCompaction(ecid2)
+            .deleteExternalCompaction(ecid1).submit(tm -> false);
+        var results = ctmi.process();
+        assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+        assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
+      }
       assertEquals(Set.of(), context.getAmple().readTablet(e1).getExternalCompactions().keySet());
       assertEquals(Set.of(ecid2),
           context.getAmple().readTablet(e3).getExternalCompactions().keySet());
-
     }
   }
 
@@ -996,8 +957,6 @@
     try (AccumuloClient c = Accumulo.newClient().from(getClientProps()).build()) {
       var context = cluster.getServerContext();
 
-      var ctmi = new ConditionalTabletsMutatorImpl(context);
-
       FateInstanceType type = FateInstanceType.fromTableId(tid);
       FateId fateId1 = FateId.from(type, UUID.randomUUID());
       FateId fateId2 = FateId.from(type, UUID.randomUUID());
@@ -1006,65 +965,64 @@
       FateId fateId5 = FateId.from(type, UUID.randomUUID());
 
       var tabletMeta1 = TabletMetadata.builder(e1).build(COMPACTED);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED)
-          .putCompacted(fateId2)
-          .submit(tabletMetadata -> tabletMetadata.getCompacted().contains(fateId2));
-      var tabletMeta2 = TabletMetadata.builder(e2).putCompacted(fateId1).build(COMPACTED);
-      ctmi.mutateTablet(e2).requireAbsentOperation().requireSame(tabletMeta2, COMPACTED)
-          .putCompacted(fateId3)
-          .submit(tabletMetadata -> tabletMetadata.getCompacted().contains(fateId3));
 
-      var results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-      assertEquals(Status.REJECTED, results.get(e2).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED)
+            .putCompacted(fateId2)
+            .submit(tabletMetadata -> tabletMetadata.getCompacted().contains(fateId2));
+        var tabletMeta2 = TabletMetadata.builder(e2).putCompacted(fateId1).build(COMPACTED);
+        ctmi.mutateTablet(e2).requireAbsentOperation().requireSame(tabletMeta2, COMPACTED)
+            .putCompacted(fateId3)
+            .submit(tabletMetadata -> tabletMetadata.getCompacted().contains(fateId3));
+        var results = ctmi.process();
+        assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+        assertEquals(Status.REJECTED, results.get(e2).getStatus());
+      }
       tabletMeta1 = context.getAmple().readTablet(e1);
       assertEquals(Set.of(fateId2), tabletMeta1.getCompacted());
       assertEquals(Set.of(), context.getAmple().readTablet(e2).getCompacted());
 
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED)
-          .putCompacted(fateId4).putCompacted(fateId5).submit(tabletMetadata -> false);
-
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED)
+            .putCompacted(fateId4).putCompacted(fateId5).submit(tabletMetadata -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       tabletMeta1 = context.getAmple().readTablet(e1);
       assertEquals(Set.of(fateId2, fateId4, fateId5), tabletMeta1.getCompacted());
 
       // test require same with a superset
-      ctmi = new ConditionalTabletsMutatorImpl(context);
       tabletMeta1 = TabletMetadata.builder(e2).putCompacted(fateId2).putCompacted(fateId4)
           .putCompacted(fateId5).putCompacted(fateId1).build(COMPACTED);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED)
-          .deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5)
-          .submit(tabletMetadata -> false);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED)
+            .deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5)
+            .submit(tabletMetadata -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Set.of(fateId2, fateId4, fateId5),
           context.getAmple().readTablet(e1).getCompacted());
 
       // test require same with a subset
-      ctmi = new ConditionalTabletsMutatorImpl(context);
       tabletMeta1 =
           TabletMetadata.builder(e2).putCompacted(fateId2).putCompacted(fateId4).build(COMPACTED);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED)
-          .deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5)
-          .submit(tabletMetadata -> false);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED)
+            .deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5)
+            .submit(tabletMetadata -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Set.of(fateId2, fateId4, fateId5),
           context.getAmple().readTablet(e1).getCompacted());
 
       // now use the exact set the tablet has
-      ctmi = new ConditionalTabletsMutatorImpl(context);
       tabletMeta1 = TabletMetadata.builder(e2).putCompacted(fateId2).putCompacted(fateId4)
           .putCompacted(fateId5).build(COMPACTED);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED)
-          .deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5)
-          .submit(tabletMetadata -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, COMPACTED)
+            .deleteCompacted(fateId2).deleteCompacted(fateId4).deleteCompacted(fateId5)
+            .submit(tabletMetadata -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Set.of(), context.getAmple().readTablet(e1).getCompacted());
     }
   }
@@ -1083,27 +1041,27 @@
     TabletOperationId opid =
         TabletOperationId.from(TabletOperationType.MERGING, FateId.from(type, UUID.randomUUID()));
 
-    var ctmi = new ConditionalTabletsMutatorImpl(context);
-    ctmi.mutateTablet(RootTable.EXTENT).requireAbsentOperation().requireAbsentLocation()
-        .putOperation(opid).submit(tm -> false);
-    var results = ctmi.process();
-    assertEquals(Status.REJECTED, results.get(RootTable.EXTENT).getStatus());
+    try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+      ctmi.mutateTablet(RootTable.EXTENT).requireAbsentOperation().requireAbsentLocation()
+          .putOperation(opid).submit(tm -> false);
+      assertEquals(Status.REJECTED, ctmi.process().get(RootTable.EXTENT).getStatus());
+    }
     assertNull(context.getAmple().readTablet(RootTable.EXTENT).getOperationId());
 
-    ctmi = new ConditionalTabletsMutatorImpl(context);
-    ctmi.mutateTablet(RootTable.EXTENT).requireAbsentOperation()
-        .requireLocation(Location.future(loc.getServerInstance())).putOperation(opid)
-        .submit(tm -> false);
-    results = ctmi.process();
-    assertEquals(Status.REJECTED, results.get(RootTable.EXTENT).getStatus());
+    try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+      ctmi.mutateTablet(RootTable.EXTENT).requireAbsentOperation()
+          .requireLocation(Location.future(loc.getServerInstance())).putOperation(opid)
+          .submit(tm -> false);
+      assertEquals(Status.REJECTED, ctmi.process().get(RootTable.EXTENT).getStatus());
+    }
     assertNull(context.getAmple().readTablet(RootTable.EXTENT).getOperationId());
 
-    ctmi = new ConditionalTabletsMutatorImpl(context);
-    ctmi.mutateTablet(RootTable.EXTENT).requireAbsentOperation()
-        .requireLocation(Location.current(loc.getServerInstance())).putOperation(opid)
-        .submit(tm -> false);
-    results = ctmi.process();
-    assertEquals(Status.ACCEPTED, results.get(RootTable.EXTENT).getStatus());
+    try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+      ctmi.mutateTablet(RootTable.EXTENT).requireAbsentOperation()
+          .requireLocation(Location.current(loc.getServerInstance())).putOperation(opid)
+          .submit(tm -> false);
+      assertEquals(Status.ACCEPTED, ctmi.process().get(RootTable.EXTENT).getStatus());
+    }
     assertEquals(opid.canonical(),
         context.getAmple().readTablet(RootTable.EXTENT).getOperationId().canonical());
   }
@@ -1115,24 +1073,24 @@
 
       for (var time : List.of(new MetadataTime(100, TimeType.LOGICAL),
           new MetadataTime(100, TimeType.MILLIS), new MetadataTime(0, TimeType.LOGICAL))) {
-        var ctmi = new ConditionalTabletsMutatorImpl(context);
         var tabletMeta1 = TabletMetadata.builder(e1).putTime(time).build();
-        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, TIME)
-            .putTime(new MetadataTime(101, TimeType.LOGICAL)).submit(tabletMetadata -> false);
-        var results = ctmi.process();
-        assertEquals(Status.REJECTED, results.get(e1).getStatus());
+        try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+          ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, TIME)
+              .putTime(new MetadataTime(101, TimeType.LOGICAL)).submit(tabletMetadata -> false);
+          assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+        }
         assertEquals(new MetadataTime(0, TimeType.MILLIS),
             context.getAmple().readTablet(e1).getTime());
       }
 
       for (int i = 0; i < 10; i++) {
-        var ctmi = new ConditionalTabletsMutatorImpl(context);
         var tabletMeta1 =
             TabletMetadata.builder(e1).putTime(new MetadataTime(i, TimeType.MILLIS)).build();
-        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, TIME)
-            .putTime(new MetadataTime(i + 1, TimeType.MILLIS)).submit(tabletMetadata -> false);
-        var results = ctmi.process();
-        assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+        try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+          ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, TIME)
+              .putTime(new MetadataTime(i + 1, TimeType.MILLIS)).submit(tabletMetadata -> false);
+          assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+        }
         assertEquals(new MetadataTime(i + 1, TimeType.MILLIS),
             context.getAmple().readTablet(e1).getTime());
       }
@@ -1144,82 +1102,80 @@
     try (AccumuloClient c = Accumulo.newClient().from(getClientProps()).build()) {
       var context = cluster.getServerContext();
 
-      var ctmi = new ConditionalTabletsMutatorImpl(context);
-
       FateInstanceType type = FateInstanceType.fromTableId(tid);
       FateId fateId1 = FateId.from(type, UUID.randomUUID());
       FateId fateId2 = FateId.from(type, UUID.randomUUID());
       FateId fateId3 = FateId.from(type, UUID.randomUUID());
       FateId fateId4 = FateId.from(type, UUID.randomUUID());
       FateId fateId5 = FateId.from(type, UUID.randomUUID());
-
       var tabletMeta1 = TabletMetadata.builder(e1).build(USER_COMPACTION_REQUESTED);
-      ctmi.mutateTablet(e1).requireAbsentOperation()
-          .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId2)
-          .submit(tabletMetadata -> tabletMetadata.getUserCompactionsRequested().contains(fateId2));
-      var tabletMeta2 = TabletMetadata.builder(e2).putUserCompactionRequested(fateId1)
-          .build(USER_COMPACTION_REQUESTED);
-      ctmi.mutateTablet(e2).requireAbsentOperation()
-          .requireSame(tabletMeta2, USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId3)
-          .submit(tabletMetadata -> tabletMetadata.getUserCompactionsRequested().contains(fateId3));
 
-      var results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-      assertEquals(Status.REJECTED, results.get(e2).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation()
+            .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId2)
+            .submit(
+                tabletMetadata -> tabletMetadata.getUserCompactionsRequested().contains(fateId2));
+        var tabletMeta2 = TabletMetadata.builder(e2).putUserCompactionRequested(fateId1)
+            .build(USER_COMPACTION_REQUESTED);
+        ctmi.mutateTablet(e2).requireAbsentOperation()
+            .requireSame(tabletMeta2, USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId3)
+            .submit(
+                tabletMetadata -> tabletMetadata.getUserCompactionsRequested().contains(fateId3));
+        var results = ctmi.process();
+        assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+        assertEquals(Status.REJECTED, results.get(e2).getStatus());
+      }
       tabletMeta1 = context.getAmple().readTablet(e1);
       assertEquals(Set.of(fateId2), tabletMeta1.getUserCompactionsRequested());
       assertEquals(Set.of(), context.getAmple().readTablet(e2).getUserCompactionsRequested());
 
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation()
-          .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId4)
-          .putUserCompactionRequested(fateId5).submit(tabletMetadata -> false);
-
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation()
+            .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED).putUserCompactionRequested(fateId4)
+            .putUserCompactionRequested(fateId5).submit(tabletMetadata -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       tabletMeta1 = context.getAmple().readTablet(e1);
       assertEquals(Set.of(fateId2, fateId4, fateId5), tabletMeta1.getUserCompactionsRequested());
 
       // test require same with a superset
-      ctmi = new ConditionalTabletsMutatorImpl(context);
       tabletMeta1 = TabletMetadata.builder(e2).putUserCompactionRequested(fateId2)
           .putUserCompactionRequested(fateId4).putUserCompactionRequested(fateId5)
           .putUserCompactionRequested(fateId1).build(USER_COMPACTION_REQUESTED);
-      ctmi.mutateTablet(e1).requireAbsentOperation()
-          .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED)
-          .deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4)
-          .deleteUserCompactionRequested(fateId5).submit(tabletMetadata -> false);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation()
+            .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED)
+            .deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4)
+            .deleteUserCompactionRequested(fateId5).submit(tabletMetadata -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Set.of(fateId2, fateId4, fateId5),
           context.getAmple().readTablet(e1).getUserCompactionsRequested());
 
       // test require same with a subset
-      ctmi = new ConditionalTabletsMutatorImpl(context);
       tabletMeta1 = TabletMetadata.builder(e2).putUserCompactionRequested(fateId2)
           .putUserCompactionRequested(fateId4).build(USER_COMPACTION_REQUESTED);
-      ctmi.mutateTablet(e1).requireAbsentOperation()
-          .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED)
-          .deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4)
-          .deleteUserCompactionRequested(fateId5).submit(tabletMetadata -> false);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation()
+            .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED)
+            .deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4)
+            .deleteUserCompactionRequested(fateId5).submit(tabletMetadata -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Set.of(fateId2, fateId4, fateId5),
           context.getAmple().readTablet(e1).getUserCompactionsRequested());
 
       // now use the exact set the tablet has
-      ctmi = new ConditionalTabletsMutatorImpl(context);
       tabletMeta1 = TabletMetadata.builder(e2).putUserCompactionRequested(fateId2)
           .putUserCompactionRequested(fateId4).putUserCompactionRequested(fateId5)
           .build(USER_COMPACTION_REQUESTED);
-      ctmi.mutateTablet(e1).requireAbsentOperation()
-          .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED)
-          .deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4)
-          .deleteUserCompactionRequested(fateId5).submit(tabletMetadata -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation()
+            .requireSame(tabletMeta1, USER_COMPACTION_REQUESTED)
+            .deleteUserCompactionRequested(fateId2).deleteUserCompactionRequested(fateId4)
+            .deleteUserCompactionRequested(fateId5).submit(tabletMetadata -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(Set.of(), context.getAmple().readTablet(e1).getUserCompactionsRequested());
     }
   }
@@ -1269,7 +1225,6 @@
     @Test
     public void multipleFilters() {
       ServerContext context = cluster.getServerContext();
-      ConditionalTabletsMutatorImpl ctmi;
 
       // make sure we read all tablets on table initially with no filters
       testFilterApplied(context, Set.of(), Set.of(e1, e2, e3, e4),
@@ -1285,12 +1240,12 @@
       for (KeyExtent ke : tabletsWithWalCompactFlush) {
         FateInstanceType type = FateInstanceType.fromTableId(ke.tableId());
         FateId fateId = FateId.from(type, UUID.randomUUID());
-        ctmi = new ConditionalTabletsMutatorImpl(context);
-        ctmi.mutateTablet(ke).requireAbsentOperation().putCompacted(fateId)
-            .putFlushId(TestTabletMetadataFilter.VALID_FLUSH_ID).putWal(wal)
-            .submit(tabletMetadata -> false);
-        var results = ctmi.process();
-        assertEquals(Status.ACCEPTED, results.get(ke).getStatus());
+        try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+          ctmi.mutateTablet(ke).requireAbsentOperation().putCompacted(fateId)
+              .putFlushId(TestTabletMetadataFilter.VALID_FLUSH_ID).putWal(wal)
+              .submit(tabletMetadata -> false);
+          assertEquals(Status.ACCEPTED, ctmi.process().get(ke).getStatus());
+        }
       }
       // check that applying a combination of filters returns only tablets that meet the criteria
       testFilterApplied(context, Set.of(new TestTabletMetadataFilter(), new GcWalsFilter(Set.of())),
@@ -1301,11 +1256,11 @@
       // on a subset of the tablets, put a location
       final Set<KeyExtent> tabletsWithLocation = Set.of(e2, e3, e4);
       for (KeyExtent ke : tabletsWithLocation) {
-        ctmi = new ConditionalTabletsMutatorImpl(context);
-        ctmi.mutateTablet(ke).requireAbsentOperation().requireAbsentLocation()
-            .putLocation(Location.current(serverInstance)).submit(tabletMetadata -> false);
-        var results = ctmi.process();
-        assertEquals(Status.ACCEPTED, results.get(ke).getStatus());
+        try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+          ctmi.mutateTablet(ke).requireAbsentOperation().requireAbsentLocation()
+              .putLocation(Location.current(serverInstance)).submit(tabletMetadata -> false);
+          assertEquals(Status.ACCEPTED, ctmi.process().get(ke).getStatus());
+        }
         assertEquals(Location.current(serverInstance),
             context.getAmple().readTablet(ke).getLocation(),
             "Did not see expected location after adding it");
@@ -1323,48 +1278,50 @@
     @Test
     public void testCompactedAndFlushIdFilter() {
       ServerContext context = cluster.getServerContext();
-      ConditionalTabletsMutatorImpl ctmi = new ConditionalTabletsMutatorImpl(context);
       Set<TabletMetadataFilter> filter = Set.of(new TestTabletMetadataFilter());
       FateInstanceType type = FateInstanceType.fromTableId(tid);
       FateId fateId1 = FateId.from(type, UUID.randomUUID());
       FateId fateId2 = FateId.from(type, UUID.randomUUID());
 
-      // make sure we read all tablets on table initially with no filters
-      testFilterApplied(context, Set.of(), Set.of(e1, e2, e3, e4),
-          "Initially, all tablets should be present");
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        // make sure we read all tablets on table initially with no filters
+        testFilterApplied(context, Set.of(), Set.of(e1, e2, e3, e4),
+            "Initially, all tablets should be present");
+      }
 
-      // Set compacted on e2 but with no flush ID
-      ctmi.mutateTablet(e2).requireAbsentOperation().putCompacted(fateId1)
-          .submit(tabletMetadata -> false);
-      var results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        // Set compacted on e2 but with no flush ID
+        ctmi.mutateTablet(e2).requireAbsentOperation().putCompacted(fateId1)
+            .submit(tabletMetadata -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e2).getStatus());
+      }
       testFilterApplied(context, filter, Set.of(),
           "Compacted but no flush ID should return no tablets");
 
       // Set incorrect flush ID on e2
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e2).requireAbsentOperation().putFlushId(45L)
-          .submit(tabletMetadata -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e2).requireAbsentOperation().putFlushId(45L)
+            .submit(tabletMetadata -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e2).getStatus());
+      }
       testFilterApplied(context, filter, Set.of(),
           "Compacted with incorrect flush ID should return no tablets");
 
       // Set correct flush ID on e2
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e2).requireAbsentOperation()
-          .putFlushId(TestTabletMetadataFilter.VALID_FLUSH_ID).submit(tabletMetadata -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e2).requireAbsentOperation()
+            .putFlushId(TestTabletMetadataFilter.VALID_FLUSH_ID).submit(tabletMetadata -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e2).getStatus());
+      }
       testFilterApplied(context, filter, Set.of(e2),
           "Compacted with correct flush ID should return e2");
 
       // Set compacted and correct flush ID on e3
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e3).requireAbsentOperation().putCompacted(fateId2)
-          .putFlushId(TestTabletMetadataFilter.VALID_FLUSH_ID).submit(tabletMetadata -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e3).requireAbsentOperation().putCompacted(fateId2)
+            .putFlushId(TestTabletMetadataFilter.VALID_FLUSH_ID).submit(tabletMetadata -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e3).getStatus());
+      }
       testFilterApplied(context, filter, Set.of(e2, e3),
           "Compacted with correct flush ID should return e2 and e3");
     }
@@ -1372,7 +1329,7 @@
     @Test
     public void walFilter() {
       ServerContext context = cluster.getServerContext();
-      ConditionalTabletsMutatorImpl ctmi = new ConditionalTabletsMutatorImpl(context);
+
       Set<TabletMetadataFilter> filter = Set.of(new GcWalsFilter(Set.of()));
 
       // make sure we read all tablets on table initially with no filters
@@ -1380,33 +1337,35 @@
           "Initially, all tablets should be present");
 
       // add a wal to e2
-      String walFilePath =
+      var walFilePath =
           java.nio.file.Path.of("tserver+8080", UUID.randomUUID().toString()).toString();
-      LogEntry wal = LogEntry.fromPath(walFilePath);
-      ctmi.mutateTablet(e2).requireAbsentOperation().putWal(wal).submit(tabletMetadata -> false);
-      var results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
+      var wal = LogEntry.fromPath(walFilePath);
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e2).requireAbsentOperation().putWal(wal).submit(tabletMetadata -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e2).getStatus());
+      }
 
       // test that the filter works
       testFilterApplied(context, filter, Set.of(e2), "Only tablets with wals should be returned");
 
       // add wal to tablet e4
-      ctmi = new ConditionalTabletsMutatorImpl(context);
       walFilePath = java.nio.file.Path.of("tserver+8080", UUID.randomUUID().toString()).toString();
       wal = LogEntry.fromPath(walFilePath);
-      ctmi.mutateTablet(e4).requireAbsentOperation().putWal(wal).submit(tabletMetadata -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e4).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e4).requireAbsentOperation().putWal(wal).submit(tabletMetadata -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e4).getStatus());
+      }
 
       // now, when using the wal filter, should see both e2 and e4
       testFilterApplied(context, filter, Set.of(e2, e4),
           "Only tablets with wals should be returned");
 
       // remove the wal from e4
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e4).requireAbsentOperation().deleteWal(wal).submit(tabletMetadata -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e4).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e4).requireAbsentOperation().deleteWal(wal)
+            .submit(tabletMetadata -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e4).getStatus());
+      }
 
       // test that now only the tablet with a wal is returned when using filter()
       testFilterApplied(context, filter, Set.of(e2), "Only tablets with wals should be returned");
@@ -1414,20 +1373,21 @@
       var ts1 = new TServerInstance("localhost:9997", 5000L);
       var ts2 = new TServerInstance("localhost:9997", 6000L);
 
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
-          .putLocation(Location.future(ts1)).submit(tabletMetadata -> false);
-      ctmi.mutateTablet(e2).requireAbsentOperation().requireAbsentLocation()
-          .putLocation(Location.current(ts1)).submit(tabletMetadata -> false);
-      ctmi.mutateTablet(e3).requireAbsentOperation().requireAbsentLocation()
-          .putLocation(Location.future(ts2)).submit(tabletMetadata -> false);
-      ctmi.mutateTablet(e4).requireAbsentOperation().requireAbsentLocation()
-          .putLocation(Location.current(ts2)).submit(tabletMetadata -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
-      assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
-      assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
-      assertEquals(Status.ACCEPTED, results.get(e4).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireAbsentLocation()
+            .putLocation(Location.future(ts1)).submit(tabletMetadata -> false);
+        ctmi.mutateTablet(e2).requireAbsentOperation().requireAbsentLocation()
+            .putLocation(Location.current(ts1)).submit(tabletMetadata -> false);
+        ctmi.mutateTablet(e3).requireAbsentOperation().requireAbsentLocation()
+            .putLocation(Location.future(ts2)).submit(tabletMetadata -> false);
+        ctmi.mutateTablet(e4).requireAbsentOperation().requireAbsentLocation()
+            .putLocation(Location.current(ts2)).submit(tabletMetadata -> false);
+        var results = ctmi.process();
+        assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+        assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
+        assertEquals(Status.ACCEPTED, results.get(e3).getStatus());
+        assertEquals(Status.ACCEPTED, results.get(e4).getStatus());
+      }
 
       testFilterApplied(context, filter, Set.of(e1, e2, e3, e4),
           "All tablets should appear to be assigned to dead tservers and be returned");
@@ -1469,39 +1429,42 @@
 
       assertTrue(context.getAmple().readTablet(e1).getFlushId().isEmpty());
 
-      var ctmi = new ConditionalTabletsMutatorImpl(context);
-
       var tabletMeta1 = TabletMetadata.builder(e1).putFlushId(42L).build();
       assertTrue(tabletMeta1.getFlushId().isPresent());
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, FLUSH_ID)
-          .putFlushId(43L).submit(tabletMetadata -> tabletMetadata.getFlushId().orElse(-1) == 43L);
-      var results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, FLUSH_ID)
+            .putFlushId(43L)
+            .submit(tabletMetadata -> tabletMetadata.getFlushId().orElse(-1) == 43L);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertTrue(context.getAmple().readTablet(e1).getFlushId().isEmpty());
 
-      ctmi = new ConditionalTabletsMutatorImpl(context);
       var tabletMeta2 = TabletMetadata.builder(e1).build(FLUSH_ID);
       assertFalse(tabletMeta2.getFlushId().isPresent());
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta2, FLUSH_ID)
-          .putFlushId(43L).submit(tabletMetadata -> tabletMetadata.getFlushId().orElse(-1) == 43L);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta2, FLUSH_ID)
+            .putFlushId(43L)
+            .submit(tabletMetadata -> tabletMetadata.getFlushId().orElse(-1) == 43L);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(43L, context.getAmple().readTablet(e1).getFlushId().getAsLong());
 
-      ctmi = new ConditionalTabletsMutatorImpl(context);
       var tabletMeta3 = TabletMetadata.builder(e1).putFlushId(43L).build();
-      assertTrue(tabletMeta1.getFlushId().isPresent());
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta3, FLUSH_ID)
-          .putFlushId(44L).submit(tabletMetadata -> tabletMetadata.getFlushId().orElse(-1) == 44L);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+      assertTrue(tabletMeta3.getFlushId().isPresent());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta3, FLUSH_ID)
+            .putFlushId(44L)
+            .submit(tabletMetadata -> tabletMetadata.getFlushId().orElse(-1) == 44L);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(44L, context.getAmple().readTablet(e1).getFlushId().getAsLong());
 
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta3, FLUSH_ID)
-          .putFlushId(45L).submit(tabletMetadata -> tabletMetadata.getFlushId().orElse(-1) == 45L);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta3, FLUSH_ID)
+            .putFlushId(45L)
+            .submit(tabletMetadata -> tabletMetadata.getFlushId().orElse(-1) == 45L);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(44L, context.getAmple().readTablet(e1).getFlushId().getAsLong());
     }
   }
@@ -1675,17 +1638,17 @@
       assertEquals(TabletAvailability.ONDEMAND,
           context.getAmple().readTablet(e2).getTabletAvailability());
 
-      var ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation()
-          .requireTabletAvailability(TabletAvailability.HOSTED)
-          .putTabletAvailability(TabletAvailability.UNHOSTED).submit(tm -> false);
-      ctmi.mutateTablet(e2).requireAbsentOperation()
-          .requireTabletAvailability(TabletAvailability.ONDEMAND)
-          .putTabletAvailability(TabletAvailability.UNHOSTED).submit(tm -> false);
-      var results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
-      assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
-
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation()
+            .requireTabletAvailability(TabletAvailability.HOSTED)
+            .putTabletAvailability(TabletAvailability.UNHOSTED).submit(tm -> false);
+        ctmi.mutateTablet(e2).requireAbsentOperation()
+            .requireTabletAvailability(TabletAvailability.ONDEMAND)
+            .putTabletAvailability(TabletAvailability.UNHOSTED).submit(tm -> false);
+        var results = ctmi.process();
+        assertEquals(Status.REJECTED, results.get(e1).getStatus());
+        assertEquals(Status.ACCEPTED, results.get(e2).getStatus());
+      }
       assertEquals(TabletAvailability.ONDEMAND,
           context.getAmple().readTablet(e1).getTabletAvailability());
       assertEquals(TabletAvailability.UNHOSTED,
@@ -1698,53 +1661,50 @@
     try (AccumuloClient c = Accumulo.newClient().from(getClientProps()).build()) {
       var context = cluster.getServerContext();
 
-      var ctmi = new ConditionalTabletsMutatorImpl(context);
-
       var tabletMeta1 = TabletMetadata.builder(e1).build(UNSPLITTABLE);
-
       // require the UNSPLITTABLE column to be absent when it is absent
-      UnSplittableMetadata usm1 =
-          UnSplittableMetadata.toUnSplittable(e1, 1000, 100000, 32, Set.of());
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, UNSPLITTABLE)
-          .setUnSplittable(usm1).submit(tm -> false);
-      var results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+      var usm1 = UnSplittableMetadata.toUnSplittable(e1, 1000, 100000, 32, Set.of());
+
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, UNSPLITTABLE)
+            .setUnSplittable(usm1).submit(tm -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       var tabletMeta2 = context.getAmple().readTablet(e1);
       assertEquals(usm1.toBase64(), tabletMeta2.getUnSplittable().toBase64());
 
       // require the UNSPLITTABLE column to be absent when it is not absent
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, UNSPLITTABLE)
-          .deleteUnSplittable().submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, UNSPLITTABLE)
+            .deleteUnSplittable().submit(tm -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(usm1.toBase64(), context.getAmple().readTablet(e1).getUnSplittable().toBase64());
 
-      UnSplittableMetadata usm2 =
-          UnSplittableMetadata.toUnSplittable(e1, 1001, 100001, 33, Set.of());
+      var usm2 = UnSplittableMetadata.toUnSplittable(e1, 1001, 100001, 33, Set.of());
       var tabletMeta3 = TabletMetadata.builder(e1).setUnSplittable(usm2).build(UNSPLITTABLE);
       // require the UNSPLITTABLE column to be usm2 when it is actually usm1
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta3, UNSPLITTABLE)
-          .deleteUnSplittable().submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta3, UNSPLITTABLE)
+            .deleteUnSplittable().submit(tm -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertEquals(usm1.toBase64(), context.getAmple().readTablet(e1).getUnSplittable().toBase64());
 
       // require the UNSPLITTABLE column to be usm1 when it is actually usm1
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta2, UNSPLITTABLE)
-          .deleteUnSplittable().submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.ACCEPTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta2, UNSPLITTABLE)
+            .deleteUnSplittable().submit(tm -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
+      }
       assertNull(context.getAmple().readTablet(e1).getUnSplittable());
 
       // require the UNSPLITTABLE column to be usm1 when it is actually absent
-      ctmi = new ConditionalTabletsMutatorImpl(context);
-      ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta2, UNSPLITTABLE)
-          .setUnSplittable(usm2).submit(tm -> false);
-      results = ctmi.process();
-      assertEquals(Status.REJECTED, results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta2, UNSPLITTABLE)
+            .setUnSplittable(usm2).submit(tm -> false);
+        assertEquals(Status.REJECTED, ctmi.process().get(e1).getStatus());
+      }
       assertNull(context.getAmple().readTablet(e1).getUnSplittable());
     }
   }
@@ -1754,34 +1714,36 @@
     try (AccumuloClient c = Accumulo.newClient().from(getClientProps()).build()) {
       var context = cluster.getServerContext();
 
-      var ctmi1 = new ConditionalTabletsMutatorImpl(context);
-      ctmi1.mutateTablet(e1).requireAbsentTablet().putDirName("d1").submit(tm -> false);
-      // making multiple updates for the same tablet is not supported
-      assertThrows(IllegalStateException.class,
-          () -> ctmi1.mutateTablet(e1).requireAbsentTablet().putDirName("d2").submit(tm -> false));
-      // attempt to use a column that requireSame does not support
-      TabletMetadata tabletMetadata = TabletMetadata.builder(e2).build();
-      assertThrows(UnsupportedOperationException.class,
-          () -> ctmi1.mutateTablet(e2).requireAbsentOperation()
-              .requireSame(tabletMetadata, HOSTING_REQUESTED).putDirName("d2").submit(tm -> false));
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentTablet().putDirName("d1").submit(tm -> false);
+        // making multiple updates for the same tablet is not supported
+        assertThrows(IllegalStateException.class,
+            () -> ctmi.mutateTablet(e1).requireAbsentTablet().putDirName("d2").submit(tm -> false));
+        // attempt to use a column that requireSame does not support
+        TabletMetadata tabletMetadata = TabletMetadata.builder(e2).build();
+        assertThrows(UnsupportedOperationException.class,
+            () -> ctmi.mutateTablet(e2).requireAbsentOperation()
+                .requireSame(tabletMetadata, HOSTING_REQUESTED).putDirName("d2")
+                .submit(tm -> false));
+      }
 
-      var ctmi2 = new ConditionalTabletsMutatorImpl(context);
-      // the following end prev end row update should cause a constraint violation because a tablets
-      // prev end row must be less than its end row
-      ctmi2.mutateTablet(e1).requireAbsentOperation().putPrevEndRow(e1.endRow())
-          .submit(tm -> false);
-      var results = ctmi2.process();
-      // getting status when a constraint violation happened should throw an exception
-      assertThrows(IllegalStateException.class, () -> results.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        // the following end prev end row update should cause a constraint violation because a
+        // tablet's prev end row must be less than its end row
+        ctmi.mutateTablet(e1).requireAbsentOperation().putPrevEndRow(e1.endRow())
+            .submit(tm -> false);
+        // getting status when a constraint violation happened should throw an exception
+        assertThrows(IllegalStateException.class, () -> ctmi.process().get(e1).getStatus());
+      }
 
-      var ctmi3 = new ConditionalTabletsMutatorImpl(context);
-      ctmi3.mutateTablet(e1).requireAbsentOperation().putFlushNonce(1234).submit(tm -> false);
-      var results2 = ctmi3.process();
-      assertEquals(Status.ACCEPTED, results2.get(e1).getStatus());
+      try (var ctmi = new ConditionalTabletsMutatorImpl(context)) {
+        ctmi.mutateTablet(e1).requireAbsentOperation().putFlushNonce(1234).submit(tm -> false);
+        assertEquals(Status.ACCEPTED, ctmi.process().get(e1).getStatus());
 
-      // attempting to use after calling proccess() should throw an exception
-      assertThrows(IllegalStateException.class, () -> ctmi3.mutateTablet(e1)
-          .requireAbsentOperation().putFlushNonce(1234).submit(tm -> false));
+        // attempting to use after calling proccess() should throw an exception
+        assertThrows(IllegalStateException.class, () -> ctmi.mutateTablet(e1)
+            .requireAbsentOperation().putFlushNonce(1234).submit(tm -> false));
+      }
     }
   }
 }
diff --git a/test/src/main/java/org/apache/accumulo/test/functional/BinaryStressIT.java b/test/src/main/java/org/apache/accumulo/test/functional/BinaryStressIT.java
index 6705473..1d9b7ea 100644
--- a/test/src/main/java/org/apache/accumulo/test/functional/BinaryStressIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/functional/BinaryStressIT.java
@@ -20,7 +20,6 @@
 
 import java.time.Duration;
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
@@ -57,8 +56,6 @@
     cfg.setProperty(Property.TSERV_MAXMEM, "50K");
   }
 
-  private String majcDelay, maxMem;
-
   @BeforeEach
   public void alterConfig() throws Exception {
     if (getClusterType() == ClusterType.MINI) {
@@ -66,8 +63,6 @@
     }
     try (AccumuloClient client = Accumulo.newClient().from(getClientProps()).build()) {
       InstanceOperations iops = client.instanceOperations();
-      Map<String,String> conf = iops.getSystemConfiguration();
-      maxMem = conf.get(Property.TSERV_MAXMEM.getKey());
 
       iops.setProperty(Property.TSERV_MAXMEM.getKey(), "50K");
 
diff --git a/test/src/main/java/org/apache/accumulo/test/functional/BulkNewIT.java b/test/src/main/java/org/apache/accumulo/test/functional/BulkNewIT.java
index 27b5f80..df256d2 100644
--- a/test/src/main/java/org/apache/accumulo/test/functional/BulkNewIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/functional/BulkNewIT.java
@@ -222,29 +222,28 @@
 
   @Test
   public void testSetTime() throws Exception {
-    try (AccumuloClient client = Accumulo.newClient().from(getClientProps()).build()) {
+    try (var client = (ClientContext) Accumulo.newClient().from(getClientProps()).build()) {
       tableName = "testSetTime_table1";
       NewTableConfiguration newTableConf = new NewTableConfiguration();
       // set logical time type so we can set time on bulk import
       newTableConf.setTimeType(TimeType.LOGICAL);
       client.tableOperations().create(tableName, newTableConf);
 
-      var ctx = (ClientContext) client;
-
-      var tablet = ctx.getAmple().readTablet(new KeyExtent(ctx.getTableId(tableName), null, null));
+      var tablet =
+          client.getAmple().readTablet(new KeyExtent(client.getTableId(tableName), null, null));
       assertEquals(new MetadataTime(0, TimeType.LOGICAL), tablet.getTime());
 
-      var extent = new KeyExtent(ctx.getTableId(tableName), new Text("0333"), null);
+      var extent = new KeyExtent(client.getTableId(tableName), new Text("0333"), null);
 
       testSingleTabletSingleFile(client, false, true, () -> {
         // Want to test with and without a location, assuming the tablet does not have a location
         // now. Need to validate that assumption.
-        assertNull(ctx.getAmple().readTablet(extent).getLocation());
+        assertNull(client.getAmple().readTablet(extent).getLocation());
         return null;
       });
 
       assertEquals(new MetadataTime(1, TimeType.LOGICAL),
-          ctx.getAmple().readTablet(extent).getTime());
+          client.getAmple().readTablet(extent).getTime());
 
       int added = 0;
       try (var writer = client.createBatchWriter(tableName);
@@ -263,7 +262,7 @@
       // Writes to a tablet should not change time unless it flushes, so time in metadata table
       // should be the same
       assertEquals(new MetadataTime(1, TimeType.LOGICAL),
-          ctx.getAmple().readTablet(extent).getTime());
+          client.getAmple().readTablet(extent).getTime());
 
       // verify data written by batch writer overwrote bulk imported data
       try (var scanner = client.createScanner(tableName)) {
@@ -298,13 +297,13 @@
 
       // the bulk import should update the time in the metadata table
       assertEquals(new MetadataTime(2 + added, TimeType.LOGICAL),
-          ctx.getAmple().readTablet(extent).getTime());
+          client.getAmple().readTablet(extent).getTime());
 
       client.tableOperations().flush(tableName, null, null, true);
 
       // the flush should not change the time in the metadata table
       assertEquals(new MetadataTime(2 + added, TimeType.LOGICAL),
-          ctx.getAmple().readTablet(extent).getTime());
+          client.getAmple().readTablet(extent).getTime());
 
       try (var scanner = client.createScanner("accumulo.metadata")) {
         scanner.forEach((k, v) -> System.out.println(k + " " + v));
diff --git a/test/src/main/java/org/apache/accumulo/test/functional/LargeRowIT.java b/test/src/main/java/org/apache/accumulo/test/functional/LargeRowIT.java
index 8aa3360..715f47f 100644
--- a/test/src/main/java/org/apache/accumulo/test/functional/LargeRowIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/functional/LargeRowIT.java
@@ -78,7 +78,6 @@
   private String REG_TABLE_NAME;
   private String PRE_SPLIT_TABLE_NAME;
   private int timeoutFactor = 1;
-  private String tservMajcDelay;
 
   @BeforeEach
   public void getTimeoutFactor() throws Exception {
diff --git a/test/src/main/java/org/apache/accumulo/test/functional/ManyWriteAheadLogsIT.java b/test/src/main/java/org/apache/accumulo/test/functional/ManyWriteAheadLogsIT.java
index aa2d54d..1beb80c 100644
--- a/test/src/main/java/org/apache/accumulo/test/functional/ManyWriteAheadLogsIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/functional/ManyWriteAheadLogsIT.java
@@ -53,8 +53,6 @@
 
   private static final Logger log = LoggerFactory.getLogger(ManyWriteAheadLogsIT.class);
 
-  private String walSize;
-
   @Override
   public void configureMiniCluster(MiniAccumuloConfigImpl cfg, Configuration hadoopCoreSite) {
     // configure a smaller wal size so the wals will roll frequently in the test
@@ -78,8 +76,6 @@
     }
     try (AccumuloClient client = Accumulo.newClient().from(getClientProps()).build()) {
       InstanceOperations iops = client.instanceOperations();
-      Map<String,String> conf = iops.getSystemConfiguration();
-      walSize = conf.get(Property.TSERV_WAL_MAX_SIZE.getKey());
       iops.setProperty(Property.TSERV_WAL_MAX_SIZE.getKey(), "1M");
 
       getClusterControl().stopAllServers(ServerType.TABLET_SERVER);
diff --git a/test/src/main/java/org/apache/accumulo/test/functional/SplitIT.java b/test/src/main/java/org/apache/accumulo/test/functional/SplitIT.java
index f444eab..cee49c3 100644
--- a/test/src/main/java/org/apache/accumulo/test/functional/SplitIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/functional/SplitIT.java
@@ -39,7 +39,6 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.concurrent.Callable;
@@ -104,7 +103,7 @@
     cfg.setMemory(ServerType.TABLET_SERVER, 384, MemoryUnit.MEGABYTE);
   }
 
-  private String tservMaxMem, tservMajcDelay;
+  private String tservMaxMem;
 
   @BeforeEach
   public void alterConfig() throws Exception {
@@ -115,12 +114,10 @@
       tservMaxMem = config.get(Property.TSERV_MAXMEM.getKey());
 
       // Property.TSERV_MAXMEM can't be altered on a running server
-      boolean restarted = false;
       if (!tservMaxMem.equals("5K")) {
         iops.setProperty(Property.TSERV_MAXMEM.getKey(), "5K");
         getCluster().getClusterControl().stopAllServers(ServerType.TABLET_SERVER);
         getCluster().getClusterControl().startAllServers(ServerType.TABLET_SERVER);
-        restarted = true;
       }
     }
   }
@@ -555,7 +552,7 @@
 
       // remove the srv:lock column for tests as this will change
       // because we are changing the metadata from the IT.
-      var original = (SortedMap<Key,Value>) tabletMetadata.getKeyValues().stream()
+      var original = tabletMetadata.getKeyValues().stream()
           .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a1, b1) -> b1, TreeMap::new));
       assertTrue(original.keySet().removeIf(LOCK_COLUMN::hasColumns));
 
@@ -570,7 +567,7 @@
       assertEquals(extent, tabletMetadata.getExtent());
 
       // tablet should have an operation id set, but nothing else changed
-      var kvCopy = (SortedMap<Key,Value>) tabletMetadata2.getKeyValues().stream()
+      var kvCopy = tabletMetadata2.getKeyValues().stream()
           .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a, b) -> b, TreeMap::new));
       assertTrue(kvCopy.keySet().removeIf(LOCK_COLUMN::hasColumns));
       assertTrue(kvCopy.keySet().removeIf(OPID_COLUMN::hasColumns));
diff --git a/test/src/main/java/org/apache/accumulo/test/metrics/MetricsIT.java b/test/src/main/java/org/apache/accumulo/test/metrics/MetricsIT.java
index 4270627..7880f4f 100644
--- a/test/src/main/java/org/apache/accumulo/test/metrics/MetricsIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/metrics/MetricsIT.java
@@ -202,6 +202,8 @@
                 case COMPACTOR_JOB_PRIORITY_QUEUE_JOBS_PRIORITY:
                   queueMetricsSeen.set(compactionPriorityQueuePriorityBit, true);
                   break;
+                default:
+                  break;
               }
             } else {
               // completely unexpected metric
diff --git a/test/src/main/java/org/apache/accumulo/test/performance/NullTserver.java b/test/src/main/java/org/apache/accumulo/test/performance/NullTserver.java
index f428aaf..f15968e 100644
--- a/test/src/main/java/org/apache/accumulo/test/performance/NullTserver.java
+++ b/test/src/main/java/org/apache/accumulo/test/performance/NullTserver.java
@@ -35,9 +35,6 @@
 import org.apache.accumulo.core.conf.DefaultConfiguration;
 import org.apache.accumulo.core.conf.Property;
 import org.apache.accumulo.core.conf.SiteConfiguration;
-import org.apache.accumulo.core.data.Range;
-import org.apache.accumulo.core.data.TableId;
-import org.apache.accumulo.core.dataImpl.KeyExtent;
 import org.apache.accumulo.core.dataImpl.thrift.InitialMultiScan;
 import org.apache.accumulo.core.dataImpl.thrift.InitialScan;
 import org.apache.accumulo.core.dataImpl.thrift.IterInfo;
@@ -361,10 +358,7 @@
       context.setServiceLock(miniLock);
       HostAndPort addr = HostAndPort.fromParts(InetAddress.getLocalHost().getHostName(), opts.port);
 
-      TableId tableId = context.getTableId(opts.tableName);
-
       // read the locations for the table
-      Range tableRange = new KeyExtent(tableId, null, null).toMetaRange();
       List<Assignment> assignments = new ArrayList<>();
       try (var tablets = context.getAmple().readTablets().forLevel(DataLevel.USER).build()) {
         long randomSessionID = opts.port;
@@ -377,7 +371,6 @@
         }
       }
       // point them to this server
-      final ServiceLock lock = miniLock;
       TabletStateStore store = TabletStateStore.getStoreForLevel(DataLevel.USER, context);
       store.setLocations(assignments);