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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
