diff --git a/heartbeat/redis.in b/heartbeat/redis.in old mode 100644 new mode 100755 index ec7186d8b5..e8bf7eff78 --- a/heartbeat/redis.in +++ b/heartbeat/redis.in @@ -234,10 +234,23 @@ EOI INSTANCE_ATTR_NAME=$(echo "${OCF_RESOURCE_INSTANCE}" | awk -F : '{print $1}') CRM_ATTR_REPL_INFO="${HA_SBIN_DIR}/crm_attribute --type crm_config --name ${INSTANCE_ATTR_NAME}_REPL_INFO -s redis_replication" +CRM_ATTR_REPL_STATUS="${HA_SBIN_DIR}/crm_attribute -l reboot --name ${INSTANCE_ATTR_NAME}-repl-status" MASTER_HOST="" MASTER_ACTIVE_CACHED="" MASTER_ACTIVE="" +change_node_repl_status() +{ + + $CRM_ATTR_REPL_STATUS -N "$1" -v "$2" > /dev/null 2>&1 +} + +delete_node_repl_status() +{ + + $CRM_ATTR_REPL_STATUS -N "$1" -D > /dev/null 2>&1 +} + master_is_active() { if [ -z "$MASTER_ACTIVE_CACHED" ]; then @@ -346,6 +359,7 @@ redis_monitor() { simple_status res=$? if (( res != OCF_SUCCESS )); then + delete_node_repl_status "$NODENAME" return $res fi @@ -358,6 +372,7 @@ redis_monitor() { done < <(redis_client info) if [[ -z "${info[role]}" ]]; then ocf_log err "monitor: Could not get role from \`$REDIS_CLIENT -s $REDIS_SOCKET info\`" + delete_node_repl_status "$NODENAME" return $OCF_ERR_GENERIC fi @@ -376,9 +391,16 @@ redis_monitor() { if ocf_is_probe; then set_master "$NODENAME" fi + change_node_repl_status "$NODENAME" master return $OCF_RUNNING_MASTER fi + if [[ "${info[master_link_status]}" != "up" ]]; then + change_node_repl_status "$NODENAME" "slave:${info[master_link_status]} ${info[master_link_down_since_seconds]} secs" + else + change_node_repl_status "$NODENAME" "slave:connected" + fi + if [ "$CHECK_SLAVE_STATE" -eq 1 ]; then if [[ "${info[master_link_status]}" != "up" ]]; then ocf_log info "monitor: Slave mode link has not yet been established (link=${info[master_link_status]})" @@ -391,10 +413,12 @@ redis_monitor() { if [[ "${info[master_host]}" != "${OCF_RESKEY_tunnel_host}" ]] || [[ "${info[master_port]}" != "${last_known_master_port}" ]]; then ocf_log err "monitor: Slave mode current tunnelled connection to redis server does not match running master. tunnelled='${info[master_host]}:${info[master_port]} (${master_name})', running='$(last_known_master)'" + change_node_repl_status "$NODENAME" "slave:master-mismatch: tunnel: configured=${info[master_host]}:${info[master_port]} (${master_name}), promoted=$(last_known_master)" return $OCF_ERR_GENERIC fi else ocf_log err "monitor: Slave mode current master does not match running master. current=${info[master_host]}, running=$(last_known_master)" + change_node_repl_status "$NODENAME" "slave:master-mismatch: configured=${info[master_host]}, promoted=$(last_known_master)" return $OCF_ERR_GENERIC fi fi @@ -518,6 +542,7 @@ redis_stop() { if (( status == OCF_NOT_RUNNING )); then ocf_log info "stop: redis is already stopped" crm_master_reboot -D + delete_node_repl_status "$NODENAME" return $OCF_SUCCESS fi @@ -529,6 +554,7 @@ redis_stop() { status=$? if (( status == OCF_NOT_RUNNING )); then crm_master_reboot -D + delete_node_repl_status "$NODENAME" return $OCF_SUCCESS fi sleep 1 @@ -542,9 +568,11 @@ redis_promote() { if (( status == OCF_RUNNING_MASTER )); then ocf_log info "promote: Already running as master" set_master "$NODENAME" + change_node_repl_status "$NODENAME" master return $OCF_SUCCESS elif (( status != OCF_SUCCESS )); then ocf_log err "promote: Node is not running as a slave" + delete_node_repl_status "$NODENAME" return $OCF_ERR_GENERIC fi @@ -554,10 +582,12 @@ redis_promote() { status=$? if (( status == OCF_RUNNING_MASTER )); then set_master "$NODENAME" + change_node_repl_status "$NODENAME" master return $OCF_SUCCESS fi ocf_log err "promote: Unknown error while promoting to master (status=$status)" + delete_node_repl_status "$NODENAME" return $OCF_ERR_GENERIC } @@ -577,9 +607,11 @@ redis_demote() { if (( status == OCF_SUCCESS )); then ocf_log info "demote: Already running as slave" + change_node_repl_status "$NODENAME" slave return $OCF_SUCCESS elif (( status == OCF_NOT_RUNNING )); then ocf_log err "demote: Failed to demote, redis not running." + delete_node_repl_status "$NODENAME" return $OCF_NOT_RUNNING fi @@ -634,6 +666,7 @@ redis_demote() { if [ "$client_kill" -eq 2 ]; then redis_client CLIENT KILL type normal fi + change_node_repl_status "$NODENAME" slave return $OCF_SUCCESS fi @@ -641,6 +674,7 @@ redis_demote() { done ocf_log err "demote: Unexpected error setting slave mode (status=$status)" + delete_node_repl_status "$NODENAME" return $OCF_ERR_GENERIC }