Commit edba9396 authored by unknown's avatar unknown

fix Bug #14103 IM tests fail on SCO


server-tools/instance-manager/listener.cc:
  every new connection should have sufficient thread stack to
  handle all IM commands
server-tools/instance-manager/manager.cc:
  change stack size of listener and guardian threads
server-tools/instance-manager/priv.cc:
  Add a new function, which is a wrapper around pthread_create to increase the stack size
server-tools/instance-manager/priv.h:
  declare new function
parent f0cf596a
...@@ -362,12 +362,13 @@ void Listener_thread::handle_new_mysql_connection(Vio *vio) ...@@ -362,12 +362,13 @@ void Listener_thread::handle_new_mysql_connection(Vio *vio)
pthread_attr_t mysql_thd_attr; pthread_attr_t mysql_thd_attr;
pthread_attr_init(&mysql_thd_attr); pthread_attr_init(&mysql_thd_attr);
pthread_attr_setdetachstate(&mysql_thd_attr, PTHREAD_CREATE_DETACHED); pthread_attr_setdetachstate(&mysql_thd_attr, PTHREAD_CREATE_DETACHED);
if (pthread_create(&mysql_thd_id, &mysql_thd_attr, mysql_connection, if (set_stacksize_n_create_thread(&mysql_thd_id, &mysql_thd_attr,
mysql_thread_args)) mysql_connection, mysql_thread_args))
{ {
delete mysql_thread_args; delete mysql_thread_args;
vio_delete(vio); vio_delete(vio);
log_error("handle_one_mysql_connection(): pthread_create(mysql) failed"); log_error("handle_one_mysql_connection():"
"set_stacksize_n_create_thread(mysql) failed");
} }
pthread_attr_destroy(&mysql_thd_attr); pthread_attr_destroy(&mysql_thd_attr);
} }
......
...@@ -162,12 +162,12 @@ void manager(const Options &options) ...@@ -162,12 +162,12 @@ void manager(const Options &options)
pthread_attr_init(&listener_thd_attr); pthread_attr_init(&listener_thd_attr);
pthread_attr_setdetachstate(&listener_thd_attr, PTHREAD_CREATE_DETACHED); pthread_attr_setdetachstate(&listener_thd_attr, PTHREAD_CREATE_DETACHED);
rc= pthread_create(&listener_thd_id, &listener_thd_attr, listener, rc= set_stacksize_n_create_thread(&listener_thd_id, &listener_thd_attr,
&listener_args); listener, &listener_args);
pthread_attr_destroy(&listener_thd_attr); pthread_attr_destroy(&listener_thd_attr);
if (rc) if (rc)
{ {
log_error("manager(): pthread_create(listener) failed"); log_error("manager(): set_stacksize_n_create_thread(listener) failed");
goto err; goto err;
} }
...@@ -187,12 +187,12 @@ void manager(const Options &options) ...@@ -187,12 +187,12 @@ void manager(const Options &options)
pthread_attr_init(&guardian_thd_attr); pthread_attr_init(&guardian_thd_attr);
pthread_attr_setdetachstate(&guardian_thd_attr, PTHREAD_CREATE_DETACHED); pthread_attr_setdetachstate(&guardian_thd_attr, PTHREAD_CREATE_DETACHED);
rc= pthread_create(&guardian_thd_id, &guardian_thd_attr, guardian, rc= set_stacksize_n_create_thread(&guardian_thd_id, &guardian_thd_attr,
&guardian_thread); guardian, &guardian_thread);
pthread_attr_destroy(&guardian_thd_attr); pthread_attr_destroy(&guardian_thd_attr);
if (rc) if (rc)
{ {
log_error("manager(): pthread_create(guardian) failed"); log_error("manager(): set_stacksize_n_create_thread(guardian) failed");
goto err; goto err;
} }
......
...@@ -18,6 +18,17 @@ ...@@ -18,6 +18,17 @@
#include "priv.h" #include "priv.h"
#include "portability.h" #include "portability.h"
#if defined(__ia64__) || defined(__ia64)
/*
We can live with 32K, but reserve 64K. Just to be safe.
On ia64 we need to reserve double of the size.
*/
#define IM_THREAD_STACK_SIZE (128*1024L)
#else
#define IM_THREAD_STACK_SIZE (64*1024)
#endif
/* the pid of the manager process (of the signal thread on the LinuxThreads) */ /* the pid of the manager process (of the signal thread on the LinuxThreads) */
pid_t manager_pid; pid_t manager_pid;
...@@ -52,3 +63,27 @@ unsigned int test_flags= 0; ...@@ -52,3 +63,27 @@ unsigned int test_flags= 0;
unsigned long bytes_sent = 0L, bytes_received = 0L; unsigned long bytes_sent = 0L, bytes_received = 0L;
unsigned long mysqld_net_retry_count = 10L; unsigned long mysqld_net_retry_count = 10L;
unsigned long open_files_limit; unsigned long open_files_limit;
/*
Change the stack size and start a thread. Return an error if either
pthread_attr_setstacksize or pthread_create fails.
Arguments are the same as for pthread_create().
*/
int set_stacksize_n_create_thread(pthread_t *thread, pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg)
{
int rc;
/*
Set stack size to be safe on the platforms with too small
default thread stack.
*/
rc= pthread_attr_setstacksize(attr,
(size_t) (PTHREAD_STACK_MIN +
IM_THREAD_STACK_SIZE));
if (!rc)
rc= pthread_create(thread, attr, start_routine, arg);
return rc;
}
...@@ -80,4 +80,8 @@ extern unsigned long bytes_sent, bytes_received; ...@@ -80,4 +80,8 @@ extern unsigned long bytes_sent, bytes_received;
extern unsigned long mysqld_net_retry_count; extern unsigned long mysqld_net_retry_count;
extern unsigned long open_files_limit; extern unsigned long open_files_limit;
int set_stacksize_n_create_thread(pthread_t *thread, pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg);
#endif // INCLUDES_MYSQL_INSTANCE_MANAGER_PRIV_H #endif // INCLUDES_MYSQL_INSTANCE_MANAGER_PRIV_H
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment