Note: "permalinks" may not be as permanent as we would like,
direct links of old sources may well be a few messages off.
On Sat, Aug 22, 2015 at 12:00:01PM +0200, drbd-user-request at lists.linbit.com wrote:
> Date: Sat, 22 Aug 2015 11:29:37 +0200
> From: Lars Ellenberg <lars.ellenberg at linbit.com>
> Subject: Re: [DRBD-user] drbd.ocf misinterpreting role status with
> multiple volumes
>
> ...
> Yes, that is the case, and the above is intentional.
> Though I don't remember all of the reasoning right now. Probably has
> something to do with adding a volume to an existing resource.
>
> If you want independent volumes, use independend resources.
nope, we like the writer order guarantee :-)
> Pacemaker would not have any way to deal with a "partially promoted" DRBD.
too bad. If the RA knew the supposed role, it could try to achieve that
during a monitor. Though a monitor that actively changes stuff might be
a bit surprising.
> Anyone cares enough to prepare a patch?
I attached a patch (for 8.4.4, which is the version we are using). It
returns OCF_FAILED_MASTER in a monitor operation, but leaves the rc of
the internal drbd_status untouched. Otherwise all drbd_status()
consumers would need to handle that extra case.
Note that it also returns OCF_FAILED_MASTER if the resource is supposed
to be in Secondary role and one subvolume is Primary (showing as "Slave"
in crm_mon).
Regards
Matthias
--
one4vision GmbH Fon +49 681 96727 - 60
Residenz am Schlossgarten Fax +49 681 96727 - 69
Talstraße 34-42 info at one4vision.de
D-66119 Saarbrücken http://www.one4vision.de
HRB 11751 verantwortl. Geschäftsführer:
Amtsgericht Saarbrücken Christof Allmann, Christoph Harth
-------------- next part --------------
--- drbd.orig 2014-02-14 03:47:56.000000000 +0100
+++ drbd 2015-08-24 22:45:10.730542848 +0200
@@ -309,6 +309,37 @@
# Populates a set of variables relevant to DRBD's status
eval "$($DRBDSETUP "$DRBD_RESOURCE" sh-status)"
+
+
+ # to detect inconsistent roles in multi-volume setups,
+ # find the minimum and the maximum of the local roles
+ # Primary > Secondary > Unconfigured > Unknown > *
+ # used in drbd_promote() and drbd_status()
+ DRBD_MAX_ROLE_LOCAL="Unknown"
+ DRBD_MIN_ROLE_LOCAL="Unknown"
+
+ local rolelist role
+ rolelist=${DRBD_ROLE_LOCAL[*]}
+ for role in Primary Secondary Unconfigured; do
+ if [ "${rolelist[*]//${role}}" != "${rolelist[*]}" ]; then
+ DRBD_MIN_ROLE_LOCAL=$role
+ fi
+ rolelist=(${rolelist[*]//${role}})
+ done
+ if [ -n "${rolelist[0]}" ]; then
+ DRBD_MIN_ROLE_LOCAL=${rolelist[0]}
+ fi
+
+
+ DRBD_MAX_ROLE_LOCAL="Unknown"
+ rolelist=${DRBD_ROLE_LOCAL[*]}
+ for role in Unconfigured Secondary Primary; do
+ if [ "${rolelist[*]//${role}}" != "${rolelist[*]}" ]; then
+ DRBD_MAX_ROLE_LOCAL=$role
+ fi
+ rolelist=(${rolelist[*]//${role}})
+ done
+
}
# This is not the only fencing mechanism.
@@ -533,6 +564,14 @@
rc=$OCF_ERR_GENERIC
esac
+ # multivolume resources with inconsistent roles are logged as an error
+ # but turning OCF_RUNNING_MASTER into OCF_FAILED_MASTER is done only
+ # in drbd_monitor() to spare drbd_start()/drbd_promote()/drbd_demote()
+ # handling an additional case
+ if [ "${DRBD_MIN_ROLE_LOCAL}" != "${DRBD_MAX_ROLE_LOCAL}" ]; then
+ ocf_log err "multivolume ${DRBD_RESOURCE} with inconsistent roles: >>${DRBD_ROLE_LOCAL[*]}<<"
+ fi
+
return $rc
}
@@ -561,6 +600,13 @@
drbd_update_master_score
fi
+ # for multivolume resources, drbd_status() returns OCF_RUNNING_MASTER
+ # if any subvolume is found in Primary role
+ # change that to OCF_FAILED_MASTER if any subvolume is not Primary
+ if [ "${status}" -eq "${OCF_RUNNING_MASTER}" -a "${DRBD_MIN_ROLE_LOCAL}" != "Primary" ]; then
+ status=$OCF_FAILED_MASTER
+ fi
+
case $status in
(0) : "OCF_SUCCESS" ;;
(1) : "OCF_ERR_GENERIC" ;;
@@ -714,8 +760,24 @@
break
;;
$OCF_RUNNING_MASTER)
- rc=$OCF_SUCCESS
- break
+ if [ "${DRBD_MIN_ROLE_LOCAL}" = "Primary" ]; then
+ # only if all subvolumes are in "Primary" state
+ rc=$OCF_SUCCESS
+ break
+ else
+ # not all subvolumes are "Primary" (not just yet?)
+ # keep re-trying (worst case: until timeout)
+ do_drbdadm primary $DRBD_RESOURCE
+ if [[ $? = 17 ]]; then
+ # All available disks are inconsistent,
+ # or I am consistent, but failed to fence the peer.
+ # Cannot become primary.
+ # No need to retry indefinitely.
+ ocf_log crit "Refusing to be promoted to Primary without UpToDate data"
+ break
+ fi
+ fi
+ ;;
esac
$first_try || sleep 1
first_try=false
@@ -749,7 +811,7 @@
break
;;
$OCF_NOT_RUNNING)
- ocf_log error "Trying to promote a resource that was not started"
+ ocf_log error "Trying to demote a resource that was not started"
break
;;
$OCF_RUNNING_MASTER)