Handle inflight clean instants during Hoodie instants archiving
This commit is contained in:
@@ -126,9 +126,11 @@ public class HoodieCommitArchiveLog {
|
|||||||
HoodieTable table = HoodieTable.getHoodieTable(metaClient, config);
|
HoodieTable table = HoodieTable.getHoodieTable(metaClient, config);
|
||||||
|
|
||||||
// GroupBy each action and limit each action timeline to maxCommitsToKeep
|
// GroupBy each action and limit each action timeline to maxCommitsToKeep
|
||||||
|
// TODO: Handle ROLLBACK_ACTION in future
|
||||||
|
// ROLLBACK_ACTION is currently not defined in HoodieActiveTimeline
|
||||||
HoodieTimeline cleanAndRollbackTimeline = table.getActiveTimeline()
|
HoodieTimeline cleanAndRollbackTimeline = table.getActiveTimeline()
|
||||||
.getTimelineOfActions(Sets.newHashSet(HoodieTimeline.CLEAN_ACTION,
|
.getTimelineOfActions(Sets.newHashSet(HoodieTimeline.CLEAN_ACTION))
|
||||||
HoodieTimeline.ROLLBACK_ACTION));
|
.filterCompletedInstants();
|
||||||
Stream<HoodieInstant> instants = cleanAndRollbackTimeline.getInstants()
|
Stream<HoodieInstant> instants = cleanAndRollbackTimeline.getInstants()
|
||||||
.collect(Collectors.groupingBy(s -> s.getAction()))
|
.collect(Collectors.groupingBy(s -> s.getAction()))
|
||||||
.entrySet()
|
.entrySet()
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package com.uber.hoodie.io;
|
|||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import com.uber.hoodie.avro.model.HoodieArchivedMetaEntry;
|
import com.uber.hoodie.avro.model.HoodieArchivedMetaEntry;
|
||||||
import com.uber.hoodie.common.HoodieTestDataGenerator;
|
import com.uber.hoodie.common.HoodieTestDataGenerator;
|
||||||
import com.uber.hoodie.common.model.HoodieLogFile;
|
import com.uber.hoodie.common.model.HoodieLogFile;
|
||||||
@@ -90,11 +91,13 @@ public class TestHoodieCommitArchiveLog {
|
|||||||
assertEquals("Loaded 6 commits and the count should match", 6, timeline.countInstants());
|
assertEquals("Loaded 6 commits and the count should match", 6, timeline.countInstants());
|
||||||
|
|
||||||
HoodieTestUtils.createCleanFiles(basePath, "100");
|
HoodieTestUtils.createCleanFiles(basePath, "100");
|
||||||
|
HoodieTestUtils.createInflightCleanFiles(basePath, "101");
|
||||||
HoodieTestUtils.createCleanFiles(basePath, "101");
|
HoodieTestUtils.createCleanFiles(basePath, "101");
|
||||||
HoodieTestUtils.createCleanFiles(basePath, "102");
|
HoodieTestUtils.createCleanFiles(basePath, "102");
|
||||||
HoodieTestUtils.createCleanFiles(basePath, "103");
|
HoodieTestUtils.createCleanFiles(basePath, "103");
|
||||||
HoodieTestUtils.createCleanFiles(basePath, "104");
|
HoodieTestUtils.createCleanFiles(basePath, "104");
|
||||||
HoodieTestUtils.createCleanFiles(basePath, "105");
|
HoodieTestUtils.createCleanFiles(basePath, "105");
|
||||||
|
HoodieTestUtils.createInflightCleanFiles(basePath, "106", "107");
|
||||||
|
|
||||||
//reload the timeline and get all the commmits before archive
|
//reload the timeline and get all the commmits before archive
|
||||||
timeline = metaClient.getActiveTimeline().reload().getAllCommitsTimeline()
|
timeline = metaClient.getActiveTimeline().reload().getAllCommitsTimeline()
|
||||||
@@ -103,6 +106,9 @@ public class TestHoodieCommitArchiveLog {
|
|||||||
|
|
||||||
assertEquals("Loaded 6 commits and the count should match", 12, timeline.countInstants());
|
assertEquals("Loaded 6 commits and the count should match", 12, timeline.countInstants());
|
||||||
|
|
||||||
|
// verify in-flight instants before archive
|
||||||
|
verifyInflightInstants(metaClient, 3);
|
||||||
|
|
||||||
HoodieCommitArchiveLog archiveLog = new HoodieCommitArchiveLog(cfg,
|
HoodieCommitArchiveLog archiveLog = new HoodieCommitArchiveLog(cfg,
|
||||||
new HoodieTableMetaClient(fs.getConf(), basePath, true));
|
new HoodieTableMetaClient(fs.getConf(), basePath, true));
|
||||||
|
|
||||||
@@ -141,6 +147,9 @@ public class TestHoodieCommitArchiveLog {
|
|||||||
"Read commits map should match the originalCommits - commitsLoadedFromArchival",
|
"Read commits map should match the originalCommits - commitsLoadedFromArchival",
|
||||||
originalCommits.stream().map(HoodieInstant::getTimestamp).collect(Collectors.toList()),
|
originalCommits.stream().map(HoodieInstant::getTimestamp).collect(Collectors.toList()),
|
||||||
readCommits);
|
readCommits);
|
||||||
|
|
||||||
|
// verify in-flight instants after archive
|
||||||
|
verifyInflightInstants(metaClient, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -233,5 +242,10 @@ public class TestHoodieCommitArchiveLog {
|
|||||||
timeline.containsInstant(new HoodieInstant(false, HoodieTimeline.COMMIT_ACTION, "103")));
|
timeline.containsInstant(new HoodieInstant(false, HoodieTimeline.COMMIT_ACTION, "103")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void verifyInflightInstants(HoodieTableMetaClient metaClient, int expectedTotalInstants) {
|
||||||
|
HoodieTimeline timeline = metaClient.getActiveTimeline().reload()
|
||||||
|
.getTimelineOfActions(Sets.newHashSet(HoodieTimeline.CLEAN_ACTION)).filterInflights();
|
||||||
|
assertEquals("Loaded inflight clean actions and the count should match",
|
||||||
|
expectedTotalInstants, timeline.countInstants());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,6 +124,14 @@ public class HoodieTestUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final void createInflightCleanFiles(String basePath, String... commitTimes)
|
||||||
|
throws IOException {
|
||||||
|
for (String commitTime : commitTimes) {
|
||||||
|
new File(basePath + "/" + HoodieTableMetaClient.METAFOLDER_NAME + "/" +
|
||||||
|
HoodieTimeline.makeInflightCleanerFileName(commitTime)).createNewFile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static final String createNewDataFile(String basePath, String partitionPath,
|
public static final String createNewDataFile(String basePath, String partitionPath,
|
||||||
String commitTime) throws IOException {
|
String commitTime) throws IOException {
|
||||||
String fileID = UUID.randomUUID().toString();
|
String fileID = UUID.randomUUID().toString();
|
||||||
|
|||||||
Reference in New Issue
Block a user