This is an automated email from the ASF dual-hosted git repository.

danny0405 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 ea723504fbd [HUDI-6401] Should not throw exception when create marker 
file for log file (#9003)
ea723504fbd is described below

commit ea723504fbdb760fd00b4505fcbc737b4176370f
Author: guanziyue <[email protected]>
AuthorDate: Mon Jun 19 10:32:03 2023 +0800

    [HUDI-6401] Should not throw exception when create marker file for log file 
(#9003)
---
 .../java/org/apache/hudi/io/HoodieWriteHandle.java |  3 +--
 .../org/apache/hudi/table/marker/WriteMarkers.java | 28 ++++++++++++++++++++++
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/io/HoodieWriteHandle.java
 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/io/HoodieWriteHandle.java
index 4d5c8baefad..6653d348882 100644
--- 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/io/HoodieWriteHandle.java
+++ 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/io/HoodieWriteHandle.java
@@ -294,9 +294,8 @@ public abstract class HoodieWriteHandle<T, I, K, O> extends 
HoodieIOHandle<T, I,
 
     @Override
     public boolean preLogFileOpen(HoodieLogFile logFileToAppend) {
-      // we use create rather than createIfNotExists because create method can 
trigger marker-based early conflict detection.
       WriteMarkers writeMarkers = 
WriteMarkersFactory.get(config.getMarkersType(), hoodieTable, instantTime);
-      return writeMarkers.create(partitionPath, logFileToAppend.getFileName(), 
IOType.APPEND,
+      return writeMarkers.createIfNotExists(partitionPath, 
logFileToAppend.getFileName(), IOType.APPEND,
           config, fileId, 
hoodieTable.getMetaClient().getActiveTimeline()).isPresent();
     }
 
diff --git 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/marker/WriteMarkers.java
 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/marker/WriteMarkers.java
index bbbb2cdfd90..8a9c5c4ad1a 100644
--- 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/marker/WriteMarkers.java
+++ 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/marker/WriteMarkers.java
@@ -107,6 +107,34 @@ public abstract class WriteMarkers implements Serializable 
{
     return create(partitionPath, fileName, type, true);
   }
 
+  /**
+   * Creates a marker if the marker does not exist.
+   * This can invoke marker-based early conflict detection when enabled for 
multi-writers.
+   *
+   * @param partitionPath  partition path in the table
+   * @param fileName       file name
+   * @param type           write IO type
+   * @param writeConfig    Hudi write configs.
+   * @param fileId         File ID.
+   * @param activeTimeline Active timeline for the write operation.
+   * @return the marker path.
+   */
+  public Option<Path> createIfNotExists(String partitionPath, String fileName, 
IOType type, HoodieWriteConfig writeConfig,
+                             String fileId, HoodieActiveTimeline 
activeTimeline) {
+    if (writeConfig.isEarlyConflictDetectionEnable()
+        && 
writeConfig.getWriteConcurrencyMode().supportsOptimisticConcurrencyControl()) {
+      HoodieTimeline pendingCompactionTimeline = 
activeTimeline.filterPendingCompactionTimeline();
+      HoodieTimeline pendingReplaceTimeline = 
activeTimeline.filterPendingReplaceTimeline();
+      // TODO If current is compact or clustering then create marker directly 
without early conflict detection.
+      // Need to support early conflict detection between table service and 
common writers.
+      if (pendingCompactionTimeline.containsInstant(instantTime) || 
pendingReplaceTimeline.containsInstant(instantTime)) {
+        return create(partitionPath, fileName, type, true);
+      }
+      return createWithEarlyConflictDetection(partitionPath, fileName, type, 
false, writeConfig, fileId, activeTimeline);
+    }
+    return create(partitionPath, fileName, type, true);
+  }
+
   /**
    * Quietly deletes the marker directory.
    *

Reply via email to