in src/kudu/tools/tool_action_master.cc [754:959]
unique_ptr<Mode> BuildMasterMode() {
ModeBuilder builder("master");
builder.Description("Operate on a Kudu Master");
{
unique_ptr<Action> action_refresh =
ClusterActionBuilder("refresh", &RefreshAuthzCache)
.Description("Refresh the authorization policies")
.AddOptionalParameter(
"force", std::nullopt,
string(
"Ignore mismatches of the specified and the actual lists "
"of master addresses in the cluster"))
.Build();
unique_ptr<Mode> mode_authz_cache = ModeBuilder("authz_cache")
.Description("Operate on the authz caches of the Kudu Masters")
.AddAction(std::move(action_refresh))
.Build();
builder.AddMode(std::move(mode_authz_cache));
}
{
unique_ptr<Action> dump_memtrackers =
MasterActionBuilder("dump_memtrackers", &MasterDumpMemTrackers)
.Description("Dump the memtrackers from a Kudu Master")
.AddOptionalParameter("format")
.AddOptionalParameter("memtracker_output")
.Build();
builder.AddAction(std::move(dump_memtrackers));
}
{
unique_ptr<Action> get_flags =
MasterActionBuilder("get_flags", &MasterGetFlags)
.Description("Get the gflags for a Kudu Master")
.AddOptionalParameter("all_flags")
.AddOptionalParameter("flags")
.AddOptionalParameter("flag_tags")
.Build();
builder.AddAction(std::move(get_flags));
}
{
unique_ptr<Action> run =
ActionBuilder("run", &MasterRun)
.ProgramName("kudu-master")
.Description("Run a Kudu Master")
.ExtraDescription("Note: The master server is started in this process and "
"runs until interrupted.\n\n"
"The most common configuration flags are described below. "
"For all the configuration options pass --helpfull or see "
"https://kudu.apache.org/docs/configuration_reference.html"
"#kudu-master_supported")
.AddOptionalParameter("master_addresses")
// Even though fs_wal_dir is required, we don't want it to be positional argument.
// This allows it to be passed as a standard flag.
.AddOptionalParameter("fs_wal_dir")
.AddOptionalParameter("fs_data_dirs")
.AddOptionalParameter("fs_metadata_dir")
.AddOptionalParameter("log_dir")
// Unlike most tools we don't log to stderr by default to match the
// kudu-master binary as closely as possible.
.AddOptionalParameter("logtostderr", string("false"))
.Build();
builder.AddAction(std::move(run));
}
{
unique_ptr<Action> set_flag =
MasterActionBuilder("set_flag", &MasterSetFlag)
.Description("Change a gflag value on a Kudu Master")
.AddRequiredParameter({ kFlagArg, "Name of the gflag" })
.AddRequiredParameter({ kValueArg, "New value for the gflag" })
.AddOptionalParameter("force")
.AddOptionalParameter("run_consistency_check")
.Build();
builder.AddAction(std::move(set_flag));
}
{
unique_ptr<Action> set_flag_for_all =
ClusterActionBuilder("set_flag_for_all", &MasterSetAllMasterFlag)
.Description("Change a gflag value for all Kudu Masters in the cluster")
.AddRequiredParameter({ kFlagArg, "Name of the gflag" })
.AddRequiredParameter({ kValueArg, "New value for the gflag" })
.AddOptionalParameter("force")
.Build();
builder.AddAction(std::move(set_flag_for_all));
}
{
unique_ptr<Action> status =
MasterActionBuilder("status", &MasterStatus)
.Description("Get the status of a Kudu Master")
.Build();
builder.AddAction(std::move(status));
}
{
unique_ptr<Action> timestamp =
MasterActionBuilder("timestamp", &MasterTimestamp)
.Description("Get the current timestamp of a Kudu Master")
.Build();
builder.AddAction(std::move(timestamp));
}
{
unique_ptr<Action> list_masters =
ClusterActionBuilder("list", &ListMasters)
.Description("List masters in a Kudu cluster")
.AddOptionalParameter(
"columns",
string("uuid,rpc-addresses,role"),
string("Comma-separated list of master info fields to "
"include in output.\nPossible values: uuid, cluster_id, "
"rpc-addresses, http-addresses, version, seqno, "
"start_time, role and member_type"))
.AddOptionalParameter("format")
.Build();
builder.AddAction(std::move(list_masters));
}
{
unique_ptr<Action> add_master =
ActionBuilder("add", &AddMaster)
.Description("Add a master to the Kudu cluster")
.ExtraDescription(
"This is an advanced command that orchestrates the workflow to bring up and add a "
"new master to the Kudu cluster. It must be run locally on the new master being added "
"and not on the leader master. This tool shuts down the new master after completion "
"of the command regardless of whether the new master addition is successful. "
"After the command completes successfully, user is expected to explicitly "
"start the new master using the same flags as supplied to this tool.\n\n"
"Supply all the necessary flags to bring up the new master. "
"The most common configuration flags used to bring up a master are described "
"below. See \"Kudu Configuration Reference\" for all the configuration options that "
"apply to a Kudu master.\n\n"
"Please refer to the Kudu administration documentation on "
"\"Migrating to Multiple Kudu Masters\" for the complete steps.")
.AddRequiredParameter({ kMasterAddressesArg, kMasterAddressesArgDesc })
.AddRequiredParameter({ kMasterAddressArg, kMasterAddressDesc })
.AddOptionalParameter("wait_secs")
.AddOptionalParameter("kudu_abs_path")
.AddOptionalParameter("fs_wal_dir")
.AddOptionalParameter("fs_data_dirs")
.AddOptionalParameter("fs_metadata_dir")
.AddOptionalParameter("log_dir")
// Unlike most tools we don't log to stderr by default to match the
// kudu-master binary as closely as possible.
.AddOptionalParameter("logtostderr", string("false"))
.Build();
builder.AddAction(std::move(add_master));
}
{
unique_ptr<Action> remove_master =
ActionBuilder("remove", &RemoveMasterChangeConfig)
.Description("Remove a master from the Kudu cluster")
.ExtraDescription(
"Removes a master from the Raft configuration of the Kudu cluster.\n\n"
"Please refer to the Kudu administration documentation on "
"\"Removing Kudu Masters from a Multi-Master Deployment\" or "
"\"Recovering from a dead Kudu Master in a Multi-Master Deployment\" as appropriate.")
.AddRequiredParameter({ kMasterAddressesArg, kMasterAddressesArgDesc })
.AddRequiredParameter({ kMasterAddressArg, kMasterAddressDesc })
.AddOptionalParameter("master_uuid")
.Build();
builder.AddAction(std::move(remove_master));
}
{
const char* rebuild_extra_description = "Attempts to create or update on-disk metadata "
"that can be used by a non-replicated master to recover a Kudu cluster "
"that has permanently lost its masters. It has a number of limitations:\n\n"
" - Security metadata like cryptographic keys are not rebuilt. Tablet servers "
"and clients must be restarted before starting the new master in order to "
"communicate with the new master.\n\n"
" - Table IDs are known only by the masters. Reconstructed tables will have "
"new IDs.\n\n"
" - If a create, delete, or alter table was in progress when the masters were lost, "
"it may not be possible to restore the table.\n\n"
" - If all replicas of a tablet are missing, it may not be able to recover the "
"table fully. Moreover, the rebuild tool cannot detect that a tablet is "
"missing.\n\n"
" - It's not possible to determine the replication factor of a table from tablet "
"server metadata. The rebuild tool sets the replication factor of each "
"table to --default_num_replicas instead.\n\n"
" - It's not possible to determine the next column id for a table from tablet "
"server metadata. Instead, the rebuilt tool sets the next column id to "
"a very large number.\n\n"
" - Table metadata like comments, owners, and configurations are not stored on "
"tablet servers and are thus not restored.\n\n"
" - Without '--tables', the tool will build a brand new syscatalog table based on "
"tablet data on tablet server metadata.\n\n"
" - With '--tables', the tool will update specific tables in current syscatalog.\n\n"
"WARNING: This tool is potentially unsafe. Only use it when there is no "
"possibility of recovering the original masters, and you know what you "
"are doing.\n";
unique_ptr<Action> unsafe_rebuild =
ActionBuilder("unsafe_rebuild", &RebuildMaster)
.Description("Rebuild a Kudu master from tablet server metadata")
.ExtraDescription(rebuild_extra_description)
.AddRequiredVariadicParameter({ kTabletServerAddressArg, kTabletServerAddressDesc })
.AddOptionalParameter("default_num_replicas")
.AddOptionalParameter("default_schema_version")
.AddOptionalParameter("fs_data_dirs")
.AddOptionalParameter("fs_metadata_dir")
.AddOptionalParameter("fs_wal_dir")
.AddOptionalParameter("tables")
.Build();
builder.AddAction(std::move(unsafe_rebuild));
}
return builder.Build();
}