Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

redis: add node attribute reflecting slave connection status (master_link_status) #1405

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions heartbeat/redis.in
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -346,6 +359,7 @@ redis_monitor() {
simple_status
res=$?
if (( res != OCF_SUCCESS )); then
delete_node_repl_status "$NODENAME"
return $res
fi

Expand All @@ -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

Expand All @@ -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]})"
Expand All @@ -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
Expand Down Expand Up @@ -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

Expand All @@ -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
Expand All @@ -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

Expand All @@ -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
}

Expand All @@ -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

Expand Down Expand Up @@ -634,13 +666,15 @@ 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

sleep 1
done

ocf_log err "demote: Unexpected error setting slave mode (status=$status)"
delete_node_repl_status "$NODENAME"
return $OCF_ERR_GENERIC
}

Expand Down