cli tool: List all tablets/replica_uuids with 'kudu table list' I noticed that given a tablet or replica_uuid we need to execute multiple nested commands and also need to correlate tablets and their replica uuids and their relation to tables. Added a verbose flag to 'kudu table list' to make this simpler.
This lists tablet/replica uuids irrespective of their states. Change-Id: Ic8f8e0dfb8e7ba9f67d5926199a9b831351585a7 Reviewed-on: http://gerrit.cloudera.org:8080/4440 Tested-by: Kudu Jenkins Reviewed-by: Dan Burkert <d...@cloudera.com> Project: http://git-wip-us.apache.org/repos/asf/kudu/repo Commit: http://git-wip-us.apache.org/repos/asf/kudu/commit/7327c28b Tree: http://git-wip-us.apache.org/repos/asf/kudu/tree/7327c28b Diff: http://git-wip-us.apache.org/repos/asf/kudu/diff/7327c28b Branch: refs/heads/master Commit: 7327c28b2f445d3756da34273c5dca7e4ee8d69d Parents: 2e0f669 Author: Dinesh Bhat <din...@cloudera.com> Authored: Fri Sep 16 10:51:09 2016 -0700 Committer: Dan Burkert <d...@cloudera.com> Committed: Wed Sep 21 17:13:32 2016 +0000 ---------------------------------------------------------------------- src/kudu/tools/kudu-admin-test.cc | 50 ++++++++++++++++++++++++ src/kudu/tools/tool_action_local_replica.cc | 16 ++++---- src/kudu/tools/tool_action_table.cc | 33 ++++++++++++++-- 3 files changed, 89 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kudu/blob/7327c28b/src/kudu/tools/kudu-admin-test.cc ---------------------------------------------------------------------- diff --git a/src/kudu/tools/kudu-admin-test.cc b/src/kudu/tools/kudu-admin-test.cc index 6d72f77..daada31 100644 --- a/src/kudu/tools/kudu-admin-test.cc +++ b/src/kudu/tools/kudu-admin-test.cc @@ -33,6 +33,8 @@ namespace tools { using client::KuduClient; using client::KuduClientBuilder; +using client::KuduSchema; +using client::KuduTableCreator; using client::sp::shared_ptr; using itest::TabletServerMap; using itest::TServerDetails; @@ -209,5 +211,53 @@ TEST_F(AdminCliTest, TestListTables) { ASSERT_EQ(Substitute("$0\n", kTableId), stdout_lines[0]); } +TEST_F(AdminCliTest, TestListTablesDetail) { + FLAGS_num_tablet_servers = 3; + FLAGS_num_replicas = 3; + + BuildAndStart({}, {}); + + // Add another table to test multiple tables output. + const string kAnotherTableId = "TestAnotherTable"; + KuduSchema client_schema(client::KuduSchemaFromSchema(schema_)); + gscoped_ptr<KuduTableCreator> table_creator(client_->NewTableCreator()); + ASSERT_OK(table_creator->table_name(kAnotherTableId) + .schema(&client_schema) + .set_range_partition_columns({ "key" }) + .num_replicas(FLAGS_num_replicas) + .Create()); + + // Grab list of tablet_ids from any tserver. + vector<TServerDetails*> tservers; + vector<string> tablet_ids; + AppendValuesFromMap(tablet_servers_, &tservers); + ListRunningTabletIds(tservers.front(), + MonoDelta::FromSeconds(30), &tablet_ids); + + string stdout; + ASSERT_OK(Subprocess::Call({ + GetAdminToolPath(), + "table", + "list", + "--list_tablets", + cluster_->master()->bound_rpc_addr().ToString() + }, &stdout, nullptr)); + + vector<string> stdout_lines = strings::Split(stdout, "\n", + strings::SkipEmpty()); + + // Verify multiple tables along with their tablets and replica-uuids. + ASSERT_EQ(4, stdout_lines.size()); + ASSERT_STR_CONTAINS(stdout, kTableId); + ASSERT_STR_CONTAINS(stdout, kAnotherTableId); + ASSERT_STR_CONTAINS(stdout, tablet_ids.front()); + ASSERT_STR_CONTAINS(stdout, tablet_ids.back()); + + for (auto& ts : tservers) { + ASSERT_STR_CONTAINS(stdout, ts->uuid()); + ASSERT_STR_CONTAINS(stdout, ts->uuid()); + } +} + } // namespace tools } // namespace kudu http://git-wip-us.apache.org/repos/asf/kudu/blob/7327c28b/src/kudu/tools/tool_action_local_replica.cc ---------------------------------------------------------------------- diff --git a/src/kudu/tools/tool_action_local_replica.cc b/src/kudu/tools/tool_action_local_replica.cc index 01986c2..63e22d4 100644 --- a/src/kudu/tools/tool_action_local_replica.cc +++ b/src/kudu/tools/tool_action_local_replica.cc @@ -64,14 +64,16 @@ #include "kudu/util/pb_util.h" #include "kudu/util/status.h" +DEFINE_bool(dump_data, false, + "Dump the data for each column in the rowset."); DEFINE_bool(metadata_only, false, "Only dump the block metadata when printing blocks."); DEFINE_int64(nrows, 0, "Number of rows to dump"); +DEFINE_bool(list_detail, false, + "Print partition info for the local replicas"); DEFINE_int64(rowset_index, -1, "Index of the rowset in local replica, default value(-1) " "will dump all the rowsets of the local replica"); -DEFINE_bool(verbose, false, - "Print additional information (if any)"); namespace kudu { namespace tools { @@ -363,7 +365,7 @@ Status ListLocalReplicas(const RunnerContext& context) { vector<string> tablets; RETURN_NOT_OK(fs_manager->ListTabletIds(&tablets)); for (const string& tablet : tablets) { - if (FLAGS_verbose) { + if (FLAGS_list_detail) { cout << "Tablet: " << tablet << endl; RETURN_NOT_OK(DumpTabletMeta(fs_manager.get(), tablet, 2)); } else { @@ -383,7 +385,7 @@ Status DumpCFileBlockInternal(FsManager* fs_manager, cout << Indent(indent) << "CFile Header: " << reader->header().ShortDebugString() << endl; - if (!FLAGS_verbose) { + if (!FLAGS_dump_data) { return Status::OK(); } cout << Indent(indent) << reader->footer().num_values() @@ -489,7 +491,7 @@ Status DumpDeltaCFileBlockInternal(FsManager* fs_manager, &out, &arena)); for (const DeltaKeyAndUpdate& upd : out) { - if (FLAGS_verbose) { + if (FLAGS_dump_data) { cout << Indent(indent) << upd.key.ToString() << " " << RowChangeList(upd.cell).ToString(schema) << endl; ++ndeltas; @@ -631,12 +633,12 @@ unique_ptr<Mode> BuildDumpMode() { ActionBuilder("rowset", &DumpRowSet) .Description("Dump the rowset contents of a local replica") .AddRequiredParameter({ "tablet_id", "tablet identifier" }) + .AddOptionalParameter("dump_data") .AddOptionalParameter("fs_wal_dir") .AddOptionalParameter("fs_data_dirs") .AddOptionalParameter("metadata_only") .AddOptionalParameter("nrows") .AddOptionalParameter("rowset_index") - .AddOptionalParameter("verbose") .Build(); unique_ptr<Action> dump_wals = @@ -706,7 +708,7 @@ unique_ptr<Mode> BuildLocalReplicaMode() { .Description("Show list of Kudu replicas in the local filesystem") .AddOptionalParameter("fs_wal_dir") .AddOptionalParameter("fs_data_dirs") - .AddOptionalParameter("verbose") + .AddOptionalParameter("list_detail") .Build(); return ModeBuilder("local_replica") http://git-wip-us.apache.org/repos/asf/kudu/blob/7327c28b/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 ccbeb17..1e58286 100644 --- a/src/kudu/tools/tool_action_table.cc +++ b/src/kudu/tools/tool_action_table.cc @@ -18,7 +18,6 @@ #include "kudu/tools/tool_action.h" #include <algorithm> -#include <iterator> #include <iostream> #include <memory> #include <string> @@ -27,14 +26,21 @@ #include "kudu/client/client.h" #include "kudu/gutil/map-util.h" +#include "kudu/gutil/stl_util.h" #include "kudu/gutil/strings/split.h" #include "kudu/util/status.h" +DEFINE_bool(list_tablets, false, + "Include tablet and replica UUIDs in the output"); + namespace kudu { namespace tools { using client::KuduClient; using client::KuduClientBuilder; +using client::KuduScanToken; +using client::KuduScanTokenBuilder; +using client::KuduTable; using std::cout; using std::endl; using std::string; @@ -71,8 +77,28 @@ Status ListTables(const RunnerContext& context) { vector<string> table_names; RETURN_NOT_OK(client->ListTables(&table_names)); - std::copy(table_names.begin(), table_names.end(), - std::ostream_iterator<string>(cout, "\n")); + for (const auto& tname : table_names) { + cout << tname << endl; + if (!FLAGS_list_tablets) { + continue; + } + client::sp::shared_ptr<KuduTable> client_table; + RETURN_NOT_OK(client->OpenTable(tname, &client_table)); + vector<KuduScanToken*> tokens; + ElementDeleter deleter(&tokens); + KuduScanTokenBuilder builder(client_table.get()); + RETURN_NOT_OK(builder.Build(&tokens)); + + for (const auto* token : tokens) { + cout << "T " << token->tablet().id() << "\t"; + for (const auto* replica : token->tablet().replicas()) { + cout << "P" << (replica->is_leader() ? "(L) " : " ") + << replica->ts().uuid() << " "; + } + cout << endl; + } + cout << endl; + } return Status::OK(); } @@ -96,6 +122,7 @@ unique_ptr<Mode> BuildTableMode() { kMasterAddressesArg, "Comma-separated list of Kudu Master addresses where each address is " "of form 'hostname:port'" }) + .AddOptionalParameter("list_tablets") .Build(); return ModeBuilder("table")