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

sivabalan pushed a commit to branch release-0.10.1-rc1
in repository https://gitbox.apache.org/repos/asf/hudi.git

commit b6fde073961b8ddb5a2175f8ed0d6ea59e5798a4
Author: Sivabalan Narayanan <sivab...@uber.com>
AuthorDate: Sun Jan 9 21:14:28 2022 -0500

    Removing rollbacks instants from timeline for restore operation (#4518)
---
 .../hudi/table/action/restore/BaseRestoreActionExecutor.java   | 10 ++++++++++
 .../functional/TestHoodieClientOnCopyOnWriteStorage.java       |  2 ++
 2 files changed, 12 insertions(+)

diff --git 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/restore/BaseRestoreActionExecutor.java
 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/restore/BaseRestoreActionExecutor.java
index 9371340..58247bb 100644
--- 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/restore/BaseRestoreActionExecutor.java
+++ 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/action/restore/BaseRestoreActionExecutor.java
@@ -99,6 +99,16 @@ public abstract class BaseRestoreActionExecutor<T extends 
HoodieRecordPayload, I
     writeToMetadata(restoreMetadata);
     table.getActiveTimeline().saveAsComplete(new HoodieInstant(true, 
HoodieTimeline.RESTORE_ACTION, instantTime),
         TimelineMetadataUtils.serializeRestoreMetadata(restoreMetadata));
+    // get all rollbacks instants after restore instant time and delete them.
+    // if not, rollbacks will be considered not completed and might hinder 
metadata table compaction.
+    List<HoodieInstant> instantsToRollback = 
table.getActiveTimeline().getRollbackTimeline()
+        .getReverseOrderedInstants()
+        .filter(instant -> 
HoodieActiveTimeline.GREATER_THAN.test(instant.getTimestamp(), 
restoreInstantTime))
+        .collect(Collectors.toList());
+    instantsToRollback.forEach(entry -> {
+      table.getActiveTimeline().deletePending(new 
HoodieInstant(HoodieInstant.State.INFLIGHT, HoodieTimeline.ROLLBACK_ACTION, 
entry.getTimestamp()));
+      table.getActiveTimeline().deletePending(new 
HoodieInstant(HoodieInstant.State.REQUESTED, HoodieTimeline.ROLLBACK_ACTION, 
entry.getTimestamp()));
+    });
     LOG.info("Commits " + instantsRolledBack + " rollback is complete. 
Restored table to " + restoreInstantTime);
     return restoreMetadata;
   }
diff --git 
a/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/functional/TestHoodieClientOnCopyOnWriteStorage.java
 
b/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/functional/TestHoodieClientOnCopyOnWriteStorage.java
index aa3ead4..2ec4f7d 100644
--- 
a/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/functional/TestHoodieClientOnCopyOnWriteStorage.java
+++ 
b/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/functional/TestHoodieClientOnCopyOnWriteStorage.java
@@ -577,6 +577,8 @@ public class TestHoodieClientOnCopyOnWriteStorage extends 
HoodieClientTestBase {
     client = getHoodieWriteClient(newConfig);
     client.restoreToInstant("004");
 
+    
assertFalse(metaClient.reloadActiveTimeline().getRollbackTimeline().lastInstant().isPresent());
+
     // Check the entire dataset has all records still
     String[] fullPartitionPaths = new 
String[dataGen.getPartitionPaths().length];
     for (int i = 0; i < fullPartitionPaths.length; i++) {

Reply via email to