# 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/

Reply via email to