[HUDI-1019] Clean refresh command in CLI (#1725)
This commit is contained in:
@@ -84,12 +84,6 @@ public class CleansCommand implements CommandMarker {
|
|||||||
return HoodiePrintHelper.print(header, new HashMap<>(), sortByField, descending, limit, headerOnly, rows);
|
return HoodiePrintHelper.print(header, new HashMap<>(), sortByField, descending, limit, headerOnly, rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
@CliCommand(value = "cleans refresh", help = "Refresh the commits")
|
|
||||||
public String refreshCleans() {
|
|
||||||
HoodieCLI.refreshTableMetadata();
|
|
||||||
return "Metadata for table " + HoodieCLI.getTableMetaClient().getTableConfig().getTableName() + " refreshed.";
|
|
||||||
}
|
|
||||||
|
|
||||||
@CliCommand(value = "clean showpartitions", help = "Show partition level details of a clean")
|
@CliCommand(value = "clean showpartitions", help = "Show partition level details of a clean")
|
||||||
public String showCleanPartitions(@CliOption(key = {"clean"}, help = "clean to show") final String instantTime,
|
public String showCleanPartitions(@CliOption(key = {"clean"}, help = "clean to show") final String instantTime,
|
||||||
@CliOption(key = {"limit"}, help = "Limit commits", unspecifiedDefaultValue = "-1") final Integer limit,
|
@CliOption(key = {"limit"}, help = "Limit commits", unspecifiedDefaultValue = "-1") final Integer limit,
|
||||||
|
|||||||
@@ -214,12 +214,6 @@ public class CommitsCommand implements CommandMarker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@CliCommand(value = "commits refresh", help = "Refresh the commits")
|
|
||||||
public String refreshCommits() throws IOException {
|
|
||||||
HoodieCLI.refreshTableMetadata();
|
|
||||||
return "Metadata for table " + HoodieCLI.getTableMetaClient().getTableConfig().getTableName() + " refreshed.";
|
|
||||||
}
|
|
||||||
|
|
||||||
@CliCommand(value = "commit rollback", help = "Rollback a commit")
|
@CliCommand(value = "commit rollback", help = "Rollback a commit")
|
||||||
public String rollbackCommit(@CliOption(key = {"commit"}, help = "Commit to rollback") final String instantTime,
|
public String rollbackCommit(@CliOption(key = {"commit"}, help = "Commit to rollback") final String instantTime,
|
||||||
@CliOption(key = {"sparkProperties"}, help = "Spark Properties File Path") final String sparkPropertiesPath)
|
@CliOption(key = {"sparkProperties"}, help = "Spark Properties File Path") final String sparkPropertiesPath)
|
||||||
@@ -238,7 +232,7 @@ public class CommitsCommand implements CommandMarker {
|
|||||||
InputStreamConsumer.captureOutput(process);
|
InputStreamConsumer.captureOutput(process);
|
||||||
int exitCode = process.waitFor();
|
int exitCode = process.waitFor();
|
||||||
// Refresh the current
|
// Refresh the current
|
||||||
refreshCommits();
|
HoodieCLI.refreshTableMetadata();
|
||||||
if (exitCode != 0) {
|
if (exitCode != 0) {
|
||||||
return "Commit " + instantTime + " failed to roll back";
|
return "Commit " + instantTime + " failed to roll back";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ public class SavepointsCommand implements CommandMarker {
|
|||||||
InputStreamConsumer.captureOutput(process);
|
InputStreamConsumer.captureOutput(process);
|
||||||
int exitCode = process.waitFor();
|
int exitCode = process.waitFor();
|
||||||
// Refresh the current
|
// Refresh the current
|
||||||
refreshMetaClient();
|
HoodieCLI.refreshTableMetadata();
|
||||||
if (exitCode != 0) {
|
if (exitCode != 0) {
|
||||||
return String.format("Failed: Could not create savepoint \"%s\".", commitTime);
|
return String.format("Failed: Could not create savepoint \"%s\".", commitTime);
|
||||||
}
|
}
|
||||||
@@ -123,19 +123,13 @@ public class SavepointsCommand implements CommandMarker {
|
|||||||
InputStreamConsumer.captureOutput(process);
|
InputStreamConsumer.captureOutput(process);
|
||||||
int exitCode = process.waitFor();
|
int exitCode = process.waitFor();
|
||||||
// Refresh the current
|
// Refresh the current
|
||||||
refreshMetaClient();
|
HoodieCLI.refreshTableMetadata();
|
||||||
if (exitCode != 0) {
|
if (exitCode != 0) {
|
||||||
return String.format("Savepoint \"%s\" failed to roll back", instantTime);
|
return String.format("Savepoint \"%s\" failed to roll back", instantTime);
|
||||||
}
|
}
|
||||||
return String.format("Savepoint \"%s\" rolled back", instantTime);
|
return String.format("Savepoint \"%s\" rolled back", instantTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
@CliCommand(value = "savepoints refresh", help = "Refresh the savepoints")
|
|
||||||
public String refreshMetaClient() {
|
|
||||||
HoodieCLI.refreshTableMetadata();
|
|
||||||
return "Metadata for table " + HoodieCLI.getTableMetaClient().getTableConfig().getTableName() + " refreshed.";
|
|
||||||
}
|
|
||||||
|
|
||||||
@CliCommand(value = "savepoint delete", help = "Delete the savepoint")
|
@CliCommand(value = "savepoint delete", help = "Delete the savepoint")
|
||||||
public String deleteSavepoint(@CliOption(key = {"commit"}, help = "Delete a savepoint") final String instantTime,
|
public String deleteSavepoint(@CliOption(key = {"commit"}, help = "Delete a savepoint") final String instantTime,
|
||||||
@CliOption(key = {"sparkProperties"}, help = "Spark Properties File Path") final String sparkPropertiesPath,
|
@CliOption(key = {"sparkProperties"}, help = "Spark Properties File Path") final String sparkPropertiesPath,
|
||||||
@@ -161,7 +155,7 @@ public class SavepointsCommand implements CommandMarker {
|
|||||||
InputStreamConsumer.captureOutput(process);
|
InputStreamConsumer.captureOutput(process);
|
||||||
int exitCode = process.waitFor();
|
int exitCode = process.waitFor();
|
||||||
// Refresh the current
|
// Refresh the current
|
||||||
refreshMetaClient();
|
HoodieCLI.refreshTableMetadata();
|
||||||
if (exitCode != 0) {
|
if (exitCode != 0) {
|
||||||
return String.format("Failed: Could not delete savepoint \"%s\".", instantTime);
|
return String.format("Failed: Could not delete savepoint \"%s\".", instantTime);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,4 +131,14 @@ public class TableCommand implements CommandMarker {
|
|||||||
});
|
});
|
||||||
return HoodiePrintHelper.print(header, new HashMap<>(), "", false, -1, false, rows);
|
return HoodiePrintHelper.print(header, new HashMap<>(), "", false, -1, false, rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refresh table metadata.
|
||||||
|
*/
|
||||||
|
@CliCommand(value = {"refresh", "metadata refresh", "commits refresh", "cleans refresh", "savepoints refresh"},
|
||||||
|
help = "Refresh table metadata")
|
||||||
|
public String refreshMetadata() {
|
||||||
|
HoodieCLI.refreshTableMetadata();
|
||||||
|
return "Metadata for table " + HoodieCLI.getTableMetaClient().getTableConfig().getTableName() + " refreshed.";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,17 +18,24 @@
|
|||||||
|
|
||||||
package org.apache.hudi.cli.commands;
|
package org.apache.hudi.cli.commands;
|
||||||
|
|
||||||
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hudi.cli.HoodieCLI;
|
import org.apache.hudi.cli.HoodieCLI;
|
||||||
import org.apache.hudi.cli.testutils.AbstractShellIntegrationTest;
|
import org.apache.hudi.cli.testutils.AbstractShellIntegrationTest;
|
||||||
import org.apache.hudi.common.fs.ConsistencyGuardConfig;
|
import org.apache.hudi.common.fs.ConsistencyGuardConfig;
|
||||||
import org.apache.hudi.common.model.HoodieTableType;
|
import org.apache.hudi.common.model.HoodieTableType;
|
||||||
import org.apache.hudi.common.table.HoodieTableMetaClient;
|
import org.apache.hudi.common.table.HoodieTableMetaClient;
|
||||||
|
|
||||||
|
import org.apache.hudi.common.table.timeline.HoodieTimeline;
|
||||||
|
import org.apache.hudi.testutils.HoodieTestDataGenerator;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.shell.core.CommandResult;
|
import org.springframework.shell.core.CommandResult;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import static org.apache.hudi.common.table.HoodieTableMetaClient.METAFOLDER_NAME;
|
import static org.apache.hudi.common.table.HoodieTableMetaClient.METAFOLDER_NAME;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
@@ -140,4 +147,49 @@ public class TestTableCommand extends AbstractShellIntegrationTest {
|
|||||||
assertTrue(cr.getResult().toString().contains(metaPath));
|
assertTrue(cr.getResult().toString().contains(metaPath));
|
||||||
assertTrue(cr.getResult().toString().contains("COPY_ON_WRITE"));
|
assertTrue(cr.getResult().toString().contains("COPY_ON_WRITE"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test case of command 'refresh'.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testRefresh() throws IOException {
|
||||||
|
List<String> refreshCommands = Arrays.asList("refresh", "metadata refresh",
|
||||||
|
"commits refresh", "cleans refresh", "savepoints refresh");
|
||||||
|
for (String command: refreshCommands) {
|
||||||
|
testRefreshCommand(command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testRefreshCommand(String command) throws IOException {
|
||||||
|
// clean table matedata
|
||||||
|
FileSystem fs = FileSystem.get(jsc.hadoopConfiguration());
|
||||||
|
fs.delete(new Path(tablePath + File.separator + HoodieTableMetaClient.METAFOLDER_NAME), true);
|
||||||
|
|
||||||
|
// Create table
|
||||||
|
assertTrue(prepareTable());
|
||||||
|
|
||||||
|
HoodieTimeline timeline =
|
||||||
|
HoodieCLI.getTableMetaClient().getActiveTimeline().getCommitTimeline().filterCompletedInstants();
|
||||||
|
assertEquals(0, timeline.countInstants(), "There should have no instant at first");
|
||||||
|
|
||||||
|
// generate four savepoints
|
||||||
|
for (int i = 100; i < 104; i++) {
|
||||||
|
String instantTime = String.valueOf(i);
|
||||||
|
HoodieTestDataGenerator.createCommitFile(tablePath, instantTime, jsc.hadoopConfiguration());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Before refresh, no instant
|
||||||
|
timeline =
|
||||||
|
HoodieCLI.getTableMetaClient().getActiveTimeline().getCommitTimeline().filterCompletedInstants();
|
||||||
|
assertEquals(0, timeline.countInstants(), "there should have no instant");
|
||||||
|
|
||||||
|
CommandResult cr = getShell().executeCommand(command);
|
||||||
|
assertTrue(cr.isSuccess());
|
||||||
|
|
||||||
|
timeline =
|
||||||
|
HoodieCLI.getTableMetaClient().getActiveTimeline().getCommitTimeline().filterCompletedInstants();
|
||||||
|
|
||||||
|
// After refresh, there are 4 instants
|
||||||
|
assertEquals(4, timeline.countInstants(), "there should have 4 instants");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user