mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fix for BUG#12751: Instance Manager: client hangs after
start instance; kill mysqlmanager; show ... The problem was that Instance Manager didn't close client sockets (sockets for client connections) on execing mysqld instance. So, mysqld-instance inherits these descriptors. The fix is to set close-on-exec flag for each client socket. mysql-test/r/im_daemon_life_cycle.result: Updated result file. mysql-test/t/im_daemon_life_cycle.imtest: Test for BUG#12751. server-tools/instance-manager/listener.cc: Set close-on-exec flag for each client socket.
This commit is contained in:
@ -36,6 +36,27 @@
|
||||
#include "portability.h"
|
||||
|
||||
|
||||
static void set_non_blocking(int socket)
|
||||
{
|
||||
#ifndef __WIN__
|
||||
int flags= fcntl(socket, F_GETFL, 0);
|
||||
fcntl(socket, F_SETFL, flags | O_NONBLOCK);
|
||||
#else
|
||||
u_long arg= 1;
|
||||
ioctlsocket(socket, FIONBIO, &arg);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void set_no_inherit(int socket)
|
||||
{
|
||||
#ifndef __WIN__
|
||||
int flags= fcntl(socket, F_GETFD, 0);
|
||||
fcntl(socket, F_SETFD, flags | FD_CLOEXEC);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Listener_thread - incapsulates listening functionality
|
||||
*/
|
||||
@ -157,6 +178,8 @@ void Listener_thread::run()
|
||||
/* accept may return -1 (failure or spurious wakeup) */
|
||||
if (client_fd >= 0) // connection established
|
||||
{
|
||||
set_no_inherit(client_fd);
|
||||
|
||||
Vio *vio= vio_new(client_fd, socket_index == 0 ?
|
||||
VIO_TYPE_SOCKET : VIO_TYPE_TCPIP,
|
||||
socket_index == 0 ? 1 : 0);
|
||||
@ -198,25 +221,6 @@ err:
|
||||
return;
|
||||
}
|
||||
|
||||
void set_non_blocking(int socket)
|
||||
{
|
||||
#ifndef __WIN__
|
||||
int flags= fcntl(socket, F_GETFL, 0);
|
||||
fcntl(socket, F_SETFL, flags | O_NONBLOCK);
|
||||
#else
|
||||
u_long arg= 1;
|
||||
ioctlsocket(socket, FIONBIO, &arg);
|
||||
#endif
|
||||
}
|
||||
|
||||
void set_no_inherit(int socket)
|
||||
{
|
||||
#ifndef __WIN__
|
||||
int flags= fcntl(socket, F_GETFD, 0);
|
||||
fcntl(socket, F_SETFD, flags | FD_CLOEXEC);
|
||||
#endif
|
||||
}
|
||||
|
||||
int Listener_thread::create_tcp_socket()
|
||||
{
|
||||
/* value to be set by setsockopt */
|
||||
|
Reference in New Issue
Block a user