summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorMichael Widenius <monty@askmonty.org>2011-06-11 14:28:15 +0300
committerMichael Widenius <monty@askmonty.org>2011-06-11 14:28:15 +0300
commit69ffc06610136c45d79f5e430373ee9ce4c78cb5 (patch)
tree6e3a89bcb42233351cda58c0372ebf07e56e1510 /client
parent13f55aac67343450d1c2872dd238d81093d09f11 (diff)
downloadmariadb-git-69ffc06610136c45d79f5e430373ee9ce4c78cb5.tar.gz
Fixes BUG#60976 "Crash, valgrind warning and memory leak with partitioned archive tables"
Noted that there was no memory leak, just a lot of used partitioned tables. Fixed old bug: 'show status' now shows memory usage when compiled with safemalloc. Added option --flush to mysqlcheck.c to run a 'flush tables' between each check to keep down memory usage. Changed '--safemalloc' options to mysqld so that one can use --safemalloc and --skip-safemalloc. Now skip-safemalloc is default (ie, we only do checking of memory overrun during free()) to speed up tests. client/client_priv.h: Added OPT_FLUSH_TABLES client/mysqlcheck.c: Added option --flush to mysqlcheck.c to run a 'flush tables' between each check to keep down memory usage. mysql-test/mysql-test-run.pl: Always run tests with --loose-skip-safemysqld for higher speed sql/mysqld.cc: Changed '--safemalloc' options so that one can use --safemalloc and --skip-safemalloc. Now skip-safemalloc is default (ie, we only do checking of memory overrun during free()) to speed up tests sql/sql_parse.cc: Fixed old bug: 'show status' now shows memory usage when compiled with safemalloc. storage/archive/archive_reader.c: Changed all malloc() calls to use my_malloc()/my_free() Added checks of malloc() calls. storage/archive/ha_archive.cc: Detect failure if init_archive_reader() and return errno. This fixed assert crash in my_seek(). Changed all malloc() calls to use my_malloc()/my_free()
Diffstat (limited to 'client')
-rw-r--r--client/client_priv.h1
-rw-r--r--client/mysqlcheck.c30
2 files changed, 26 insertions, 5 deletions
diff --git a/client/client_priv.h b/client/client_priv.h
index 28edba5f8b2..fe9081c4b91 100644
--- a/client/client_priv.h
+++ b/client/client_priv.h
@@ -60,6 +60,7 @@ enum options_client
OPT_OPEN_FILES_LIMIT, OPT_SET_CHARSET, OPT_SERVER_ARG,
OPT_POSITION, OPT_STOP_POSITION, OPT_START_DATETIME, OPT_STOP_DATETIME,
OPT_SIGINT_IGNORE, OPT_HEXBLOB, OPT_ORDER_BY_PRIMARY, OPT_COUNT,
+ OPT_FLUSH_TABLES,
#ifdef HAVE_NDBCLUSTER_DB
OPT_NDBCLUSTER, OPT_NDB_CONNECTSTRING,
#endif
diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c
index 14e02bbb328..22f4b70ed81 100644
--- a/client/mysqlcheck.c
+++ b/client/mysqlcheck.c
@@ -16,7 +16,7 @@
/* By Jani Tolonen, 2001-04-20, MySQL Development Team */
-#define CHECK_VERSION "2.6.0"
+#define CHECK_VERSION "2.7.0"
#include "client_priv.h"
#include <m_ctype.h>
@@ -35,8 +35,8 @@ static my_bool opt_alldbs = 0, opt_check_only_changed = 0, opt_extended = 0,
opt_medium_check = 0, opt_quick = 0, opt_all_in_1 = 0,
opt_silent = 0, opt_auto_repair = 0, ignore_errors = 0,
tty_password= 0, opt_frm= 0, debug_info_flag= 0, debug_check_flag= 0,
- opt_fix_table_names= 0, opt_fix_db_names= 0, opt_upgrade= 0,
- opt_write_binlog= 1;
+ opt_fix_table_names= 0, opt_fix_db_names= 0, opt_upgrade= 0;
+static my_bool opt_write_binlog= 1, opt_flush_tables= 0;
static uint verbose = 0, opt_mysql_port=0;
static int my_end_arg;
static char * opt_mysql_unix_port = 0;
@@ -121,6 +121,9 @@ static struct my_option my_long_options[] =
"If you are using this option with CHECK TABLE, it will ensure that the table is 100 percent consistent, but will take a long time. If you are using this option with REPAIR TABLE, it will force using old slow repair with keycache method, instead of much faster repair by sorting.",
&opt_extended, &opt_extended, 0, GET_BOOL, NO_ARG, 0, 0, 0,
0, 0, 0},
+ {"flush", OPT_FLUSH_TABLES, "Flush each table after check. This is useful if you don't want to have the checked tables take up space in the caches after the check",
+ &opt_flush_tables, &opt_flush_tables, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
+ 0, 0 },
{"help", '?', "Display this help message and exit.", 0, 0, 0, GET_NO_ARG,
NO_ARG, 0, 0, 0, 0, 0, 0},
{"host",'h', "Connect to host.", &current_host,
@@ -685,6 +688,7 @@ static int disable_binlog()
static int handle_request_for_tables(char *tables, uint length)
{
char *query, *end, options[100], message[100];
+ char table_name_buff[NAME_CHAR_LEN*2*2+1], *table_name;
uint query_length= 0;
const char *op = 0;
@@ -723,13 +727,17 @@ static int handle_request_for_tables(char *tables, uint length)
/* No backticks here as we added them before */
query_length= my_sprintf(query,
(query, "%s TABLE %s %s", op, tables, options));
+ table_name= tables;
}
else
{
- char *ptr;
+ char *ptr, *org;
- ptr= strmov(strmov(query, op), " TABLE ");
+ org= ptr= strmov(strmov(query, op), " TABLE ");
ptr= fix_table_name(ptr, tables);
+ strmake(table_name_buff, org, min((int) sizeof(table_name_buff)-1,
+ (int) (ptr - org)));
+ table_name= table_name_buff;
ptr= strxmov(ptr, " ", options, NullS);
query_length= (uint) (ptr - query);
}
@@ -737,9 +745,21 @@ static int handle_request_for_tables(char *tables, uint length)
{
sprintf(message, "when executing '%s TABLE ... %s'", op, options);
DBerror(sock, message);
+ my_free(query, MYF(0));
return 1;
}
print_result();
+ if (opt_flush_tables)
+ {
+ query_length= my_sprintf(query,
+ (query, "FLUSH TABLES %s", table_name));
+ if (mysql_real_query(sock, query, query_length))
+ {
+ DBerror(sock, query);
+ my_free(query, MYF(0));
+ return 1;
+ }
+ }
my_free(query, MYF(0));
return 0;
}