Commit 7c8ce0a6 authored by Anitha Gopi's avatar Anitha Gopi

Merged with tree

parents 2293d284 4ba1e549
...@@ -24,16 +24,7 @@ ...@@ -24,16 +24,7 @@
#define MYSQL_AUDIT_CLASS_MASK_SIZE 1 #define MYSQL_AUDIT_CLASS_MASK_SIZE 1
#define MYSQL_AUDIT_INTERFACE_VERSION 0x0200 #define MYSQL_AUDIT_INTERFACE_VERSION 0x0300
/*
The first word in every event class struct indicates the specific
class of the event.
*/
struct mysql_event
{
unsigned int event_class;
};
/************************************************************************* /*************************************************************************
...@@ -55,7 +46,6 @@ struct mysql_event ...@@ -55,7 +46,6 @@ struct mysql_event
struct mysql_event_general struct mysql_event_general
{ {
unsigned int event_class;
unsigned int event_subclass; unsigned int event_subclass;
int general_error_code; int general_error_code;
unsigned long general_thread_id; unsigned long general_thread_id;
...@@ -87,7 +77,6 @@ struct mysql_event_general ...@@ -87,7 +77,6 @@ struct mysql_event_general
struct mysql_event_connection struct mysql_event_connection
{ {
unsigned int event_class;
unsigned int event_subclass; unsigned int event_subclass;
int status; int status;
unsigned long thread_id; unsigned long thread_id;
...@@ -118,9 +107,9 @@ struct mysql_event_connection ...@@ -118,9 +107,9 @@ struct mysql_event_connection
waiting for the next query from the client. waiting for the next query from the client.
event_notify() is invoked whenever an event occurs which is of any event_notify() is invoked whenever an event occurs which is of any
class for which the plugin has interest. The first word of the class for which the plugin has interest. The second argument
mysql_event argument indicates the specific event class and the indicates the specific event class and the third argument is data
remainder of the structure is as required for that class. as required for that class.
class_mask is an array of bits used to indicate what event classes class_mask is an array of bits used to indicate what event classes
that this plugin wants to receive. that this plugin wants to receive.
...@@ -130,7 +119,7 @@ struct st_mysql_audit ...@@ -130,7 +119,7 @@ struct st_mysql_audit
{ {
int interface_version; int interface_version;
void (*release_thd)(MYSQL_THD); 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]; unsigned long class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE];
}; };
......
...@@ -195,13 +195,8 @@ void mysql_query_cache_invalidate4(void* thd, ...@@ -195,13 +195,8 @@ void mysql_query_cache_invalidate4(void* thd,
void *thd_get_ha_data(const void* thd, const struct handlerton *hton); void *thd_get_ha_data(const void* thd, const struct handlerton *hton);
void thd_set_ha_data(void* thd, const struct handlerton *hton, void thd_set_ha_data(void* thd, const struct handlerton *hton,
const void *ha_data); const void *ha_data);
struct mysql_event
{
unsigned int event_class;
};
struct mysql_event_general struct mysql_event_general
{ {
unsigned int event_class;
unsigned int event_subclass; unsigned int event_subclass;
int general_error_code; int general_error_code;
unsigned long general_thread_id; unsigned long general_thread_id;
...@@ -217,7 +212,6 @@ struct mysql_event_general ...@@ -217,7 +212,6 @@ struct mysql_event_general
}; };
struct mysql_event_connection struct mysql_event_connection
{ {
unsigned int event_class;
unsigned int event_subclass; unsigned int event_subclass;
int status; int status;
unsigned long thread_id; unsigned long thread_id;
...@@ -240,6 +234,6 @@ struct st_mysql_audit ...@@ -240,6 +234,6 @@ struct st_mysql_audit
{ {
int interface_version; int interface_version;
void (*release_thd)(void*); 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]; unsigned long class_mask[1];
}; };
#
# 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;
--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;
...@@ -81,11 +81,12 @@ static int audit_null_plugin_deinit(void *arg __attribute__((unused))) ...@@ -81,11 +81,12 @@ static int audit_null_plugin_deinit(void *arg __attribute__((unused)))
*/ */
static void audit_null_notify(MYSQL_THD thd __attribute__((unused)), 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 */ /* prone to races, oh well */
number_of_calls++; 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_general=
(const struct mysql_event_general *) event; (const struct mysql_event_general *) event;
......
...@@ -21,11 +21,18 @@ extern int finalize_audit_plugin(st_plugin_int *plugin); ...@@ -21,11 +21,18 @@ extern int finalize_audit_plugin(st_plugin_int *plugin);
#ifndef EMBEDDED_LIBRARY #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]; unsigned long mysql_global_audit_mask[MYSQL_AUDIT_CLASS_MASK_SIZE];
static mysql_mutex_t LOCK_audit_mask; 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 static inline
...@@ -64,7 +71,6 @@ typedef void (*audit_handler_t)(THD *thd, uint event_subtype, va_list ap); ...@@ -64,7 +71,6 @@ typedef void (*audit_handler_t)(THD *thd, uint event_subtype, va_list ap);
static void general_class_handler(THD *thd, uint event_subtype, va_list ap) static void general_class_handler(THD *thd, uint event_subtype, va_list ap)
{ {
mysql_event_general event; mysql_event_general event;
event.event_class= MYSQL_AUDIT_GENERAL_CLASS;
event.event_subclass= event_subtype; event.event_subclass= event_subtype;
event.general_error_code= va_arg(ap, int); event.general_error_code= va_arg(ap, int);
event.general_thread_id= thd ? thd->thread_id : 0; event.general_thread_id= thd ? thd->thread_id : 0;
...@@ -77,14 +83,13 @@ static void general_class_handler(THD *thd, uint event_subtype, va_list ap) ...@@ -77,14 +83,13 @@ static void general_class_handler(THD *thd, uint event_subtype, va_list ap)
event.general_query_length= va_arg(ap, unsigned int); event.general_query_length= va_arg(ap, unsigned int);
event.general_charset= va_arg(ap, struct charset_info_st *); event.general_charset= va_arg(ap, struct charset_info_st *);
event.general_rows= (unsigned long long) va_arg(ap, ha_rows); 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) static void connection_class_handler(THD *thd, uint event_subclass, va_list ap)
{ {
mysql_event_connection event; mysql_event_connection event;
event.event_class= MYSQL_AUDIT_CONNECTION_CLASS;
event.event_subclass= event_subclass; event.event_subclass= event_subclass;
event.status= va_arg(ap, int); event.status= va_arg(ap, int);
event.thread_id= va_arg(ap, unsigned long); event.thread_id= va_arg(ap, unsigned long);
...@@ -102,7 +107,7 @@ static void connection_class_handler(THD *thd, uint event_subclass, va_list ap) ...@@ -102,7 +107,7 @@ static void connection_class_handler(THD *thd, uint event_subclass, va_list ap)
event.ip_length= va_arg(ap, unsigned int); event.ip_length= va_arg(ap, unsigned int);
event.database= va_arg(ap, const char *); event.database= va_arg(ap, const char *);
event.database_length= va_arg(ap, unsigned int); 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);
} }
...@@ -433,18 +438,19 @@ int finalize_audit_plugin(st_plugin_int *plugin) ...@@ -433,18 +438,19 @@ int finalize_audit_plugin(st_plugin_int *plugin)
static my_bool plugins_dispatch(THD *thd, plugin_ref plugin, void *arg) 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]; unsigned long event_class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE];
st_mysql_audit *data= plugin_data(plugin, struct st_mysql_audit *); 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 */ /* Check to see if the plugin is interested in this event */
if (check_audit_mask(data->class_mask, event_class_mask)) if (check_audit_mask(data->class_mask, event_class_mask))
return 0; return 0;
/* Actually notify the plugin */ /* Actually notify the plugin */
data->event_notify(thd, event); data->event_notify(thd, event_generic->event_class, event_generic->event);
return 0; return 0;
} }
...@@ -457,15 +463,19 @@ static my_bool plugins_dispatch(THD *thd, plugin_ref plugin, void *arg) ...@@ -457,15 +463,19 @@ static my_bool plugins_dispatch(THD *thd, plugin_ref plugin, void *arg)
@param[in] event @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 Check if we are doing a slow global dispatch. This event occurs when
thd == NULL as it is not associated with any particular thread. thd == NULL as it is not associated with any particular thread.
*/ */
if (unlikely(!thd)) if (unlikely(!thd))
{ {
plugin_foreach(thd, plugins_dispatch, MYSQL_AUDIT_PLUGIN, (void*) event); plugin_foreach(thd, plugins_dispatch, MYSQL_AUDIT_PLUGIN, &event_generic);
} }
else else
{ {
...@@ -476,7 +486,7 @@ static void event_class_dispatch(THD *thd, const struct mysql_event *event) ...@@ -476,7 +486,7 @@ static void event_class_dispatch(THD *thd, const struct mysql_event *event)
plugins_last= plugins + thd->audit_class_plugins.elements; plugins_last= plugins + thd->audit_class_plugins.elements;
for (; plugins < plugins_last; plugins++) for (; plugins < plugins_last; plugins++)
plugins_dispatch(thd, *plugins, (void*) event); plugins_dispatch(thd, *plugins, &event_generic);
} }
} }
......
...@@ -114,6 +114,15 @@ int az_open (azio_stream *s, const char *path, int Flags, File fd) ...@@ -114,6 +114,15 @@ int az_open (azio_stream *s, const char *path, int Flags, File fd)
errno = 0; errno = 0;
s->file = fd < 0 ? my_open(path, Flags, MYF(0)) : fd; 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 ) if (s->file < 0 )
{ {
......
...@@ -1685,11 +1685,12 @@ int ha_archive::check(THD* thd, HA_CHECK_OPT* check_opt) ...@@ -1685,11 +1685,12 @@ int ha_archive::check(THD* thd, HA_CHECK_OPT* check_opt)
azflush(&(share->archive_write), Z_SYNC_FLUSH); azflush(&(share->archive_write), Z_SYNC_FLUSH);
mysql_mutex_unlock(&share->mutex); 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 Now we will rewind the archive file so that we are positioned at the
start of the file. start of the file.
*/ */
init_archive_reader();
read_data_header(&archive); read_data_header(&archive);
while (!(rc= get_row(&archive, table->record[0]))) while (!(rc= get_row(&archive, table->record[0])))
count--; count--;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment