# HG changeset patch
# User Marian Marinov <[email protected]>
# Date 1268268329 -7200
# Branch mysql-ms
# Node ID 1c9dbac45db3a417be9d7a29bb15f96f35875277
# Parent c5304bc37c11e348f113b5701f2cb680d452deaa
Low: RA: mysql: updated preference calculation, better log checks
Swapped master_file to with master_log for better readability
Added more detailed checks of the logs
diff -r c5304bc37c11 -r 1c9dbac45db3 heartbeat/mysql
--- a/heartbeat/mysql Thu Mar 11 02:26:49 2010 +0200
+++ b/heartbeat/mysql Thu Mar 11 02:45:29 2010 +0200
@@ -512,7 +512,7 @@
fi
sleep 2
done
-
+
mysql -S $OCF_RESKEY_socket -O connect_timeout=1 -e 'SET GLOBAL
read_only=on';
ocf_log info "MySQL started"
@@ -645,9 +645,9 @@
}
calculate_preference() {
- master_file=''
+ master_log=''
master_pos=''
-
+
oldIFS="$IFS"
IFS=$'\n'
for i in $(mysql --password=$OCF_RESKEY_replication_passwd \
@@ -655,12 +655,12 @@
-h $master_host \
-O connect_timeout=1 \
-e 'SHOW MASTER STATUS\G'); do
- if ( echo $i | grep 'File:' > /dev/null ); then master_file=$(echo
$i|sed 's/^.*: //'); fi
+ if ( echo $i | grep 'File:' > /dev/null ); then master_log=$(echo
$i|sed 's/^.*: //'); fi
if ( echo $i | grep 'Position:' > /dev/null ); then master_pos=$(echo
$i|sed 's/^.*: //'); break; fi
done
IFS="$oldIFS"
- if [ -z "$master_file" ] || [ -z "$master_pos" ]; then
+ if [ -z "$master_log" ] || [ -z "$master_pos" ]; then
ocf_log warn "unable to find master file or master position"
return $OCF_SUCCESS;
fi
@@ -681,11 +681,24 @@
return $OCF_SUCCESS
fi
- # no preference for very old slaves
- if [ "$master_file" != "$local_log" ]; then
- ocf_run $CRM_MASTER -v 0
- return $OCF_SUCCESS;
- fi
+ master_log=$(echo $master_log|sed 's/^.\+\.0\+//')
+ local_log=$(echo $local_log|sed 's/^.\+\.0\+//')
+ log_diff=$((master_log-local_log))
+ case "$log_diff" in
+ 2)
+ # no preference for very old slaves
+ ocf_run $CRM_MASTER -v 0
+ return $OCF_SUCCESS
+ ;;
+ 1)
+ ocf_run $CRM_MASTER -v 200
+ return $OCF_SUCCESS
+ ;;
+ -*)
+ ocf_log warn "invalid log_diff"
+ return $OCF_SUCCESS
+ ;;
+ esac
# calculate preference points depending on how far behind the master
are we
local_diff=$((master_pos-local_pos))
@@ -700,11 +713,11 @@
elif [ "$local_diff" -ge 5 ]; then
points=75
elif [ "$local_diff" -ge 0 ]; then
- if [ $local_pos -eq $exec_pos ]; then
- points=100
- else
- points=90
- fi
+ if [ $local_pos -eq $exec_pos ]; then
+ points=100
+ else
+ points=90
+ fi
fi
ocf_run $CRM_MASTER -v $points
_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/