diff --git a/hudi-cli/src/test/java/org/apache/hudi/cli/commands/TestCommitsCommand.java b/hudi-cli/src/test/java/org/apache/hudi/cli/commands/TestCommitsCommand.java index 959346e15..9e2046df8 100644 --- a/hudi-cli/src/test/java/org/apache/hudi/cli/commands/TestCommitsCommand.java +++ b/hudi-cli/src/test/java/org/apache/hudi/cli/commands/TestCommitsCommand.java @@ -251,6 +251,53 @@ public class TestCommitsCommand extends CLIFunctionalTestHarness { assertEquals(expected, got); } + @Test + public void testShowArchivedCommitsWithMultiCommitsFile() throws Exception { + // Generate archive + HoodieWriteConfig cfg = HoodieWriteConfig.newBuilder().withPath(tablePath1) + .withSchema(HoodieTestCommitMetadataGenerator.TRIP_EXAMPLE_SCHEMA).withParallelism(2, 2) + .withCompactionConfig(HoodieCompactionConfig.newBuilder().retainCommits(1).archiveCommitsWith(2, 3).build()) + .withFileSystemViewConfig(FileSystemViewStorageConfig.newBuilder() + .withRemoteServerPort(timelineServicePort).build()) + .withMetadataConfig(HoodieMetadataConfig.newBuilder().enable(false).build()) + .forTable("test-trip-table").build(); + + // generate data and metadata + Map data = new LinkedHashMap<>(); + + for (int i = 194; i >= 154; i--) { + data.put(String.valueOf(i), new Integer[] {i, i}); + } + + for (Map.Entry entry : data.entrySet()) { + String key = entry.getKey(); + Integer[] value = entry.getValue(); + HoodieTestCommitMetadataGenerator.createCommitFileWithMetadata(tablePath1, key, hadoopConf(), + Option.of(value[0]), Option.of(value[1])); + // archive + metaClient = HoodieTableMetaClient.reload(HoodieCLI.getTableMetaClient()); + HoodieSparkTable table = HoodieSparkTable.create(cfg, context(), metaClient); + + // need to create multi archive files + HoodieTimelineArchiveLog archiveLog = new HoodieTimelineArchiveLog(cfg, table); + archiveLog.archiveIfRequired(context()); + } + + CommandResult cr = shell().executeCommand(String.format("commits showarchived --startTs %s --endTs %s", "160", "174")); + assertTrue(cr.isSuccess()); + assertEquals(3, metaClient.reloadActiveTimeline().getCommitsTimeline().countInstants(), + "There should 3 instants not be archived!"); + + Map data2 = new LinkedHashMap<>(); + for (int i = 174; i >= 161; i--) { + data2.put(String.valueOf(i), new Integer[] {i, i}); + } + String expected = generateExpectData(1, data2); + expected = removeNonWordAndStripSpace(expected); + String got = removeNonWordAndStripSpace(cr.getResult().toString()); + assertEquals(expected, got); + } + /** * Test case of 'commit showpartitions' command. */ diff --git a/hudi-common/src/main/java/org/apache/hudi/common/table/timeline/HoodieArchivedTimeline.java b/hudi-common/src/main/java/org/apache/hudi/common/table/timeline/HoodieArchivedTimeline.java index e82819e73..6090e0861 100644 --- a/hudi-common/src/main/java/org/apache/hudi/common/table/timeline/HoodieArchivedTimeline.java +++ b/hudi-common/src/main/java/org/apache/hudi/common/table/timeline/HoodieArchivedTimeline.java @@ -67,7 +67,7 @@ import java.util.stream.Collectors; */ public class HoodieArchivedTimeline extends HoodieDefaultTimeline { private static final Pattern ARCHIVE_FILE_PATTERN = - Pattern.compile("^\\.commits_\\.archive\\.([0-9]*)$"); + Pattern.compile("^\\.commits_\\.archive\\.([0-9]+).*"); private static final String HOODIE_COMMIT_ARCHIVE_LOG_FILE_PREFIX = "commits"; private static final String ACTION_TYPE_KEY = "actionType";