diff -uNr a/heartbeat/LVM-activate b/heartbeat/LVM-activate --- a/heartbeat/LVM-activate 2019-10-08 12:10:11.755991580 +0200 +++ b/heartbeat/LVM-activate 2019-10-08 12:14:38.388288176 +0200 @@ -42,6 +42,11 @@ : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs +# Parameter defaults +OCF_RESKEY_partial_activation_default="false" + +: ${OCF_RESKEY_partial_activation=${OCF_RESKEY_partial_activation_default}} + # If LV is given, only activate this named LV; otherwise, activate all # LVs in the named VG. VG=${OCF_RESKEY_vgname} @@ -150,6 +155,16 @@ + + +If set, the volume group will be activated partially even with some +physical volumes missing. It helps to set to true when using mirrored +logical volumes. + +Activate VG partially when missing PVs + + + @@ -486,6 +501,25 @@ exit $OCF_ERR_CONFIGURED fi + # Inconsistency might be due to missing physical volumes, which doesn't + # automatically mean we should fail. If partial_activation=true then + # we should let start try to handle it, or if no PVs are listed as + # "unknown device" then another node may have marked a device missing + # where we have access to all of them and can start without issue. + case $(vgs -o attr --noheadings $VG | tr -d ' ') in + ???p??*) + if ! ocf_is_true "$OCF_RESKEY_partial_activation" ; then + # We are missing devices and cannot activate partially + ocf_exit_reason "Volume group [$VG] has devices missing. Consider partial_activation=true to attempt to activate partially" + exit $OCF_ERR_GENERIC + else + # We are missing devices but are allowed to activate partially. + # Assume that caused the vgck failure and carry on + ocf_log warn "Volume group inconsistency detected with missing device(s) and partial_activation enabled. Proceeding with requested action." + fi + ;; + esac + # Get the access mode from VG metadata and check if it matches the input # value. Skip to check "tagging" mode because there's no reliable way to # automatically check if "tagging" mode is being used. @@ -545,6 +579,10 @@ do_activate() { local activate_opt=$1 + if ocf_is_true "$OCF_RESKEY_partial_activation" ; then + activate_opt="${activate_opt} --partial" + fi + # Only activate the specific LV if it's given if [ -n "$LV" ]; then ocf_run lvchange $activate_opt ${VG}/${LV}