MDEV-5995 MySQL Bug#12750920: EMBEDDED SERVER START/STOP.
Some variables weren't cleared properly so consequitive embedded server start/stop failed. Cleanups added. Also mysql_client_test.c extended to test that (taken from Mattias Johnson's patch)
This commit is contained in:
parent
1eaf2106e5
commit
bcb85f0e02
@ -2049,6 +2049,7 @@ void clean_up(bool print_message)
|
|||||||
free_global_table_stats();
|
free_global_table_stats();
|
||||||
free_global_index_stats();
|
free_global_index_stats();
|
||||||
delete_dynamic(&all_options);
|
delete_dynamic(&all_options);
|
||||||
|
free_all_rpl_filters();
|
||||||
#ifdef HAVE_REPLICATION
|
#ifdef HAVE_REPLICATION
|
||||||
end_slave_list();
|
end_slave_list();
|
||||||
#endif
|
#endif
|
||||||
@ -2091,6 +2092,13 @@ void clean_up(bool print_message)
|
|||||||
mysql_mutex_unlock(&LOCK_thread_count);
|
mysql_mutex_unlock(&LOCK_thread_count);
|
||||||
|
|
||||||
free_list(opt_plugin_load_list_ptr);
|
free_list(opt_plugin_load_list_ptr);
|
||||||
|
|
||||||
|
if (THR_THD)
|
||||||
|
(void) pthread_key_delete(THR_THD);
|
||||||
|
|
||||||
|
if (THR_MALLOC)
|
||||||
|
(void) pthread_key_delete(THR_MALLOC);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The following lines may never be executed as the main thread may have
|
The following lines may never be executed as the main thread may have
|
||||||
killed us
|
killed us
|
||||||
|
@ -59,6 +59,7 @@ static MYSQL *mysql= 0;
|
|||||||
static char current_db[]= "client_test_db";
|
static char current_db[]= "client_test_db";
|
||||||
static unsigned int test_count= 0;
|
static unsigned int test_count= 0;
|
||||||
static unsigned int opt_count= 0;
|
static unsigned int opt_count= 0;
|
||||||
|
static unsigned int opt_count_read= 0;
|
||||||
static unsigned int iter_count= 0;
|
static unsigned int iter_count= 0;
|
||||||
static my_bool have_innodb= FALSE;
|
static my_bool have_innodb= FALSE;
|
||||||
static char *opt_plugin_dir= 0, *opt_default_auth= 0;
|
static char *opt_plugin_dir= 0, *opt_default_auth= 0;
|
||||||
@ -69,6 +70,9 @@ static const char *opt_vardir= "mysql-test/var";
|
|||||||
|
|
||||||
static longlong opt_getopt_ll_test= 0;
|
static longlong opt_getopt_ll_test= 0;
|
||||||
|
|
||||||
|
static char **defaults_argv;
|
||||||
|
static int original_argc;
|
||||||
|
static char **original_argv;
|
||||||
static int embedded_server_arg_count= 0;
|
static int embedded_server_arg_count= 0;
|
||||||
static char *embedded_server_args[MAX_SERVER_ARGS];
|
static char *embedded_server_args[MAX_SERVER_ARGS];
|
||||||
|
|
||||||
@ -112,6 +116,7 @@ DBUG_PRINT("test", ("name: %s", str)); \
|
|||||||
static void print_error(const char *msg);
|
static void print_error(const char *msg);
|
||||||
static void print_st_error(MYSQL_STMT *stmt, const char *msg);
|
static void print_st_error(MYSQL_STMT *stmt, const char *msg);
|
||||||
static void client_disconnect(MYSQL* mysql);
|
static void client_disconnect(MYSQL* mysql);
|
||||||
|
static void get_options(int *argc, char ***argv);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -273,7 +278,7 @@ static my_bool check_have_innodb(MYSQL *conn)
|
|||||||
MYSQL_RES *res;
|
MYSQL_RES *res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
int rc;
|
int rc;
|
||||||
my_bool result;
|
my_bool result= FALSE;
|
||||||
|
|
||||||
rc= mysql_query(conn,
|
rc= mysql_query(conn,
|
||||||
"SELECT (support = 'YES' or support = 'DEFAULT' or support = 'ENABLED') "
|
"SELECT (support = 'YES' or support = 'DEFAULT' or support = 'ENABLED') "
|
||||||
@ -285,7 +290,8 @@ static my_bool check_have_innodb(MYSQL *conn)
|
|||||||
row= mysql_fetch_row(res);
|
row= mysql_fetch_row(res);
|
||||||
DIE_UNLESS(row);
|
DIE_UNLESS(row);
|
||||||
|
|
||||||
result= strcmp(row[1], "1") == 0;
|
if (row[0] && row[1])
|
||||||
|
result= strcmp(row[1], "1") == 0;
|
||||||
mysql_free_result(res);
|
mysql_free_result(res);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -1181,8 +1187,8 @@ static struct my_option client_test_long_options[] =
|
|||||||
{
|
{
|
||||||
{"basedir", 'b', "Basedir for tests.", &opt_basedir,
|
{"basedir", 'b', "Basedir for tests.", &opt_basedir,
|
||||||
&opt_basedir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
&opt_basedir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"count", 't', "Number of times test to be executed", &opt_count,
|
{"count", 't', "Number of times test to be executed", &opt_count_read,
|
||||||
&opt_count, 0, GET_UINT, REQUIRED_ARG, 1, 0, 0, 0, 0, 0},
|
&opt_count_read, 0, GET_UINT, REQUIRED_ARG, 1, 0, 0, 0, 0, 0},
|
||||||
{"database", 'D', "Database to use", &opt_db, &opt_db,
|
{"database", 'D', "Database to use", &opt_db, &opt_db,
|
||||||
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"do-not-drop-database", 'd', "Do not drop database while disconnecting",
|
{"do-not-drop-database", 'd', "Do not drop database while disconnecting",
|
||||||
@ -1338,6 +1344,10 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||||||
static void get_options(int *argc, char ***argv)
|
static void get_options(int *argc, char ***argv)
|
||||||
{
|
{
|
||||||
int ho_error;
|
int ho_error;
|
||||||
|
/* Copy argv from load_defaults, so we can free it when done. */
|
||||||
|
defaults_argv= *argv;
|
||||||
|
/* reset --silent option */
|
||||||
|
opt_silent= 0;
|
||||||
|
|
||||||
if ((ho_error= handle_options(argc, argv, client_test_long_options,
|
if ((ho_error= handle_options(argc, argv, client_test_long_options,
|
||||||
get_one_option)))
|
get_one_option)))
|
||||||
@ -1359,9 +1369,12 @@ static void print_test_output()
|
|||||||
fprintf(stdout, "\n\n");
|
fprintf(stdout, "\n\n");
|
||||||
fprintf(stdout, "All '%d' tests were successful (in '%d' iterations)",
|
fprintf(stdout, "All '%d' tests were successful (in '%d' iterations)",
|
||||||
test_count-1, opt_count);
|
test_count-1, opt_count);
|
||||||
fprintf(stdout, "\n Total execution time: %g SECS", total_time);
|
if (!opt_silent)
|
||||||
if (opt_count > 1)
|
{
|
||||||
fprintf(stdout, " (Avg: %g SECS)", total_time/opt_count);
|
fprintf(stdout, "\n Total execution time: %g SECS", total_time);
|
||||||
|
if (opt_count > 1)
|
||||||
|
fprintf(stdout, " (Avg: %g SECS)", total_time/opt_count);
|
||||||
|
}
|
||||||
|
|
||||||
fprintf(stdout, "\n\n!!! SUCCESS !!!\n");
|
fprintf(stdout, "\n\n!!! SUCCESS !!!\n");
|
||||||
}
|
}
|
||||||
@ -1374,16 +1387,37 @@ static void print_test_output()
|
|||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
char **tests_to_run= NULL, **curr_test;
|
||||||
struct my_tests_st *fptr;
|
struct my_tests_st *fptr;
|
||||||
my_testlist= get_my_tests();
|
my_testlist= get_my_tests();
|
||||||
|
|
||||||
MY_INIT(argv[0]);
|
MY_INIT(argv[0]);
|
||||||
|
/* Copy the original arguments, so it can be reused for restarting. */
|
||||||
|
original_argc= argc;
|
||||||
|
original_argv= malloc(argc * sizeof(char*));
|
||||||
|
if (argc && !original_argv)
|
||||||
|
exit(1);
|
||||||
|
for (i= 0; i < argc; i++)
|
||||||
|
original_argv[i]= strdup(argv[i]);
|
||||||
|
|
||||||
if (load_defaults("my", client_test_load_default_groups, &argc, &argv))
|
if (load_defaults("my", client_test_load_default_groups, &argc, &argv))
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
||||||
defaults_argv= argv;
|
|
||||||
get_options(&argc, &argv);
|
get_options(&argc, &argv);
|
||||||
|
/* Set main opt_count. */
|
||||||
|
opt_count= opt_count_read;
|
||||||
|
|
||||||
|
/* If there are any arguments left (named tests), save them. */
|
||||||
|
if (argc)
|
||||||
|
{
|
||||||
|
tests_to_run= malloc((argc + 1) * sizeof(char*));
|
||||||
|
if (!tests_to_run)
|
||||||
|
exit(1);
|
||||||
|
for (i= 0; i < argc; i++)
|
||||||
|
tests_to_run[i]= strdup(argv[i]);
|
||||||
|
tests_to_run[i]= NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (mysql_server_init(embedded_server_arg_count,
|
if (mysql_server_init(embedded_server_arg_count,
|
||||||
embedded_server_args,
|
embedded_server_args,
|
||||||
@ -1399,18 +1433,18 @@ int main(int argc, char **argv)
|
|||||||
/* Start of tests */
|
/* Start of tests */
|
||||||
test_count= 1;
|
test_count= 1;
|
||||||
start_time= time((time_t *)0);
|
start_time= time((time_t *)0);
|
||||||
if (!argc)
|
if (!tests_to_run)
|
||||||
{
|
{
|
||||||
for (fptr= my_testlist; fptr->name; fptr++)
|
for (fptr= my_testlist; fptr->name; fptr++)
|
||||||
(*fptr->function)();
|
(*fptr->function)();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for ( ; *argv ; argv++)
|
for (curr_test= tests_to_run ; *curr_test ; curr_test++)
|
||||||
{
|
{
|
||||||
for (fptr= my_testlist; fptr->name; fptr++)
|
for (fptr= my_testlist; fptr->name; fptr++)
|
||||||
{
|
{
|
||||||
if (!strcmp(fptr->name, *argv))
|
if (!strcmp(fptr->name, *curr_test))
|
||||||
{
|
{
|
||||||
(*fptr->function)();
|
(*fptr->function)();
|
||||||
break;
|
break;
|
||||||
@ -1423,6 +1457,7 @@ int main(int argc, char **argv)
|
|||||||
my_progname);
|
my_progname);
|
||||||
client_disconnect(mysql);
|
client_disconnect(mysql);
|
||||||
free_defaults(defaults_argv);
|
free_defaults(defaults_argv);
|
||||||
|
mysql_server_end();
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1446,5 +1481,18 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
my_end(0);
|
my_end(0);
|
||||||
|
|
||||||
|
for (i= 0; i < original_argc; i++)
|
||||||
|
free(original_argv[i]);
|
||||||
|
if (original_argc)
|
||||||
|
free(original_argv);
|
||||||
|
if (tests_to_run)
|
||||||
|
{
|
||||||
|
for (curr_test= tests_to_run ; *curr_test ; curr_test++)
|
||||||
|
free(*curr_test);
|
||||||
|
free(tests_to_run);
|
||||||
|
}
|
||||||
|
my_free(opt_password);
|
||||||
|
my_free(opt_host);
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
@ -6996,6 +6996,118 @@ static void test_set_option()
|
|||||||
mysql_stmt_close(stmt);
|
mysql_stmt_close(stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef EMBEDDED_LIBRARY
|
||||||
|
static void test_embedded_start_stop()
|
||||||
|
{
|
||||||
|
MYSQL *mysql_emb=NULL;
|
||||||
|
int i, j;
|
||||||
|
int argc= original_argc; // Start with the original args
|
||||||
|
char **argv, **my_argv;
|
||||||
|
char test_name[]= "test_embedded_start_stop";
|
||||||
|
#define EMBEDDED_RESTARTS 64
|
||||||
|
|
||||||
|
myheader("test_embedded_start_stop");
|
||||||
|
|
||||||
|
/* Must stop the main embedded server, since we use the same config. */
|
||||||
|
client_disconnect(mysql); /* disconnect from server */
|
||||||
|
free_defaults(defaults_argv);
|
||||||
|
mysql_server_end();
|
||||||
|
/* Free everything allocated by my_once_alloc */
|
||||||
|
my_end(0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Use a copy of the original arguments.
|
||||||
|
The arguments will be altered when reading the configs and parsing
|
||||||
|
options.
|
||||||
|
*/
|
||||||
|
my_argv= malloc((argc + 1) * sizeof(char*));
|
||||||
|
if (!my_argv)
|
||||||
|
exit(1);
|
||||||
|
|
||||||
|
/* Test restarting the embedded library many times. */
|
||||||
|
for (i= 1; i <= EMBEDDED_RESTARTS; i++)
|
||||||
|
{
|
||||||
|
argv= my_argv;
|
||||||
|
argv[0]= test_name;
|
||||||
|
for (j= 1; j < argc; j++)
|
||||||
|
argv[j]= original_argv[j];
|
||||||
|
|
||||||
|
/* Initialize everything again. */
|
||||||
|
MY_INIT(argv[0]);
|
||||||
|
|
||||||
|
/* Load the client defaults from the .cnf file[s]. */
|
||||||
|
if (load_defaults("my", client_test_load_default_groups, &argc, &argv))
|
||||||
|
{
|
||||||
|
myerror("load_defaults failed");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the options (including the ones given from defaults files). */
|
||||||
|
get_options(&argc, &argv);
|
||||||
|
|
||||||
|
/* mysql_library_init is the same as mysql_server_init. */
|
||||||
|
if (mysql_library_init(embedded_server_arg_count,
|
||||||
|
embedded_server_args,
|
||||||
|
(char**) embedded_server_groups))
|
||||||
|
{
|
||||||
|
myerror("mysql_library_init failed");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create a client connection. */
|
||||||
|
if (!(mysql_emb= mysql_client_init(NULL)))
|
||||||
|
{
|
||||||
|
myerror("mysql_client_init failed");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Connect it and see if we can use the database. */
|
||||||
|
if (!(mysql_real_connect(mysql_emb, opt_host, opt_user,
|
||||||
|
opt_password, current_db, 0,
|
||||||
|
NULL, 0)))
|
||||||
|
{
|
||||||
|
myerror("mysql_real_connect failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close the client connection */
|
||||||
|
mysql_close(mysql_emb);
|
||||||
|
mysql_emb = NULL;
|
||||||
|
/* Free arguments allocated for defaults files. */
|
||||||
|
free_defaults(defaults_argv);
|
||||||
|
/* mysql_library_end is a define for mysql_server_end. */
|
||||||
|
mysql_library_end();
|
||||||
|
/* Free everything allocated by my_once_alloc */
|
||||||
|
my_end(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
argc= original_argc;
|
||||||
|
argv= my_argv;
|
||||||
|
argv[0]= test_name;
|
||||||
|
for (j= 1; j < argc; j++)
|
||||||
|
argv[j]= original_argv[j];
|
||||||
|
|
||||||
|
MY_INIT(argv[0]);
|
||||||
|
|
||||||
|
if (load_defaults("my", client_test_load_default_groups, &argc, &argv))
|
||||||
|
{
|
||||||
|
myerror("load_defaults failed \n ");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
get_options(&argc, &argv);
|
||||||
|
|
||||||
|
/* Must start the main embedded server again after the test. */
|
||||||
|
if (mysql_server_init(embedded_server_arg_count,
|
||||||
|
embedded_server_args,
|
||||||
|
(char**) embedded_server_groups))
|
||||||
|
DIE("Can't initialize MySQL server");
|
||||||
|
|
||||||
|
/* connect to server with no flags, default protocol, auto reconnect true */
|
||||||
|
mysql= client_connect(0, MYSQL_PROTOCOL_DEFAULT, 1);
|
||||||
|
free(my_argv);
|
||||||
|
}
|
||||||
|
#endif /* EMBEDDED_LIBRARY */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Test a misc GRANT option
|
Test a misc GRANT option
|
||||||
@ -19148,6 +19260,9 @@ static struct my_tests_st my_tests[]= {
|
|||||||
{ "test_view_sp_list_fields", test_view_sp_list_fields },
|
{ "test_view_sp_list_fields", test_view_sp_list_fields },
|
||||||
{ "client_query", client_query },
|
{ "client_query", client_query },
|
||||||
{ "test_prepare_insert_update", test_prepare_insert_update},
|
{ "test_prepare_insert_update", test_prepare_insert_update},
|
||||||
|
#ifdef EMBEDDED_LIBRARY
|
||||||
|
{ "test_embedded_start_stop", test_embedded_start_stop },
|
||||||
|
#endif
|
||||||
#if NOT_YET_WORKING
|
#if NOT_YET_WORKING
|
||||||
{ "test_drop_temp", test_drop_temp },
|
{ "test_drop_temp", test_drop_temp },
|
||||||
#endif
|
#endif
|
||||||
@ -19226,6 +19341,7 @@ static struct my_tests_st my_tests[]= {
|
|||||||
{ "test_set_option", test_set_option },
|
{ "test_set_option", test_set_option },
|
||||||
#ifndef EMBEDDED_LIBRARY
|
#ifndef EMBEDDED_LIBRARY
|
||||||
{ "test_prepare_grant", test_prepare_grant },
|
{ "test_prepare_grant", test_prepare_grant },
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
{ "test_frm_bug", test_frm_bug },
|
{ "test_frm_bug", test_frm_bug },
|
||||||
{ "test_explain_bug", test_explain_bug },
|
{ "test_explain_bug", test_explain_bug },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user