This is an automated email from the ASF dual-hosted git repository.
sivabalan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hudi.git
The following commit(s) were added to refs/heads/master by this push:
new fd0656c11304 fix: Use correct lastCompletedTransactionMetadata while
acquiring lock for clustering (#18198)
fd0656c11304 is described below
commit fd0656c11304865a444eb90413acfd5da2ec54a3
Author: Surya Prasanna <[email protected]>
AuthorDate: Tue Feb 24 11:06:41 2026 -0800
fix: Use correct lastCompletedTransactionMetadata while acquiring lock for
clustering (#18198)
---
.../org/apache/hudi/client/BaseHoodieTableServiceClient.java | 11 +++++++++--
.../java/org/apache/hudi/client/BaseHoodieWriteClient.java | 1 +
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/BaseHoodieTableServiceClient.java
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/BaseHoodieTableServiceClient.java
index 83449c0d8972..b505ee60c40e 100644
---
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/BaseHoodieTableServiceClient.java
+++
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/BaseHoodieTableServiceClient.java
@@ -114,6 +114,9 @@ public abstract class BaseHoodieTableServiceClient<I, T, O>
extends BaseHoodieCl
protected transient AsyncCleanerService asyncCleanerService;
protected transient AsyncArchiveService asyncArchiveService;
+ @Setter(AccessLevel.PROTECTED)
+ protected Option<Pair<HoodieInstant, Map<String, String>>>
lastCompletedTxnAndMetadata = Option.empty();
+
@Setter(AccessLevel.PROTECTED)
protected Set<String> pendingInflightAndRequestedInstants;
@@ -559,7 +562,8 @@ public abstract class BaseHoodieTableServiceClient<I, T, O>
extends BaseHoodieCl
final HoodieInstant clusteringInstant =
ClusteringUtils.getInflightClusteringInstant(clusteringCommitTime,
table.getActiveTimeline(),
table.getMetaClient().getInstantGenerator()).get();
try {
- this.txnManager.beginStateChange(Option.of(clusteringInstant),
Option.empty());
+ this.txnManager.beginStateChange(Option.of(clusteringInstant),
+ lastCompletedTxnAndMetadata.isPresent() ?
Option.of(lastCompletedTxnAndMetadata.get().getLeft()) : Option.empty());
finalizeWrite(table, clusteringCommitTime, writeStats);
// Only in some cases conflict resolution needs to be performed.
@@ -675,7 +679,10 @@ public abstract class BaseHoodieTableServiceClient<I, T,
O> extends BaseHoodieCl
// so it is handled differently to avoid locking for planning.
return scheduleCleaning(createTable(config, storageConf),
providedInstantTime);
}
- txnManager.beginStateChange(Option.empty(), Option.empty());
+ Option<HoodieInstant> lastCompletedInstant =
lastCompletedTxnAndMetadata.isPresent()
+ ? Option.of(lastCompletedTxnAndMetadata.get().getLeft())
+ : Option.empty();
+ txnManager.beginStateChange(Option.empty(), lastCompletedInstant);
try {
Option<String> option;
HoodieTable<?, ?, ?, ?> table = createTable(config, storageConf);
diff --git
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/BaseHoodieWriteClient.java
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/BaseHoodieWriteClient.java
index 5b4657c0c273..664d4e13bdfc 100644
---
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/BaseHoodieWriteClient.java
+++
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/BaseHoodieWriteClient.java
@@ -560,6 +560,7 @@ public abstract class BaseHoodieWriteClient<T, I, K, O>
extends BaseHoodieClient
? TransactionUtils.getLastCompletedTxnInstantAndMetadata(metaClient) :
Option.empty();
this.pendingInflightAndRequestedInstants =
TransactionUtils.getInflightAndRequestedInstants(metaClient);
this.pendingInflightAndRequestedInstants.remove(instantTime);
+
tableServiceClient.setLastCompletedTxnAndMetadata(this.lastCompletedTxnAndMetadata);
tableServiceClient.setPendingInflightAndRequestedInstants(this.pendingInflightAndRequestedInstants);
tableServiceClient.startAsyncCleanerService(this);
tableServiceClient.startAsyncArchiveService(this);