yihua commented on a change in pull request #4962:
URL: https://github.com/apache/hudi/pull/4962#discussion_r825395951



##########
File path: 
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/utils/TransactionUtils.java
##########
@@ -80,11 +85,24 @@
       final Option<HoodieCommitMetadata> thisCommitMetadata,
       final HoodieWriteConfig config,
       Option<HoodieInstant> lastCompletedTxnOwnerInstant,
-      boolean reloadActiveTimeline) throws HoodieWriteConflictException {
+      boolean reloadActiveTimeline,
+      List<HoodieInstant> pendingClusteringInstants) throws 
HoodieWriteConflictException {
     if 
(config.getWriteConcurrencyMode().supportsOptimisticConcurrencyControl()) {
+      // deal with pendingClusteringInstants
+      // some clustering instants maybe finished during current write 
operation,
+      // we should check the conflict of those clustering operation
+      List<String> completeClusteringOperations = table.getMetaClient()

Review comment:
       Use `Set<String>` for `completeClusteringOperations` to achieve O(1) 
lookup with `contains`?

##########
File path: 
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/BaseHoodieWriteClient.java
##########
@@ -429,6 +431,7 @@ protected void preWrite(String instantTime, 
WriteOperationType writeOperationTyp
       HoodieTableMetaClient metaClient) {
     setOperationType(writeOperationType);
     this.lastCompletedTxnAndMetadata = 
TransactionUtils.getLastCompletedTxnInstantAndMetadata(metaClient);
+    this.pendingReplaceRequestedInstants = 
TransactionUtils.getPendingReplaceRequestedInstants(metaClient);

Review comment:
       @xiarixiaoyao could you add a test case for the scenario described in 
HUDI-3355, which is resolved by the new logic in this PR?

##########
File path: 
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/utils/TransactionUtils.java
##########
@@ -105,6 +123,16 @@
     return thisCommitMetadata;
   }
 
+  public static Option<HoodieCommitMetadata> resolveWriteConflictIfAny(

Review comment:
       I see `TransactionUtils::resolveWriteConflictIfAny` is also called in 
`BaseCommitActionExecutor::autoCommit`.  Does that place require looking at the 
pending clustering instants as well?

##########
File path: 
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/utils/TransactionUtils.java
##########
@@ -137,4 +165,20 @@
       throw new HoodieIOException("Unable to read metadata for instant " + 
hoodieInstantOption.get(), io);
     }
   }
+
+  /**
+   * Get pending clustering instant.
+   * Notice:
+   *   we return .requested instant here.
+   *
+   * @param metaClient
+   * @return
+   */
+  public static List<HoodieInstant> 
getPendingReplaceRequestedInstants(HoodieTableMetaClient metaClient) {
+    return metaClient
+        .getActiveTimeline()
+        .filterPendingReplaceTimeline()
+        .getInstants()
+        .map(f -> 
HoodieTimeline.getReplaceCommitRequestedInstant(f.getTimestamp())).collect(Collectors.toList());

Review comment:
       I understand this addresses the completed replacecommit which was 
pending before the lastSuccessfulCommit looked by the conflict resolution.  Is 
there any other type of pending instants we need to consider as well, e.g., 
commits, deltacommits, compaction, etc.?  They could also be missed during 
conflict resolution like the pending clustering? 




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to