From: Vladislav Vaintroub Date: November 20 2009 12:09pm Subject: bzr commit into mysql-5.1-bugteam branch (vvaintroub:3208) Bug#47571 List-Archive: http://lists.mysql.com/commits/91062 X-Bug: 47571 Message-Id: <0KTE00CKWPSQQO20@fe-emea-10.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_GsXS8HuN+ul0doBZVL+mLQ)" --Boundary_(ID_GsXS8HuN+ul0doBZVL+mLQ) 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:sven.sandberg@stripped 3208 Vladislav Vaintroub 2009-11-20 Bug#47571 : idle named pipe connection is unkillable implement Davi's review suggestions (post-push fixes) @ include/violite.h Use official abbreviation for milliseconds (ms) @ sql/mysqld.cc Fix formatting Add error handling for the case of CreateEvent error @ vio/vio.c Use official abbreviation for milliseconds(ms) Remove superfluous memset Fix formatting @ vio/viosocket.c Use official abbreviation for milliseconds (ms) Use size_t datatype instead of int in pipe_complete_io modified: include/violite.h sql/mysqld.cc vio/vio.c vio/viosocket.c === modified file 'include/violite.h' --- a/include/violite.h 2009-11-02 22:19:58 +0000 +++ b/include/violite.h 2009-11-20 12:09:50 +0000 @@ -224,8 +224,8 @@ struct st_vio #endif /* HAVE_SMEM */ #ifdef _WIN32 OVERLAPPED pipe_overlapped; - DWORD read_timeout_millis; - DWORD write_timeout_millis; + DWORD read_timeout_ms; + DWORD write_timeout_ms; #endif }; #endif /* vio_violite_h_ */ === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2009-11-10 12:42:12 +0000 +++ b/sql/mysqld.cc 2009-11-20 12:09:50 +0000 @@ -5224,12 +5224,16 @@ pthread_handler_t handle_connections_soc pthread_handler_t handle_connections_namedpipes(void *arg) { HANDLE hConnectedPipe; - OVERLAPPED connectOverlapped = {0}; + OVERLAPPED connectOverlapped= {0}; THD *thd; my_thread_init(); DBUG_ENTER("handle_connections_namedpipes"); - connectOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - + connectOverlapped.hEvent= CreateEvent(NULL, TRUE, FALSE, NULL); + if (!connectOverlapped.hEvent) + { + sql_print_error("Can't create event, last error=%u", GetLastError()); + unireg_abort(1); + } DBUG_PRINT("general",("Waiting for named pipe connections.")); while (!abort_loop) { @@ -5252,7 +5256,8 @@ pthread_handler_t handle_connections_nam { CloseHandle(hPipe); if ((hPipe= CreateNamedPipe(pipe_name, - PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED, + PIPE_ACCESS_DUPLEX | + FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, @@ -5272,7 +5277,8 @@ pthread_handler_t handle_connections_nam hConnectedPipe = hPipe; /* create new pipe for new connection */ if ((hPipe = CreateNamedPipe(pipe_name, - PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED, + PIPE_ACCESS_DUPLEX | + FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, === modified file 'vio/vio.c' --- a/vio/vio.c 2009-11-02 22:19:58 +0000 +++ b/vio/vio.c 2009-11-20 12:09:50 +0000 @@ -62,10 +62,8 @@ static void vio_init(Vio* vio, enum enum 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->read_timeout_ms= INFINITE; + vio->write_timeout_ms= INFINITE; vio->pipe_overlapped.hEvent= CreateEvent(NULL, TRUE, FALSE, NULL); DBUG_VOID_RETURN; } @@ -90,8 +88,8 @@ static void vio_init(Vio* vio, enum enum /* 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; + vio->read_timeout_ms= INFINITE; + vio->write_timeout_ms= INFINITE; DBUG_VOID_RETURN; } #endif @@ -115,22 +113,20 @@ static void vio_init(Vio* vio, enum enum DBUG_VOID_RETURN; } #endif /* HAVE_OPENSSL */ - { - vio->viodelete =vio_delete; - vio->vioerrno =vio_errno; - vio->read= (flags & VIO_BUFFERED_READ) ? vio_read_buff : vio_read; - vio->write =vio_write; - vio->fastsend =vio_fastsend; - vio->viokeepalive =vio_keepalive; - vio->should_retry =vio_should_retry; - vio->was_interrupted=vio_was_interrupted; - vio->vioclose =vio_close; - vio->peer_addr =vio_peer_addr; - vio->in_addr =vio_in_addr; - vio->vioblocking =vio_blocking; - vio->is_blocking =vio_is_blocking; - vio->timeout =vio_timeout; - } + vio->viodelete =vio_delete; + vio->vioerrno =vio_errno; + vio->read= (flags & VIO_BUFFERED_READ) ? vio_read_buff : vio_read; + vio->write =vio_write; + vio->fastsend =vio_fastsend; + vio->viokeepalive =vio_keepalive; + vio->should_retry =vio_should_retry; + vio->was_interrupted=vio_was_interrupted; + vio->vioclose =vio_close; + vio->peer_addr =vio_peer_addr; + vio->in_addr =vio_in_addr; + vio->vioblocking =vio_blocking; + vio->is_blocking =vio_is_blocking; + vio->timeout =vio_timeout; DBUG_VOID_RETURN; } === modified file 'vio/viosocket.c' --- a/vio/viosocket.c 2009-11-02 22:19:58 +0000 +++ b/vio/viosocket.c 2009-11-20 12:09:50 +0000 @@ -415,14 +415,14 @@ void vio_timeout(Vio *vio, uint which, u /* Finish pending IO on pipe. Honor wait timeout */ -static int pipe_complete_io(Vio* vio, char* buf, size_t size, DWORD timeout_millis) +static size_t pipe_complete_io(Vio* vio, char* buf, size_t size, DWORD timeout_ms) { DWORD length; DWORD ret; DBUG_ENTER("pipe_complete_io"); - ret= WaitForSingleObject(vio->pipe_overlapped.hEvent, timeout_millis); + ret= WaitForSingleObject(vio->pipe_overlapped.hEvent, timeout_ms); /* WaitForSingleObjects will normally return WAIT_OBJECT_O (success, IO completed) or WAIT_TIMEOUT. @@ -431,14 +431,14 @@ static int pipe_complete_io(Vio* vio, ch { CancelIo(vio->hPipe); DBUG_PRINT("error",("WaitForSingleObject() returned %d", ret)); - DBUG_RETURN(-1); + DBUG_RETURN((size_t)-1); } if (!GetOverlappedResult(vio->hPipe,&(vio->pipe_overlapped),&length, FALSE)) { DBUG_PRINT("error",("GetOverlappedResult() returned last error %d", GetLastError())); - DBUG_RETURN(-1); + DBUG_RETURN((size_t)-1); } DBUG_RETURN(length); @@ -448,49 +448,58 @@ static int pipe_complete_io(Vio* vio, ch size_t vio_read_pipe(Vio * vio, uchar *buf, size_t size) { DWORD bytes_read; + size_t retval; DBUG_ENTER("vio_read_pipe"); DBUG_PRINT("enter", ("sd: %d buf: 0x%lx size: %u", vio->sd, (long) buf, (uint) size)); - if (!ReadFile(vio->hPipe, buf, (DWORD)size, &bytes_read, + if (ReadFile(vio->hPipe, buf, (DWORD)size, &bytes_read, &(vio->pipe_overlapped))) { + retval= bytes_read; + } + else + { 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); + retval= pipe_complete_io(vio, buf, size,vio->read_timeout_ms); } - DBUG_PRINT("exit", ("%d", bytes_read)); - DBUG_RETURN(bytes_read); + DBUG_PRINT("exit", ("%lld", (longlong)retval)); + DBUG_RETURN(retval); } size_t vio_write_pipe(Vio * vio, const uchar* buf, size_t size) { DWORD bytes_written; + size_t retval; DBUG_ENTER("vio_write_pipe"); DBUG_PRINT("enter", ("sd: %d buf: 0x%lx size: %u", vio->sd, (long) buf, (uint) size)); - if (!WriteFile(vio->hPipe, buf, (DWORD)size, &bytes_written, + if (WriteFile(vio->hPipe, buf, (DWORD)size, &bytes_written, &(vio->pipe_overlapped))) { + retval= bytes_written; + } + else + { 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); + retval= pipe_complete_io(vio, (char *)buf, size, vio->write_timeout_ms); } - DBUG_PRINT("exit", ("%d", bytes_written)); - DBUG_RETURN(bytes_written); + DBUG_PRINT("exit", ("%lld", (longlong)retval)); + DBUG_RETURN(retval); } @@ -515,21 +524,21 @@ int vio_close_pipe(Vio * vio) void vio_win32_timeout(Vio *vio, uint which , uint timeout_sec) { - DWORD timeout_millis; + DWORD timeout_ms; /* Windows is measuring timeouts in milliseconds. Check for possible int overflow. */ if (timeout_sec > UINT_MAX/1000) - timeout_millis= INFINITE; + timeout_ms= INFINITE; else - timeout_millis= timeout_sec * 1000; + timeout_ms= timeout_sec * 1000; /* which == 1 means "write", which == 0 means "read".*/ if(which) - vio->write_timeout_millis= timeout_millis; + vio->write_timeout_ms= timeout_ms; else - vio->read_timeout_millis= timeout_millis; + vio->read_timeout_ms= timeout_ms; } @@ -564,7 +573,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->read_timeout_millis) != WAIT_OBJECT_0) + vio->read_timeout_ms) != WAIT_OBJECT_0) { DBUG_RETURN(-1); }; @@ -621,7 +630,7 @@ size_t vio_write_shared_memory(Vio * vio while (remain != 0) { if (WaitForMultipleObjects(array_elements(events), events, FALSE, - vio->write_timeout_millis) != WAIT_OBJECT_0) + vio->write_timeout_ms) != WAIT_OBJECT_0) { DBUG_RETURN((size_t) -1); } --Boundary_(ID_GsXS8HuN+ul0doBZVL+mLQ) 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: 55c8b4aafa8cdce2c6ae864104e9a7c64d3f0e2c # timestamp: 2009-11-20 13:09:56 +0100 # source_branch: bzr+ssh://bk-internal.mysql.com/bzrroot/server/mysql-\ # 5.1-bugteam/ # base_revision_id: sven.sandberg@stripped\ # d2xa6jb6sjc2lxrp # # Begin bundle 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 ThQkPvYa7oA= --Boundary_(ID_GsXS8HuN+ul0doBZVL+mLQ)--