Below is the list of changes that have just been committed into a local
5.1 repository of rburnett. When rburnett 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.2163 06/05/23 20:28:52 rburnett@stripped +10 -0
Merge bk-internal.mysql.com:/data0/bk/mysql-5.1-new
into bk-internal.mysql.com:/data0/bk/mysql-5.1-kt
sql/share/errmsg.txt
1.102 06/05/23 20:27:47 rburnett@stripped +2 -3
C
Merged.
?
sql/sql_parse.cc
1.551 06/05/23 20:26:12 rburnett@stripped +0 -0
Auto merged
sql/sql_class.h
1.295 06/05/23 20:26:11 rburnett@stripped +0 -0
Auto merged
sql/sql_class.cc
1.261 06/05/23 20:26:11 rburnett@stripped +0 -0
Auto merged
sql/set_var.cc
1.176 06/05/23 20:26:10 rburnett@stripped +0 -0
Auto merged
sql/mysqld.cc
1.548 06/05/23 20:26:10 rburnett@stripped +0 -0
Auto merged
sql/log.cc
1.208 06/05/23 20:26:09 rburnett@stripped +0 -0
Auto merged
mysql-test/mysql-test-run.pl
1.117 06/05/23 20:26:09 rburnett@stripped +0 -0
Auto merged
include/my_sys.h
1.197 06/05/23 20:26:08 rburnett@stripped +0 -0
Auto merged
include/m_string.h
1.43 06/05/23 20:26:07 rburnett@stripped +0 -0
Auto merged
# 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: rburnett
# Host: bk-internal.mysql.com
# Root: /data0/bk/mysql-5.1-kt/RESYNC
--- 1.42/include/m_string.h 2006-05-08 22:00:41 +02:00
+++ 1.43/include/m_string.h 2006-05-23 20:26:07 +02:00
@@ -240,4 +240,22 @@
#if defined(__cplusplus)
}
#endif
+
+/*
+ LEX_STRING -- a pair of a C-string and its length.
+
+ NOTE: this exactly form of declaration is required for some C-compilers
+ (for one, Sun C 5.7 2005/01/07). Unfortunatelt with such declaration
+ LEX_STRING can not be forward declared.
+*/
+
+typedef struct
+{
+ char *str;
+ uint length;
+} LEX_STRING;
+
+#define STRING_WITH_LEN(X) (X), ((uint) (sizeof(X) - 1))
+#define C_STRING_WITH_SIZE(X) ((char *) (X)), ((uint) (sizeof(X) - 1))
+
#endif
--- 1.196/include/my_sys.h 2006-05-19 16:39:27 +02:00
+++ 1.197/include/my_sys.h 2006-05-23 20:26:08 +02:00
@@ -77,6 +77,10 @@
#define MY_GIVE_INFO 2 /* Give time info about process*/
#define MY_DONT_FREE_DBUG 4 /* Do not call DBUG_END() in my_end() */
+#define MY_REMOVE_NONE 0 /* Params for modify_defaults_file */
+#define MY_REMOVE_OPTION 1
+#define MY_REMOVE_SECTION 2
+
#define ME_HIGHBYTE 8 /* Shift for colours */
#define ME_NOCUR 1 /* Don't use curses message */
#define ME_OLDWIN 2 /* Use old window */
--- 1.207/sql/log.cc 2006-05-18 09:45:35 +02:00
+++ 1.208/sql/log.cc 2006-05-23 20:26:09 +02:00
@@ -55,6 +55,14 @@
static int binlog_rollback(THD *thd, bool all);
static int binlog_prepare(THD *thd, bool all);
+sql_print_message_func sql_print_message_handlers[3] =
+{
+ sql_print_information,
+ sql_print_warning,
+ sql_print_error
+};
+
+
/*
This is a POD. Please keep it that way!
--- 1.547/sql/mysqld.cc 2006-05-22 17:25:31 +02:00
+++ 1.548/sql/mysqld.cc 2006-05-23 20:26:10 +02:00
@@ -864,8 +864,8 @@
{
DBUG_PRINT("quit",("Informing thread %ld that it's time to die",
tmp->thread_id));
- /* We skip slave threads on this first loop through. */
- if (tmp->slave_thread)
+ /* We skip slave threads & scheduler on this first loop through. */
+ if (tmp->slave_thread || tmp->system_thread == SYSTEM_THREAD_EVENT_SCHEDULER)
continue;
tmp->killed= THD::KILL_CONNECTION;
@@ -884,6 +884,7 @@
}
(void) pthread_mutex_unlock(&LOCK_thread_count); // For unlink from list
+ Events::shutdown();
end_slave();
if (thread_count)
@@ -1299,6 +1300,7 @@
(void) pthread_mutex_destroy(&LOCK_bytes_sent);
(void) pthread_mutex_destroy(&LOCK_bytes_received);
(void) pthread_mutex_destroy(&LOCK_user_conn);
+ Events::destroy_mutexes();
#ifdef HAVE_OPENSSL
(void) pthread_mutex_destroy(&LOCK_des_key_file);
#ifndef HAVE_YASSL
@@ -2854,6 +2856,7 @@
(void) pthread_mutex_init(&LOCK_server_started, MY_MUTEX_INIT_FAST);
(void) pthread_cond_init(&COND_server_started,NULL);
sp_cache_init();
+ Events::init_mutexes();
/* Parameter for threads created for connections */
(void) pthread_attr_init(&connection_attrib);
(void) pthread_attr_setdetachstate(&connection_attrib,
@@ -2999,7 +3002,6 @@
#ifdef HAVE_REPLICATION
init_slave_list();
#endif
- init_events();
/* Setup logs */
@@ -3623,6 +3625,10 @@
mysqld_server_started= 1;
pthread_cond_signal(&COND_server_started);
+ if (!opt_noacl)
+ {
+ Events::init();
+ }
#if defined(__NT__) || defined(HAVE_SMEM)
handle_connections_methods();
#else
@@ -3674,7 +3680,6 @@
clean_up(1);
wait_for_signal_thread_to_end();
clean_up_mutexes();
- shutdown_events();
my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
exit(0);
@@ -4665,7 +4670,7 @@
OPT_MAX_BINLOG_DUMP_EVENTS, OPT_SPORADIC_BINLOG_DUMP_FAIL,
OPT_SAFE_USER_CREATE, OPT_SQL_MODE,
OPT_HAVE_NAMED_PIPE,
- OPT_DO_PSTACK, OPT_EVENT_EXECUTOR, OPT_REPORT_HOST,
+ OPT_DO_PSTACK, OPT_EVENT_SCHEDULER, OPT_REPORT_HOST,
OPT_REPORT_USER, OPT_REPORT_PASSWORD, OPT_REPORT_PORT,
OPT_SHOW_SLAVE_AUTH_INFO,
OPT_SLAVE_LOAD_TMPDIR, OPT_NO_MIX_TYPE,
@@ -4998,9 +5003,9 @@
(gptr*) &global_system_variables.engine_condition_pushdown,
(gptr*) &global_system_variables.engine_condition_pushdown,
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
- {"event-scheduler", OPT_EVENT_EXECUTOR, "Enable/disable the event scheduler.",
- (gptr*) &opt_event_executor, (gptr*) &opt_event_executor, 0, GET_BOOL, NO_ARG,
- 0/*default*/, 0/*min-value*/, 1/*max-value*/, 0, 0, 0},
+ {"event-scheduler", OPT_EVENT_SCHEDULER, "Enable/disable the event scheduler.",
+ (gptr*) &Events::opt_event_scheduler, (gptr*) &Events::opt_event_scheduler, 0, GET_STR,
+ REQUIRED_ARG, 2/*default*/, 0/*min-value*/, 2/*max-value*/, 0, 0, 0},
{"exit-info", 'T', "Used for debugging; Use at your own risk!", 0, 0, 0,
GET_LONG, OPT_ARG, 0, 0, 0, 0, 0, 0},
{"external-locking", OPT_USE_LOCKING, "Use system (external) locking. With this option enabled you can run myisamchk to test (not repair) tables while the MySQL server is running.",
@@ -7327,6 +7332,24 @@
break;
}
#endif
+ case OPT_EVENT_SCHEDULER:
+ if (!argument)
+ Events::opt_event_scheduler= 2;
+ else
+ {
+ int type;
+ if ((type=find_type(argument, &Events::opt_typelib, 1)) <= 0)
+ {
+ fprintf(stderr,"Unknown option to event-scheduler: %s\n",argument);
+ exit(1);
+ }
+ /*
+ type= 1 2 3 4 5 6
+ (OFF | 0) - (ON | 1) - (2 | SUSPEND)
+ */
+ Events::opt_event_scheduler= (type-1) / 2;
+ }
+ break;
case (int) OPT_SKIP_NEW:
opt_specialflag|= SPECIAL_NO_NEW_FUNC;
delay_key_write_options= (uint) DELAY_KEY_WRITE_NONE;
--- 1.260/sql/sql_class.cc 2006-05-18 09:45:35 +02:00
+++ 1.261/sql/sql_class.cc 2006-05-23 20:26:11 +02:00
@@ -253,7 +253,8 @@
net.last_error[0]=0; // If error on boot
net.query_cache_query=0; // If error on boot
ull=0;
- system_thread= cleanup_done= abort_on_warning= no_warnings_for_error= 0;
+ system_thread= NON_SYSTEM_THREAD;
+ cleanup_done= abort_on_warning= no_warnings_for_error= 0;
peer_port= 0; // For SHOW PROCESSLIST
#ifdef HAVE_ROW_BASED_REPLICATION
transaction.m_pending_rows_event= 0;
@@ -512,6 +513,8 @@
void THD::awake(THD::killed_state state_to_set)
{
+ DBUG_ENTER("THD::awake");
+ DBUG_PRINT("enter", ("this=0x%lx", this));
THD_CHECK_SENTRY(this);
safe_mutex_assert_owner(&LOCK_delete);
@@ -555,6 +558,7 @@
}
pthread_mutex_unlock(&mysys_var->mutex);
}
+ DBUG_VOID_RETURN;
}
/*
@@ -2030,6 +2034,13 @@
*priv_host= '\0';
}
+
+bool Security_context::set_user(char *user_arg)
+{
+ safeFree(user);
+ user= my_strdup(user_arg, MYF(0));
+ return user == 0;
+}
/****************************************************************************
Handling of open and locked tables states.
--- 1.294/sql/sql_class.h 2006-05-18 09:45:35 +02:00
+++ 1.295/sql/sql_class.h 2006-05-23 20:26:11 +02:00
@@ -629,6 +629,8 @@
{
return (*priv_host ? priv_host : (char *)"%");
}
+
+ bool set_user(char *user_arg);
};
@@ -770,6 +772,19 @@
};
+/* Flags for the THD::system_thread variable */
+enum enum_thread_type
+{
+ NON_SYSTEM_THREAD= 0,
+ SYSTEM_THREAD_DELAYED_INSERT= 1,
+ SYSTEM_THREAD_SLAVE_IO= 2,
+ SYSTEM_THREAD_SLAVE_SQL= 4,
+ SYSTEM_THREAD_NDBCLUSTER_BINLOG= 8,
+ SYSTEM_THREAD_EVENT_SCHEDULER= 16,
+ SYSTEM_THREAD_EVENT_WORKER= 32
+};
+
+
/*
For each client connection we create a separate thread with THD serving as
a thread/connection descriptor
@@ -1103,7 +1118,8 @@
long dbug_thread_id;
pthread_t real_id;
uint tmp_table, global_read_lock;
- uint server_status,open_options,system_thread;
+ uint server_status,open_options;
+ enum enum_thread_type system_thread;
uint32 db_length;
uint select_number; //number of select (used for EXPLAIN)
/* variables.transaction_isolation is reset to this after each commit */
@@ -1404,11 +1420,6 @@
#define reenable_binlog(A) (A)->options= tmp_disable_binlog__save_options;}
-/* Flags for the THD::system_thread (bitmap) variable */
-#define SYSTEM_THREAD_DELAYED_INSERT 1
-#define SYSTEM_THREAD_SLAVE_IO 2
-#define SYSTEM_THREAD_SLAVE_SQL 4
-#define SYSTEM_THREAD_NDBCLUSTER_BINLOG 8
/*
Used to hold information about file and file structure in exchainge
--- 1.550/sql/sql_parse.cc 2006-05-18 17:23:29 +02:00
+++ 1.551/sql/sql_parse.cc 2006-05-23 20:26:12 +02:00
@@ -2049,7 +2049,7 @@
{
statistic_increment(thd->status_var.com_stat[SQLCOM_KILL], &LOCK_status);
ulong id=(ulong) uint4korr(packet);
- kill_one_thread(thd,id,false);
+ sql_kill(thd,id,false);
break;
}
case COM_SET_OPTION:
@@ -3836,14 +3836,17 @@
switch (lex->sql_command) {
case SQLCOM_CREATE_EVENT:
- res= evex_create_event(thd, lex->et, (uint) lex->create_info.options,
- &rows_affected);
+ res= Events::create_event(thd, lex->et,
+ (uint) lex->create_info.options,
+ &rows_affected);
break;
case SQLCOM_ALTER_EVENT:
- res= evex_update_event(thd, lex->et, lex->spname, &rows_affected);
+ res= Events::update_event(thd, lex->et, lex->spname,
+ &rows_affected);
break;
case SQLCOM_DROP_EVENT:
- res= evex_drop_event(thd, lex->et, lex->drop_if_exists, &rows_affected);
+ res= Events::drop_event(thd, lex->et, lex->drop_if_exists,
+ &rows_affected);
default:;
}
DBUG_PRINT("info", ("CREATE/ALTER/DROP returned error code=%d af_rows=%d",
@@ -3881,9 +3884,16 @@
my_error(ER_TOO_LONG_IDENT, MYF(0), lex->spname->m_name.str);
goto error;
}
- res= evex_show_create_event(thd, lex->spname, lex->et->definer);
+ res= Events::show_create_event(thd, lex->spname, lex->et->definer);
break;
}
+#ifndef DBUG_OFF
+ case SQLCOM_SHOW_SCHEDULER_STATUS:
+ {
+ res= Events::dump_internal_status(thd);
+ break;
+ }
+#endif
case SQLCOM_CREATE_FUNCTION: // UDF function
{
if (check_access(thd,INSERT_ACL,"mysql",0,1,0,0))
@@ -4123,7 +4133,7 @@
MYF(0));
goto error;
}
- kill_one_thread(thd, (ulong)it->val_int(), lex->type & ONLY_KILL_QUERY);
+ sql_kill(thd, (ulong)it->val_int(), lex->type & ONLY_KILL_QUERY);
break;
}
#ifndef NO_EMBEDDED_ACCESS_CHECKS
@@ -6917,22 +6927,26 @@
return result;
}
+
/*
- kill on thread
+ kills a thread
SYNOPSIS
kill_one_thread()
thd Thread class
id Thread id
+ only_kill_query Should it kill the query or the connection
NOTES
This is written such that we have a short lock on LOCK_thread_count
*/
-void kill_one_thread(THD *thd, ulong id, bool only_kill_query)
+uint kill_one_thread(THD *thd, ulong id, bool only_kill_query)
{
THD *tmp;
uint error=ER_NO_SUCH_THREAD;
+ DBUG_ENTER("kill_one_thread");
+ DBUG_PRINT("enter", ("id=%lu only_kill=%d", id, only_kill_query));
VOID(pthread_mutex_lock(&LOCK_thread_count)); // For unlink from list
I_List_iterator<THD> it(threads);
while ((tmp=it++))
@@ -6958,8 +6972,25 @@
error=ER_KILL_DENIED_ERROR;
pthread_mutex_unlock(&tmp->LOCK_delete);
}
+ DBUG_PRINT("exit", ("%d", error));
+ DBUG_RETURN(error);
+}
+
- if (!error)
+/*
+ kills a thread and sends response
+
+ SYNOPSIS
+ sql_kill()
+ thd Thread class
+ id Thread id
+ only_kill_query Should it kill the query or the connection
+*/
+
+void sql_kill(THD *thd, ulong id, bool only_kill_query)
+{
+ uint error;
+ if (!(error= kill_one_thread(thd, id, only_kill_query)))
send_ok(thd);
else
my_error(error, MYF(0), id);
--- 1.101/sql/share/errmsg.txt 2006-05-18 17:23:34 +02:00
+++ 1.102/sql/share/errmsg.txt 2006-05-23 20:27:47 +02:00
@@ -5042,7 +5042,7 @@
ER_DUPLICATED_VALUE_IN_TYPE
eng "Column '%-.100s' has duplicated value '%-.64s' in %s"
ger "Feld '%-.100s' hat doppelten Wert '%-.64s' in %s"
@@ -5844,4 +5844,7 @@
eng "Transaction isolation level can't be changed while a transaction is in progress"
ER_DUP_ENTRY_AUTOINCREMENT_CASE
eng "ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '%-.64s' for key '%-.64s'"
-
+ER_EVENT_MODIFY_QUEUE_ERROR
+ eng "Internal scheduler error %d"
+ER_EVENT_SET_VAR_ERROR
+ eng "Error during starting/stopping of the scheduler. Error code %u"
--- 1.116/mysql-test/mysql-test-run.pl 2006-05-18 17:22:19 +02:00
+++ 1.117/mysql-test/mysql-test-run.pl 2006-05-23 20:26:09 +02:00
@@ -1220,9 +1220,12 @@
$ENV{'NDBCLUSTER_PORT_SLAVE'}=$opt_ndbcluster_port_slave;
$ENV{'NDB_STATUS_OK'}= "YES";
+ $ENV{'IM_EXE'}= $exe_im;
$ENV{'IM_PATH_PID'}= $instance_manager->{path_pid};
$ENV{'IM_PATH_ANGEL_PID'}= $instance_manager->{path_angel_pid};
$ENV{'IM_PORT'}= $instance_manager->{port};
+ $ENV{'IM_DEFAULTS_PATH'}= $instance_manager->{defaults_file};
+ $ENV{'IM_PASSWORD_PATH'}= $instance_manager->{password_file};
$ENV{'IM_MYSQLD1_SOCK'}= $instance_manager->{instances}->[0]->{path_sock};
$ENV{'IM_MYSQLD1_PORT'}= $instance_manager->{instances}->[0]->{port};
--- 1.175/sql/set_var.cc 2006-05-22 17:25:32 +02:00
+++ 1.176/sql/set_var.cc 2006-05-23 20:26:10 +02:00
@@ -56,6 +56,8 @@
#include <thr_alarm.h>
#include <myisam.h>
+#include "event_scheduler.h"
+
/* WITH_BERKELEY_STORAGE_ENGINE */
extern bool berkeley_shared_data;
extern ulong berkeley_max_lock, berkeley_log_buffer_size;
@@ -106,7 +108,6 @@
-extern my_bool event_executor_running_global_var;
static HASH system_variable_hash;
const char *bool_type_names[]= { "OFF", "ON", NullS };
@@ -225,9 +226,8 @@
&delayed_insert_timeout);
sys_var_long_ptr sys_delayed_queue_size("delayed_queue_size",
&delayed_queue_size);
-sys_var_event_executor sys_event_executor("event_scheduler",
- (my_bool *)
- &event_executor_running_global_var);
+
+sys_var_event_scheduler sys_event_scheduler("event_scheduler");
sys_var_long_ptr sys_expire_logs_days("expire_logs_days",
&expire_logs_days);
sys_var_bool_ptr sys_flush("flush", &myisam_flush);
@@ -768,7 +768,7 @@
{sys_div_precincrement.name,(char*) &sys_div_precincrement,SHOW_SYS},
{sys_engine_condition_pushdown.name,
(char*) &sys_engine_condition_pushdown, SHOW_SYS},
- {sys_event_executor.name, (char*) &sys_event_executor, SHOW_SYS},
+ {sys_event_scheduler.name, (char*) &sys_event_scheduler, SHOW_SYS},
{sys_expire_logs_days.name, (char*) &sys_expire_logs_days, SHOW_SYS},
{sys_flush.name, (char*) &sys_flush, SHOW_SYS},
{sys_flush_time.name, (char*) &sys_flush_time, SHOW_SYS},
@@ -3631,6 +3631,69 @@
DBUG_EXPLAIN(buf, sizeof(buf));
return (byte*) thd->strdup(buf);
}
+
+
+/*
+ The update method of the global variable event_scheduler.
+ If event_scheduler is switched from 0 to 1 then the scheduler main
+ thread is resumed and if from 1 to 0 the scheduler thread is suspended
+
+ SYNOPSIS
+ sys_var_event_scheduler::update()
+ thd Thread context (unused)
+ var The new value
+
+ Returns
+ FALSE OK
+ TRUE Error
+*/
+
+bool
+sys_var_event_scheduler::update(THD *thd, set_var *var)
+{
+ enum Event_scheduler::enum_error_code res;
+ Event_scheduler *scheduler= Event_scheduler::get_instance();
+ /* here start the thread if not running. */
+ DBUG_ENTER("sys_var_event_scheduler::update");
+
+ DBUG_PRINT("new_value", ("%lu", (bool)var->save_result.ulong_value));
+ if (!scheduler->initialized())
+ {
+ my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--event-scheduler=0");
+ DBUG_RETURN(true);
+ }
+
+ if (var->save_result.ulonglong_value < 1 ||
+ var->save_result.ulonglong_value > 2)
+ {
+ char buf[64];
+ my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), "event_scheduler",
+ llstr(var->save_result.ulonglong_value, buf));
+ DBUG_RETURN(true);
+ }
+ if ((res= scheduler->suspend_or_resume(var->save_result.ulonglong_value == 1?
+ Event_scheduler::RESUME :
+ Event_scheduler::SUSPEND)))
+ my_error(ER_EVENT_SET_VAR_ERROR, MYF(0), (uint) res);
+ DBUG_RETURN((bool) res);
+}
+
+
+byte *sys_var_event_scheduler::value_ptr(THD *thd, enum_var_type type,
+ LEX_STRING *base)
+{
+ Event_scheduler *scheduler= Event_scheduler::get_instance();
+
+ if (!scheduler->initialized())
+ thd->sys_var_tmp.long_value= 0;
+ else if (scheduler->get_state() == Event_scheduler::RUNNING)
+ thd->sys_var_tmp.long_value= 1;
+ else
+ thd->sys_var_tmp.long_value= 2;
+
+ return (byte*) &thd->sys_var_tmp;
+}
+
/****************************************************************************
Used templates
| Thread |
|---|
| • bk commit into 5.1 tree (rburnett:1.2163) | reggie | 23 May |