in src/kudu/tools/tool_action_fs.cc [701:801]
Status List(const RunnerContext& /*context*/) {
// Parse the required fields into the enum form, and create an output data table.
vector<Field> fields;
vector<string> columns;
for (StringPiece name : strings::Split(FLAGS_columns, ",", strings::SkipEmpty())) {
Field field;
RETURN_NOT_OK(ParseField(name.ToString(), &field));
fields.push_back(field);
columns.emplace_back(ToString(field));
}
DataTable table(std::move(columns));
if (fields.empty()) {
return table.PrintTo(cout);
}
FsManagerOpts fs_opts;
fs_opts.read_only = true;
FsManager fs_manager(Env::Default(), std::move(fs_opts));
RETURN_NOT_OK(fs_manager.Open());
// Build the list of tablets to inspect.
vector<string> tablet_ids;
if (!FLAGS_tablet_id.empty()) {
string tablet_id = FLAGS_tablet_id;
ToLowerCase(&tablet_id);
tablet_ids.emplace_back(std::move(tablet_id));
} else {
RETURN_NOT_OK(fs_manager.ListTabletIds(&tablet_ids));
}
string table_name = FLAGS_table_name;
string table_id = FLAGS_table_id;
ToLowerCase(&table_id);
FieldGroup group = ToFieldGroup(*std::max_element(fields.begin(), fields.end()));
VLOG(1) << "group: " << string(ToString(group));
for (const string& tablet_id : tablet_ids) {
scoped_refptr<TabletMetadata> tablet_metadata;
RETURN_NOT_OK(TabletMetadata::Load(&fs_manager, tablet_id, &tablet_metadata));
const TabletMetadata& tablet = *tablet_metadata.get();
if (!table_name.empty() && table_name != tablet.table_name()) {
continue;
}
if (!table_id.empty() && table_id != tablet.table_id()) {
continue;
}
if (group == FieldGroup::kTablet) {
table.AddRow(BuildInfoRow(TabletInfo, fields, tablet));
continue;
}
for (const auto& rowset_metadata : tablet.rowsets()) {
const RowSetMetadata& rowset = *rowset_metadata.get();
if (FLAGS_rowset_id != -1 && FLAGS_rowset_id != rowset.id()) {
continue;
}
if (group == FieldGroup::kRowset) {
table.AddRow(BuildInfoRow(RowsetInfo, fields, tablet, rowset));
continue;
}
auto column_blocks = rowset.GetColumnBlocksById();
if (FLAGS_column_id >= 0) {
ColumnId column_id(FLAGS_column_id);
auto block = FindOrNull(column_blocks, column_id);
if (block) {
RETURN_NOT_OK(AddBlockInfoRow(&table, group, fields, &fs_manager, tablet, rowset,
"column", column_id, *block));
}
} else {
for (const auto& col_block : column_blocks) {
RETURN_NOT_OK(AddBlockInfoRow(&table, group, fields, &fs_manager, tablet,
rowset, "column", col_block.first, col_block.second));
}
for (const auto& block : rowset.redo_delta_blocks()) {
RETURN_NOT_OK(AddBlockInfoRow(&table, group, fields, &fs_manager, tablet,
rowset, "redo", boost::none, block));
}
for (const auto& block : rowset.undo_delta_blocks()) {
RETURN_NOT_OK(AddBlockInfoRow(&table, group, fields, &fs_manager, tablet,
rowset, "undo", boost::none, block));
}
RETURN_NOT_OK(AddBlockInfoRow(&table, group, fields, &fs_manager, tablet,
rowset, "bloom", boost::none, rowset.bloom_block()));
RETURN_NOT_OK(AddBlockInfoRow(&table, group, fields, &fs_manager, tablet,
rowset, "adhoc-index", boost::none,
rowset.adhoc_index_block()));
}
}
// TODO(dan): should orphaned blocks be included, perhaps behind a flag?
}
return table.PrintTo(cout);
}