1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-17 06:04:23 +03:00

vgchange: allow changing system ID with majority of PVs

when used with --majoritypvs.  This allows the fail-over
of a VG between systems (by changing the VG system ID)
when a PV is missing.
This commit is contained in:
David Teigland 2022-07-07 16:06:01 -05:00
parent fc6330c1a8
commit 03653a0a57
3 changed files with 26 additions and 0 deletions

View File

@ -390,6 +390,10 @@ arg(logonly_ARG, '\0', "logonly", 0, 0, 0,
arg(longhelp_ARG, '\0', "longhelp", 0, 0, 0, arg(longhelp_ARG, '\0', "longhelp", 0, 0, 0,
"Display long help text.\n") "Display long help text.\n")
arg(majoritypvs_ARG, '\0', "majoritypvs", 0, 0, 0,
"Change the VG system ID if the majority of PVs in the VG\n"
"are present (one more than half).\n")
arg(maxrecoveryrate_ARG, '\0', "maxrecoveryrate", sizekb_VAL, 0, 0, arg(maxrecoveryrate_ARG, '\0', "maxrecoveryrate", sizekb_VAL, 0, 0,
"Sets the maximum recovery rate for a RAID LV. The rate value\n" "Sets the maximum recovery rate for a RAID LV. The rate value\n"
"is an amount of data per second for each device in the array.\n" "is an amount of data per second for each device in the array.\n"

View File

@ -1766,6 +1766,7 @@ ID: vgchange_refresh
DESC: Reactivate LVs using the latest metadata. DESC: Reactivate LVs using the latest metadata.
vgchange --systemid String VG vgchange --systemid String VG
OO: --majoritypvs
ID: vgchange_systemid ID: vgchange_systemid
DESC: Change the system ID of a VG. DESC: Change the system ID of a VG.

View File

@ -1344,6 +1344,24 @@ static int _vgchange_systemid_single(struct cmd_context *cmd, const char *vg_nam
struct volume_group *vg, struct volume_group *vg,
struct processing_handle *handle) struct processing_handle *handle)
{ {
if (arg_is_set(cmd, majoritypvs_ARG)) {
struct pv_list *pvl;
int missing_pvs = 0;
int found_pvs = 0;
dm_list_iterate_items(pvl, &vg->pvs) {
if (!pvl->pv->dev)
missing_pvs++;
else
found_pvs++;
}
if (found_pvs <= missing_pvs) {
log_error("Cannot change system ID without the majority of PVs (found %d of %d)",
found_pvs, found_pvs+missing_pvs);
return ECMD_FAILED;
}
}
if (!_vgchange_system_id(cmd, vg)) if (!_vgchange_system_id(cmd, vg))
return_ECMD_FAILED; return_ECMD_FAILED;
@ -1376,6 +1394,9 @@ int vgchange_systemid_cmd(struct cmd_context *cmd, int argc, char **argv)
return ECMD_FAILED; return ECMD_FAILED;
} }
if (arg_is_set(cmd, majoritypvs_ARG))
cmd->handles_missing_pvs = 1;
ret = process_each_vg(cmd, argc, argv, NULL, NULL, READ_FOR_UPDATE, 0, handle, &_vgchange_systemid_single); ret = process_each_vg(cmd, argc, argv, NULL, NULL, READ_FOR_UPDATE, 0, handle, &_vgchange_systemid_single);
destroy_processing_handle(cmd, handle); destroy_processing_handle(cmd, handle);