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