# HG changeset patch
# User Marian Marinov <[email protected]>
# Date 1268210842 -7200
# Branch mysql-ms
# Node ID 283dfb08a1ee6e378725e006f1a98467fd134cfb
# Parent  7d5becb0cbd1bf5b3558dd85dede99d7f3ef2a3c
Medium: RA: mysql: readonly and updated preference handling

Make all servers readonly during start and switch off the readonly
flag during promotion.

Updated calculate_preference, now we get the master information
after we get the local information.
Now we also check for the logfile and add preference based on that.

diff -r 7d5becb0cbd1 -r 283dfb08a1ee heartbeat/mysql
--- a/heartbeat/mysql   Tue Mar 02 14:43:57 2010 +0100
+++ b/heartbeat/mysql   Wed Mar 10 10:47:22 2010 +0200
@@ -361,7 +361,7 @@
                fi
        else
                if [ "$slave_io" = 'Yes' ] || [ "$slave_sql" = 'Yes' ]; then
-                       if [ "$slave_user" = "$OCF_RESKEY_replication_user" ]; 
then
+                       if [ "$master_user" = "$OCF_RESKEY_replication_user" ]; 
then
                                # machine is slave
                                return 0;
                        fi
@@ -515,6 +515,8 @@
         sleep 2
     done
 
+       mysql --socket=$OCF_RESKEY_socket -O connect_timeout=1 -e 'SET GLOBAL 
read_only=on';
+
     ocf_log info "MySQL started"
     return $OCF_SUCCESS
 }
@@ -571,6 +573,7 @@
        if is_slave; then
                mysql --socket=$OCF_RESKEY_socket -O connect_timeout=1 -e 'STOP 
SLAVE'
        fi
+       mysql --socket=$OCF_RESKEY_socket -O connect_timeout=1 -e 'SET GLOBAL 
read_only=off';
        return $OCF_SUCCESS
 }
 
@@ -598,7 +601,7 @@
                return $OCF_NOT_RUNNING
        fi
        if [ $# != 1 ] && [ "$OCF_RESKEY_CRM_meta_notify_demote_uname" != 
"$HOSTNAME " ]; then
-               return $OCF_ERR_GENERIC
+               return $OCF_SUCCESS
        fi
        if is_slave 1; then
                return $OCF_SUCCESS
@@ -632,6 +635,9 @@
                                MASTER_CONNECT_RETRY=4"
                mysql --socket=$OCF_RESKEY_socket -O connect_timeout=1 -e 
'START SLAVE';
        fi
+
+       mysql --socket=$OCF_RESKEY_socket -O connect_timeout=1 -e 'SET GLOBAL 
read_only=on';
+
        if is_slave 1; then
                return $OCF_SUCCESS
        else
@@ -640,22 +646,8 @@
 }
 
 calculate_preference() {
-       master_file=''
+       master_log=''
        master_pos=''
-       mysql --password=$OCF_RESKEY_replication_passwd \
-               --user=$OCF_RESKEY_replication_user \
-               -h $master_host \
-               -O connect_timeout=1 \
-               -e 'SHOW MASTER STATUS\G'|while read k v; do
-               if [ "$k" = 'File:' ]; then master_file="$v"; fi
-               if [ "$k" = 'Position:' ]; then master_pos="$v"; fi
-       done
-
-       if [ -z "$master_file" ] || [ -z "$master_pos" ]; then
-               ocf_log err "unable to find master file or master position"
-               return $OCF_ERR_GENERIC;
-       fi
-
        local_log=''
        local_pos=''
        exec_pos=''
@@ -671,8 +663,24 @@
                return $OCF_ERR_GENERIC
        fi
 
+       mysql --password=$OCF_RESKEY_replication_passwd \
+               --user=$OCF_RESKEY_replication_user \
+               -h $master_host \
+               -O connect_timeout=1 \
+               -e 'SHOW MASTER STATUS\G'|while read k v; do
+               if [ "$k" = 'File:' ]; then master_log="$v"; fi
+               if [ "$k" = 'Position:' ]; then master_pos="$v"; fi
+       done
+
+       if [ -z "$master_log" ] || [ -z "$master_pos" ]; then
+               ocf_log err "unable to find master log or master position"
+               return $OCF_ERR_GENERIC;
+       fi
+       master_log=$(echo $master_log|sed 's/^.\+\.0\+//')
+       local_log=$(echo $local_log|sed 's/^.\+\.0\+//')
+       log_diff=$((master_log-local_log))
        # no preference for very old slaves
-       if [ "$master_file" != "$local_log" ]; then
+       if [ "$log_diff" -ge 2 ]; then
                ocf_run $CRM_MASTER -v 0
                return 1;
        fi
_______________________________________________________
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