in src/kudu/tools/tool_action_tablet.cc [265:357]
unique_ptr<Mode> BuildTabletMode() {
unique_ptr<Action> add_replica =
ActionBuilder("add_replica", &AddReplica)
.Description("Add a new replica to a tablet's Raft configuration")
.AddRequiredParameter({ kMasterAddressesArg, kMasterAddressesArgDesc })
.AddRequiredParameter({ kTabletIdArg, kTabletIdArgDesc })
.AddRequiredParameter({ kTsUuidArg,
"UUID of the tablet server that should host the new replica" })
.AddRequiredParameter(
{ kReplicaTypeArg, "New replica's type. Must be VOTER or NON_VOTER."
})
.Build();
unique_ptr<Action> change_replica_type =
ActionBuilder("change_replica_type", &ChangeReplicaType)
.Description(
"Change the type of an existing replica in a tablet's Raft configuration")
.AddRequiredParameter({ kMasterAddressesArg, kMasterAddressesArgDesc })
.AddRequiredParameter({ kTabletIdArg, kTabletIdArgDesc })
.AddRequiredParameter({ kTsUuidArg,
"UUID of the tablet server hosting the existing replica" })
.AddRequiredParameter(
{ kReplicaTypeArg, "Existing replica's new type. Must be VOTER or NON_VOTER."
})
.Build();
unique_ptr<Action> remove_replica =
ActionBuilder("remove_replica", &RemoveReplica)
.Description("Remove an existing replica from a tablet's Raft configuration")
.AddRequiredParameter({ kMasterAddressesArg, kMasterAddressesArgDesc })
.AddRequiredParameter({ kTabletIdArg, kTabletIdArgDesc })
.AddRequiredParameter({ kTsUuidArg,
"UUID of the tablet server hosting the existing replica" })
.Build();
const string move_extra_desc = "The replica move tool effectively moves a "
"replica from one tablet server to another by adding a replica to the "
"new server and then removing it from the old one. It requires that "
"ksck return no errors when run against the target tablet. If the move "
"fails, the user should wait for any tablet copy to complete, and, if "
"the copy succeeds, use remove_replica manually. If the copy fails, the "
"new replica will be deleted automatically after some time, and then the "
"move can be retried.";
unique_ptr<Action> move_replica =
ActionBuilder("move_replica", &MoveReplica)
.Description("Move a tablet replica from one tablet server to another")
.ExtraDescription(move_extra_desc)
.AddRequiredParameter({ kMasterAddressesArg, kMasterAddressesArgDesc })
.AddRequiredParameter({ kTabletIdArg, kTabletIdArgDesc })
.AddRequiredParameter({ kFromTsUuidArg, "UUID of the tablet server to move from" })
.AddRequiredParameter({ kToTsUuidArg, "UUID of the tablet server to move to" })
.Build();
unique_ptr<Action> leader_step_down =
ActionBuilder("leader_step_down", &LeaderStepDown)
.Description("Change the tablet's leader")
.AddRequiredParameter({ kMasterAddressesArg, kMasterAddressesArgDesc })
.AddRequiredParameter({ kTabletIdArg, kTabletIdArgDesc })
.AddOptionalParameter("abrupt")
.AddOptionalParameter("new_leader_uuid")
.Build();
unique_ptr<Mode> change_config =
ModeBuilder("change_config")
.Description("Change a tablet's Raft configuration")
.AddAction(std::move(add_replica))
.AddAction(std::move(change_replica_type))
.AddAction(std::move(move_replica))
.AddAction(std::move(remove_replica))
.Build();
unique_ptr<Action> replace_tablet =
ActionBuilder("unsafe_replace_tablet", &ReplaceTablet)
.Description("Replace a tablet with an empty one, deleting the previous tablet.")
.ExtraDescription("Use this tool to repair a table when one of its tablets has permanently "
"lost all of its replicas. It replaces the unrecoverable tablet with a new "
"empty one representing the same partition. Its primary use is to jettison "
"an unrecoverable tablet in order to make the rest of the table "
"available.\n\n"
"NOTE: The original tablet will be deleted. Its data will be permanently "
"lost. Additionally, clients should be restarted before attempting to "
"use the repaired table (see KUDU-2376).")
.AddRequiredParameter({ kMasterAddressesArg, kMasterAddressesArgDesc })
.AddRequiredParameter({ kTabletIdArg, kTabletIdArgDesc })
.Build();
return ModeBuilder("tablet")
.Description("Operate on remote Kudu tablets")
.AddMode(std::move(change_config))
.AddAction(std::move(leader_step_down))
.AddAction(std::move(replace_tablet))
.Build();
}