You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hudi.apache.org by la...@apache.org on 2020/05/11 01:26:04 UTC
[incubator-hudi] branch master updated: [HUDI-820] cleaner repair
command should only inspect clean metadata files (#1542)
This is an automated email from the ASF dual-hosted git repository.
lamberken pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-hudi.git
The following commit(s) were added to refs/heads/master by this push:
new 8d0e231 [HUDI-820] cleaner repair command should only inspect clean metadata files (#1542)
8d0e231 is described below
commit 8d0e23173b3f21d7cdb24942913eb1132a111a32
Author: Balaji Varadarajan <va...@uber.com>
AuthorDate: Sun May 10 18:25:54 2020 -0700
[HUDI-820] cleaner repair command should only inspect clean metadata files (#1542)
---
.../apache/hudi/cli/commands/RepairsCommand.java | 21 +++++++++++++++------
.../hudi/cli/commands/TestRepairsCommand.java | 4 ++--
.../apache/hudi/common/HoodieTestDataGenerator.java | 13 ++++++++++++-
3 files changed, 29 insertions(+), 9 deletions(-)
diff --git a/hudi-cli/src/main/java/org/apache/hudi/cli/commands/RepairsCommand.java b/hudi-cli/src/main/java/org/apache/hudi/cli/commands/RepairsCommand.java
index 0af9ff2..7b859c2 100644
--- a/hudi-cli/src/main/java/org/apache/hudi/cli/commands/RepairsCommand.java
+++ b/hudi-cli/src/main/java/org/apache/hudi/cli/commands/RepairsCommand.java
@@ -27,9 +27,11 @@ import org.apache.hudi.common.fs.FSUtils;
import org.apache.hudi.common.model.HoodiePartitionMetadata;
import org.apache.hudi.common.table.HoodieTableConfig;
import org.apache.hudi.common.table.HoodieTableMetaClient;
-import org.apache.hudi.common.table.timeline.HoodieActiveTimeline;
+import org.apache.hudi.common.table.timeline.HoodieTimeline;
import org.apache.hudi.common.util.CleanerUtils;
+import org.apache.hudi.exception.HoodieIOException;
+import org.apache.avro.AvroRuntimeException;
import org.apache.hadoop.fs.Path;
import org.apache.hudi.common.util.StringUtils;
import org.apache.log4j.Logger;
@@ -171,14 +173,21 @@ public class RepairsCommand implements CommandMarker {
public void removeCorruptedPendingCleanAction() {
HoodieTableMetaClient client = HoodieCLI.getTableMetaClient();
- HoodieActiveTimeline activeTimeline = HoodieCLI.getTableMetaClient().getActiveTimeline();
-
- activeTimeline.filterInflightsAndRequested().getInstants().forEach(instant -> {
+ HoodieTimeline cleanerTimeline = HoodieCLI.getTableMetaClient().getActiveTimeline().getCleanerTimeline();
+ LOG.info("Inspecting pending clean metadata in timeline for corrupted files");
+ cleanerTimeline.filterInflightsAndRequested().getInstants().forEach(instant -> {
try {
CleanerUtils.getCleanerPlan(client, instant);
- } catch (IOException e) {
- LOG.warn("try to remove corrupted instant file: " + instant);
+ } catch (AvroRuntimeException e) {
+ LOG.warn("Corruption found. Trying to remove corrupted clean instant file: " + instant);
FSUtils.deleteInstantFile(client.getFs(), client.getMetaPath(), instant);
+ } catch (IOException ioe) {
+ if (ioe.getMessage().contains("Not an Avro data file")) {
+ LOG.warn("Corruption found. Trying to remove corrupted clean instant file: " + instant);
+ FSUtils.deleteInstantFile(client.getFs(), client.getMetaPath(), instant);
+ } else {
+ throw new HoodieIOException(ioe.getMessage(), ioe);
+ }
}
});
}
diff --git a/hudi-cli/src/test/java/org/apache/hudi/cli/commands/TestRepairsCommand.java b/hudi-cli/src/test/java/org/apache/hudi/cli/commands/TestRepairsCommand.java
index 9fd44b4..452e249 100644
--- a/hudi-cli/src/test/java/org/apache/hudi/cli/commands/TestRepairsCommand.java
+++ b/hudi-cli/src/test/java/org/apache/hudi/cli/commands/TestRepairsCommand.java
@@ -188,8 +188,8 @@ public class TestRepairsCommand extends AbstractShellIntegrationTest {
// Create four requested files
for (int i = 100; i < 104; i++) {
String timestamp = String.valueOf(i);
- // Write corrupted requested Compaction
- HoodieTestCommitMetadataGenerator.createCompactionRequestedFile(tablePath, timestamp, conf);
+ // Write corrupted requested Clean File
+ HoodieTestCommitMetadataGenerator.createEmptyCleanRequestedFile(tablePath, timestamp, conf);
}
// reload meta client
diff --git a/hudi-client/src/test/java/org/apache/hudi/common/HoodieTestDataGenerator.java b/hudi-client/src/test/java/org/apache/hudi/common/HoodieTestDataGenerator.java
index 65b567c..9a55ade 100644
--- a/hudi-client/src/test/java/org/apache/hudi/common/HoodieTestDataGenerator.java
+++ b/hudi-client/src/test/java/org/apache/hudi/common/HoodieTestDataGenerator.java
@@ -315,12 +315,23 @@ public class HoodieTestDataGenerator {
});
}
+ public static void createEmptyCleanRequestedFile(String basePath, String instantTime, Configuration configuration)
+ throws IOException {
+ Path commitFile = new Path(basePath + "/" + HoodieTableMetaClient.METAFOLDER_NAME + "/"
+ + HoodieTimeline.makeRequestedCleanerFileName(instantTime));
+ createEmptyFile(basePath, commitFile, configuration);
+ }
+
public static void createCompactionRequestedFile(String basePath, String instantTime, Configuration configuration)
throws IOException {
Path commitFile = new Path(basePath + "/" + HoodieTableMetaClient.METAFOLDER_NAME + "/"
+ HoodieTimeline.makeRequestedCompactionFileName(instantTime));
+ createEmptyFile(basePath, commitFile, configuration);
+ }
+
+ private static void createEmptyFile(String basePath, Path filePath, Configuration configuration) throws IOException {
FileSystem fs = FSUtils.getFs(basePath, configuration);
- FSDataOutputStream os = fs.create(commitFile, true);
+ FSDataOutputStream os = fs.create(filePath, true);
os.close();
}