List:Commits« Previous MessageNext Message »
From:Vladislav Vaintroub Date:November 3 2009 10:28am
Subject:bzr commit into mysql-6.0-codebase-bugfixing branch (vvaintroub:3694)
View as plain text  
#At file:///H:/bzr/mysql-6.0-codebase-bugfixing/ based on revid:marc.alff@stripped

 3694 Vladislav Vaintroub	2009-11-03 [merge]
      Merge from next-mr-bugfixing (manual).

    modified:
      client/mysqlbinlog.cc
      client/mysqltest.cc
      include/violite.h
      mysql-test/lib/My/ConfigFactory.pm
      sql-common/client.c
      sql/mysqld.cc
      storage/mysql_storage_engine.cmake
      tests/mysql_client_test.c
      vio/vio.c
      vio/vio_priv.h
      vio/viosocket.c
=== modified file 'client/mysqlbinlog.cc'
--- a/client/mysqlbinlog.cc	2009-10-26 14:02:26 +0000
+++ b/client/mysqlbinlog.cc	2009-11-03 10:26:54 +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;
@@ -1090,6 +1093,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 "
@@ -1391,6 +1400,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-25 13:41:27 +0000
+++ b/client/mysqltest.cc	2009-11-03 10:26:54 +0000
@@ -82,6 +82,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;
@@ -5092,8 +5095,13 @@ void do_connect(struct st_command *comma
     uint protocol= MYSQL_PROTOCOL_MEMORY;
     if (!ds_shm.length)
       die("Missing shared memory base name");
-    mysql_options(&con_slot->mysql, MYSQL_OPT_PROTOCOL, &protocol);
     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
 
@@ -5818,6 +5826,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,
@@ -7770,6 +7784,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 'include/violite.h'
--- a/include/violite.h	2009-10-12 09:08:34 +0000
+++ b/include/violite.h	2009-11-03 10:26:54 +0000
@@ -44,7 +44,7 @@ enum enum_vio_type
 Vio*	vio_new(my_socket sd, enum enum_vio_type type, uint flags);
 #ifdef __WIN__
 Vio* vio_new_win32pipe(HANDLE hPipe);
-Vio* vio_new_win32shared_memory(NET *net,HANDLE handle_file_map,
+Vio* vio_new_win32shared_memory(HANDLE handle_file_map,
                                 HANDLE handle_map,
                                 HANDLE event_server_wrote,
                                 HANDLE event_server_read,
@@ -228,7 +228,11 @@ struct st_vio
   HANDLE  event_conn_closed;
   size_t  shared_memory_remain;
   char    *shared_memory_pos;
-  NET     *net;
 #endif /* HAVE_SMEM */
+#ifdef _WIN32
+  OVERLAPPED pipe_overlapped;
+  DWORD read_timeout_millis;
+  DWORD write_timeout_millis;
+#endif
 };
 #endif /* vio_violite_h_ */

=== modified file 'mysql-test/lib/My/ConfigFactory.pm'
--- a/mysql-test/lib/My/ConfigFactory.pm	2009-10-15 12:27:13 +0000
+++ b/mysql-test/lib/My/ConfigFactory.pm	2009-11-03 10:26:54 +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 'sql-common/client.c'
--- a/sql-common/client.c	2009-10-28 07:39:03 +0000
+++ b/sql-common/client.c	2009-11-03 10:26:54 +0000
@@ -430,7 +430,7 @@ HANDLE create_named_pipe(MYSQL *mysql, u
 			    0,
 			    NULL,
 			    OPEN_EXISTING,
-			    0,
+			    FILE_FLAG_OVERLAPPED,
 			    NULL )) != INVALID_HANDLE_VALUE)
       break;
     if (GetLastError() != ERROR_PIPE_BUSY)
