From: Anitha Gopi Date: June 3 2011 9:10am Subject: bzr commit into mysql-trunk branch (anitha.gopi:3151) List-Archive: http://lists.mysql.com/commits/138637 Message-Id: <201106030910.p539Au3s008668@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1857819427==" --===============1857819427== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/anitha/mysql/repo/mysql-trunk-mod/ based on revid:anitha.gopi@stripped 3151 Anitha Gopi 2011-06-03 [merge] Merge with tree added: mysql-test/r/archive_debug.result mysql-test/t/archive_debug.test modified: include/mysql/plugin_audit.h include/mysql/plugin_audit.h.pp plugin/audit_null/audit_null.c sql/sql_audit.cc storage/archive/azio.c storage/archive/ha_archive.cc === modified file 'include/mysql/plugin_audit.h' --- a/include/mysql/plugin_audit.h 2010-12-14 14:34:23 +0000 +++ b/include/mysql/plugin_audit.h 2011-06-03 07:27:11 +0000 @@ -24,16 +24,7 @@ #define MYSQL_AUDIT_CLASS_MASK_SIZE 1 -#define MYSQL_AUDIT_INTERFACE_VERSION 0x0200 - -/* - The first word in every event class struct indicates the specific - class of the event. -*/ -struct mysql_event -{ - unsigned int event_class; -}; +#define MYSQL_AUDIT_INTERFACE_VERSION 0x0300 /************************************************************************* @@ -55,7 +46,6 @@ struct mysql_event struct mysql_event_general { - unsigned int event_class; unsigned int event_subclass; int general_error_code; unsigned long general_thread_id; @@ -87,7 +77,6 @@ struct mysql_event_general struct mysql_event_connection { - unsigned int event_class; unsigned int event_subclass; int status; unsigned long thread_id; @@ -118,9 +107,9 @@ struct mysql_event_connection waiting for the next query from the client. event_notify() is invoked whenever an event occurs which is of any - class for which the plugin has interest. The first word of the - mysql_event argument indicates the specific event class and the - remainder of the structure is as required for that class. + class for which the plugin has interest. The second argument + indicates the specific event class and the third argument is data + as required for that class. class_mask is an array of bits used to indicate what event classes that this plugin wants to receive. @@ -130,7 +119,7 @@ struct st_mysql_audit { int interface_version; void (*release_thd)(MYSQL_THD); - void (*event_notify)(MYSQL_THD, const struct mysql_event *); + void (*event_notify)(MYSQL_THD, unsigned int, const void *); unsigned long class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE]; }; === modified file 'include/mysql/plugin_audit.h.pp' --- a/include/mysql/plugin_audit.h.pp 2011-05-04 09:54:04 +0000 +++ b/include/mysql/plugin_audit.h.pp 2011-06-03 08:00:42 +0000 @@ -44,7 +44,7 @@ typedef enum _thd_wait_type_e { THD_WAIT_BINLOG= 8, THD_WAIT_GROUP_COMMIT= 9, THD_WAIT_SYNC= 10, - THD_WAIT_LAST= 11 + THD_WAIT_LAST= 11 } thd_wait_type; extern struct thd_wait_service_st { void (*thd_wait_begin_func)(void*, int); @@ -209,13 +209,8 @@ void mysql_query_cache_invalidate4(void* void *thd_get_ha_data(const void* thd, const struct handlerton *hton); void thd_set_ha_data(void* thd, const struct handlerton *hton, const void *ha_data); -struct mysql_event -{ - unsigned int event_class; -}; struct mysql_event_general { - unsigned int event_class; unsigned int event_subclass; int general_error_code; unsigned long general_thread_id; @@ -231,7 +226,6 @@ struct mysql_event_general }; struct mysql_event_connection { - unsigned int event_class; unsigned int event_subclass; int status; unsigned long thread_id; @@ -254,6 +248,6 @@ struct st_mysql_audit { int interface_version; void (*release_thd)(void*); - void (*event_notify)(void*, const struct mysql_event *); + void (*event_notify)(void*, unsigned int, const void *); unsigned long class_mask[1]; }; === added file 'mysql-test/r/archive_debug.result' --- a/mysql-test/r/archive_debug.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/archive_debug.result 2011-05-18 10:01:43 +0000 @@ -0,0 +1,12 @@ +# +# BUG#12402794 - 60976: CRASH, VALGRIND WARNING AND MEMORY LEAK +# WITH PARTITIONED ARCHIVE TABLES +# +CREATE TABLE t1(a INT) ENGINE=ARCHIVE; +INSERT INTO t1 VALUES(1); +SET SESSION debug='d,simulate_archive_open_failure'; +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check error Corrupt +SET SESSION debug=DEFAULT; +DROP TABLE t1; === added file 'mysql-test/t/archive_debug.test' --- a/mysql-test/t/archive_debug.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/archive_debug.test 2011-05-18 10:01:43 +0000 @@ -0,0 +1,13 @@ +--source include/have_archive.inc +--source include/have_debug.inc + +--echo # +--echo # BUG#12402794 - 60976: CRASH, VALGRIND WARNING AND MEMORY LEAK +--echo # WITH PARTITIONED ARCHIVE TABLES +--echo # +CREATE TABLE t1(a INT) ENGINE=ARCHIVE; +INSERT INTO t1 VALUES(1); +SET SESSION debug='d,simulate_archive_open_failure'; +CHECK TABLE t1; +SET SESSION debug=DEFAULT; +DROP TABLE t1; === modified file 'plugin/audit_null/audit_null.c' --- a/plugin/audit_null/audit_null.c 2010-08-12 15:19:57 +0000 +++ b/plugin/audit_null/audit_null.c 2011-06-03 07:27:11 +0000 @@ -81,11 +81,12 @@ static int audit_null_plugin_deinit(void */ static void audit_null_notify(MYSQL_THD thd __attribute__((unused)), - const struct mysql_event *event) + unsigned int event_class, + const void *event) { /* prone to races, oh well */ number_of_calls++; - if (event->event_class == MYSQL_AUDIT_GENERAL_CLASS) + if (event_class == MYSQL_AUDIT_GENERAL_CLASS) { const struct mysql_event_general *event_general= (const struct mysql_event_general *) event; === modified file 'sql/sql_audit.cc' --- a/sql/sql_audit.cc 2011-05-26 15:20:09 +0000 +++ b/sql/sql_audit.cc 2011-06-03 08:00:42 +0000 @@ -21,11 +21,18 @@ extern int finalize_audit_plugin(st_plug #ifndef EMBEDDED_LIBRARY +struct st_mysql_event_generic +{ + unsigned int event_class; + const void *event; +}; + unsigned long mysql_global_audit_mask[MYSQL_AUDIT_CLASS_MASK_SIZE]; static mysql_mutex_t LOCK_audit_mask; -static void event_class_dispatch(THD *thd, const struct mysql_event *event); +static void event_class_dispatch(THD *thd, unsigned int event_class, + const void *event); static inline @@ -64,7 +71,6 @@ typedef void (*audit_handler_t)(THD *thd static void general_class_handler(THD *thd, uint event_subtype, va_list ap) { mysql_event_general event; - event.event_class= MYSQL_AUDIT_GENERAL_CLASS; event.event_subclass= event_subtype; event.general_error_code= va_arg(ap, int); event.general_thread_id= thd ? thd->thread_id : 0; @@ -77,14 +83,13 @@ static void general_class_handler(THD *t event.general_query_length= va_arg(ap, unsigned int); event.general_charset= va_arg(ap, struct charset_info_st *); event.general_rows= (unsigned long long) va_arg(ap, ha_rows); - event_class_dispatch(thd, (const mysql_event*) &event); + event_class_dispatch(thd, MYSQL_AUDIT_GENERAL_CLASS, &event); } static void connection_class_handler(THD *thd, uint event_subclass, va_list ap) { mysql_event_connection event; - event.event_class= MYSQL_AUDIT_CONNECTION_CLASS; event.event_subclass= event_subclass; event.status= va_arg(ap, int); event.thread_id= va_arg(ap, unsigned long); @@ -102,7 +107,7 @@ static void connection_class_handler(THD event.ip_length= va_arg(ap, unsigned int); event.database= va_arg(ap, const char *); event.database_length= va_arg(ap, unsigned int); - event_class_dispatch(thd, (const mysql_event *) &event); + event_class_dispatch(thd, MYSQL_AUDIT_CONNECTION_CLASS, &event); } @@ -430,18 +435,19 @@ int finalize_audit_plugin(st_plugin_int static my_bool plugins_dispatch(THD *thd, plugin_ref plugin, void *arg) { - const struct mysql_event *event= (const struct mysql_event *) arg; + const struct st_mysql_event_generic *event_generic= + (const struct st_mysql_event_generic *) arg; unsigned long event_class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE]; st_mysql_audit *data= plugin_data(plugin, struct st_mysql_audit *); - set_audit_mask(event_class_mask, event->event_class); + set_audit_mask(event_class_mask, event_generic->event_class); /* Check to see if the plugin is interested in this event */ if (check_audit_mask(data->class_mask, event_class_mask)) return 0; /* Actually notify the plugin */ - data->event_notify(thd, event); + data->event_notify(thd, event_generic->event_class, event_generic->event); return 0; } @@ -454,15 +460,19 @@ static my_bool plugins_dispatch(THD *thd @param[in] event */ -static void event_class_dispatch(THD *thd, const struct mysql_event *event) +static void event_class_dispatch(THD *thd, unsigned int event_class, + const void *event) { + struct st_mysql_event_generic event_generic; + event_generic.event_class= event_class; + event_generic.event= event; /* Check if we are doing a slow global dispatch. This event occurs when thd == NULL as it is not associated with any particular thread. */ if (unlikely(!thd)) { - plugin_foreach(thd, plugins_dispatch, MYSQL_AUDIT_PLUGIN, (void*) event); + plugin_foreach(thd, plugins_dispatch, MYSQL_AUDIT_PLUGIN, &event_generic); } else { @@ -473,7 +483,7 @@ static void event_class_dispatch(THD *th plugins_last= plugins + thd->audit_class_plugins.elements; for (; plugins < plugins_last; plugins++) - plugins_dispatch(thd, *plugins, (void*) event); + plugins_dispatch(thd, *plugins, &event_generic); } } === modified file 'storage/archive/azio.c' --- a/storage/archive/azio.c 2010-07-26 15:54:20 +0000 +++ b/storage/archive/azio.c 2011-06-03 07:49:05 +0000 @@ -114,6 +114,15 @@ int az_open (azio_stream *s, const char errno = 0; s->file = fd < 0 ? my_open(path, Flags, MYF(0)) : fd; + DBUG_EXECUTE_IF("simulate_archive_open_failure", + { + if (s->file >= 0) + { + my_close(s->file, MYF(0)); + s->file= -1; + my_errno= EMFILE; + } + }); if (s->file < 0 ) { === modified file 'storage/archive/ha_archive.cc' --- a/storage/archive/ha_archive.cc 2011-05-10 13:41:34 +0000 +++ b/storage/archive/ha_archive.cc 2011-06-03 08:00:42 +0000 @@ -1680,11 +1680,12 @@ int ha_archive::check(THD* thd, HA_CHECK azflush(&(share->archive_write), Z_SYNC_FLUSH); mysql_mutex_unlock(&share->mutex); + if (init_archive_reader()) + DBUG_RETURN(HA_ADMIN_CORRUPT); /* Now we will rewind the archive file so that we are positioned at the start of the file. */ - init_archive_reader(); read_data_header(&archive); while (!(rc= get_row(&archive, table->record[0]))) count--; --===============1857819427== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/anitha.gopi@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: anitha.gopi@stripped # target_branch: file:///home/anitha/mysql/repo/mysql-trunk-mod/ # testament_sha1: 4ec236ac09d5a1ad2ed6018073a23d5c75cb0e07 # timestamp: 2011-06-03 14:40:45 +0530 # source_branch: file:///home/anitha/mysql/repo/mysql-5.5-mod/ # base_revision_id: anitha.gopi@stripped\ # 7u9d0ug7gvi7x9oa # # Begin bundle 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 --===============1857819427==--