xushiyan commented on code in PR #7196:
URL: https://github.com/apache/hudi/pull/7196#discussion_r1032384887


##########
hudi-common/src/main/java/org/apache/hudi/common/table/timeline/HoodieActiveTimeline.java:
##########
@@ -267,21 +267,27 @@ public void deleteCompactionRequested(HoodieInstant 
instant) {
   }
 
   public void deleteInstantFileIfExists(HoodieInstant instant) {
+    deleteInstantFileIfExists(instant, true);
+  }
+
+  public boolean deleteInstantFileIfExists(HoodieInstant instant, boolean 
exceptionIfFailToDelete) {

Review Comment:
   ```suggestion
     public boolean deleteInstantFileIfExists(HoodieInstant instant, boolean 
throwIfFailed) {
   ```
   
   
   



##########
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/HoodieTimelineArchiver.java:
##########
@@ -570,12 +570,24 @@ private boolean 
deleteArchivedInstants(List<HoodieInstant> archivedInstants, Hoo
     return success;
   }
 
-  private boolean deleteArchivedInstantFiles(HoodieEngineContext context, 
boolean success, List<String> files) {
-    Map<String, Boolean> resultDeleteInstantFiles = 
deleteFilesParallelize(metaClient, files, context, false);
+  private boolean deleteArchivedInstants(HoodieEngineContext context,
+                                         HoodieTableMetaClient metaClient,
+                                         List<HoodieInstant> instants) {
+    if (instants.isEmpty()) {
+      return true;
+    }
 
-    for (Map.Entry<String, Boolean> result : 
resultDeleteInstantFiles.entrySet()) {
-      LOG.info("Archived and deleted instant file " + result.getKey() + " : " 
+ result.getValue());
-      success &= result.getValue();
+    Map<HoodieInstant, Boolean> result = context.mapToPair(
+        instants,
+        instant -> ImmutablePair.of(

Review Comment:
   hide implementation: use `Pair.of()`



##########
hudi-common/src/main/java/org/apache/hudi/common/table/timeline/HoodieActiveTimeline.java:
##########
@@ -267,21 +267,27 @@ public void deleteCompactionRequested(HoodieInstant 
instant) {
   }
 
   public void deleteInstantFileIfExists(HoodieInstant instant) {
+    deleteInstantFileIfExists(instant, true);
+  }
+
+  public boolean deleteInstantFileIfExists(HoodieInstant instant, boolean 
exceptionIfFailToDelete) {

Review Comment:
   in what case do we want to silence the failure? this relates to timeline 
integrity so we should prefer to fail out loud



##########
hudi-common/src/main/java/org/apache/hudi/common/table/timeline/HoodieActiveTimeline.java:
##########
@@ -267,21 +267,27 @@ public void deleteCompactionRequested(HoodieInstant 
instant) {
   }
 
   public void deleteInstantFileIfExists(HoodieInstant instant) {
+    deleteInstantFileIfExists(instant, true);
+  }
+
+  public boolean deleteInstantFileIfExists(HoodieInstant instant, boolean 
exceptionIfFailToDelete) {
     LOG.info("Deleting instant " + instant);
-    Path inFlightCommitFilePath = 
getInstantFileNamePath(instant.getFileName());
+    Path commitFilePath = getInstantFileNamePath(instant.getFileName());
     try {
-      if (metaClient.getFs().exists(inFlightCommitFilePath)) {
-        boolean result = metaClient.getFs().delete(inFlightCommitFilePath, 
false);
+      if (metaClient.getFs().exists(commitFilePath)) {
+        boolean result = metaClient.getFs().delete(commitFilePath, false);
         if (result) {
           LOG.info("Removed instant " + instant);
-        } else {
+        } else if (exceptionIfFailToDelete) {

Review Comment:
   again, i don't think we should allow silencing exception at this level



##########
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/HoodieTimelineArchiver.java:
##########
@@ -570,12 +570,24 @@ private boolean 
deleteArchivedInstants(List<HoodieInstant> archivedInstants, Hoo
     return success;
   }
 
-  private boolean deleteArchivedInstantFiles(HoodieEngineContext context, 
boolean success, List<String> files) {
-    Map<String, Boolean> resultDeleteInstantFiles = 
deleteFilesParallelize(metaClient, files, context, false);
+  private boolean deleteArchivedInstants(HoodieEngineContext context,
+                                         HoodieTableMetaClient metaClient,
+                                         List<HoodieInstant> instants) {
+    if (instants.isEmpty()) {
+      return true;
+    }
 
-    for (Map.Entry<String, Boolean> result : 
resultDeleteInstantFiles.entrySet()) {
-      LOG.info("Archived and deleted instant file " + result.getKey() + " : " 
+ result.getValue());
-      success &= result.getValue();
+    Map<HoodieInstant, Boolean> result = context.mapToPair(
+        instants,
+        instant -> ImmutablePair.of(
+            instant,
+            metaClient.getActiveTimeline().deleteInstantFileIfExists(instant, 
false)),
+        Math.min(instants.size(), config.getArchiveDeleteParallelism()));
+
+    boolean success = true;
+    for (Map.Entry<HoodieInstant, Boolean> entry : result.entrySet()) {
+      LOG.info("Archived and deleted instant " + entry.getKey().toString() + " 
: " + entry.getValue());
+      success &= entry.getValue();

Review Comment:
   you can chain this with `result` using stream API `allMatch()`



##########
hudi-common/src/main/java/org/apache/hudi/common/table/timeline/HoodieActiveTimeline.java:
##########
@@ -267,21 +267,27 @@ public void deleteCompactionRequested(HoodieInstant 
instant) {
   }
 
   public void deleteInstantFileIfExists(HoodieInstant instant) {
+    deleteInstantFileIfExists(instant, true);
+  }
+
+  public boolean deleteInstantFileIfExists(HoodieInstant instant, boolean 
exceptionIfFailToDelete) {
     LOG.info("Deleting instant " + instant);
-    Path inFlightCommitFilePath = 
getInstantFileNamePath(instant.getFileName());
+    Path commitFilePath = getInstantFileNamePath(instant.getFileName());

Review Comment:
   we need to be careful about what commit can be deleted. this API is designed 
to only delete requested/inflight or empty clean commit, based on the usage. (1 
exception is in 
`org.apache.hudi.cli.commands.TestRepairsCommand#testShowFailedCommits` where 
this api is misused for deleting completed commits in tests; we should make 
separate test helper for that)
   
   We can't delete completed commit instants, which breaks the timeline's 
integrity. So we should name it properly at the variable as well as the API 
level.



##########
hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/HoodieTimelineArchiver.java:
##########
@@ -570,12 +570,24 @@ private boolean 
deleteArchivedInstants(List<HoodieInstant> archivedInstants, Hoo
     return success;
   }
 
-  private boolean deleteArchivedInstantFiles(HoodieEngineContext context, 
boolean success, List<String> files) {
-    Map<String, Boolean> resultDeleteInstantFiles = 
deleteFilesParallelize(metaClient, files, context, false);
+  private boolean deleteArchivedInstants(HoodieEngineContext context,
+                                         HoodieTableMetaClient metaClient,
+                                         List<HoodieInstant> instants) {
+    if (instants.isEmpty()) {
+      return true;
+    }
 
-    for (Map.Entry<String, Boolean> result : 
resultDeleteInstantFiles.entrySet()) {
-      LOG.info("Archived and deleted instant file " + result.getKey() + " : " 
+ result.getValue());
-      success &= result.getValue();
+    Map<HoodieInstant, Boolean> result = context.mapToPair(
+        instants,
+        instant -> ImmutablePair.of(
+            instant,
+            metaClient.getActiveTimeline().deleteInstantFileIfExists(instant, 
false)),

Review Comment:
   the original invocation is `ignoreFailure=false`; you inverted the flag here 
by saying `exceptionIfFailToDelete=false`, which silence the error



-- 
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: commits-unsubscr...@hudi.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to