This is an automated email from the ASF dual-hosted git repository.

dlmarion pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/main by this push:
     new 564667112f Replace AbstractFateStore.verifyReserved() with new method 
FateMutator.requireReserved() (#6521)
564667112f is described below

commit 564667112feb27a4417016e4c319d9a7c3f386ed
Author: Amanda Villarreal <[email protected]>
AuthorDate: Wed Sep 30 06:52:25 2026 -0500

    Replace AbstractFateStore.verifyReserved() with new method 
FateMutator.requireReserved() (#6521)
---
 .../accumulo/core/fate/user/FateMutator.java       |  5 +++
 .../accumulo/core/fate/user/FateMutatorImpl.java   | 12 ++++++
 .../accumulo/core/fate/user/UserFateStore.java     | 44 ++++++++--------------
 3 files changed, 33 insertions(+), 28 deletions(-)

diff --git 
a/core/src/main/java/org/apache/accumulo/core/fate/user/FateMutator.java 
b/core/src/main/java/org/apache/accumulo/core/fate/user/FateMutator.java
index f8a6501147..52ce044511 100644
--- a/core/src/main/java/org/apache/accumulo/core/fate/user/FateMutator.java
+++ b/core/src/main/java/org/apache/accumulo/core/fate/user/FateMutator.java
@@ -52,6 +52,11 @@ public interface FateMutator<T> {
    */
   FateMutator<T> requireUnreserved();
 
+  /**
+   * Require the transaction is reserved with the given reservation.
+   */
+  FateMutator<T> requireReserved(FateStore.FateReservation fateReservation);
+
   /**
    * Require the transaction has no fate key set.
    */
diff --git 
a/core/src/main/java/org/apache/accumulo/core/fate/user/FateMutatorImpl.java 
b/core/src/main/java/org/apache/accumulo/core/fate/user/FateMutatorImpl.java
index 26971e2c47..34dd4c1b67 100644
--- a/core/src/main/java/org/apache/accumulo/core/fate/user/FateMutatorImpl.java
+++ b/core/src/main/java/org/apache/accumulo/core/fate/user/FateMutatorImpl.java
@@ -61,6 +61,7 @@ public class FateMutatorImpl<T> implements FateMutator<T> {
   private final ConditionalMutation mutation;
   private final Supplier<ConditionalWriter> writer;
   private boolean requiredUnreserved = false;
+  private boolean requiredReserved = false;
   public static final int INITIAL_ITERATOR_PRIO = 1000000;
 
   public FateMutatorImpl(ClientContext context, String tableName, FateId 
fateId,
@@ -108,6 +109,17 @@ public class FateMutatorImpl<T> implements FateMutator<T> {
     return this;
   }
 
+  @Override
+  public FateMutator<T> requireReserved(FateStore.FateReservation 
fateReservation) {
+    Preconditions.checkState(!requiredReserved);
+    Condition condition = new 
Condition(TxAdminColumnFamily.RESERVATION_COLUMN.getColumnFamily(),
+        TxAdminColumnFamily.RESERVATION_COLUMN.getColumnQualifier())
+        .setValue(fateReservation.getSerialized());
+    mutation.addCondition(condition);
+    requiredReserved = true;
+    return this;
+  }
+
   @Override
   public FateMutator<T> requireAbsentKey() {
     Condition condition = new 
Condition(TxColumnFamily.TX_KEY_COLUMN.getColumnFamily(),
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 158c2ce1aa..dbf2421f35 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
@@ -544,10 +544,17 @@ public class UserFateStore<T> extends 
AbstractFateStore<T> {
       super(fateId, reservation);
     }
 
+    private FateMutatorImpl<T> newReservedMutator() {
+      Preconditions.checkState(isReserved(),
+          "Attempted write on unreserved FATE transaction: " + fateId);
+      Preconditions.checkState(!deleted, "Attempted write on deleted FATE 
transaction: " + fateId);
+      FateMutatorImpl<T> mutator = newMutator(fateId);
+      mutator.requireReserved(reservation);
+      return mutator;
+    }
+
     @Override
     public Repo<T> top() {
-      verifyReservedAndNotDeleted(false);
-
       return scanTx(scanner -> {
         scanner.setRange(getRow(fateId));
         scanner.setBatchSize(1);
@@ -562,8 +569,6 @@ public class UserFateStore<T> extends AbstractFateStore<T> {
 
     @Override
     public List<ReadOnlyRepo<T>> getStack() {
-      verifyReservedAndNotDeleted(false);
-
       return scanTx(scanner -> {
         scanner.setRange(getRow(fateId));
         scanner.fetchColumnFamily(RepoColumnFamily.NAME);
@@ -577,8 +582,6 @@ public class UserFateStore<T> extends AbstractFateStore<T> {
 
     @Override
     public Serializable getTransactionInfo(TxInfo txInfo) {
-      verifyReservedAndNotDeleted(false);
-
       try (Scanner scanner = context.createScanner(tableName, 
Authorizations.EMPTY)) {
         scanner.setRange(getRow(fateId));
 
@@ -600,8 +603,6 @@ public class UserFateStore<T> extends AbstractFateStore<T> {
 
     @Override
     public long timeCreated() {
-      verifyReservedAndNotDeleted(false);
-
       return scanTx(scanner -> {
         scanner.setRange(getRow(fateId));
         TxColumnFamily.CREATE_TIME_COLUMN.fetch(scanner);
@@ -612,8 +613,6 @@ public class UserFateStore<T> extends AbstractFateStore<T> {
 
     @Override
     public void push(Repo<T> repo) throws StackOverflowException {
-      verifyReservedAndNotDeleted(true);
-
       Optional<Integer> top = findTop();
 
       if (top.filter(t -> t >= MAX_REPOS).isPresent()) {
@@ -621,41 +620,32 @@ public class UserFateStore<T> extends 
AbstractFateStore<T> {
       }
 
       FateMutator<T> fateMutator =
-          
newMutator(fateId).requireStatus(REQ_PUSH_STATUS.toArray(TStatus[]::new));
+          
newReservedMutator().requireStatus(REQ_PUSH_STATUS.toArray(TStatus[]::new));
       fateMutator.putRepo(top.map(t -> t + 1).orElse(1), repo).mutate();
     }
 
     @Override
     public void pop() {
-      verifyReservedAndNotDeleted(true);
-
       Optional<Integer> top = findTop();
-      top.ifPresent(t -> 
newMutator(fateId).requireStatus(REQ_POP_STATUS.toArray(TStatus[]::new))
-          .deleteRepo(t).mutate());
+      
newReservedMutator().requireStatus(REQ_POP_STATUS.toArray(TStatus[]::new))
+          .deleteRepo(top.orElseThrow()).mutate();
     }
 
     @Override
     public void setStatus(TStatus status) {
-      verifyReservedAndNotDeleted(true);
-
-      newMutator(fateId).putStatus(status).mutate();
+      newReservedMutator().putStatus(status).mutate();
       observedStatus = status;
     }
 
     @Override
     public void setTransactionInfo(TxInfo txInfo, Serializable so) {
-      verifyReservedAndNotDeleted(true);
-
       final byte[] serialized = serializeTxInfo(so);
-
-      newMutator(fateId).putTxInfo(txInfo, serialized).mutate();
+      newReservedMutator().putTxInfo(txInfo, serialized).mutate();
     }
 
     @Override
     public void delete() {
-      verifyReservedAndNotDeleted(true);
-
-      var mutator = newMutator(fateId);
+      var mutator = newReservedMutator();
       mutator.requireStatus(REQ_DELETE_STATUS.toArray(TStatus[]::new));
       mutator.delete().mutate();
       this.deleted = true;
@@ -663,9 +653,7 @@ public class UserFateStore<T> extends AbstractFateStore<T> {
 
     @Override
     public void forceDelete() {
-      verifyReservedAndNotDeleted(true);
-
-      var mutator = newMutator(fateId);
+      var mutator = newReservedMutator();
       mutator.requireStatus(REQ_FORCE_DELETE_STATUS.toArray(TStatus[]::new));
       mutator.delete().mutate();
       this.deleted = true;

Reply via email to