You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by we...@apache.org on 2026/08/25 03:22:23 UTC

(ozone) 02/08: HDDS-15665. Race condition of deletingTxIDs between readOnlyIterator and onFlush (#10613)

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

jojochuang pushed a commit to branch ozone-2.2
in repository https://gitbox.apache.org/repos/asf/ozone.git

commit 32f3714f630d54941030532aff0c472a37c6b136
Author: Sammi Chen <sa...@apache.org>
AuthorDate: Fri Jun 26 21:20:04 2026 +0800

    HDDS-15665. Race condition of deletingTxIDs between readOnlyIterator and onFlush (#10613)
    
    (cherry picked from commit 01a8446f6fbb3155a13cadcb74e4ef704bb920a1)
---
 .../hadoop/hdds/scm/block/DeletedBlockLogStateManagerImpl.java    | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManagerImpl.java
index 7f45f5cb2d1..9698da95675 100644
--- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManagerImpl.java
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManagerImpl.java
@@ -55,7 +55,7 @@ public class DeletedBlockLogStateManagerImpl
   private Table<String, ByteString> statefulConfigTable;
   private ContainerManager containerManager;
   private final SCMHADBTransactionBuffer transactionBuffer;
-  private final Set<Long> deletingTxIDs;
+  private volatile Set<Long> deletingTxIDs;
   public static final String SERVICE_NAME = DeletedBlockLogStateManager.class.getSimpleName();
 
   public DeletedBlockLogStateManagerImpl(Table<Long, DeletedBlocksTransaction> deletedTable,
@@ -74,6 +74,7 @@ public Table.KeyValueIterator<Long, DeletedBlocksTransaction> getReadOnlyIterato
     return new Table.KeyValueIterator<Long, DeletedBlocksTransaction>() {
 
       private final Table.KeyValueIterator<Long, DeletedBlocksTransaction> iter = deletedTable.iterator();
+      private final Set<Long> snapshotDeletingTxIDs = deletingTxIDs;
       private TypedTable.KeyValue<Long, DeletedBlocksTransaction> nextTx;
 
       {
@@ -85,7 +86,7 @@ private void findNext() {
           final TypedTable.KeyValue<Long, DeletedBlocksTransaction> next = iter.next();
           final long txID = next.getKey();
 
-          if ((!deletingTxIDs.contains(txID))) {
+          if (!snapshotDeletingTxIDs.contains(txID)) {
             nextTx = next;
             if (LOG.isTraceEnabled()) {
               LOG.trace("DeletedBlocksTransaction matching txID:{}", txID);
@@ -177,7 +178,8 @@ public void removeTransactionsFromDB(ArrayList<Long> txIDs, DeletedBlocksTransac
   public void onFlush() {
     // onFlush() can be invoked only when ratis is enabled.
     Objects.requireNonNull(deletingTxIDs, "deletingTxIDs == null");
-    deletingTxIDs.clear();
+    // avoid synchronization of deletingTxIDs as onFlush is called by SCM statemachine thread
+    deletingTxIDs = ConcurrentHashMap.newKeySet();
   }
 
   @Override


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ozone.apache.org
For additional commands, e-mail: commits-help@ozone.apache.org