List:Commits« Previous MessageNext Message »
From:gluh Date:April 12 2006 2:10pm
Subject:bk commit into 5.1 tree (gluh:1.2304)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of gluh. When gluh does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.2304 06/04/12 19:10:15 gluh@stripped +12 -0
  WL#3015: Logging Improvements - No Restarts
  Added SLOW_QUERY_LOG & GENERAL_LOG global variables.
  Added slow-query-log & general-log startup options
  SLOW_QUERY_LOG & GENERAL_LOG can be set 'ON' or 'OFF'
  and turn logs ON/OFF while server is running.
  slow-query-log & general-log startup options
  can be 0 or 1 and enable | disable logging
  at startup. These options have sence
  only if --log & --log-slow-queries are set.
  If --log & --log-slow-queries are set and
  slow-query-log & general-log omitted then
  slow-query-log & general-log set to 1 automatically
  (to keep old mysqld behaviour).
  If slow-query-log & general-log have no argument then
  their values are 0.
  

  mysql-test/t/log_state.test
    1.1 06/04/12 19:08:23 gluh@stripped +68 -0

  mysql-test/t/log_state.test
    1.0 06/04/12 19:08:23 gluh@stripped +0 -0
    BitKeeper file /home/gluh/MySQL/Devel/5.1.3015/mysql-test/t/log_state.test

  mysql-test/t/log_state-master.opt
    1.1 06/04/12 19:08:22 gluh@stripped +6 -0

  mysql-test/r/log_state.result
    1.1 06/04/12 19:08:22 gluh@stripped +84 -0

  sql/sql_delete.cc
    1.180 06/04/12 19:08:22 gluh@stripped +4 -4
    WL#3015: Logging Improvements - No Restarts
     'truncate table slow_log|general', keep status of logs

  mysql-test/t/log_state-master.opt
    1.0 06/04/12 19:08:22 gluh@stripped +0 -0
    BitKeeper file /home/gluh/MySQL/Devel/5.1.3015/mysql-test/t/log_state-master.opt

  mysql-test/r/log_state.result
    1.0 06/04/12 19:08:22 gluh@stripped +0 -0
    BitKeeper file /home/gluh/MySQL/Devel/5.1.3015/mysql-test/r/log_state.result

  sql/share/errmsg.txt
    1.91 06/04/12 19:08:21 gluh@stripped +2 -0
    WL#3015: Logging Improvements - No Restarts
     added error message

  sql/set_var.h
    1.85 06/04/12 19:08:21 gluh@stripped +10 -0
    WL#3015: Logging Improvements - No Restarts
     new class sys_var_log_state

  sql/set_var.cc
    1.182 06/04/12 19:08:21 gluh@stripped +42 -0
    WL#3015: Logging Improvements - No Restarts
     added 'slow-query_log' & 'general_log' options

  sql/mysqld.cc
    1.554 06/04/12 19:08:21 gluh@stripped +24 -2
    WL#3015: Logging Improvements - No Restarts
     added 'slow-query-log' & 'general-log' options

  sql/mysql_priv.h
    1.391 06/04/12 19:08:21 gluh@stripped +2 -0
    WL#3015: Logging Improvements - No Restarts

  sql/log.h
    1.9 06/04/12 19:08:21 gluh@stripped +3 -0
    WL#3015: Logging Improvements - No Restarts
    added methods to logger
    void deactivate_log_handlers(THD* thd, uint log_type);
    void activate_log_handlers(THD* thd, uint log_type);

  sql/log.cc
    1.203 06/04/12 19:08:21 gluh@stripped +81 -18
    WL#3015: Logging Improvements - No Restarts
    added methods to logger
    void deactivate_log_handlers(THD* thd, uint log_type);
    void activate_log_handlers(THD* thd, uint log_type);

  mysql-test/r/show_check.result
    1.94 06/04/12 19:08:21 gluh@stripped +7 -13
    WL#3015: Logging Improvements - No Restarts
     result fix

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	gluh
# Host:	eagle.intranet.mysql.r18.ru
# Root:	/home/gluh/MySQL/Devel/5.1.3015

--- 1.202/sql/log.cc	Fri Apr  7 19:45:42 2006
+++ 1.203/sql/log.cc	Wed Apr 12 19:08:21 2006
@@ -280,8 +280,10 @@ bool Log_to_csv_event_handler::reopen_lo
 
 void Log_to_csv_event_handler::cleanup()
 {
-  close_log_table(QUERY_LOG_GENERAL, FALSE);
-  close_log_table(QUERY_LOG_SLOW, FALSE);
+  if (opt_general_log)
+    close_log_table(QUERY_LOG_GENERAL, FALSE);
+  if (opt_slow_query_log)
+    close_log_table(QUERY_LOG_SLOW, FALSE);
   logger.is_log_tables_initialized= FALSE;
 }
 
@@ -534,10 +536,10 @@ bool Log_to_file_event_handler::init()
 {
   if (!is_initialized)
   {
-    if (opt_slow_log)
+    if (opt_slow_query_log)
       mysql_slow_log.open_slow_log(opt_slow_logname);
 
-    if (opt_log)
+    if (opt_general_log)
       mysql_log.open_query_log(opt_logname);
 
     is_initialized= TRUE;
@@ -556,8 +558,10 @@ void Log_to_file_event_handler::cleanup(
 void Log_to_file_event_handler::flush()
 {
   /* reopen log files */
-  mysql_log.new_file(1);
-  mysql_slow_log.new_file(1);
+  if (opt_general_log)
+    mysql_log.new_file(1);
+  if (opt_slow_query_log)
+    mysql_slow_log.new_file(1);
 }
 
 /*
@@ -684,8 +688,10 @@ bool LOGGER::flush_logs(THD *thd)
     this will lock and wait for all but the logger thread to release the
     tables. Then we could reopen log tables. Then release the name locks.
   */
-  lock_and_wait_for_table_name(thd, &close_slow_log);
-  lock_and_wait_for_table_name(thd, &close_general_log);
+  if(opt_slow_query_log)
+    lock_and_wait_for_table_name(thd, &close_slow_log);
+  if(opt_general_log)
+    lock_and_wait_for_table_name(thd, &close_general_log);
 
   /* deny others from logging to general and slow log, while reopening tables */
   logger.lock();
@@ -918,26 +924,79 @@ void LOGGER::init_general_log(uint gener
 }
 
 
+void LOGGER::activate_log_handlers(THD* thd, uint log_type)
+{
+  lock();
+  reopen_log_table(log_type);
+  if (log_type == QUERY_LOG_GENERAL)
+    file_log_handler->mysql_log.open_query_log(opt_logname);
+  else
+    file_log_handler->mysql_slow_log.open_query_log(opt_slow_logname);
+  unlock();
+}
+
+
+void LOGGER::deactivate_log_handlers(THD* thd, uint log_type)
+{
+  TABLE_LIST *table_list;
+  if (log_type == QUERY_LOG_GENERAL)
+    table_list= &table_log_handler->general_log;
+  else
+    table_list= &table_log_handler->slow_log;
+  lock();
+  VOID(pthread_mutex_lock(&LOCK_open));
+  close_log_table(log_type, TRUE);
+  query_cache_invalidate3(thd, table_list, 0);
+  unlock_table_name(thd, table_list);
+  VOID(pthread_mutex_unlock(&LOCK_open));
+  if (log_type == QUERY_LOG_GENERAL)
+    file_log_handler->mysql_log.close(LOG_CLOSE_INDEX|LOG_CLOSE_STOP_EVENT);
+  else
+    file_log_handler->mysql_slow_log.close(LOG_CLOSE_INDEX|LOG_CLOSE_STOP_EVENT);
+  unlock();
+}
+
+
 bool Log_to_csv_event_handler::flush(THD *thd, TABLE_LIST *close_slow_log,
                                      TABLE_LIST *close_general_log)
 {
+  TABLE_LIST *table_list= 0;
   VOID(pthread_mutex_lock(&LOCK_open));
-  close_log_table(QUERY_LOG_GENERAL, TRUE);
-  close_log_table(QUERY_LOG_SLOW, TRUE);
-  close_general_log->next_local= close_slow_log;
-  query_cache_invalidate3(thd, close_general_log, 0);
-  unlock_table_name(thd, close_slow_log);
-  unlock_table_name(thd, close_general_log);
+  if (opt_general_log)
+  {
+    close_log_table(QUERY_LOG_GENERAL, TRUE);
+    table_list= close_general_log;
+  }
+  if (opt_slow_query_log)
+  {
+    close_log_table(QUERY_LOG_SLOW, TRUE);
+    if (!table_list)
+      table_list= close_slow_log;
+    else
+      table_list->next_local= close_slow_log;
+  }
+  if (table_list)
+    query_cache_invalidate3(thd, table_list, 0);
+  if (opt_general_log)
+    unlock_table_name(thd, close_general_log);
+  if (opt_slow_query_log)
+    unlock_table_name(thd, close_slow_log);
   VOID(pthread_mutex_unlock(&LOCK_open));
-  return reopen_log_table(QUERY_LOG_SLOW) ||
-         reopen_log_table(QUERY_LOG_GENERAL);
+
+  if (opt_slow_query_log && reopen_log_table(QUERY_LOG_SLOW) ||
+      opt_general_log && reopen_log_table(QUERY_LOG_GENERAL))
+    return 1;
+  return 0;
 }
 
 /* the parameters are unused for the log tables */
 bool Log_to_csv_event_handler::init()
 {
-  /* we always open log tables. even if the logging is disabled */
-  return (open_log_table(QUERY_LOG_GENERAL) || open_log_table(QUERY_LOG_SLOW));
+  if (opt_general_log && open_log_table(QUERY_LOG_GENERAL))
+    return 1;
+  if (opt_slow_query_log && open_log_table(QUERY_LOG_SLOW))
+    return 1;
+  return 0;
 }
 
 int LOGGER::set_handlers(uint error_log_printer,
@@ -2979,6 +3038,8 @@ int error_log_print(enum loglevel level,
 bool slow_log_print(THD *thd, const char *query, uint query_length,
                     time_t query_start_arg)
 {
+  if (!opt_slow_query_log)
+    return 0;
   return logger.slow_log_print(thd, query, query_length, query_start_arg);
 }
 
@@ -2989,6 +3050,8 @@ bool general_log_print(THD *thd, enum en
   va_list args;
   uint error= 0;
 
+  if (!opt_general_log)
+    return 0;
   va_start(args, format);
   error= logger.general_log_print(thd, command, format, args);
   va_end(args);

--- 1.390/sql/mysql_priv.h	Fri Apr  7 12:13:20 2006
+++ 1.391/sql/mysql_priv.h	Wed Apr 12 19:08:21 2006
@@ -1312,6 +1312,8 @@ extern ulong expire_logs_days, sync_binl
 extern ulong opt_tc_log_size, tc_log_max_pages_used, tc_log_page_size;
 extern ulong tc_log_page_waits;
 extern my_bool relay_log_purge, opt_innodb_safe_binlog, opt_innodb;
+extern my_bool opt_general_log, opt_slow_query_log;
+extern ulong log_output_options;
 extern uint test_flags,select_errors,ha_open_options;
 extern uint protocol_version, mysqld_port, dropping_tables;
 extern uint delay_key_write_options, lower_case_table_names;

--- 1.553/sql/mysqld.cc	Mon Apr  3 13:25:22 2006
+++ 1.554/sql/mysqld.cc	Wed Apr 12 19:08:21 2006
@@ -313,7 +313,6 @@ TYPELIB log_output_typelib= {array_eleme
 
 /* the default log output is log tables */
 static const char *log_output_str= "TABLE";
-static ulong log_output_options= LOG_TABLE;
 static bool lower_case_table_names_used= 0;
 static bool volatile select_thread_in_use, signal_thread_in_use;
 static bool volatile ready_to_exit;
@@ -364,6 +363,7 @@ my_bool opt_safe_user_create = 0, opt_no
 my_bool opt_show_slave_auth_info, opt_sql_bin_update = 0;
 my_bool opt_log_slave_updates= 0;
 my_bool	opt_innodb;
+my_bool opt_general_log, opt_slow_query_log;
 #ifdef WITH_INNOBASE_STORAGE_ENGINE
 extern SHOW_VAR innodb_status_variables[];
 extern uint innobase_init_flags, innobase_lock_type;
@@ -506,6 +506,7 @@ ulong thread_id=1L,current_pid;
 ulong slow_launch_threads = 0, sync_binlog_period;
 ulong expire_logs_days = 0;
 ulong rpl_recovery_rank=0;
+ulong log_output_options= LOG_TABLE;
 
 double log_10[32];			/* 10 potences */
 time_t start_time;
@@ -4814,7 +4815,9 @@ enum options_mysqld
   OPT_TABLE_LOCK_WAIT_TIMEOUT,
   OPT_PLUGIN_DIR,
   OPT_LOG_OUTPUT,
-  OPT_PORT_OPEN_TIMEOUT
+  OPT_PORT_OPEN_TIMEOUT,
+  OPT_GENERAL_LOG,
+  OPT_SLOW_LOG
 };
 
 
@@ -5050,6 +5053,9 @@ Disable with --skip-bdb (will save memor
    "Set up signals usable for debugging",
    (gptr*) &opt_debugging, (gptr*) &opt_debugging,
    0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
+  {"general-log", OPT_GENERAL_LOG,
+   "Enable|disable general log", (gptr*) &opt_general_log,
+   (gptr*) &opt_general_log, 0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0},
 #ifdef HAVE_LARGE_PAGES
   {"large-pages", OPT_ENABLE_LARGE_PAGES, "Enable support for large pages. \
 Disable with --skip-large-pages.",
@@ -5619,6 +5625,9 @@ replicating a LOAD DATA INFILE command."
    "Tells the slave thread to continue replication when a query returns an error from the provided list.",
    0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 #endif
+  {"slow-query-log", OPT_SLOW_LOG,
+   "Enable|disable slow query log", (gptr*) &opt_slow_query_log,
+   (gptr*) &opt_slow_query_log, 0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0},
   {"socket", OPT_SOCKET, "Socket file to use for connection.",
    (gptr*) &mysqld_unix_port, (gptr*) &mysqld_unix_port, 0, GET_STR,
    REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
@@ -6937,6 +6946,7 @@ static void mysql_init_variables(void)
   /* Things reset to zero */
   opt_skip_slave_start= opt_reckless_slave = 0;
   mysql_home[0]= pidfile_name[0]= log_error_file[0]= 0;
+  opt_general_log= opt_slow_query_log= 0;
   opt_log= opt_update_log= opt_slow_log= 0;
   opt_bin_log= 0;
   opt_disable_networking= opt_skip_show_db=0;
@@ -7165,6 +7175,7 @@ get_one_option(int optid, const struct m
     break;
   case 'l':
     opt_log=1;
+    opt_general_log=1;
     break;
   case 'h':
     strmake(mysql_real_data_home,argument, sizeof(mysql_real_data_home)-1);
@@ -7350,6 +7361,7 @@ get_one_option(int optid, const struct m
 #endif /* HAVE_REPLICATION */
   case (int) OPT_SLOW_QUERY_LOG:
     opt_slow_log= 1;
+    opt_slow_query_log= 1;
     break;
 #ifdef WITH_CSV_STORAGE_ENGINE
   case  OPT_LOG_OUTPUT:
@@ -7883,6 +7895,16 @@ static void get_options(int argc,char **
 				  &global_system_variables.datetime_format))
     exit(1);
 
+  if (!opt_log && opt_general_log)
+  {
+    sql_print_warning("General log is disabled. Option 'general-log' has no effect.");
+    opt_general_log= 0;
+  }
+  if (!opt_slow_log && opt_slow_query_log)
+  {
+    sql_print_warning("Slow query log is disabled. Option 'slow-query-log' has no effect.");
+    opt_slow_query_log= 0;
+  }  
 }
 
 

--- 1.179/sql/sql_delete.cc	Thu Apr  6 16:44:20 2006
+++ 1.180/sql/sql_delete.cc	Wed Apr 12 19:08:22 2006
@@ -927,7 +927,7 @@ bool mysql_truncate(THD *thd, TABLE_LIST
   if (!my_strcasecmp(system_charset_info, table_list->db, "mysql"))
   {
     if (!my_strcasecmp(system_charset_info, table_list->table_name,
-                       "general_log"))
+                       "general_log") && opt_general_log)
     {
       lock_logger= 1;
       logger.lock();
@@ -936,7 +936,7 @@ bool mysql_truncate(THD *thd, TABLE_LIST
     }
     else
       if (!my_strcasecmp(system_charset_info, table_list->table_name,
-                         "slow_log"))
+                         "slow_log") && opt_slow_query_log)
       {
         lock_logger= 1;
         logger.lock();
@@ -974,10 +974,10 @@ end:
     unlock_table_name(thd, table_list);
     VOID(pthread_mutex_unlock(&LOCK_open));
 
-    if (closed_log_tables & QUERY_LOG_SLOW)
+    if (opt_slow_query_log && (closed_log_tables & QUERY_LOG_SLOW))
       logger.reopen_log_table(QUERY_LOG_SLOW);
 
-    if (closed_log_tables & QUERY_LOG_GENERAL)
+    if (opt_general_log && (closed_log_tables & QUERY_LOG_GENERAL))
       logger.reopen_log_table(QUERY_LOG_GENERAL);
     if (lock_logger)
       logger.unlock();

--- 1.90/sql/share/errmsg.txt	Tue Mar 21 00:41:16 2006
+++ 1.91/sql/share/errmsg.txt	Wed Apr 12 19:08:21 2006
@@ -5826,3 +5826,5 @@ ER_NDB_CANT_SWITCH_BINLOG_FORMAT
 	eng "The NDB cluster engine does not support changing the binlog format on the fly yet"
 ER_PARTITION_NO_TEMPORARY
 	eng "Cannot create temporary table with partitions"
+ER_CANT_CHANGE_LOG_VAR
+	eng "'%-.64s' is disabled. Cannot change '%-.64s' variable."
--- New file ---
+++ mysql-test/r/log_state.result	06/04/12 19:08:22
truncate table mysql.general_log;
truncate table mysql.slow_log;
show global variables 
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
Variable_name	Value
general_log	OFF
log	ON
log_slow_queries	ON
slow_query_log	OFF
flush logs;
set global general_log= ON;
create table t1(f1 int);
select * from mysql.general_log;
event_time	user_host	thread_id	server_id	command_type	argument
TIMESTAMP	root[root] @ localhost []	1	1	Query	create table t1(f1 int)
TIMESTAMP	root[root] @ localhost []	1	1	Query	select * from mysql.general_log
set global general_log= OFF;
drop table t1;
select * from mysql.general_log;
event_time	user_host	thread_id	server_id	command_type	argument
TIMESTAMP	root[root] @ localhost []	1	1	Query	create table t1(f1 int)
TIMESTAMP	root[root] @ localhost []	1	1	Query	select * from mysql.general_log
TIMESTAMP	root[root] @ localhost []	1	1	Query	set global general_log= OFF
set global general_log= ON;
flush logs;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
Variable_name	Value
general_log	ON
log	ON
log_slow_queries	ON
slow_query_log	OFF
set session long_query_time=1;
select sleep(2);
sleep(2)
0
select * from mysql.slow_log;
start_time	user_host	query_time	lock_time	rows_sent	rows_examined	db	last_insert_id	insert_id	server_id	sql_text
set global slow_query_log= ON;
set session long_query_time=1;
select sleep(2);
sleep(2)
0
select * from mysql.slow_log;
start_time	user_host	query_time	lock_time	rows_sent	rows_examined	db	last_insert_id	insert_id	server_id	sql_text
TIMESTAMP,	root[root] @ localhost []	USER_HOST,	QUERY_TIME	1	0	test	0	0	1	select sleep(2)
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
Variable_name	Value
general_log	ON
log	ON
log_slow_queries	ON
slow_query_log	ON
set global general_log= ON;
set global general_log= OFF;
set global general_log= OFF;
set global slow_query_log= ON;
set global slow_query_log= OFF;
set global slow_query_log= OFF;
set global general_log= ON;
truncate table mysql.general_log;
create table t1(f1 int);
drop table t1;
select * from mysql.general_log;
event_time	user_host	thread_id	server_id	command_type	argument
TIMESTAMP	root[root] @ localhost []	1	1	Query	create table t1(f1 int)
TIMESTAMP	root[root] @ localhost []	1	1	Query	drop table t1
TIMESTAMP	root[root] @ localhost []	1	1	Query	select * from mysql.general_log
set global general_log= OFF;
truncate table mysql.general_log;
select * from mysql.general_log;
event_time	user_host	thread_id	server_id	command_type	argument
set global general_log= ON;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
Variable_name	Value
general_log	ON
log	ON
log_slow_queries	ON
slow_query_log	OFF

--- New file ---
+++ mysql-test/t/log_state-master.opt	06/04/12 19:08:22
--log-output=TABLE,FILE --log --general-log=0 --log-slow-queries --slow-query-log=0






--- New file ---
+++ mysql-test/t/log_state.test	06/04/12 19:08:23
-- source include/not_embedded.inc
--source include/have_csv.inc

--disable_ps_protocol
truncate table mysql.general_log;
truncate table mysql.slow_log;
show global variables 
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
flush logs;

set global general_log= ON;
create table t1(f1 int);
--replace_column 1 TIMESTAMP
select * from mysql.general_log;
set global general_log= OFF;
drop table t1;
--replace_column 1 TIMESTAMP
select * from mysql.general_log;
set global general_log= ON;
flush logs;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';

connect (con1,localhost,root,,);
connection con1;
set session long_query_time=1;
select sleep(2);
--replace_column 1 TIMESTAMP, 3 USER_HOST, 4 QUERY_TIME
select * from mysql.slow_log;
connection default;

set global slow_query_log= ON;
connection con1;
set session long_query_time=1;
select sleep(2);
--replace_column 1 TIMESTAMP, 3 USER_HOST, 4 QUERY_TIME
select * from mysql.slow_log;
disconnect con1;
connection default;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';

set global general_log= ON;
set global general_log= OFF;
set global general_log= OFF;
set global slow_query_log= ON;
set global slow_query_log= OFF;
set global slow_query_log= OFF;

set global general_log= ON;
truncate table mysql.general_log;
create table t1(f1 int);
drop table t1;
--replace_column 1 TIMESTAMP
select * from mysql.general_log;
set global general_log= OFF;
truncate table mysql.general_log;
--replace_column 1 TIMESTAMP
select * from mysql.general_log;
set global general_log= ON;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';

--enable_ps_protocol


--- 1.8/sql/log.h	Wed Mar 29 16:27:31 2006
+++ 1.9/sql/log.h	Wed Apr 12 19:08:21 2006
@@ -416,6 +416,7 @@ public:
 
 class Log_to_file_event_handler: public Log_event_handler
 {
+  friend class LOGGER;
   MYSQL_LOG mysql_log, mysql_slow_log;
   bool is_initialized;
 public:
@@ -510,6 +511,8 @@ public:
   void init_error_log(uint error_log_printer);
   void init_slow_log(uint slow_log_printer);
   void init_general_log(uint general_log_printer);
+  void deactivate_log_handlers(THD* thd, uint log_type);
+  void activate_log_handlers(THD* thd, uint log_type);
  };
 
 

--- 1.93/mysql-test/r/show_check.result	Mon Mar  6 14:35:33 2006
+++ 1.94/mysql-test/r/show_check.result	Wed Apr 12 19:08:21 2006
@@ -148,14 +148,12 @@ flush tables;
 show open tables;
 Database	Table	In_use	Name_locked
 mysql	general_log	1	0
-mysql	slow_log	1	0
 create table t1(n int);
 insert into t1 values (1);
 show open tables;
 Database	Table	In_use	Name_locked
-mysql	general_log	1	0
-mysql	slow_log	1	0
 test	t1	0	0
+mysql	general_log	1	0
 drop table t1;
 create table t1 (a int not null, b VARCHAR(10), INDEX (b) ) AVG_ROW_LENGTH=10 CHECKSUM=1 COMMENT="test" ENGINE=MYISAM MIN_ROWS=10 MAX_ROWS=100 PACK_KEYS=1 DELAY_KEY_WRITE=1 ROW_FORMAT=fixed;
 show create table t1;
@@ -568,23 +566,21 @@ SELECT 1 FROM mysql.db, mysql.proc, mysq
 1
 SHOW OPEN TABLES;
 Database	Table	In_use	Name_locked
-mysql	proc	0	0
+mysql	db	0	0
 test	urkunde	0	0
 mysql	time_zone	0	0
-mysql	db	0	0
+mysql	general_log	1	0
 test	txt1	0	0
-mysql	slow_log	1	0
+mysql	proc	0	0
 test	tyt2	0	0
-mysql	general_log	1	0
 mysql	user	0	0
 mysql	time_zone_name	0	0
 SHOW OPEN TABLES FROM mysql;
 Database	Table	In_use	Name_locked
-mysql	proc	0	0
-mysql	time_zone	0	0
 mysql	db	0	0
-mysql	slow_log	1	0
+mysql	time_zone	0	0
 mysql	general_log	1	0
+mysql	proc	0	0
 mysql	user	0	0
 mysql	time_zone_name	0	0
 SHOW OPEN TABLES FROM mysql LIKE 'u%';
@@ -598,16 +594,14 @@ test	tyt2	0	0
 mysql	time_zone_name	0	0
 SHOW OPEN TABLES LIKE '%o%';
 Database	Table	In_use	Name_locked
-mysql	proc	0	0
 mysql	time_zone	0	0
-mysql	slow_log	1	0
 mysql	general_log	1	0
+mysql	proc	0	0
 mysql	time_zone_name	0	0
 FLUSH TABLES;
 SHOW OPEN TABLES;
 Database	Table	In_use	Name_locked
 mysql	general_log	1	0
-mysql	slow_log	1	0
 DROP TABLE txt1;
 DROP TABLE tyt2;
 DROP TABLE urkunde;

--- 1.181/sql/set_var.cc	Wed Mar 29 16:27:31 2006
+++ 1.182/sql/set_var.cc	Wed Apr 12 19:08:21 2006
@@ -649,6 +649,10 @@ sys_var_have_variable sys_have_row_based
 /* Global read-only variable describing server license */
 sys_var_const_str		sys_license("license", STRINGIFY_ARG(LICENSE));
 
+/* Global variables which enable|disable logging */
+sys_var_log_state sys_var_general_log("general_log", &opt_general_log, QUERY_LOG_GENERAL);
+sys_var_log_state sys_var_slow_query_log("slow_query_log", &opt_slow_query_log, QUERY_LOG_SLOW);
+
 #ifdef HAVE_REPLICATION
 static int show_slave_skip_errors(THD *thd, SHOW_VAR *var, char *buff)
 {
@@ -748,6 +752,7 @@ SHOW_VAR init_vars[]= {
   {"ft_min_word_len",         (char*) &ft_min_word_len,             SHOW_LONG},
   {"ft_query_expansion_limit",(char*) &ft_query_expansion_limit,    SHOW_LONG},
   {"ft_stopword_file",        (char*) &ft_stopword_file,            SHOW_CHAR_PTR},
+  {sys_var_general_log.name, (char*) &opt_general_log,              SHOW_MY_BOOL},
   {sys_group_concat_max_len.name, (char*) &sys_group_concat_max_len,  SHOW_SYS},
   {sys_have_archive_db.name,  (char*) &have_archive_db,             SHOW_HAVE},
   {sys_have_berkeley_db.name, (char*) &have_berkeley_db,            SHOW_HAVE},
@@ -943,6 +948,7 @@ SHOW_VAR init_vars[]= {
   {sys_slave_trans_retries.name,(char*) &sys_slave_trans_retries,   SHOW_SYS},
 #endif
   {sys_slow_launch_time.name, (char*) &sys_slow_launch_time,        SHOW_SYS},
+  {sys_var_slow_query_log.name, (char*) &opt_slow_query_log,        SHOW_MY_BOOL},
 #ifdef HAVE_SYS_UN_H
   {"socket",                  (char*) &mysqld_unix_port,             SHOW_CHAR_PTR},
 #endif
@@ -2455,6 +2461,42 @@ bool sys_var_key_cache_long::update(THD 
 end:
   pthread_mutex_unlock(&LOCK_global_system_variables);
   return error;
+}
+
+
+bool sys_var_log_state::check(THD *thd, set_var *var)
+{
+  if ((log_type == QUERY_LOG_SLOW && !opt_slow_log) ||
+      (log_type == QUERY_LOG_GENERAL && !opt_log))
+  {
+    my_error(ER_CANT_CHANGE_LOG_VAR, MYF(0),
+             log_type == QUERY_LOG_SLOW ? "SLOW QUERY LOG" : "GENERAL LOG",
+	     name);
+    return 1;    // log disabled, can not update variable
+  }
+  return check_enum(thd, var, &bool_typelib);
+}
+
+
+bool sys_var_log_state::update(THD *thd, set_var *var)
+{
+  my_bool tmp_val= (my_bool) var->save_result.ulong_value;
+  pthread_mutex_lock(&LOCK_global_system_variables);
+  if (!logger.is_log_tables_initialized ||
+      *value == tmp_val)
+  {
+    *value= (my_bool) tmp_val;
+    goto err;
+  }
+  if (!tmp_val)
+    logger.deactivate_log_handlers(thd, log_type);
+  else
+    logger.activate_log_handlers(thd, log_type);
+  *value= (my_bool) tmp_val;
+
+err:
+  pthread_mutex_unlock(&LOCK_global_system_variables);
+  return 0;
 }
 
 

--- 1.84/sql/set_var.h	Sun Feb 26 01:20:53 2006
+++ 1.85/sql/set_var.h	Wed Apr 12 19:08:21 2006
@@ -718,6 +718,16 @@ public:
 };
 
 
+class sys_var_log_state :public sys_var_bool_ptr
+{
+  uint log_type;
+public:
+  sys_var_log_state(const char *name_arg, my_bool *value_arg, uint log_type_arg)
+    :sys_var_bool_ptr(name_arg, value_arg), log_type(log_type_arg) {}
+  bool check(THD *thd, set_var *var);
+  bool update(THD *thd, set_var *var);
+};
+
 /* Variable that you can only read from */
 
 class sys_var_readonly: public sys_var
Thread
bk commit into 5.1 tree (gluh:1.2304)gluh12 Apr