From: Vladislav Vaintroub Date: November 3 2009 12:05am Subject: bzr commit into mysql-5.1-bugteam branch (vvaintroub:3157) Bug#47423 List-Archive: http://lists.mysql.com/commits/89015 X-Bug: 47423 Message-Id: <0KSI002T2AX5P950@fe-emea-10.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_dPjzexEN+A3vcec6BiDNgQ)" --Boundary_(ID_dPjzexEN+A3vcec6BiDNgQ) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///H:/bzr/mysql-5.1-bugteam/ based on revid:vvaintroub@stripped 3157 Vladislav Vaintroub 2009-11-03 Bug #47423 mtr connects to wrong database The reason for the bug is that mysqtest as well as other client tools running in test suite (mysqlbinlog, mysqldump) will first try to connect whatever database has created shared memory with default base name "MySQL" and use this. (Same effect could be seen on Unix if mtr would not care to calculate "port" and "socket" parameter). The fix ensures that all client tools and running in mtr use unique per-database shared memory base parameters, so there is no possibility to clash with already installed one. We use socket name for shared memory base (it's known to be unique). This shared-memory-base is written to the MTR config file to the [client] and [mysqld] sections. Fix made also made sure all client tools understand and correctly handle --shared-memory-base. Prior to this patch it was not the case for mysqltest, mysqlbinlog and mysql_client_test. All new connections done from mtr scripts via connect() will by default set shared-memory-base. And finally, there is a possibility to force shared memory or pipe connection and overwrite shared memory/pipe base name from within mtr scripts via optional PIPE or SHM modifier. This functionality was manually backported from 6.0 (original patch http://lists.mysql.com/commits/74749) modified: client/mysqlbinlog.cc client/mysqltest.cc mysql-test/lib/My/ConfigFactory.pm mysql-test/t/named_pipe.test tests/mysql_client_test.c === modified file 'client/mysqlbinlog.cc' --- a/client/mysqlbinlog.cc 2009-09-30 02:31:25 +0000 +++ b/client/mysqlbinlog.cc 2009-11-03 00:05:21 +0000 @@ -78,6 +78,9 @@ static const char* host = 0; static int port= 0; static uint my_end_arg; static const char* sock= 0; +#ifdef HAVE_SMEM +static char *shared_memory_base_name= 0; +#endif static const char* user = 0; static char* pass = 0; static char *charset= 0; @@ -1077,6 +1080,12 @@ static struct my_option my_long_options[ {"set-charset", OPT_SET_CHARSET, "Add 'SET NAMES character_set' to the output.", (uchar**) &charset, (uchar**) &charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, +#ifdef HAVE_SMEM + {"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME, + "Base name of shared memory.", (uchar**) &shared_memory_base_name, + (uchar**) &shared_memory_base_name, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, +#endif {"short-form", 's', "Just show regular queries: no extra info and no " "row-based events. This is for testing only, and should not be used in " "production systems. If you want to suppress base64-output, consider " @@ -1379,6 +1388,11 @@ static Exit_status safe_connect() if (opt_protocol) mysql_options(mysql, MYSQL_OPT_PROTOCOL, (char*) &opt_protocol); +#ifdef HAVE_SMEM + if (shared_memory_base_name) + mysql_options(mysql, MYSQL_SHARED_MEMORY_BASE_NAME, + shared_memory_base_name); +#endif if (!mysql_real_connect(mysql, host, user, pass, 0, port, sock, 0)) { error("Failed on connect: %s", mysql_error(mysql)); === modified file 'client/mysqltest.cc' --- a/client/mysqltest.cc 2009-10-08 15:36:36 +0000 +++ b/client/mysqltest.cc 2009-11-03 00:05:21 +0000 @@ -81,6 +81,9 @@ enum { static int record= 0, opt_sleep= -1; static char *opt_db= 0, *opt_pass= 0; const char *opt_user= 0, *opt_host= 0, *unix_sock= 0, *opt_basedir= "./"; +#ifdef HAVE_SMEM +static char *shared_memory_base_name=0; +#endif const char *opt_logdir= ""; const char *opt_include= 0, *opt_charsets_dir; static int opt_port= 0; @@ -4896,6 +4899,8 @@ do_handle_error: - options to use for the connection * SSL - use SSL if available * COMPRESS - use compression if available + * SHM - use shared memory if available + * PIPE - use named pipe if available */ @@ -4904,6 +4909,7 @@ void do_connect(struct st_command *comma int con_port= opt_port; char *con_options; my_bool con_ssl= 0, con_compress= 0; + my_bool con_pipe= 0, con_shm= 0; struct st_connection* con_slot; static DYNAMIC_STRING ds_connection_name; @@ -4914,6 +4920,9 @@ void do_connect(struct st_command *comma static DYNAMIC_STRING ds_port; static DYNAMIC_STRING ds_sock; static DYNAMIC_STRING ds_options; +#ifdef HAVE_SMEM + static DYNAMIC_STRING ds_shm; +#endif const struct command_arg connect_args[] = { { "connection name", ARG_STRING, TRUE, &ds_connection_name, "Name of the connection" }, { "host", ARG_STRING, TRUE, &ds_host, "Host to connect to" }, @@ -4941,6 +4950,11 @@ void do_connect(struct st_command *comma die("Illegal argument for port: '%s'", ds_port.str); } +#ifdef HAVE_SMEM + /* Shared memory */ + init_dynamic_string(&ds_shm, ds_sock.str, 0, 0); +#endif + /* Sock */ if (ds_sock.length) { @@ -4979,6 +4993,10 @@ void do_connect(struct st_command *comma con_ssl= 1; else if (!strncmp(con_options, "COMPRESS", 8)) con_compress= 1; + else if (!strncmp(con_options, "PIPE", 4)) + con_pipe= 1; + else if (!strncmp(con_options, "SHM", 3)) + con_shm= 1; else die("Illegal option to connect: %.*s", (int) (end - con_options), con_options); @@ -5026,6 +5044,31 @@ void do_connect(struct st_command *comma } #endif +#ifdef __WIN__ + if (con_pipe) + { + uint protocol= MYSQL_PROTOCOL_PIPE; + mysql_options(&con_slot->mysql, MYSQL_OPT_PROTOCOL, &protocol); + } +#endif + +#ifdef HAVE_SMEM + if (con_shm) + { + uint protocol= MYSQL_PROTOCOL_MEMORY; + if (!ds_shm.length) + die("Missing shared memory base name"); + mysql_options(&con_slot->mysql, MYSQL_SHARED_MEMORY_BASE_NAME, ds_shm.str); + mysql_options(&con_slot->mysql, MYSQL_OPT_PROTOCOL, &protocol); + } + else if(shared_memory_base_name) + { + mysql_options(&con_slot->mysql, MYSQL_SHARED_MEMORY_BASE_NAME, + shared_memory_base_name); + } +#endif + + /* Use default db name */ if (ds_database.length == 0) dynstr_set(&ds_database, opt_db); @@ -5058,6 +5101,9 @@ void do_connect(struct st_command *comma dynstr_free(&ds_port); dynstr_free(&ds_sock); dynstr_free(&ds_options); +#ifdef HAVE_SMEM + dynstr_free(&ds_shm); +#endif DBUG_VOID_RETURN; } @@ -5724,6 +5770,12 @@ static struct my_option my_long_options[ 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"server-file", 'F', "Read embedded server arguments from file.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, +#ifdef HAVE_SMEM + {"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME, + "Base name of shared memory.", (uchar**) &shared_memory_base_name, + (uchar**) &shared_memory_base_name, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, + 0, 0, 0}, +#endif {"silent", 's', "Suppress all normal output. Synonym for --quiet.", (uchar**) &silent, (uchar**) &silent, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"skip-safemalloc", OPT_SKIP_SAFEMALLOC, @@ -7673,6 +7725,11 @@ int main(int argc, char **argv) } #endif +#ifdef HAVE_SMEM + if (shared_memory_base_name) + mysql_options(&con->mysql,MYSQL_SHARED_MEMORY_BASE_NAME,shared_memory_base_name); +#endif + if (!(con->name = my_strdup("default", MYF(MY_WME)))) die("Out of memory"); === modified file 'mysql-test/lib/My/ConfigFactory.pm' --- a/mysql-test/lib/My/ConfigFactory.pm 2009-06-22 14:27:05 +0000 +++ b/mysql-test/lib/My/ConfigFactory.pm 2009-11-03 00:05:21 +0000 @@ -7,6 +7,7 @@ use Carp; use My::Config; use My::Find; +use My::Platform; use File::Basename; @@ -218,7 +219,13 @@ my @mysqld_rules= { 'ssl-key' => \&fix_ssl_server_key }, ); - +if (IS_WINDOWS) +{ + # For simplicity, we use the same names for shared memory and + # named pipes. + push(@mysqld_rules, {'shared-memory-base-name' => \&fix_socket}); +} + sub fix_ndb_mgmd_port { my ($self, $config, $group_name, $group)= @_; my $hostname= $group->value('HostName'); @@ -347,6 +354,16 @@ sub post_check_client_group { } $config->insert($client_group_name, $name_to, $option->value()) } + + if (IS_WINDOWS) + { + # Shared memory base may or may not be defined (e.g not defined in embedded) + my $shm = $group_to_copy_from->option("shared-memory-base-name"); + if (defined $shm) + { + $config->insert($client_group_name,"shared-memory-base-name", $shm->value()); + } + } } @@ -393,6 +410,7 @@ sub post_check_embedded_group { ( '#log-error', # Embedded server writes stderr to mysqltest's log file 'slave-net-timeout', # Embedded server are not build with replication + 'shared-memory-base-name', # No shared memory for embedded ); foreach my $option ( $mysqld->options(), $first_mysqld->options() ) { === modified file 'mysql-test/t/named_pipe.test' --- a/mysql-test/t/named_pipe.test 2007-09-24 10:42:44 +0000 +++ b/mysql-test/t/named_pipe.test 2009-11-03 00:05:21 +0000 @@ -9,6 +9,11 @@ if (`SELECT '$nmp' != 'ON'`){ skip No named pipe support; } +# Connect using named pipe for testing +connect(pipe_con,localhost,root,,,,,PIPE); + # Source select test case -- source include/common-tests.inc +connection default; +disconnect pipe_con; === modified file 'tests/mysql_client_test.c' --- a/tests/mysql_client_test.c 2009-09-02 10:09:01 +0000 +++ b/tests/mysql_client_test.c 2009-11-03 00:05:21 +0000 @@ -46,6 +46,9 @@ static char *opt_user= 0; static char *opt_password= 0; static char *opt_host= 0; static char *opt_unix_socket= 0; +#ifdef HAVE_SMEM +static char *shared_memory_base_name= 0; +#endif static unsigned int opt_port; static my_bool tty_password= 0, opt_silent= 0; @@ -230,6 +233,26 @@ static void print_st_error(MYSQL_STMT *s } } +/* + Enhanced version of mysql_client_init(), which may also set shared memory + base on Windows. +*/ +static MYSQL *mysql_client_init(MYSQL* con) +{ + MYSQL* res = mysql_init(con); +#ifdef HAVE_SMEM + if (res && shared_memory_base_name) + mysql_options(res, MYSQL_SHARED_MEMORY_BASE_NAME, shared_memory_base_name); +#endif + return res; +} + +/* + Disable direct calls of mysql_init, as it disregards shared memory base. +*/ +#define mysql_init(A) Please use mysql_client_init instead of mysql_init + + /* Check if the connection has InnoDB tables */ static my_bool check_have_innodb(MYSQL *conn) @@ -293,10 +316,10 @@ static MYSQL* client_connect(ulong flag, fprintf(stdout, "\n Establishing a connection to '%s' ...", opt_host ? opt_host : ""); - if (!(mysql= mysql_init(NULL))) + if (!(mysql= mysql_client_init(NULL))) { opt_silent= 0; - myerror("mysql_init() failed"); + myerror("mysql_client_init() failed"); exit(1); } /* enable local infile, in non-binary builds often disabled by default */ @@ -1160,9 +1183,9 @@ static my_bool thread_query(char *query) error= 0; if (!opt_silent) fprintf(stdout, "\n in thread_query(%s)", query); - if (!(l_mysql= mysql_init(NULL))) + if (!(l_mysql= mysql_client_init(NULL))) { - myerror("mysql_init() failed"); + myerror("mysql_client_init() failed"); return 1; } if (!(mysql_real_connect(l_mysql, opt_host, opt_user, @@ -2512,9 +2535,9 @@ static void test_ps_query_cache() case TEST_QCACHE_ON_WITH_OTHER_CONN: if (!opt_silent) fprintf(stdout, "\n Establishing a test connection ..."); - if (!(lmysql= mysql_init(NULL))) + if (!(lmysql= mysql_client_init(NULL))) { - printf("mysql_init() failed"); + printf("mysql_client_init() failed"); DIE_UNLESS(0); } if (!(mysql_real_connect(lmysql, opt_host, opt_user, @@ -4960,9 +4983,9 @@ static void test_stmt_close() if (!opt_silent) fprintf(stdout, "\n Establishing a test connection ..."); - if (!(lmysql= mysql_init(NULL))) + if (!(lmysql= mysql_client_init(NULL))) { - myerror("mysql_init() failed"); + myerror("mysql_client_init() failed"); exit(1); } if (!(mysql_real_connect(lmysql, opt_host, opt_user, @@ -5851,9 +5874,9 @@ DROP TABLE IF EXISTS test_multi_tab"; rc= mysql_more_results(mysql); DIE_UNLESS(rc == 0); - if (!(mysql_local= mysql_init(NULL))) + if (!(mysql_local= mysql_client_init(NULL))) { - fprintf(stdout, "\n mysql_init() failed"); + fprintf(stdout, "\n mysql_client_init() failed"); exit(1); } @@ -5976,9 +5999,9 @@ static void test_prepare_multi_statement char query[MAX_TEST_QUERY_LENGTH]; myheader("test_prepare_multi_statements"); - if (!(mysql_local= mysql_init(NULL))) + if (!(mysql_local= mysql_client_init(NULL))) { - fprintf(stderr, "\n mysql_init() failed"); + fprintf(stderr, "\n mysql_client_init() failed"); exit(1); } @@ -7459,9 +7482,9 @@ static void test_prepare_grant() if (!opt_silent) fprintf(stdout, "\n Establishing a test connection ..."); - if (!(lmysql= mysql_init(NULL))) + if (!(lmysql= mysql_client_init(NULL))) { - myerror("mysql_init() failed"); + myerror("mysql_client_init() failed"); exit(1); } if (!(mysql_real_connect(lmysql, opt_host, "test_grant", @@ -7915,9 +7938,9 @@ static void test_drop_temp() if (!opt_silent) fprintf(stdout, "\n Establishing a test connection ..."); - if (!(lmysql= mysql_init(NULL))) + if (!(lmysql= mysql_client_init(NULL))) { - myerror("mysql_init() failed"); + myerror("mysql_client_init() failed"); exit(1); } @@ -13159,7 +13182,7 @@ static void test_bug15518() int rc; myheader("test_bug15518"); - mysql1= mysql_init(NULL); + mysql1= mysql_client_init(NULL); if (!mysql_real_connect(mysql1, opt_host, opt_user, opt_password, opt_db ? opt_db : "test", opt_port, opt_unix_socket, @@ -13315,9 +13338,9 @@ static void test_bug8378() if (!opt_silent) fprintf(stdout, "\n Establishing a test connection ..."); - if (!(lmysql= mysql_init(NULL))) + if (!(lmysql= mysql_client_init(NULL))) { - myerror("mysql_init() failed"); + myerror("mysql_client_init() failed"); exit(1); } if (mysql_options(lmysql, MYSQL_SET_CHARSET_NAME, "gbk")) @@ -13856,7 +13879,7 @@ static void test_bug9992() if (!opt_silent) printf("Establishing a connection with option CLIENT_MULTI_STATEMENTS..\n"); - mysql1= mysql_init(NULL); + mysql1= mysql_client_init(NULL); if (!mysql_real_connect(mysql1, opt_host, opt_user, opt_password, opt_db ? opt_db : "test", opt_port, opt_unix_socket, @@ -14445,9 +14468,9 @@ static void test_bug12001() myheader("test_bug12001"); - if (!(mysql_local= mysql_init(NULL))) + if (!(mysql_local= mysql_client_init(NULL))) { - fprintf(stdout, "\n mysql_init() failed"); + fprintf(stdout, "\n mysql_client_init() failed"); exit(1); } @@ -15172,9 +15195,9 @@ static void test_opt_reconnect() myheader("test_opt_reconnect"); - if (!(lmysql= mysql_init(NULL))) + if (!(lmysql= mysql_client_init(NULL))) { - myerror("mysql_init() failed"); + myerror("mysql_client_init() failed"); exit(1); } @@ -15209,9 +15232,9 @@ static void test_opt_reconnect() mysql_close(lmysql); - if (!(lmysql= mysql_init(NULL))) + if (!(lmysql= mysql_client_init(NULL))) { - myerror("mysql_init() failed"); + myerror("mysql_client_init() failed"); DIE_UNLESS(0); } @@ -15246,7 +15269,7 @@ static void test_bug12744() int rc; myheader("test_bug12744"); - lmysql= mysql_init(NULL); + lmysql= mysql_client_init(NULL); DIE_UNLESS(lmysql); if (!mysql_real_connect(lmysql, opt_host, opt_user, opt_password, @@ -15819,7 +15842,7 @@ static void test_bug15752() rc= mysql_query(mysql, "create procedure p1() select 1"); myquery(rc); - mysql_init(&mysql_local); + mysql_client_init(&mysql_local); if (! mysql_real_connect(&mysql_local, opt_host, opt_user, opt_password, current_db, opt_port, opt_unix_socket, @@ -16705,7 +16728,7 @@ static void test_bug29692() { MYSQL* conn; - if (!(conn= mysql_init(NULL))) + if (!(conn= mysql_client_init(NULL))) { myerror("test_bug29692 init failed"); exit(1); @@ -16840,7 +16863,7 @@ static void test_bug30472() /* Create a new connection. */ - DIE_UNLESS(mysql_init(&con)); + DIE_UNLESS(mysql_client_init(&con)); DIE_UNLESS(mysql_real_connect(&con, opt_host, @@ -17014,7 +17037,7 @@ static void test_bug20023() /* Create a new connection. */ - DIE_UNLESS(mysql_init(&con)); + DIE_UNLESS(mysql_client_init(&con)); DIE_UNLESS(mysql_real_connect(&con, opt_host, @@ -17151,7 +17174,7 @@ static void bug31418_impl() /* Create a new connection. */ - DIE_UNLESS(mysql_init(&con)); + DIE_UNLESS(mysql_client_init(&con)); DIE_UNLESS(mysql_real_connect(&con, opt_host, @@ -18001,7 +18024,7 @@ static void test_bug44495() "END;"); myquery(rc); - DIE_UNLESS(mysql_init(&con)); + DIE_UNLESS(mysql_client_init(&con)); DIE_UNLESS(mysql_real_connect(&con, opt_host, opt_user, opt_password, current_db, opt_port, opt_unix_socket, @@ -18064,6 +18087,11 @@ static struct my_option client_test_long 0, 0, 0, 0, 0, 0}, {"silent", 's', "Be more silent", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, +#ifdef HAVE_SMEM + {"shared-memory-base-name", 'm', "Base name of shared memory.", + (uchar**) &shared_memory_base_name, (uchar**)&shared_memory_base_name, 0, + GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, +#endif {"socket", 'S', "Socket file to use for connection", (uchar **) &opt_unix_socket, (uchar **) &opt_unix_socket, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, --Boundary_(ID_dPjzexEN+A3vcec6BiDNgQ) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/vvaintroub@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/vvaintroub@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: vvaintroub@stripped # target_branch: file:///H:/bzr/mysql-5.1-bugteam/ # testament_sha1: 28c5fa6a2d63243bb238fe7d0538d13998425b50 # timestamp: 2009-11-03 01:05:27 +0100 # base_revision_id: vvaintroub@stripped\ # bvupsntwxi1f715j # # Begin bundle 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 --Boundary_(ID_dPjzexEN+A3vcec6BiDNgQ)--