summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorf4rnham <f4rnham@PC.none>2015-04-24 12:38:59 +0200
committerKristian Nielsen <knielsen@knielsen-hq.org>2015-04-24 13:08:27 +0200
commit060ec5b6b9384456695b6fc903ccfeb8c7ccd298 (patch)
treef27cb185b0499c266af19571377ba07c4fc20cf3
parentb616991a68c78733770fa4519d2f92b052932160 (diff)
downloadmariadb-git-060ec5b6b9384456695b6fc903ccfeb8c7ccd298.tar.gz
MDEV-7130: MASTER_POS_WAIT(log_name,log_pos,timeout,"connection_name") hangs, does not respect the timeout
Changed also arg_count check for connection_name to prevent same bug if fifth argument is introduced in future
-rw-r--r--mysql-test/suite/rpl/r/rpl_master_pos_wait.result22
-rw-r--r--mysql-test/suite/rpl/t/rpl_master_pos_wait.test31
-rw-r--r--sql/item_func.cc4
3 files changed, 55 insertions, 2 deletions
diff --git a/mysql-test/suite/rpl/r/rpl_master_pos_wait.result b/mysql-test/suite/rpl/r/rpl_master_pos_wait.result
index bf4347757f7..78bda5a1c6f 100644
--- a/mysql-test/suite/rpl/r/rpl_master_pos_wait.result
+++ b/mysql-test/suite/rpl/r/rpl_master_pos_wait.result
@@ -18,4 +18,26 @@ show slave status;
select master_pos_wait('foo', 98);
master_pos_wait('foo', 98)
NULL
+*** MDEV-7130: MASTER_POS_WAIT(log_name,log_pos,timeout,"connection_name") hangs, does not respect the timeout ***
+include/stop_slave.inc
+reset slave all;
+change master 'my_slave' to master_port=MASTER_MYPORT, master_host='127.0.0.1', master_user='root';
+set default_master_connection = 'my_slave';
+include/start_slave.inc
+# Call without connection name -- works (expected -1)
+select master_pos_wait('master-bin.000001',1000000,1);
+master_pos_wait('master-bin.000001',1000000,1)
+-1
+set default_master_connection = '';
+# Call for non-existing anonymous connection -- works (expected NULL)
+select master_pos_wait('master-bin.000001',1000000,1);
+master_pos_wait('master-bin.000001',1000000,1)
+NULL
+# Call with a valid connection name -- hangs before MDEV-7130 fix (expected -1)
+select master_pos_wait('master-bin.000001',1000000,1,"my_slave");
+master_pos_wait('master-bin.000001',1000000,1,"my_slave")
+-1
+STOP SLAVE 'my_slave';
+RESET SLAVE 'my_slave' ALL;
+change master to master_port=MASTER_MYPORT, master_host='127.0.0.1', master_user='root';
include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_master_pos_wait.test b/mysql-test/suite/rpl/t/rpl_master_pos_wait.test
index 25e27f62d0a..a3f3ff56464 100644
--- a/mysql-test/suite/rpl/t/rpl_master_pos_wait.test
+++ b/mysql-test/suite/rpl/t/rpl_master_pos_wait.test
@@ -25,5 +25,36 @@ echo "*** must be NULL ***";
select master_pos_wait('foo', 98);
# End of 4.1 tests
+
+
+--echo *** MDEV-7130: MASTER_POS_WAIT(log_name,log_pos,timeout,"connection_name") hangs, does not respect the timeout ***
+
+--connection slave
+--source include/stop_slave.inc
+reset slave all;
+--replace_result $MASTER_MYPORT MASTER_MYPORT
+eval change master 'my_slave' to master_port=$MASTER_MYPORT, master_host='127.0.0.1', master_user='root';
+set default_master_connection = 'my_slave';
+--source include/start_slave.inc
+
+--echo # Call without connection name -- works (expected -1)
+select master_pos_wait('master-bin.000001',1000000,1);
+
+set default_master_connection = '';
+
+--echo # Call for non-existing anonymous connection -- works (expected NULL)
+select master_pos_wait('master-bin.000001',1000000,1);
+
+--echo # Call with a valid connection name -- hangs before MDEV-7130 fix (expected -1)
+select master_pos_wait('master-bin.000001',1000000,1,"my_slave");
+
+STOP SLAVE 'my_slave';
+RESET SLAVE 'my_slave' ALL;
+
+--replace_result $MASTER_MYPORT MASTER_MYPORT
+eval change master to master_port=$MASTER_MYPORT, master_host='127.0.0.1', master_user='root';
+
+# End of 10.0 tests
+
--let $rpl_only_running_threads= 1
--source include/rpl_end.inc
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 84559504bbb..0dabd06d423 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -3943,11 +3943,11 @@ longlong Item_master_pos_wait::val_int()
}
#ifdef HAVE_REPLICATION
longlong pos = (ulong)args[1]->val_int();
- longlong timeout = (arg_count==3) ? args[2]->val_int() : 0 ;
+ longlong timeout = (arg_count>=3) ? args[2]->val_int() : 0 ;
String connection_name_buff;
LEX_STRING connection_name;
Master_info *mi;
- if (arg_count == 4)
+ if (arg_count >= 4)
{
String *con;
if (!(con= args[3]->val_str(&connection_name_buff)))