X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=meta-starlingx%2Fmeta-stx-integ%2Frecipes-support%2Fdrbd%2Fdrbd-utils%2F0003-drbd_report_condition.patch;fp=meta-starlingx%2Fmeta-stx-integ%2Frecipes-support%2Fdrbd%2Fdrbd-utils%2F0003-drbd_report_condition.patch;h=7103dc9c167d9b1744c3a02ae8233a87a9437166;hb=e0634c6eaf2fe2641a0fb90e84a5defb880b1335;hp=0000000000000000000000000000000000000000;hpb=210d0f78485e760dffcdd3f630f59cec797f3f11;p=pti%2Frtp.git diff --git a/meta-starlingx/meta-stx-integ/recipes-support/drbd/drbd-utils/0003-drbd_report_condition.patch b/meta-starlingx/meta-stx-integ/recipes-support/drbd/drbd-utils/0003-drbd_report_condition.patch new file mode 100644 index 0000000..7103dc9 --- /dev/null +++ b/meta-starlingx/meta-stx-integ/recipes-support/drbd/drbd-utils/0003-drbd_report_condition.patch @@ -0,0 +1,387 @@ +--- + scripts/drbd | 1 + scripts/drbd.ocf | 259 ++++++++++++++++++++++--------------------------------- + 2 files changed, 109 insertions(+), 151 deletions(-) + +--- a/scripts/drbd.ocf ++++ b/scripts/drbd.ocf +@@ -5,6 +5,8 @@ + # + # Copyright (c) 2009 LINBIT HA-Solutions GmbH, + # Copyright (c) 2009 Florian Haas, Lars Ellenberg ++# Copyright (c) 2014 Wind River Systems, Inc. All rights reserved. ++# + # Based on the Heartbeat drbd OCF Resource Agent by Lars Marowsky-Bree + # (though it turned out to be an almost complete rewrite) + # +@@ -216,20 +218,6 @@ do_drbdadm() { + return $ret + } + +-set_master_score() { +- if [ -x ${HA_SBIN_DIR}/crm_master ]; then +- # Use quiet mode (-Q) to quench logging. Actual score updates +- # will get logged by attrd anyway +- do_cmd ${HA_SBIN_DIR}/crm_master -Q -l reboot -v $1 +- fi +-} +- +-remove_master_score() { +- if [ -x ${HA_SBIN_DIR}/crm_master ]; then +- do_cmd ${HA_SBIN_DIR}/crm_master -l reboot -D +- fi +-} +- + _sh_status_process() { + # _volume not present should not happen, + # but may help make this agent work even if it talks to drbd 8.3. +@@ -242,6 +230,7 @@ _sh_status_process() { + DRBD_DSTATE_LOCAL[$_volume]=${_disk:-Unconfigured} + DRBD_DSTATE_REMOTE[$_volume]=${_pdsk:-DUnknown} + } ++ + drbd_set_status_variables() { + # drbdsetup sh-status prints these values to stdout, + # and then prints _sh_status_process. +@@ -322,119 +311,9 @@ maybe_outdate_self() + ocf_log notice "outdating $DRBD_RESOURCE: according to OCF_RESKEY_CRM_meta_notify_master_uname, '$host' is still master" + do_drbdadm outdate $DRBD_RESOURCE + +- # on some pacemaker versions, -INFINITY may cause resource instance stop/start. +- # But in this case that is ok, it may even clear the replication link +- # problem. +- set_master_score -INFINITY +- + return 0 + } + +-drbd_update_master_score() { +- # NOTE +- # there may be constraint scores from rules on role=Master, +- # that in some ways can add to the node attribute based master score we +- # specify below. If you think you want to add personal preferences, +- # in case the scores given by this RA do not suffice, this is the +- # value space you can work with: +- # -INFINITY: Do not promote. Really. Won't work anyways. +- # Too bad, at least with current (Oktober 2009) Pacemaker, +- # negative master scores cause instance stop; restart cycle :( +- # missing, zero: Do not promote. +- # I think my data is not good enough. +- # Though, of course, you may try, and it might even work. +- # 5: please, do not promote, unless this is your only option. +- # 10: promotion is probably a bad idea, our local data is no good, +- # you'd probably run into severe performance problems, and risk +- # application crashes or blocking IO in case you lose the +- # replication connection. +- # 1000: Ok to be promoted, we have good data locally (though we don't +- # know about the peer, so possibly it has even better data?). +- # You sould use the crm-fence-peer.sh handler or similar +- # mechanism to avoid data divergence. +- # 10000: Please promote me/keep me Primary. +- # I'm confident that my data is as good as it gets. +- # +- # For multi volume, we need to compare who is "better" a bit more sophisticated. +- # The ${XXX[*]//UpToDate}, without being in double quotes, results in a single space, +- # if all are UpToDate. +- : == DEBUG == ${DRBD_ROLE_LOCAL[*]}/${DRBD_DSTATE_LOCAL[*]//UpToDate/ }/${DRBD_DSTATE_REMOTE[*]//UpToDate/ }/ == +- case ${DRBD_ROLE_LOCAL[*]}/${DRBD_DSTATE_LOCAL[*]//UpToDate/ }/${DRBD_DSTATE_REMOTE[*]//UpToDate/ }/ in +- *Primary*/\ /*/) +- # I am Primary, all local disks are UpToDate +- set_master_score 10000 +- ;; +- */\ /*DUnknown*/) +- # all local disks are UpToDate, +- # but I'm not Primary, +- # and I'm not sure about the peer's disk state(s). +- # We may need to outdate ourselves? +- # But if we outdate in a MONITOR, and are disconnected +- # secondary because of a hard primary crash, before CRM noticed +- # that there is no more master, we'd make us utterly useless! +- # Trust that the primary will also notice the disconnect, +- # and will place an appropriate fencing constraint via +- # its fence-peer handler callback. +- set_master_score 1000 +- ;; +- */\ /*/) +- # We know something about our peer, which means that either the +- # replication link is established, or it was not even +- # consistent last time we talked to each other. +- # Also all our local disks are UpToDate, which means even if we are +- # currently synchronizing, we do so as SyncSource. +- set_master_score 10000 +- ;; +- +- */*/\ /) +- # At least one of our local disks is not up to date. +- # But our peer is ALL OK. +- # We can expect to have access to useful +- # data, but must expect degraded performance. +- set_master_score 10 +- ;; +- */*Attaching*/*/|\ +- */*Negotiating*/*/) +- # some transitional state. +- # just don't do anything +- : ;; +- +- Unconfigured*|\ +- */*Diskless*/*/|\ +- */*Failed*/*/|\ +- */*Inconsistent*/*/|\ +- */*Outdated*/*/) +- # ALWAYS put the cluster in MAINTENANCE MODE +- # if you add a volume to a live replication group, +- # because the new volume will typically come up as Inconsistent +- # the first time, which would cause a monitor to revoke the +- # master score! +- # +- # At least some of our local disks are not really useable. +- # Our peer is not all good either (or some previous case block +- # would have matched). We have no access to useful data. +- # DRBD would refuse to be promoted, anyways. +- # +- # set_master_score -INFINITY +- # Too bad, at least with current (Oktober 2009) Pacemaker, +- # negative master scores cause instance stop; restart cycle :( +- # Hope that this will suffice. +- remove_master_score +- ;; +- *) +- # All local disks seem to be Consistent. +- # They _may_ be up to date, or not. +- # We hope that fencing mechanisms have put constraints in +- # place, so we won't be promoted with stale data. +- # But in case this was a cluster crash, +- # at least allow _someone_ to be promoted. +- set_master_score 5 +- ;; +- esac +- +- return $OCF_SUCCESS +-} +- + is_drbd_enabled() { + test -f /proc/drbd + } +@@ -488,7 +367,103 @@ drbd_status() { + return $rc + } + +-# I'm sorry, but there is no $OCF_DEGRADED_MASTER or similar yet. ++drbd_condition() { ++ local status ++ local rc ++ ++ status=$1 ++ rc=$status ++ ++ if [ $status -ne $OCF_SUCCESS -a $status -ne $OCF_RUNNING_MASTER ] ++ then ++ return $rc ++ fi ++ ++ drbd_set_status_variables ++ ++ ocf_log info "${OCF_RESKEY_drbd_resource} ${DRBD_ROLE_LOCAL}/${DRBD_DSTATE_LOCAL}/${DRBD_DSTATE_REMOTE} ${DRBD_CSTATE}" ++ ++ case "${DRBD_DSTATE_LOCAL}" in ++ UpToDate) ++ case "${DRBD_CSTATE}" in ++ StandAlone) ++ rc=$OCF_DATA_STANDALONE ++ ocf_log info "${OCF_RESKEY_drbd_resource} standalone, attempting to reconnect." ++ do_drbdadm connect ${OCF_RESKEY_drbd_resource} ++ ;; ++ StartingSyncT | WFBitMapT | WFSyncUUID | SyncTarget | \ ++ PausedSyncT) ++ rc=$OCF_DATA_SYNC ++ #drbd-overview | grep -A 1 drbd-cgcs | grep sync\'ed | cut -f2,3 -d' ' ++ ocf_log info "${OCF_RESKEY_drbd_resource} syncing" ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ Consistent) ++ case "${DRBD_CSTATE}" in ++ StandAlone) ++ rc=$OCF_DATA_STANDALONE ++ ocf_log info "${OCF_RESKEY_drbd_resource} standalone, attempting to reconnect" ++ do_drbdadm connect ${OCF_RESKEY_drbd_resource} ++ ;; ++ *) ++ rc=$OCF_DATA_CONSISTENT ++ ocf_log info "${OCF_RESKEY_drbd_resource} consistent" ++ ;; ++ esac ++ ;; ++ Outdated) ++ rc=$OCF_DATA_OUTDATED ++ ocf_log info "${OCF_RESKEY_drbd_resource} outdated" ++ ;; ++ *) ++ case "${DRBD_CSTATE}" in ++ StandAlone) ++ rc=$OCF_DATA_STANDALONE ++ ocf_log info "${OCF_RESKEY_drbd_resource} standalone" ++ ;; ++ StartingSyncT | WFBitMapT | WFSyncUUID | SyncTarget | \ ++ PausedSyncT) ++ rc=$OCF_DATA_SYNC ++ ocf_log info "${OCF_RESKEY_drbd_resource} sync" ++ ;; ++ *) ++ rc=$OCF_DATA_INCONSISTENT ++ ocf_log info "${OCF_RESKEY_drbd_resource} inconsistent" ++ ;; ++ esac ++ ;; ++ esac ++ ++ if [ $status -eq $OCF_RUNNING_MASTER ] ++ then ++ if [ $rc -eq $OCF_DATA_INCONSISTENT ] ++ then ++ rc=$OCF_RUNNING_MASTER_DATA_INCONSISTENT ++ ++ elif [ $rc -eq $OCF_DATA_OUTDATED ] ++ then ++ rc=$OCF_RUNNING_MASTER_DATA_OUTDATED ++ ++ elif [ $rc -eq $OCF_DATA_CONSISTENT ] ++ then ++ rc=$OCF_RUNNING_MASTER_DATA_CONSISTENT ++ ++ elif [ $rc -eq $OCF_DATA_SYNC ] ++ then ++ rc=$OCF_RUNNING_MASTER_DATA_SYNC ++ ++ elif [ $rc -eq $OCF_DATA_STANDALONE ] ++ then ++ rc=$OCF_RUNNING_MASTER_DATA_STANDALONE ++ fi ++ fi ++ ++ return $rc ++} ++ + drbd_monitor() { + local status + +@@ -501,7 +476,8 @@ drbd_monitor() { + drbd_status + status=$? + +- drbd_update_master_score ++ drbd_condition $status ++ status=$? + + return $status + } +@@ -578,7 +554,8 @@ drbd_start() { + # "running" already, anyways, right? + figure_out_drbd_peer_uname + do_drbdadm $DRBD_TO_PEER adjust $DRBD_RESOURCE +- rc=$OCF_SUCCESS ++ drbd_condition $OCF_SUCCESS ++ rc=$? + break + ;; + $OCF_NOT_RUNNING) +@@ -606,9 +583,6 @@ drbd_start() { + $first_try || sleep 1 + first_try=false + done +- # in case someone does not configure monitor, +- # we must at least call it once after start. +- drbd_update_master_score + + return $rc + } +@@ -642,7 +616,8 @@ drbd_promote() { + break + ;; + $OCF_RUNNING_MASTER) +- rc=$OCF_SUCCESS ++ drbd_condition $OCF_SUCCESS ++ rc=$? + break + esac + $first_try || sleep 1 +@@ -666,7 +641,8 @@ drbd_demote() { + status=$? + case "$status" in + $OCF_SUCCESS) +- rc=$OCF_SUCCESS ++ drbd_condition $OCF_SUCCESS ++ rc=$? + break + ;; + $OCF_NOT_RUNNING) +@@ -718,14 +694,9 @@ drbd_stop() { + # outdate myself in drbd on-disk meta data. + maybe_outdate_self + +- # do not let old master scores laying around. +- # they may confuse crm if this node was set to standby. +- remove_master_score +- + return $rc + } + +- + drbd_notify() { + local n_type=$OCF_RESKEY_CRM_meta_notify_type + local n_op=$OCF_RESKEY_CRM_meta_notify_operation +@@ -760,7 +731,6 @@ drbd_notify() { + # After something has been done is a good time to + # recheck our status: + drbd_set_status_variables +- drbd_update_master_score + + : == DEBUG == ${DRBD_DSTATE_REMOTE[*]} == + case ${DRBD_DSTATE_REMOTE[*]} in +@@ -793,17 +763,6 @@ ls_stat_is_block_maj_147() { + [[ $1 = b* ]] && [[ $5 == 147,* ]] + } + +-check_crm_feature_set() +-{ +- set -- ${OCF_RESKEY_crm_feature_set//[!0-9]/ } +- local a=${1:-0} b=${2:-0} c=${3:-0} +- +- (( a > 3 )) || +- (( a == 3 && b > 0 )) || +- (( a == 3 && b == 0 && c > 0 )) || +- ocf_log warn "You may be disappointed: This RA is intended for pacemaker 1.0 or better!" +-} +- + drbd_validate_all () { + DRBDADM="drbdadm" + DRBDSETUP="drbdsetup" +@@ -821,7 +780,6 @@ drbd_validate_all () { + if (( $DRBDADM_VERSION_CODE >= 0x080400 )); then + DRBD_HAS_MULTI_VOLUME=true + fi +- check_crm_feature_set + + # Check clone and M/S options. + meta_expect clone-max -le 2 +@@ -890,7 +848,6 @@ drbd_validate_all () { + # hm. probably misconfigured constraint somewhere. + # sorry. don't retry anywhere. + ocf_log err "DRBD resource ${DRBD_RESOURCE} not found in configuration file ${OCF_RESKEY_drbdconf}." +- remove_master_score + return $OCF_ERR_INSTALLED + fi + fi +--- a/scripts/drbd ++++ b/scripts/drbd +@@ -4,6 +4,7 @@ + # description: Loads and unloads the drbd module + # + # Copyright 2001-2010 LINBIT ++# Copyright (c) 2014 Wind River Systems, Inc. All rights reserved. + # + # Philipp Reisner, Lars Ellenberg + #