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

domgarguilo 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 b24b55122b Schedule cleanup of interrupted scan refs (#5652)
b24b55122b is described below

commit b24b55122babfb9a4913a1f785117eecd942f99e
Author: Dom G. <[email protected]>
AuthorDate: Mon Jun 23 12:32:19 2025 -0400

    Schedule cleanup of interrupted scan refs (#5652)
---
 .../java/org/apache/accumulo/tserver/TabletServer.java     | 12 ++++++++++++
 .../apache/accumulo/tserver/tablet/DatafileManager.java    | 14 ++++++++++++++
 .../java/org/apache/accumulo/tserver/tablet/Tablet.java    |  4 ++++
 3 files changed, 30 insertions(+)

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 7d910f7e4b..d5d411db50 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
@@ -310,6 +310,18 @@ public class TabletServer extends AbstractServer
         }), 5, 5, TimeUnit.SECONDS);
     watchNonCriticalScheduledTask(future);
 
+    ScheduledFuture<?> cleanupTask =
+        
context.getScheduledExecutor().scheduleWithFixedDelay(Threads.createNamedRunnable(
+            "ScanRefCleanupTask", () -> 
getOnlineTablets().values().forEach(tablet -> {
+              try {
+                tablet.removeOrphanedScanRefs();
+              } catch (Exception e) {
+                log.error("Error cleaning up stale scan references for tablet 
{}",
+                    tablet.getExtent(), e);
+              }
+            })), 5, 5, TimeUnit.MINUTES);
+    watchNonCriticalScheduledTask(cleanupTask);
+
     @SuppressWarnings("deprecation")
     final long walMaxSize =
         aconf.getAsBytes(aconf.resolve(Property.TSERV_WAL_MAX_SIZE, 
Property.TSERV_WALOG_MAX_SIZE));
diff --git 
a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/DatafileManager.java
 
b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/DatafileManager.java
index b2568f7ade..33f16c98de 100644
--- 
a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/DatafileManager.java
+++ 
b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/DatafileManager.java
@@ -184,6 +184,20 @@ class DatafileManager {
     }
   }
 
+  /**
+   * Removes any scan‐in‐use metadata entries that were left behind when a 
scan cleanup was
+   * interrupted. Intended to be called periodically to clear these orphaned 
scan refs once their
+   * in-memory reference count reaches zero.
+   */
+  public void removeOrphanedScanRefs() {
+    Set<StoredTabletFile> snapshot;
+    synchronized (tablet) {
+      snapshot = new HashSet<>(filesToDeleteAfterScan);
+      filesToDeleteAfterScan.clear();
+    }
+    removeFilesAfterScan(snapshot);
+  }
+
   private TreeSet<StoredTabletFile> waitForScansToFinish(Set<StoredTabletFile> 
pathsToWaitFor) {
     long maxWait = 10000L;
     long startTime = System.currentTimeMillis();
diff --git 
a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java 
b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
index 0f8773d93a..e4d9f9787c 100644
--- 
a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
+++ 
b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
@@ -2220,6 +2220,10 @@ public class Tablet extends TabletBase {
     return getDatafileManager().getUpdateCount();
   }
 
+  public void removeOrphanedScanRefs() {
+    getDatafileManager().removeOrphanedScanRefs();
+  }
+
   TabletMemory getTabletMemory() {
     return tabletMemory;
   }

Reply via email to