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

adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 01a8446f6fb HDDS-15665. Race condition of deletingTxIDs between 
readOnlyIterator and onFlush (#10613)
01a8446f6fb is described below

commit 01a8446f6fbb3155a13cadcb74e4ef704bb920a1
Author: Sammi Chen <[email protected]>
AuthorDate: Fri Jun 26 21:20:04 2026 +0800

    HDDS-15665. Race condition of deletingTxIDs between readOnlyIterator and 
onFlush (#10613)
---
 .../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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to