@@ -664,7 +664,7 @@ HANDLE create_shared_memory(MYSQL *mysql
 err2:
   if (error_allow == 0)
   {
-    net->vio= vio_new_win32shared_memory(net,handle_file_map,handle_map,
+    net->vio= vio_new_win32shared_memory(handle_file_map,handle_map,
                                          event_server_wrote,
                                          event_server_read,event_client_wrote,
                                          event_client_read,event_conn_closed);
@@ -2419,7 +2419,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,cons
     }
     else
     {
-      net->vio=vio_new_win32pipe(hPipe);
+      net->vio= vio_new_win32pipe(hPipe);
       my_snprintf(host_info=buff, sizeof(buff)-1,
                   ER(CR_NAMEDPIPE_CONNECTION), unix_socket);
     }

=== modified file 'sql/mysqld.cc'
--- a/sql/mysqld.cc	2009-10-29 21:33:17 +0000
+++ b/sql/mysqld.cc	2009-11-03 10:26:54 +0000
@@ -1931,7 +1931,7 @@ static void network_init(void)
     saPipeSecurity.lpSecurityDescriptor = &sdPipeDescriptor;
     saPipeSecurity.bInheritHandle = FALSE;
     if ((hPipe= CreateNamedPipe(pipe_name,
-				PIPE_ACCESS_DUPLEX,
+				PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,
 				PIPE_TYPE_BYTE |
 				PIPE_READMODE_BYTE |
 				PIPE_WAIT,
@@ -5539,16 +5539,26 @@ pthread_handler_t handle_connections_soc
 pthread_handler_t handle_connections_namedpipes(void *arg)
 {
   HANDLE hConnectedPipe;
-  BOOL fConnected;
+  OVERLAPPED connectOverlapped = {0};
   THD *thd;
   my_thread_init();
   DBUG_ENTER("handle_connections_namedpipes");
+  connectOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
 
   DBUG_PRINT("general",("Waiting for named pipe connections."));
   while (!abort_loop)
   {
     /* wait for named pipe connection */
-    fConnected = ConnectNamedPipe(hPipe, NULL);
+    BOOL fConnected= ConnectNamedPipe(hPipe, &connectOverlapped);
+    if (!fConnected && (GetLastError() == ERROR_IO_PENDING))
+    {
+        /*
+          ERROR_IO_PENDING says async IO has started but not yet finished.
+          GetOverlappedResult will wait for completion.
+        */
+        DWORD bytes;
+        fConnected= GetOverlappedResult(hPipe, &connectOverlapped,&bytes, TRUE);
+    }
     if (abort_loop)
       break;
     if (!fConnected)
@@ -5557,7 +5567,7 @@ pthread_handler_t handle_connections_nam
     {
       CloseHandle(hPipe);
       if ((hPipe= CreateNamedPipe(pipe_name,
-                                  PIPE_ACCESS_DUPLEX,
+                                  PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,
                                   PIPE_TYPE_BYTE |
                                   PIPE_READMODE_BYTE |
                                   PIPE_WAIT,
@@ -5577,7 +5587,7 @@ pthread_handler_t handle_connections_nam
     hConnectedPipe = hPipe;
     /* create new pipe for new connection */
     if ((hPipe = CreateNamedPipe(pipe_name,
-				 PIPE_ACCESS_DUPLEX,
+				 PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,
 				 PIPE_TYPE_BYTE |
 				 PIPE_READMODE_BYTE |
 				 PIPE_WAIT,
@@ -5599,7 +5609,7 @@ pthread_handler_t handle_connections_nam
       CloseHandle(hConnectedPipe);
       continue;
     }
-    if (!(thd->net.vio = vio_new_win32pipe(hConnectedPipe)) ||
+    if (!(thd->net.vio= vio_new_win32pipe(hConnectedPipe)) ||
 	my_net_init(&thd->net, thd->net.vio))
     {
       close_connection(thd, ER_OUT_OF_RESOURCES, 1);
@@ -5610,7 +5620,7 @@ pthread_handler_t handle_connections_nam
     thd->security_ctx->host= my_strdup(my_localhost, MYF(0));
     create_new_thread(thd);
   }
-
+  CloseHandle(connectOverlapped.hEvent);
   decrement_handler_count();
   DBUG_RETURN(0);
 }
@@ -5787,8 +5797,7 @@ pthread_handler_t handle_connections_sha
       errmsg= "Could not set client to read mode";
       goto errorconn;
     }
-    if (!(thd->net.vio= vio_new_win32shared_memory(&thd->net,
-                                                   handle_client_file_map,
+    if (!(thd->net.vio= vio_new_win32shared_memory(handle_client_file_map,
                                                    handle_client_map,
                                                    event_client_wrote,
                                                    event_client_read,

=== modified file 'storage/mysql_storage_engine.cmake'
--- a/storage/mysql_storage_engine.cmake	2009-10-08 13:04:36 +0000
+++ b/storage/mysql_storage_engine.cmake	2009-11-03 10:26:54 +0000
@@ -34,7 +34,7 @@ IF(NOT SOURCE_SUBLIBS)
     #The dll is linked to the mysqld executable
     SET(dyn_libname ha_${libname})
     ADD_LIBRARY(${dyn_libname} SHARED ${${engine}_SOURCES})
-    TARGET_LINK_LIBRARIES (${dyn_libname}  mysqld)
+    TARGET_LINK_LIBRARIES (${dyn_libname}  mysqld libservices)
     IF(${engine}_LIBS)
       TARGET_LINK_LIBRARIES(${dyn_libname} ${${engine}_LIBS})
     ENDIF(${engine}_LIBS)

=== modified file 'tests/mysql_client_test.c'
--- a/tests/mysql_client_test.c	2009-10-25 13:41:27 +0000
+++ b/tests/mysql_client_test.c	2009-11-03 10:26:54 +0000
@@ -49,6 +49,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;
 
@@ -233,6 +236,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)
@@ -296,10 +319,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 */
@@ -1186,9 +1209,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,
@@ -3101,9 +3124,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,
@@ -5551,9 +5574,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,
@@ -6442,9 +6465,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);
   }
 
@@ -6567,9 +6590,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);
   }
 
@@ -8050,9 +8073,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",
@@ -8512,9 +8535,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);
     }
 
@@ -13756,7 +13779,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,
@@ -13912,9 +13935,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"))
@@ -14453,7 +14476,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,
@@ -15042,9 +15065,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);
   }
 
@@ -15772,9 +15795,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);
   }
 
@@ -15809,9 +15832,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);
   }
 
@@ -15846,7 +15869,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,
@@ -16419,7 +16442,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,
@@ -17304,7 +17327,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);
@@ -17439,7 +17462,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,
@@ -17613,7 +17636,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,
@@ -17750,7 +17773,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,
@@ -18526,9 +18549,9 @@ static void test_bug33831(void)
   
   error= 0;
 
-  if (!(l_mysql= mysql_init(NULL)))
+  if (!(l_mysql= mysql_client_init(NULL)))
   {
-    myerror("mysql_init() failed");
+    myerror("mysql_client_init() failed");
     DIE_UNLESS(0);
   }
   if (!(mysql_real_connect(l_mysql, opt_host, opt_user,
@@ -18903,7 +18926,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,
@@ -18966,6 +18989,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},

=== modified file 'vio/vio.c'
--- a/vio/vio.c	2009-05-22 17:09:16 +0000
+++ b/vio/vio.c	2009-11-03 10:26:54 +0000
@@ -65,7 +65,7 @@ static void vio_init(Vio* vio, enum enum
   if ((flags & VIO_BUFFERED_READ) &&
       !(vio->read_buffer= (char*)my_malloc(VIO_READ_BUFFER_SIZE, MYF(MY_WME))))
     flags&= ~VIO_BUFFERED_READ;
-#ifdef __WIN__ 
+#ifdef _WIN32
   if (type == VIO_TYPE_NAMEDPIPE)
   {
     vio->viodelete	=vio_delete;
@@ -80,11 +80,19 @@ static void vio_init(Vio* vio, enum enum
     vio->peer_addr	=vio_peer_addr;
     vio->vioblocking	=vio_blocking;
     vio->is_blocking	=vio_is_blocking;
-    vio->timeout	=vio_ignore_timeout;
+
     vio->poll_read      =no_poll_read;
     vio->is_connected   =vio_is_connected_pipe;
+
+    vio->timeout=vio_win32_timeout;
+    /* Set default timeout */
+    vio->read_timeout_millis = INFINITE;
+    vio->write_timeout_millis = INFINITE;
+
+    memset(&(vio->pipe_overlapped), 0, sizeof(OVERLAPPED));
+    vio->pipe_overlapped.hEvent= CreateEvent(NULL, TRUE, FALSE, NULL);
+    DBUG_VOID_RETURN;
   }
-  else					/* default is VIO_TYPE_TCPIP */
 #endif
 #ifdef HAVE_SMEM 
   if (type == VIO_TYPE_SHARED_MEMORY)
@@ -101,11 +109,17 @@ static void vio_init(Vio* vio, enum enum
     vio->peer_addr	=vio_peer_addr;
     vio->vioblocking	=vio_blocking;
     vio->is_blocking	=vio_is_blocking;
-    vio->timeout	=vio_ignore_timeout;
+
     vio->poll_read      =no_poll_read;
     vio->is_connected   =vio_is_connected_shared_memory;
+
+    /* Currently, shared memory is on Windows only, hence the below is ok*/
+    vio->timeout= vio_win32_timeout; 
+    /* Set default timeout */
+    vio->read_timeout_millis= INFINITE;
+    vio->write_timeout_millis= INFINITE;
+    DBUG_VOID_RETURN;
   }
-  else
 #endif   
 #ifdef HAVE_OPENSSL 
   if (type == VIO_TYPE_SSL)
@@ -125,8 +139,8 @@ static void vio_init(Vio* vio, enum enum
     vio->timeout	=vio_timeout;
     vio->poll_read      =vio_poll_read;
     vio->is_connected   =vio_is_connected;
+    DBUG_VOID_RETURN;
   }
-  else					/* default is VIO_TYPE_TCPIP */
 #endif /* HAVE_OPENSSL */
   {
     vio->viodelete	=vio_delete;
@@ -219,7 +233,7 @@ Vio *vio_new_win32pipe(HANDLE hPipe)
 }
 
 #ifdef HAVE_SMEM
-Vio *vio_new_win32shared_memory(NET *net,HANDLE handle_file_map, HANDLE handle_map,
+Vio *vio_new_win32shared_memory(HANDLE handle_file_map, HANDLE handle_map,
                                 HANDLE event_server_wrote, HANDLE event_server_read,
                                 HANDLE event_client_wrote, HANDLE event_client_read,
                                 HANDLE event_conn_closed)
@@ -236,9 +250,11 @@ Vio *vio_new_win32shared_memory(NET *net
     vio->event_client_wrote= event_client_wrote;
     vio->event_client_read= event_client_read;
     vio->event_conn_closed= event_conn_closed;
-    vio->shared_memory_remain= 0;
+    vio->shared_memory_remain= 0;    /* Currently, shared memory is on Windows only, hence the below is ok*/
+    vio->timeout= vio_win32_timeout; 
+    /* Set default timeout */
+
     vio->shared_memory_pos= handle_map;
-    vio->net= net;
     strmov(vio->desc, "shared memory");
   }
   DBUG_RETURN(vio);

=== modified file 'vio/vio_priv.h'
--- a/vio/vio_priv.h	2009-10-26 14:02:26 +0000
+++ b/vio/vio_priv.h	2009-11-03 10:26:54 +0000
@@ -25,10 +25,11 @@
 #include <m_string.h>
 #include <violite.h>
 
-#ifndef __WIN__
+#ifndef _WIN32
 #include <sys/socket.h>
 #include <netdb.h>
-#else /* __WIN__ */
+#else
+void vio_win32_timeout(Vio *vio, uint which, uint timeout);
 size_t vio_read_pipe(Vio *vio, uchar * buf, size_t size);
 size_t vio_write_pipe(Vio *vio, const uchar * buf, size_t size);
 my_bool vio_is_connected_pipe(Vio *vio);
@@ -42,7 +43,6 @@ my_bool vio_is_connected_shared_memory(V
 int vio_close_shared_memory(Vio * vio);
 #endif
 
-void	vio_ignore_timeout(Vio *vio, uint which, uint timeout);
 void	vio_timeout(Vio *vio,uint which, uint timeout);
 
 #ifdef HAVE_OPENSSL

=== modified file 'vio/viosocket.c'
--- a/vio/viosocket.c	2009-10-12 09:08:34 +0000
+++ b/vio/viosocket.c	2009-11-03 10:26:54 +0000
@@ -261,19 +261,13 @@ int vio_close(Vio * vio)
 {
   int r=0;
   DBUG_ENTER("vio_close");
-#ifdef _WIN32
-  if (vio->type == VIO_TYPE_NAMEDPIPE)
-  {
-#ifdef MYSQL_SERVER
-    CancelIo(vio->hPipe);
-    DisconnectNamedPipe(vio->hPipe);
-#endif
-    r=CloseHandle(vio->hPipe);
-  }
-  else
-#endif /* _WIN32 */
+
  if (vio->type != VIO_CLOSED)
   {
+    DBUG_ASSERT(vio->type ==  VIO_TYPE_TCPIP ||
+      vio->type == VIO_TYPE_SOCKET ||
+      vio->type == VIO_TYPE_SSL);
+
     DBUG_ASSERT(vio->sd >= 0);
     if (shutdown(vio->sd, SHUT_RDWR))
       r= -1;
@@ -709,33 +703,86 @@ void vio_timeout(Vio *vio, uint which, u
 
 
 #ifdef __WIN__
-size_t vio_read_pipe(Vio * vio, uchar* buf, size_t size)
+
+/*
+  Finish pending IO on pipe. Honor wait timeout
+*/
+static int pipe_complete_io(Vio* vio, char* buf, size_t size, DWORD timeout_millis)
 {
   DWORD length;
+  DWORD ret;
+
+  DBUG_ENTER("pipe_complete_io");
+
+  ret= WaitForSingleObject(vio->pipe_overlapped.hEvent, timeout_millis);
+  /*
+    WaitForSingleObjects will normally return WAIT_OBJECT_O (success, IO completed)
+    or WAIT_TIMEOUT.
+  */
+  if(ret != WAIT_OBJECT_0)
+  {
+    CancelIo(vio->hPipe);
+    DBUG_PRINT("error",("WaitForSingleObject() returned  %d", ret));
+    DBUG_RETURN(-1);
+  }
+
+  if (!GetOverlappedResult(vio->hPipe,&(vio->pipe_overlapped),&length, FALSE))
+  {
+    DBUG_PRINT("error",("GetOverlappedResult() returned last error  %d", 
+      GetLastError()));
+    DBUG_RETURN(-1);
+  }
+
+  DBUG_RETURN(length);
+}
+
+
+size_t vio_read_pipe(Vio * vio, uchar *buf, size_t size)
+{
+  DWORD bytes_read;
   DBUG_ENTER("vio_read_pipe");
   DBUG_PRINT("enter", ("sd: %d  buf: %p  size: %u", vio->sd, buf,
                        (uint) size));
 
-  if (!ReadFile(vio->hPipe, buf, size, &length, NULL))
-    DBUG_RETURN(-1);
+  if (!ReadFile(vio->hPipe, buf, (DWORD)size, &bytes_read,
+      &(vio->pipe_overlapped)))
+  {
+    if (GetLastError() != ERROR_IO_PENDING)
+    {
+      DBUG_PRINT("error",("ReadFile() returned last error %d",
+        GetLastError()));
+      DBUG_RETURN((size_t)-1);
+    }
+    bytes_read= pipe_complete_io(vio, buf, size,vio->read_timeout_millis);
+  }
 
-  DBUG_PRINT("exit", ("%d", length));
-  DBUG_RETURN((size_t) length);
+  DBUG_PRINT("exit", ("%d", bytes_read));
+  DBUG_RETURN(bytes_read);
 }
 
 
 size_t vio_write_pipe(Vio * vio, const uchar* buf, size_t size)
 {
-  DWORD length;
+  DWORD bytes_written;
   DBUG_ENTER("vio_write_pipe");
   DBUG_PRINT("enter", ("sd: %d  buf: %p  size: %u", vio->sd, buf,
                        (uint) size));
 
-  if (!WriteFile(vio->hPipe, (char*) buf, size, &length, NULL))
-    DBUG_RETURN(-1);
+  if (!WriteFile(vio->hPipe, buf, (DWORD)size, &bytes_written,
+      &(vio->pipe_overlapped)))
+  {
+    if (GetLastError() != ERROR_IO_PENDING)
+    {
+      DBUG_PRINT("vio_error",("WriteFile() returned last error %d",
+        GetLastError()));
+      DBUG_RETURN((size_t)-1);
+    }
+    bytes_written = pipe_complete_io(vio, (char *)buf, size, 
+        vio->write_timeout_millis);
+  }
 
-  DBUG_PRINT("exit", ("%d", length));
-  DBUG_RETURN((size_t) length);
+  DBUG_PRINT("exit", ("%d", bytes_written));
+  DBUG_RETURN(bytes_written);
 }
 
 
@@ -752,11 +799,10 @@ int vio_close_pipe(Vio * vio)
 {
   int r;
   DBUG_ENTER("vio_close_pipe");
-#ifdef MYSQL_SERVER
-  CancelIo(vio->hPipe);
+
+  CloseHandle(vio->pipe_overlapped.hEvent);
   DisconnectNamedPipe(vio->hPipe);
-#endif
-  r=CloseHandle(vio->hPipe);
+  r= CloseHandle(vio->hPipe);
   if (r)
   {
     DBUG_PRINT("vio_error", ("close() failed, error: %d",GetLastError()));
@@ -768,10 +814,23 @@ int vio_close_pipe(Vio * vio)
 }
 
 
-void vio_ignore_timeout(Vio *vio __attribute__((unused)),
-			uint which __attribute__((unused)),
-			uint timeout __attribute__((unused)))
+void vio_win32_timeout(Vio *vio, uint which , uint timeout_sec)
 {
+    DWORD timeout_millis;
+    /*
+      Windows is measuring timeouts in milliseconds. Check for possible int 
+      overflow.
+    */
+    if (timeout_sec > UINT_MAX/1000)
+      timeout_millis= INFINITE;
+    else
+      timeout_millis= timeout_sec * 1000;
+
+    /* which == 1 means "write", which == 0 means "read".*/
+    if(which)
+      vio->write_timeout_millis= timeout_millis;
+    else
+      vio->read_timeout_millis= timeout_millis;
 }
 
 
@@ -806,7 +865,7 @@ size_t vio_read_shared_memory(Vio * vio,
          WAIT_ABANDONED_0 and WAIT_TIMEOUT - fail.  We can't read anything
       */
       if (WaitForMultipleObjects(array_elements(events), events, FALSE,
-                                 vio->net->read_timeout*1000) != WAIT_OBJECT_0)
+                                 vio->read_timeout_millis) != WAIT_OBJECT_0)
       {
         DBUG_RETURN(-1);
       };
@@ -863,7 +922,7 @@ size_t vio_write_shared_memory(Vio * vio
   while (remain != 0)
   {
     if (WaitForMultipleObjects(array_elements(events), events, FALSE,
-                               vio->net->write_timeout*1000) != WAIT_OBJECT_0)
+                               vio->write_timeout_millis) != WAIT_OBJECT_0)
     {
       DBUG_RETURN((size_t) -1);
     }


Attachment: [text/bzr-bundle] bzr/vvaintroub@mysql.com-20091103102654-o05y0l8tqf6nb2q1.bundle
Thread
bzr commit into mysql-6.0-codebase-bugfixing branch (vvaintroub:3694)Vladislav Vaintroub3 Nov