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]