[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pecl-cvs
Subject:    [PECL-CVS] =?utf-8?q?svn:_/pecl/mysqlnd=5Fms/trunk/_mysqlnd=5Fms=5Ffilter=5Fqos.c_tests/mysqlnd=5Fms
From:       Ulf_Wendel <uw () php ! net>
Date:       2011-11-30 15:59:24
Message-ID: svn-uw-1322668764-320200-105293496 () svn ! php ! net
[Download RAW message or body]

uw                                       Wed, 30 Nov 2011 15:59:24 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=320200

Log:
Changing error handling. Don't bubble up error. It will stop execution although we \
can easily continue and use master only. Continuing is what makes most sense for a \
drop-in solution. Emit warning to inform user about issue. Needs 5.3 code, 5.3 and \
5.4 behaviour differ after push. Leaving to Andrey to fix.

Changed paths:
    U   pecl/mysqlnd_ms/trunk/mysqlnd_ms_filter_qos.c
    U   pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_filter_qos_rt_gtid.phpt
    U   pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_lost_connection.phpt
    U   pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_sql_error.phpt
    U   pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_sql_error2.phpt
    U   pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_sql_parsing2.phpt


["svn-diffs-320200.txt" (text/x-diff)]

Modified: pecl/mysqlnd_ms/trunk/mysqlnd_ms_filter_qos.c
===================================================================
--- pecl/mysqlnd_ms/trunk/mysqlnd_ms_filter_qos.c	2011-11-30 14:36:26 UTC (rev \
                320199)
+++ pecl/mysqlnd_ms/trunk/mysqlnd_ms_filter_qos.c	2011-11-30 15:59:24 UTC (rev \
320200) @@ -41,12 +41,21 @@

 /* {{{ mysqlnd_ms_qos_get_gtid */
 static enum_func_status mysqlnd_ms_qos_server_has_gtid(MYSQLND_CONN_DATA * conn,
-		MYSQLND_MS_CONN_DATA ** conn_data, char *sql, size_t sql_len TSRMLS_DC) {
+		MYSQLND_MS_CONN_DATA ** conn_data, char *sql, size_t sql_len, MYSQLND_ERROR_INFO * \
tmp_error_info TSRMLS_DC) {  MYSQLND_RES * res = NULL;
 	enum_func_status ret = FAIL;
+	/* TODO Andrey */
+#if MYSQLND_VERSION_ID >= 50010
+	MYSQLND_ERROR_INFO * org_error_info = NULL;
+#endif

 	DBG_ENTER("mysqlnd_ms_qos_server_has_gtid");

+#if MYSQLND_VERSION_ID >= 50010
+	/* hide errors from user */
+	org_error_info = conn->error_info;
+	conn->error_info = tmp_error_info;
+#endif
 	(*conn_data)->skip_ms_calls = TRUE;
 	if ((PASS == MS_CALL_ORIGINAL_CONN_DATA_METHOD(send_query)(conn, sql, sql_len \
TSRMLS_CC)) &&  (PASS ==  MS_CALL_ORIGINAL_CONN_DATA_METHOD(reap_query)(conn \
TSRMLS_CC)) && @@ -54,6 +63,10 @@
 		ret = (MYSQLND_MS_UPSERT_STATUS(conn).affected_rows) ? PASS : FAIL;
 	}
 	(*conn_data)->skip_ms_calls = FALSE;
+#if MYSQLND_VERSION_ID >= 50010
+	conn->error_info = org_error_info;
+#endif
+
 	if (res) {
 		res->m.free_result(res, FALSE TSRMLS_CC);
 	}
@@ -100,50 +113,59 @@
 				MYSQLND_MS_LIST_DATA * element = NULL;
 				MYSQLND_CONN_DATA * connection = NULL;
 				MYSQLND_MS_CONN_DATA ** conn_data = NULL;
+				MYSQLND_ERROR_INFO *tmp_error_info = mnd_ecalloc(1,sizeof(MYSQLND_ERROR_INFO));
+				smart_str sql = {0};
+				zend_bool exit_loop = FALSE;

 				BEGIN_ITERATE_OVER_SERVER_LIST(element, slave_list);
-					if (element->conn) {
+					if (element->conn && !exit_loop) {
 						connection = element->conn;
 						MS_LOAD_CONN_DATA(conn_data, connection);
 						if (conn_data && (*conn_data) && (*conn_data)->global_trx.check_for_gtid &&
 							(CONN_GET_STATE(connection) != CONN_QUIT_SENT) &&
 							((CONN_GET_STATE(connection) > CONN_ALLOCED) ||	(PASS == \
mysqlnd_ms_lazy_connect(element, TRUE TSRMLS_CC))))  {
-							smart_str sql = {0};
-							char * pos;
-							char buf[32];

-							DBG_INF_FMT("Checking slave connection "MYSQLND_LLU_SPEC"", \
connection->thread_id); +							 DBG_INF_FMT("Checking slave connection \
"MYSQLND_LLU_SPEC"", connection->thread_id);

-							pos = strstr((*conn_data)->global_trx.check_for_gtid, "#GTID");
-							if (pos) {
-								smart_str_appendl(&sql, (*conn_data)->global_trx.check_for_gtid, pos - \
                ((*conn_data)->global_trx.check_for_gtid));
-								snprintf(buf, sizeof(buf), "%ld", filter_data->option_value);
-								smart_str_appends(&sql, buf);
-								smart_str_appendc(&sql, '\0');
-								if (PASS == mysqlnd_ms_qos_server_has_gtid(connection, conn_data, sql.c, \
                sql.len - 1 TSRMLS_CC)) {
-									zend_llist_add_element(selected_slaves, &element);
+							if (!sql.c) {
+								char * pos;
+								char buf[32];
+								pos = strstr((*conn_data)->global_trx.check_for_gtid, "#GTID");
+								if (pos) {
+								  	smart_str_appendl(&sql, (*conn_data)->global_trx.check_for_gtid, pos - \
((*conn_data)->global_trx.check_for_gtid)); +									snprintf(buf, sizeof(buf), \
"%ld", filter_data->option_value); +									smart_str_appends(&sql, buf);
+									smart_str_appendc(&sql, '\0');
 								} else {
-									MYSQLND_ERROR_INFO connection_error_info = \
MYSQLND_MS_ERROR_INFO(connection);  char error_buf[256];
-									snprintf(error_buf, sizeof(error_buf), MYSQLND_MS_ERROR_PREFIX " SQL error \
while checking slave for GTID: '%s'", connection_error_info.error); \
+									snprintf(error_buf, sizeof(error_buf), MYSQLND_MS_ERROR_PREFIX " Failed \
parse SQL for checking GTID. Cannot find #GTID placeholder");  \
                error_buf[sizeof(error_buf) - 1] = '\0';
-									SET_CLIENT_ERROR((*error_info), CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, \
error_buf);  php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", error_buf);
+									exit_loop = TRUE;
 								}
-								smart_str_free(&sql);
-							} else {
-								char error_buf[256];
-								snprintf(error_buf, sizeof(error_buf), MYSQLND_MS_ERROR_PREFIX " Failed \
                parse SQL for checking GTID. Cannot find #GTID placeholder");
-								error_buf[sizeof(error_buf) - 1] = '\0';
-								SET_CLIENT_ERROR((*error_info), CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, \
                error_buf);
-								php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", error_buf);
 							}
+							if (sql.c) {
+								tmp_error_info->error_no = 0;
+								if (PASS == mysqlnd_ms_qos_server_has_gtid(connection, conn_data, sql.c, \
sql.len - 1, tmp_error_info TSRMLS_CC)) { \
+									zend_llist_add_element(selected_slaves, &element); +								} else if \
(tmp_error_info->error_no) { +									char error_buf[256];
+									snprintf(error_buf, sizeof(error_buf), MYSQLND_MS_ERROR_PREFIX " SQL error \
while checking slave for GTID: %d/'%s'", tmp_error_info->error_no, \
tmp_error_info->error); +									error_buf[sizeof(error_buf) - 1] = '\0';
+									php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", error_buf);
+								}
+							}
 						}
 					}
 					i++;
 				END_ITERATE_OVER_SERVER_LIST;

+				if (sql.c)
+					smart_str_free(&sql);
+
+				mnd_efree(tmp_error_info);
+
 				zend_llist_copy(selected_masters, master_list);
 				break;
 			}
@@ -170,8 +192,11 @@
 				We may inject mysqlnd_qc per-query TTL SQL hints here to
 				replace a slave access with a call access.
 			*/
+			if (QOS_OPTION_AGE == filter_data->option) {
+			} else {
+				zend_llist_copy(selected_slaves, slave_list);
+			}
 			zend_llist_copy(selected_masters, master_list);
-			zend_llist_copy(selected_slaves, slave_list);
 			break;

 		default:

Modified: pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_filter_qos_rt_gtid.phpt
===================================================================
--- pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_filter_qos_rt_gtid.phpt	2011-11-30 \
                14:36:26 UTC (rev 320199)
+++ pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_filter_qos_rt_gtid.phpt	2011-11-30 \
15:59:24 UTC (rev 320200) @@ -17,11 +17,18 @@
 _skipif_connect($slave_host_only, $user, $passwd, $db, $slave_port, $slave_socket);

 include_once("util.inc");
+$ret = mst_is_slave_of($slave_host_only, $slave_port, $slave_socket, \
$master_host_only, $master_port, $master_socket, $user, $passwd, $db); +if \
(is_string($ret)) +	die(sprintf("SKIP Failed to check relation of configured master \
and slave, %s\n", $ret)); +
 $sql = mst_get_gtid_sql($db);
 if ($error = mst_mysqli_setup_gtid_table($master_host_only, $user, $passwd, $db, \
$master_port, $master_socket))  die(sprintf("SKIP Failed to setup GTID on master, \
%s\n", $error));

+if ($error = mst_mysqli_drop_gtid_table($slave_host_only, $user, $passwd, $db, \
$slave_port, $slave_socket)) +	die(sprintf("SKIP Failed to drop GTID table on slave \
%s\n", $error));

+
 $settings = array(
 	"myapp" => array(
 		'master' => array(
@@ -120,7 +127,9 @@
     string(1) "1"
   }
 }
-GTID '%d'
+GTID '5'
+
+Warning: mysqli::query(): (mysqlnd_ms) SQL error while checking slave for GTID: \
1146/'%s' in %s on line %d  array(1) {
   [0]=>
   array(1) {
@@ -128,5 +137,7 @@
     string(1) "1"
   }
 }
-[009] Run on %s
+
+Warning: mysqli::query(): (mysqlnd_ms) SQL error while checking slave for GTID: \
1146/'%s' in %s on line %d +[009] Run on master1-%s
 done!
\ No newline at end of file

Modified: pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_lost_connection.phpt
===================================================================
--- pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_lost_connection.phpt	2011-11-30 \
                14:36:26 UTC (rev 320199)
+++ pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_lost_connection.phpt	2011-11-30 \
15:59:24 UTC (rev 320200) @@ -131,7 +131,7 @@
 	if ($error = mst_mysqli_drop_gtid_table($master_host_only, $user, $passwd, $db, \
$master_port, $master_socket))  printf("[clean] %s\n", $error));
 ?>
---XFAIL--
-Some warning, which one depends on upcoming implementation from Andrey
 --EXPECTF--
+[006] [%d] %s
+[007] [%d] %s
 done!
\ No newline at end of file

Modified: pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_sql_error.phpt
===================================================================
--- pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_sql_error.phpt	2011-11-30 \
                14:36:26 UTC (rev 320199)
+++ pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_sql_error.phpt	2011-11-30 \
15:59:24 UTC (rev 320200) @@ -107,8 +107,12 @@
 ?>
 --EXPECTF--
 Warning: mysqli::query(): (mysqlnd_ms) Failed parse SQL for checking GTID. Cannot \
                find #GTID placeholder in %s on line %d
-
-Warning: mysqli::query(): (mysqlnd_ms) Failed parse SQL for checking GTID. Cannot \
                find #GTID placeholder in %s on line %d
-[006] [2000] (mysqlnd_ms) Failed parse SQL for checking GTID. Cannot find #GTID \
                placeholder
-[007] [2000] '(mysqlnd_ms) Failed parse SQL for checking GTID. Cannot find #GTID \
placeholder' +array(1) {
+  [0]=>
+  array(1) {
+    [0]=>
+    string(1) "1"
+  }
+}
+[007] [0] ''
 done!
\ No newline at end of file

Modified: pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_sql_error2.phpt
===================================================================
--- pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_sql_error2.phpt	2011-11-30 \
                14:36:26 UTC (rev 320199)
+++ pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_sql_error2.phpt	2011-11-30 \
15:59:24 UTC (rev 320200) @@ -17,6 +17,11 @@
 _skipif_connect($slave_host_only, $user, $passwd, $db, $slave_port, $slave_socket);

 include_once("util.inc");
+$ret = mst_is_slave_of($slave_host_only, $slave_port, $slave_socket, \
$master_host_only, $master_port, $master_socket, $user, $passwd, $db); +if \
(is_string($ret)) +	die(sprintf("SKIP Failed to check relation of configured master \
and slave, %s\n", $ret)); +
+include_once("util.inc");
 $sql = mst_get_gtid_sql($db);
 if ($error = mst_mysqli_setup_gtid_table($master_host_only, $user, $passwd, $db, \
$master_port, $master_socket))  die(sprintf("SKIP Failed to setup GTID on master, \
%s\n", $error)); @@ -106,9 +111,15 @@
 		printf("[clean] %s\n", $error));
 ?>
 --EXPECTF--
-Warning: mysqli::query(): (mysqlnd_ms) SQL error while checking slave for GTID: '%s' \
in %s on line %d +Warning: mysqli::query(): (mysqlnd_ms) SQL error while checking \
slave for GTID: 1064/'%s' at line 1' in %s on line %d

-Warning: mysqli::query(): (mysqlnd_ms) SQL error while checking slave for GTID: '%s' \
                in %s on line %d
-[006] [2000] (mysqlnd_ms) SQL error while checking slave for GTID: '%s'
-[007] [2000] '(mysqlnd_ms) SQL error while checking slave for GTID: '%s''
+Warning: mysqli::query(): (mysqlnd_ms) SQL error while checking slave for GTID: \
1064/'%s' at line 1' in %s on line %d +array(1) {
+  [0]=>
+  array(1) {
+    [0]=>
+    string(1) "1"
+  }
+}
+[007] [0] ''
 done!
\ No newline at end of file

Modified: pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_sql_parsing2.phpt
===================================================================
--- pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_sql_parsing2.phpt	2011-11-30 \
                14:36:26 UTC (rev 320199)
+++ pecl/mysqlnd_ms/trunk/tests/mysqlnd_ms_set_qos_gtid_sql_parsing2.phpt	2011-11-30 \
15:59:24 UTC (rev 320200) @@ -106,6 +106,9 @@
 		printf("[clean] %s\n", $error));
 ?>
 --EXPECTF--
+Warning: mysqli::query(): (mysqlnd_ms) SQL error while checking slave for GTID: \
1064/'%s' in %s on line %d +
+Warning: mysqli::query(): (mysqlnd_ms) SQL error while checking slave for GTID: \
1064/'%s' in %s on line %d  array(1) {
   [0]=>
   array(1) {



-- 
PECL CVS Mailing List 
To unsubscribe, visit: http://www.php.net/unsub.php

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic