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:
@ -8,3 +8,17 @@ mysqld2 offline
|
|||||||
Killing the process...
|
Killing the process...
|
||||||
Sleeping...
|
Sleeping...
|
||||||
Success: the process was restarted.
|
Success: the process was restarted.
|
||||||
|
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
-- Test for BUG#12751
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
START INSTANCE mysqld2;
|
||||||
|
Success: the process has been started.
|
||||||
|
Killing the process...
|
||||||
|
Sleeping...
|
||||||
|
Success: the process was restarted.
|
||||||
|
SHOW INSTANCE STATUS mysqld1;
|
||||||
|
instance_name status version
|
||||||
|
mysqld1 online VERSION
|
||||||
|
STOP INSTANCE mysqld2;
|
||||||
|
Success: the process has been stopped.
|
||||||
|
@ -14,3 +14,47 @@
|
|||||||
# process.
|
# process.
|
||||||
|
|
||||||
--exec $MYSQL_TEST_DIR/t/kill_n_check.sh $IM_PATH_PID restarted 30
|
--exec $MYSQL_TEST_DIR/t/kill_n_check.sh $IM_PATH_PID restarted 30
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#12751: Instance Manager: client hangs
|
||||||
|
#
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo --------------------------------------------------------------------
|
||||||
|
--echo -- Test for BUG#12751
|
||||||
|
--echo --------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Give some time to begin accepting connections after restart.
|
||||||
|
# FIXME: race condition here.
|
||||||
|
|
||||||
|
--sleep 3
|
||||||
|
|
||||||
|
# 1. Start mysqld;
|
||||||
|
|
||||||
|
START INSTANCE mysqld2;
|
||||||
|
# FIXME: START INSTANCE should be synchronous.
|
||||||
|
--exec $MYSQL_TEST_DIR/t/wait_for_process.sh $IM_MYSQLD2_PATH_PID 30 started
|
||||||
|
|
||||||
|
# 2. Restart IM-main: kill it and IM-angel will restart it.
|
||||||
|
|
||||||
|
--exec $MYSQL_TEST_DIR/t/kill_n_check.sh $IM_PATH_PID restarted 30
|
||||||
|
|
||||||
|
# 3. Issue some statement -- connection should be re-established.
|
||||||
|
|
||||||
|
# Give some time to begin accepting connections after restart.
|
||||||
|
# FIXME: race condition here.
|
||||||
|
|
||||||
|
--sleep 3
|
||||||
|
|
||||||
|
--replace_column 3 VERSION
|
||||||
|
SHOW INSTANCE STATUS mysqld1;
|
||||||
|
|
||||||
|
# 4. Stop mysqld2, because it will not be stopped by IM, as it is nonguarded.
|
||||||
|
# So, if it we do not stop it, it will be stopped by mysql-test-run.pl with
|
||||||
|
# warning.
|
||||||
|
|
||||||
|
STOP INSTANCE mysqld2;
|
||||||
|
# FIXME: STOP INSTANCE should be synchronous.
|
||||||
|
--exec $MYSQL_TEST_DIR/t/wait_for_process.sh $IM_MYSQLD2_PATH_PID 30 stopped
|
||||||
|
@ -36,6 +36,27 @@
|
|||||||
#include "portability.h"
|
#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
|
Listener_thread - incapsulates listening functionality
|
||||||
*/
|
*/
|
||||||
@ -157,6 +178,8 @@ void Listener_thread::run()
|
|||||||
/* accept may return -1 (failure or spurious wakeup) */
|
/* accept may return -1 (failure or spurious wakeup) */
|
||||||
if (client_fd >= 0) // connection established
|
if (client_fd >= 0) // connection established
|
||||||
{
|
{
|
||||||
|
set_no_inherit(client_fd);
|
||||||
|
|
||||||
Vio *vio= vio_new(client_fd, socket_index == 0 ?
|
Vio *vio= vio_new(client_fd, socket_index == 0 ?
|
||||||
VIO_TYPE_SOCKET : VIO_TYPE_TCPIP,
|
VIO_TYPE_SOCKET : VIO_TYPE_TCPIP,
|
||||||
socket_index == 0 ? 1 : 0);
|
socket_index == 0 ? 1 : 0);
|
||||||
@ -198,25 +221,6 @@ err:
|
|||||||
return;
|
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()
|
int Listener_thread::create_tcp_socket()
|
||||||
{
|
{
|
||||||
/* value to be set by setsockopt */
|
/* value to be set by setsockopt */
|
||||||
|
Reference in New Issue
Block a user