List:Commits« Previous MessageNext Message »
From:reggie Date:May 23 2006 6:29pm
Subject:bk commit into 5.1 tree (rburnett:1.2163)
View as plain text  
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)reggie23 May