summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorguilhem@mysql.com <>2004-06-15 11:35:23 +0200
committerguilhem@mysql.com <>2004-06-15 11:35:23 +0200
commitf1fda6387e5e0169a2d654928c5d592b6abea4f8 (patch)
tree5975f12541afcd6e853432cf20d0f88672d428f7
parent5dd2881f542e06a4ba236d15c19d0da5a8799c71 (diff)
downloadmariadb-git-f1fda6387e5e0169a2d654928c5d592b6abea4f8.tar.gz
API change: mysql_shutdown() now needs a 2nd parameter, the shutdown level.
Server will however still accept shutdown without specified level; so that old mysqladmin can still shut server down. I would like your comments on the names of shutdown level which I chose. You are welcome to propose better names. Please however check WL#709 before. Reason for the names I propose is to be accurate, thus leaving possibility for other levels which we may imagine in the future; that's why I have rejected names like "fast", "smart", "graceful" so far. My position is that WAIT_ALL_BUFFERS or WAIT_CRITICAL_BUFFERS say what the shutdown does, whereas for "smart", "fast" you need to remember what it does. This should be pushed in 4.1.3 but only after your comments.
-rw-r--r--client/mysqladmin.c2
-rw-r--r--include/mysql.h4
-rw-r--r--include/mysql_com.h20
-rw-r--r--libmysql/libmysql.c7
-rw-r--r--sql/sql_parse.cc20
-rw-r--r--tools/mysqlmanager.c2
6 files changed, 49 insertions, 6 deletions
diff --git a/client/mysqladmin.c b/client/mysqladmin.c
index fcbcc0d7151..aaed101a83e 100644
--- a/client/mysqladmin.c
+++ b/client/mysqladmin.c
@@ -509,7 +509,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
!stat(pidfile, &pidfile_status))
last_modified= pidfile_status.st_mtime;
- if (mysql_shutdown(mysql))
+ if (mysql_shutdown(mysql, SHUTDOWN_DEFAULT))
{
my_printf_error(0,"shutdown failed; error: '%s'",MYF(ME_BELL),
mysql_error(mysql));
diff --git a/include/mysql.h b/include/mysql.h
index 71bff833d59..57c04f32dc8 100644
--- a/include/mysql.h
+++ b/include/mysql.h
@@ -453,7 +453,9 @@ int STDCALL mysql_add_slave(MYSQL* mysql, const char* host,
const char* user,
const char* passwd);
-int STDCALL mysql_shutdown(MYSQL *mysql);
+int STDCALL mysql_shutdown(MYSQL *mysql,
+ enum enum_shutdown_level
+ shutdown_level);
int STDCALL mysql_dump_debug_info(MYSQL *mysql);
int STDCALL mysql_refresh(MYSQL *mysql,
unsigned int refresh_options);
diff --git a/include/mysql_com.h b/include/mysql_com.h
index d354a979cd1..bfd38f4f0fc 100644
--- a/include/mysql_com.h
+++ b/include/mysql_com.h
@@ -223,6 +223,26 @@ enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
#define FIELD_TYPE_INTERVAL MYSQL_TYPE_ENUM
#define FIELD_TYPE_GEOMETRY MYSQL_TYPE_GEOMETRY
+enum enum_shutdown_level {
+ /*
+ We want levels to be in growing order of gracefulness. So we leave room
+ for future intermediate levels. For now, escalating one level is += 10;
+ later if we insert new levels in between we will need a function
+ next_shutdown_level(level). Note that DEFAULT does not respect the
+ growing property.
+ */
+ SHUTDOWN_DEFAULT= 255, /* mapped to WAIT_ALL_BUFFERS for now */
+ /*
+ Here is the list in growing order (the next does the previous plus
+ something). WAIT_ALL_BUFFERS is what we have now. Others are "this MySQL
+ server does not support this shutdown level yet".
+ */
+ SHUTDOWN_WAIT_CRITICAL_BUFFERS= 10, /* flush MyISAM buffs (no corruption) */
+ SHUTDOWN_WAIT_ALL_BUFFERS= 20, /* flush InnoDB buffers */
+ SHUTDOWN_WAIT_TRANSACTIONS= 30, /* wait for existing trans to finish */
+ SHUTDOWN_WAIT_CONNECTIONS= 40 /* wait for existing connections to finish */
+};
+
/* options for mysql_set_option */
enum enum_mysql_set_option
{
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index eb8368977e9..1e8244e670b 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -1285,10 +1285,13 @@ mysql_drop_db(MYSQL *mysql, const char *db)
int STDCALL
-mysql_shutdown(MYSQL *mysql)
+mysql_shutdown(MYSQL *mysql, enum enum_shutdown_level shutdown_level)
{
+ uchar level[1];
+ level[0]= (uchar) shutdown_level;
DBUG_ENTER("mysql_shutdown");
- DBUG_RETURN(simple_command(mysql,COM_SHUTDOWN,0,0,0));
+ DBUG_RETURN(simple_command(mysql, COM_SHUTDOWN,
+ &level, 1, 0));
}
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 28e833b8421..b0d476c695f 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1308,6 +1308,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
if (command != COM_STATISTICS && command != COM_PING)
query_id++;
thread_running++;
+ /* TODO: set thd->lex->sql_command to SQLCOM_PARSE here */
VOID(pthread_mutex_unlock(&LOCK_thread_count));
thd->server_status&=
@@ -1478,6 +1479,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
thd->query_length= length;
thd->query= packet;
thd->query_id= query_id++;
+ /* TODO: set thd->lex->sql_command to SQLCOM_PARSE here */
VOID(pthread_mutex_unlock(&LOCK_thread_count));
#ifndef EMBEDDED_LIBRARY
mysql_parse(thd, packet, length);
@@ -1631,10 +1633,25 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
}
#ifndef EMBEDDED_LIBRARY
case COM_SHUTDOWN:
+ {
statistic_increment(com_other,&LOCK_status);
if (check_global_access(thd,SHUTDOWN_ACL))
break; /* purecov: inspected */
- DBUG_PRINT("quit",("Got shutdown command"));
+ enum enum_shutdown_level level= (packet_length >= 2) ?
+ (enum enum_shutdown_level) (uchar) packet[0] : SHUTDOWN_DEFAULT;
+ DBUG_PRINT("quit",("Got shutdown command for level %u", level));
+ /*
+ Accept old mysql_shutdown (with no argument). For now we do nothing of
+ the argument.
+ */
+ if (level == SHUTDOWN_DEFAULT)
+ level= SHUTDOWN_WAIT_ALL_BUFFERS; // soon default will be configurable
+ else if (level != SHUTDOWN_WAIT_ALL_BUFFERS)
+ {
+ my_error(ER_NOT_SUPPORTED_YET, MYF(0), "this shutdown level");
+ send_error(thd);
+ break;
+ }
mysql_log.write(thd,command,NullS);
send_eof(thd);
#ifdef __WIN__
@@ -1650,6 +1667,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
kill_mysql();
error=TRUE;
break;
+ }
#endif
case COM_STATISTICS:
{
diff --git a/tools/mysqlmanager.c b/tools/mysqlmanager.c
index 45865e97ab7..bb0a76d6c49 100644
--- a/tools/mysqlmanager.c
+++ b/tools/mysqlmanager.c
@@ -687,7 +687,7 @@ HANDLE_DECL(handle_stop_exec)
error="Process not running";
goto err;
}
- if (mysql_shutdown(&e->mysql))
+ if (mysql_shutdown(&e->mysql, SHUTDOWN_DEFAULT))
{
/* e->th=0; */ /* th may be a struct */
pthread_mutex_unlock(&e->lock);