Repository: kudu Updated Branches: refs/heads/master 60c8e305b -> 26af97c8f
Add a table renaming tool This commit introduces a tool to rename a table. When HMS integration feature is enabled, users can use this tool to rename legacy tables that have hive incompatible names. In order to allow these tables to be upgraded. Change-Id: I49a8c352ded124eef99f341ab552961fc3dc1260 Reviewed-on: http://gerrit.cloudera.org:8080/10337 Reviewed-by: Dan Burkert <danburk...@apache.org> Tested-by: Kudu Jenkins Reviewed-by: Todd Lipcon <t...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/kudu/repo Commit: http://git-wip-us.apache.org/repos/asf/kudu/commit/38b0c8f2 Tree: http://git-wip-us.apache.org/repos/asf/kudu/tree/38b0c8f2 Diff: http://git-wip-us.apache.org/repos/asf/kudu/diff/38b0c8f2 Branch: refs/heads/master Commit: 38b0c8f27022801957ac30018aefabe447bb3410 Parents: 60c8e30 Author: hahao <hao....@cloudera.com> Authored: Mon May 7 16:56:47 2018 -0700 Committer: Hao Hao <hao....@cloudera.com> Committed: Wed May 9 18:19:42 2018 +0000 ---------------------------------------------------------------------- src/kudu/tools/kudu-tool-test.cc | 27 ++++++++++++++++++++++++ src/kudu/tools/tool_action_table.cc | 36 +++++++++++++++++++++++++++----- 2 files changed, 58 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kudu/blob/38b0c8f2/src/kudu/tools/kudu-tool-test.cc ---------------------------------------------------------------------- diff --git a/src/kudu/tools/kudu-tool-test.cc b/src/kudu/tools/kudu-tool-test.cc index fcd4e0f..cc4d08c 100644 --- a/src/kudu/tools/kudu-tool-test.cc +++ b/src/kudu/tools/kudu-tool-test.cc @@ -128,8 +128,11 @@ namespace tools { using cfile::CFileWriter; using cfile::StringDataGenerator; using cfile::WriterOptions; +using client::KuduClient; +using client::KuduClientBuilder; using client::KuduSchema; using client::KuduSchemaBuilder; +using client::KuduTable; using client::sp::shared_ptr; using cluster::ExternalMiniCluster; using cluster::ExternalMiniClusterOptions; @@ -1831,6 +1834,30 @@ TEST_F(ToolTest, TestMasterList) { ASSERT_STR_CONTAINS(out, master->bound_rpc_hostport().ToString()); } +TEST_F(ToolTest, TestRenameTable) { + NO_FATALS(StartExternalMiniCluster()); + const string& kTableName = "kudu.table"; + const string& kNewTableName = "kudu_table"; + + // Create the table. + TestWorkload workload(cluster_.get()); + workload.set_table_name(kTableName); + workload.set_num_replicas(1); + workload.Setup(); + + string master_addr = cluster_->master()->bound_rpc_addr().ToString(); + string out; + NO_FATALS(RunActionStdoutNone(Substitute("table rename $0 $1 $2", + master_addr, kTableName, + kNewTableName))); + shared_ptr<KuduClient> client; + ASSERT_OK(KuduClientBuilder() + .add_master_server_addr(master_addr) + .Build(&client)); + shared_ptr<KuduTable> table; + ASSERT_OK(client->OpenTable(kNewTableName, &table)); +} + // This test is parameterized on the serialization mode and Kerberos. class ControlShellToolTest : public ToolTest, http://git-wip-us.apache.org/repos/asf/kudu/blob/38b0c8f2/src/kudu/tools/tool_action_table.cc ---------------------------------------------------------------------- diff --git a/src/kudu/tools/tool_action_table.cc b/src/kudu/tools/tool_action_table.cc index d878f36..b9f5308 100644 --- a/src/kudu/tools/tool_action_table.cc +++ b/src/kudu/tools/tool_action_table.cc @@ -47,6 +47,7 @@ using client::KuduClientBuilder; using client::KuduScanToken; using client::KuduScanTokenBuilder; using client::KuduTable; +using client::KuduTableAlterer; using client::internal::ReplicaController; using std::cout; using std::endl; @@ -101,20 +102,36 @@ class TableLister { namespace { const char* const kTableNameArg = "table_name"; +const char* const kNewTableNameArg = "new_table_name"; -Status DeleteTable(const RunnerContext& context) { +Status CreateKuduClient(const RunnerContext& context, + client::sp::shared_ptr<KuduClient>* client) { const string& master_addresses_str = FindOrDie(context.required_args, kMasterAddressesArg); vector<string> master_addresses = Split(master_addresses_str, ","); - const string& table_name = FindOrDie(context.required_args, kTableNameArg); + return KuduClientBuilder() + .master_server_addrs(master_addresses) + .Build(client); +} +Status DeleteTable(const RunnerContext& context) { + const string& table_name = FindOrDie(context.required_args, kTableNameArg); client::sp::shared_ptr<KuduClient> client; - RETURN_NOT_OK(KuduClientBuilder() - .master_server_addrs(master_addresses) - .Build(&client)); + RETURN_NOT_OK(CreateKuduClient(context, &client)); return client->DeleteTable(table_name); } +Status RenameTable(const RunnerContext& context) { + const string& table_name = FindOrDie(context.required_args, kTableNameArg); + const string& new_table_name = FindOrDie(context.required_args, kNewTableNameArg); + + client::sp::shared_ptr<KuduClient> client; + RETURN_NOT_OK(CreateKuduClient(context, &client)); + unique_ptr<KuduTableAlterer> alterer(client->NewTableAlterer(table_name)); + return alterer->RenameTo(new_table_name) + ->Alter(); +} + Status ListTables(const RunnerContext& context) { const string& master_addresses_str = FindOrDie(context.required_args, kMasterAddressesArg); @@ -131,6 +148,14 @@ unique_ptr<Mode> BuildTableMode() { .AddRequiredParameter({ kTableNameArg, "Name of the table to delete" }) .Build(); + unique_ptr<Action> rename_table = + ActionBuilder("rename", &RenameTable) + .Description("Rename a table") + .AddRequiredParameter({ kMasterAddressesArg, kMasterAddressesArgDesc }) + .AddRequiredParameter({ kTableNameArg, "Name of the table to rename" }) + .AddRequiredParameter({ kNewTableNameArg, "New table name" }) + .Build(); + unique_ptr<Action> list_tables = ActionBuilder("list", &ListTables) .Description("List all tables") @@ -141,6 +166,7 @@ unique_ptr<Mode> BuildTableMode() { return ModeBuilder("table") .Description("Operate on Kudu tables") .AddAction(std::move(delete_table)) + .AddAction(std::move(rename_table)) .AddAction(std::move(list_tables)) .Build(); }