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

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


The following commit(s) were added to refs/heads/2.1 by this push:
     new d973179452 Remove mutation timestamp for valid GcCandidates (#4113)
d973179452 is described below

commit d97317945290fcd4e3a4eb8b3cf7e427fcc322bd
Author: Daniel Roberts <ddani...@gmail.com>
AuthorDate: Wed Dec 27 23:07:39 2023 -0500

    Remove mutation timestamp for valid GcCandidates (#4113)
    
    * Remove mutation timestamp for valid GcCandidates
---
 .../accumulo/server/metadata/ServerAmpleImpl.java      | 18 ++++++++++++++----
 .../accumulo/test/functional/GarbageCollectorIT.java   | 18 +++++++++++++++---
 2 files changed, 29 insertions(+), 7 deletions(-)

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 223a9cf112..ef02f22b4d 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
@@ -226,10 +226,20 @@ public class ServerAmpleImpl extends AmpleImpl implements 
Ample {
     }
 
     try (BatchWriter writer = context.createBatchWriter(level.metaTable())) {
-      for (GcCandidate candidate : candidates) {
-        Mutation m = new 
Mutation(DeletesSection.encodeRow(candidate.getPath()));
-        m.putDelete(EMPTY_TEXT, EMPTY_TEXT, candidate.getUid());
-        writer.addMutation(m);
+      if (type == GcCandidateType.VALID) {
+        for (GcCandidate candidate : candidates) {
+          Mutation m = new 
Mutation(DeletesSection.encodeRow(candidate.getPath()));
+          // Removes all versions of the candidate to avoid reprocessing 
deleted file entries
+          m.putDelete(EMPTY_TEXT, EMPTY_TEXT);
+          writer.addMutation(m);
+        }
+      } else {
+        for (GcCandidate candidate : candidates) {
+          Mutation m = new 
Mutation(DeletesSection.encodeRow(candidate.getPath()));
+          // Removes this and older versions while allowing newer candidate 
versions to persist
+          m.putDelete(EMPTY_TEXT, EMPTY_TEXT, candidate.getUid());
+          writer.addMutation(m);
+        }
       }
     } catch (MutationsRejectedException | TableNotFoundException e) {
       throw new RuntimeException(e);
diff --git 
a/test/src/main/java/org/apache/accumulo/test/functional/GarbageCollectorIT.java
 
b/test/src/main/java/org/apache/accumulo/test/functional/GarbageCollectorIT.java
index d7899e1a3b..1776bc4c03 100644
--- 
a/test/src/main/java/org/apache/accumulo/test/functional/GarbageCollectorIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/functional/GarbageCollectorIT.java
@@ -285,6 +285,7 @@ public class GarbageCollectorIT extends ConfigurableMacBase 
{
       log.info("User GcCandidate Deletion test of table: {}", table);
       log.info("GcCandidates will be added/removed from table: {}", 
DataLevel.USER.metaTable());
       createAndDeleteUniqueMutation(TableId.of(table), 
Ample.GcCandidateType.INUSE);
+      createAndDeleteUniqueMutation(TableId.of(table), 
Ample.GcCandidateType.VALID);
     }
   }
 
@@ -295,6 +296,7 @@ public class GarbageCollectorIT extends ConfigurableMacBase 
{
     log.info("Metadata GcCandidate Deletion test");
     log.info("GcCandidates will be added/removed from table: {}", 
DataLevel.METADATA.metaTable());
     createAndDeleteUniqueMutation(tableId, Ample.GcCandidateType.INUSE);
+    createAndDeleteUniqueMutation(tableId, Ample.GcCandidateType.VALID);
   }
 
   /**
@@ -467,6 +469,13 @@ public class GarbageCollectorIT extends 
ConfigurableMacBase {
   }
 
   private void createAndDeleteUniqueMutation(TableId tableId, 
Ample.GcCandidateType type) {
+    int totalCandidates = 2;
+    boolean inUseDelete = true;
+
+    if (type == Ample.GcCandidateType.VALID) {
+      totalCandidates = 1;
+      inUseDelete = false;
+    }
     Ample ample = cluster.getServerContext().getAmple();
     DataLevel datalevel = Ample.DataLevel.of(tableId);
 
@@ -504,7 +513,7 @@ public class GarbageCollectorIT extends ConfigurableMacBase 
{
     ample.putGcCandidates(tableId, List.of(new 
StoredTabletFile(deleteCandidate.getPath())));
 
     log.debug("Deleting Candidate {}", deleteCandidate);
-    ample.deleteGcCandidates(datalevel, List.of(deleteCandidate), 
Ample.GcCandidateType.INUSE);
+    ample.deleteGcCandidates(datalevel, List.of(deleteCandidate), type);
 
     candidate = ample.getGcCandidates(datalevel);
 
@@ -519,7 +528,10 @@ public class GarbageCollectorIT extends 
ConfigurableMacBase {
       }
       counter++;
     }
-    assertEquals(2, counter);
-    assertTrue(foundNewCandidate);
+    assertEquals(totalCandidates, counter);
+    assertEquals(inUseDelete, foundNewCandidate);
+
+    // Cleanup from test
+    ample.deleteGcCandidates(datalevel, candidates, 
Ample.GcCandidateType.VALID);
   }
 }

Reply via email to