Commit 4c5686a9 authored by unknown's avatar unknown

Merge jbruehe@bk-internal.mysql.com:/home/bk/mysql-5.1-new

into debian.(none):/M51/mysql-5.1

parents 56d0e302 4234038b
...@@ -377,7 +377,8 @@ static struct my_option my_long_options[] = ...@@ -377,7 +377,8 @@ static struct my_option my_long_options[] =
{"create-schema", OPT_CREATE_SLAP_SCHEMA, "Schema to run tests in.", {"create-schema", OPT_CREATE_SLAP_SCHEMA, "Schema to run tests in.",
(gptr*) &create_schema_string, (gptr*) &create_schema_string, 0, GET_STR, (gptr*) &create_schema_string, (gptr*) &create_schema_string, 0, GET_STR,
REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"csv", OPT_CREATE_SLAP_SCHEMA, "Schema to run tests in.", {"csv", OPT_CREATE_SLAP_SCHEMA,
"Generate CSV output to named file or to stdout if no file is named.",
(gptr*) &opt_csv_str, (gptr*) &opt_csv_str, 0, GET_STR, (gptr*) &opt_csv_str, (gptr*) &opt_csv_str, 0, GET_STR,
OPT_ARG, 0, 0, 0, 0, 0, 0}, OPT_ARG, 0, 0, 0, 0, 0, 0},
{"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.", {"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.",
......
...@@ -39,7 +39,10 @@ then ...@@ -39,7 +39,10 @@ then
AC_DEFINE([$5]) AC_DEFINE([$5])
mysql_se_decls="${mysql_se_decls},$6" mysql_se_decls="${mysql_se_decls},$6"
mysql_se_htons="${mysql_se_htons},&$6" mysql_se_htons="${mysql_se_htons},&$6"
mysql_se_objs="$mysql_se_objs $8" if test "$8" != "no"
then
mysql_se_objs="$mysql_se_objs $8"
fi
mysql_se_dirs="$mysql_se_dirs $7" mysql_se_dirs="$mysql_se_dirs $7"
mysql_se_libs="$mysql_se_libs $9" mysql_se_libs="$mysql_se_libs $9"
else else
......
...@@ -2437,8 +2437,8 @@ MYSQL_STORAGE_ENGINE(archive,,,,,,storage/archive,, ...@@ -2437,8 +2437,8 @@ MYSQL_STORAGE_ENGINE(archive,,,,,,storage/archive,,
\$(top_builddir)/storage/archive/libarchive.a, [ \$(top_builddir)/storage/archive/libarchive.a, [
AC_CONFIG_FILES(storage/archive/Makefile) AC_CONFIG_FILES(storage/archive/Makefile)
]) ])
MYSQL_STORAGE_ENGINE(csv,,,"yes",,tina_hton,storage/csv, MYSQL_STORAGE_ENGINE(csv,,,"yes",,tina_hton,storage/csv,no,
../storage/csv/ha_tina.o,,[ \$(top_builddir)/storage/csv/libcsv.a,[
AC_CONFIG_FILES(storage/csv/Makefile) AC_CONFIG_FILES(storage/csv/Makefile)
]) ])
MYSQL_STORAGE_ENGINE(blackhole) MYSQL_STORAGE_ENGINE(blackhole)
......
...@@ -296,7 +296,10 @@ int ha_myisam::dump(THD* thd, int fd) ...@@ -296,7 +296,10 @@ int ha_myisam::dump(THD* thd, int fd)
#endif /* HAVE_REPLICATION */ #endif /* HAVE_REPLICATION */
bool ha_myisam::check_if_locking_is_allowed(THD *thd, TABLE *table, uint count) bool ha_myisam::check_if_locking_is_allowed(uint sql_command,
ulong type, TABLE *table,
uint count,
bool called_by_logger_thread)
{ {
/* /*
To be able to open and lock for reading system tables like 'mysql.proc', To be able to open and lock for reading system tables like 'mysql.proc',
......
...@@ -60,7 +60,10 @@ class ha_myisam: public handler ...@@ -60,7 +60,10 @@ class ha_myisam: public handler
uint max_supported_key_part_length() const { return MI_MAX_KEY_LENGTH; } uint max_supported_key_part_length() const { return MI_MAX_KEY_LENGTH; }
uint checksum() const; uint checksum() const;
virtual bool check_if_locking_is_allowed(THD *thd, TABLE *table, uint count); virtual bool check_if_locking_is_allowed(uint sql_command,
ulong type, TABLE *table,
uint count,
bool called_by_logger_thread);
int open(const char *name, int mode, uint test_if_locked); int open(const char *name, int mode, uint test_if_locked);
int close(void); int close(void);
int write_row(byte * buf); int write_row(byte * buf);
......
...@@ -1425,6 +1425,12 @@ int ha_delete_table(THD *thd, handlerton *table_type, const char *path, ...@@ -1425,6 +1425,12 @@ int ha_delete_table(THD *thd, handlerton *table_type, const char *path,
** General handler functions ** General handler functions
****************************************************************************/ ****************************************************************************/
void handler::ha_statistic_increment(ulong SSV::*offset) const
{
statistic_increment(table->in_use->status_var.*offset, &LOCK_status);
}
/* /*
Open database-handler. Open database-handler.
......
...@@ -1006,6 +1006,8 @@ typedef struct st_handler_buffer ...@@ -1006,6 +1006,8 @@ typedef struct st_handler_buffer
byte *end_of_used_area; /* End of area that was used by handler */ byte *end_of_used_area; /* End of area that was used by handler */
} HANDLER_BUFFER; } HANDLER_BUFFER;
typedef struct system_status_var SSV;
class handler :public Sql_alloc class handler :public Sql_alloc
{ {
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
...@@ -1027,6 +1029,9 @@ class handler :public Sql_alloc ...@@ -1027,6 +1029,9 @@ class handler :public Sql_alloc
virtual int rnd_init(bool scan) =0; virtual int rnd_init(bool scan) =0;
virtual int rnd_end() { return 0; } virtual int rnd_end() { return 0; }
void ha_statistic_increment(ulong SSV::*offset) const;
private: private:
virtual int reset() { return extra(HA_EXTRA_RESET); } virtual int reset() { return extra(HA_EXTRA_RESET); }
public: public:
...@@ -1109,7 +1114,10 @@ class handler :public Sql_alloc ...@@ -1109,7 +1114,10 @@ class handler :public Sql_alloc
TRUE Locking is allowed TRUE Locking is allowed
FALSE Locking is not allowed. The error was thrown. FALSE Locking is not allowed. The error was thrown.
*/ */
virtual bool check_if_locking_is_allowed(THD *thd, TABLE *table, uint count) virtual bool check_if_locking_is_allowed(uint sql_command,
ulong type, TABLE *table,
uint count,
bool called_by_logger_thread)
{ {
return TRUE; return TRUE;
} }
......
...@@ -1932,7 +1932,7 @@ class Item_int_with_ref :public Item_int ...@@ -1932,7 +1932,7 @@ class Item_int_with_ref :public Item_int
virtual Item *real_item() { return ref; } virtual Item *real_item() { return ref; }
}; };
#ifdef MYSQL_SERVER
#include "gstream.h" #include "gstream.h"
#include "spatial.h" #include "spatial.h"
#include "item_sum.h" #include "item_sum.h"
...@@ -1945,6 +1945,7 @@ class Item_int_with_ref :public Item_int ...@@ -1945,6 +1945,7 @@ class Item_int_with_ref :public Item_int
#include "item_uniq.h" #include "item_uniq.h"
#include "item_subselect.h" #include "item_subselect.h"
#include "item_xmlfunc.h" #include "item_xmlfunc.h"
#endif
class Item_copy_string :public Item class Item_copy_string :public Item
{ {
......
...@@ -617,8 +617,11 @@ static MYSQL_LOCK *get_lock_data(THD *thd, TABLE **table_ptr, uint count, ...@@ -617,8 +617,11 @@ static MYSQL_LOCK *get_lock_data(THD *thd, TABLE **table_ptr, uint count,
Check if we can lock the table. For some tables we cannot do that Check if we can lock the table. For some tables we cannot do that
beacause of handler-specific locking issues. beacause of handler-specific locking issues.
*/ */
if (!table_ptr[i]->file->check_if_locking_is_allowed(thd, table_ptr[i], if (!table_ptr[i]-> file->
count)) check_if_locking_is_allowed(thd->lex->sql_command, thd->lex->type,
table_ptr[i], count,
(thd == logger.get_general_log_thd()) ||
(thd == logger.get_slow_log_thd())))
return 0; return 0;
} }
......
...@@ -477,6 +477,11 @@ inline THD *_current_thd(void) ...@@ -477,6 +477,11 @@ inline THD *_current_thd(void)
} }
#define current_thd _current_thd() #define current_thd _current_thd()
/* below functions are required for plugins as THD class is opaque */
my_bool thd_in_lock_tables(const THD *thd);
my_bool thd_tablespace_op(const THD *thd);
const char *thd_proc_info(THD *thd, const char *info);
/* /*
External variables External variables
*/ */
...@@ -507,7 +512,9 @@ enum enum_var_type ...@@ -507,7 +512,9 @@ enum enum_var_type
class sys_var; class sys_var;
#include "item.h" #include "item.h"
extern my_decimal decimal_zero; extern my_decimal decimal_zero;
#ifdef MYSQL_SERVER
typedef Comp_creator* (*chooser_compare_func_creator)(bool invert); typedef Comp_creator* (*chooser_compare_func_creator)(bool invert);
#endif
/* sql_parse.cc */ /* sql_parse.cc */
void free_items(Item *item); void free_items(Item *item);
void cleanup_items(Item *item); void cleanup_items(Item *item);
...@@ -545,6 +552,7 @@ Item *negate_expression(THD *thd, Item *expr); ...@@ -545,6 +552,7 @@ Item *negate_expression(THD *thd, Item *expr);
#include "sql_class.h" #include "sql_class.h"
#include "sql_acl.h" #include "sql_acl.h"
#include "tztime.h" #include "tztime.h"
#ifdef MYSQL_SERVER
#include "opt_range.h" #include "opt_range.h"
#ifdef HAVE_QUERY_CACHE #ifdef HAVE_QUERY_CACHE
...@@ -841,6 +849,8 @@ find_field_in_table(THD *thd, TABLE *table, const char *name, uint length, ...@@ -841,6 +849,8 @@ find_field_in_table(THD *thd, TABLE *table, const char *name, uint length,
Field * Field *
find_field_in_table_sef(TABLE *table, const char *name); find_field_in_table_sef(TABLE *table, const char *name);
#endif /* MYSQL_SERVER */
#ifdef HAVE_OPENSSL #ifdef HAVE_OPENSSL
#include <openssl/des.h> #include <openssl/des.h>
struct st_des_keyblock struct st_des_keyblock
...@@ -858,6 +868,7 @@ extern pthread_mutex_t LOCK_des_key_file; ...@@ -858,6 +868,7 @@ extern pthread_mutex_t LOCK_des_key_file;
bool load_des_key_file(const char *file_name); bool load_des_key_file(const char *file_name);
#endif /* HAVE_OPENSSL */ #endif /* HAVE_OPENSSL */
#ifdef MYSQL_SERVER
/* sql_do.cc */ /* sql_do.cc */
bool mysql_do(THD *thd, List<Item> &values); bool mysql_do(THD *thd, List<Item> &values);
...@@ -1169,6 +1180,7 @@ int key_cmp(KEY_PART_INFO *key_part, const byte *key, uint key_length); ...@@ -1169,6 +1180,7 @@ int key_cmp(KEY_PART_INFO *key_part, const byte *key, uint key_length);
int key_rec_cmp(void *key_info, byte *a, byte *b); int key_rec_cmp(void *key_info, byte *a, byte *b);
bool init_errmessage(void); bool init_errmessage(void);
#endif /* MYSQL_SERVER */
void sql_perror(const char *message); void sql_perror(const char *message);
int vprint_msg_to_log(enum loglevel level, const char *format, va_list args); int vprint_msg_to_log(enum loglevel level, const char *format, va_list args);
...@@ -1191,6 +1203,7 @@ bool general_log_print(THD *thd, enum enum_server_command command, ...@@ -1191,6 +1203,7 @@ bool general_log_print(THD *thd, enum enum_server_command command,
bool fn_format_relative_to_data_home(my_string to, const char *name, bool fn_format_relative_to_data_home(my_string to, const char *name,
const char *dir, const char *extension); const char *dir, const char *extension);
#ifdef MYSQL_SERVER
File open_binlog(IO_CACHE *log, const char *log_file_name, File open_binlog(IO_CACHE *log, const char *log_file_name,
const char **errmsg); const char **errmsg);
...@@ -1739,4 +1752,5 @@ inline void kill_delayed_threads(void) {} ...@@ -1739,4 +1752,5 @@ inline void kill_delayed_threads(void) {}
#define check_stack_overrun(A, B, C) 0 #define check_stack_overrun(A, B, C) 0
#endif #endif
#endif /* MYSQL_SERVER */
#endif /* MYSQL_CLIENT */ #endif /* MYSQL_CLIENT */
...@@ -167,6 +167,25 @@ Open_tables_state::Open_tables_state(ulong version_arg) ...@@ -167,6 +167,25 @@ Open_tables_state::Open_tables_state(ulong version_arg)
reset_open_tables_state(); reset_open_tables_state();
} }
my_bool thd_in_lock_tables(const THD *thd)
{
return thd->in_lock_tables;
}
my_bool thd_tablespace_op(const THD *thd)
{
return thd->tablespace_op;
}
const char *thd_proc_info(THD *thd, const char *info)
{
const char *old_info= thd->proc_info;
thd->proc_info= info;
return old_info;
}
/* /*
Pass nominal parameters to Statement constructor only to ensure that Pass nominal parameters to Statement constructor only to ensure that
......
...@@ -171,6 +171,7 @@ class LEX_COLUMN : public Sql_alloc ...@@ -171,6 +171,7 @@ class LEX_COLUMN : public Sql_alloc
class delayed_insert; class delayed_insert;
class select_result; class select_result;
class Time_zone;
#define THD_SENTRY_MAGIC 0xfeedd1ff #define THD_SENTRY_MAGIC 0xfeedd1ff
#define THD_SENTRY_GONE 0xdeadbeef #define THD_SENTRY_GONE 0xdeadbeef
...@@ -344,6 +345,8 @@ typedef struct system_status_var ...@@ -344,6 +345,8 @@ typedef struct system_status_var
#define last_system_status_var com_stmt_close #define last_system_status_var com_stmt_close
#ifdef MYSQL_SERVER
void free_tmp_table(THD *thd, TABLE *entry); void free_tmp_table(THD *thd, TABLE *entry);
...@@ -354,7 +357,6 @@ void free_tmp_table(THD *thd, TABLE *entry); ...@@ -354,7 +357,6 @@ void free_tmp_table(THD *thd, TABLE *entry);
#define INIT_ARENA_DBUG_INFO #define INIT_ARENA_DBUG_INFO
#endif #endif
class Query_arena class Query_arena
{ {
public: public:
...@@ -1905,3 +1907,5 @@ class select_dumpvar :public select_result_interceptor { ...@@ -1905,3 +1907,5 @@ class select_dumpvar :public select_result_interceptor {
/* Functions in sql_class.cc */ /* Functions in sql_class.cc */
void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var); void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var);
#endif /* MYSQL_SERVER */
...@@ -29,6 +29,7 @@ class st_alter_tablespace; ...@@ -29,6 +29,7 @@ class st_alter_tablespace;
class partition_info; class partition_info;
class event_timed; class event_timed;
#ifdef MYSQL_SERVER
/* /*
The following hack is needed because mysql_yacc.cc does not define The following hack is needed because mysql_yacc.cc does not define
YYSTYPE before including this file YYSTYPE before including this file
...@@ -43,6 +44,7 @@ class event_timed; ...@@ -43,6 +44,7 @@ class event_timed;
#include "sql_yacc.h" #include "sql_yacc.h"
#define LEX_YYSTYPE YYSTYPE * #define LEX_YYSTYPE YYSTYPE *
#endif #endif
#endif
/* /*
When a command is added here, be sure it's also added in mysqld.cc When a command is added here, be sure it's also added in mysqld.cc
...@@ -115,6 +117,8 @@ enum enum_sql_command { ...@@ -115,6 +117,8 @@ enum enum_sql_command {
*/ */
#define DESCRIBE_PARTITIONS 4 #define DESCRIBE_PARTITIONS 4
#ifdef MYSQL_SERVER
enum enum_sp_suid_behaviour enum enum_sp_suid_behaviour
{ {
SP_IS_DEFAULT_SUID= 0, SP_IS_DEFAULT_SUID= 0,
...@@ -1109,3 +1113,5 @@ extern int yylex(void *arg, void *yythd); ...@@ -1109,3 +1113,5 @@ extern int yylex(void *arg, void *yythd);
extern pthread_key(LEX*,THR_LEX); extern pthread_key(LEX*,THR_LEX);
#define current_lex (current_thd->lex) #define current_lex (current_thd->lex)
#endif
...@@ -24,17 +24,16 @@ INCLUDES = -I$(top_srcdir)/include \ ...@@ -24,17 +24,16 @@ INCLUDES = -I$(top_srcdir)/include \
-I$(top_srcdir)/regex \ -I$(top_srcdir)/regex \
-I$(top_srcdir)/sql \ -I$(top_srcdir)/sql \
-I$(srcdir) -I$(srcdir)
WRAPLIBS=
pkglib_LTLIBRARIES = ha_csv.la pkglib_LIBRARIES = libcsv.a
ha_csv_la_LDFLAGS = -module
noinst_HEADERS = ha_tina.h
ha_csv_la_SOURCES = ha_tina.cc
LDADD = LDADD =
DEFS = -DMYSQL_SERVER @DEFS@ DEFS = @DEFS@
libcsv_a_CXXFLAGS = $(AM_CFLAGS)
noinst_HEADERS = ha_tina.h
libcsv_a_SOURCES = ha_tina.cc
# Don't update the files from bitkeeper # Don't update the files from bitkeeper
%::SCCS/s.% %::SCCS/s.%
...@@ -590,7 +590,10 @@ void ha_tina::update_status() ...@@ -590,7 +590,10 @@ void ha_tina::update_status()
} }
bool ha_tina::check_if_locking_is_allowed(THD *thd, TABLE *table, uint count) bool ha_tina::check_if_locking_is_allowed(uint sql_command,
ulong type, TABLE *table,
uint count,
bool called_by_logger_thread)
{ {
/* /*
Deny locking of the log tables, which is incompatible with Deny locking of the log tables, which is incompatible with
...@@ -598,11 +601,10 @@ bool ha_tina::check_if_locking_is_allowed(THD *thd, TABLE *table, uint count) ...@@ -598,11 +601,10 @@ bool ha_tina::check_if_locking_is_allowed(THD *thd, TABLE *table, uint count)
general_log_thd or slow_log_thd. general_log_thd or slow_log_thd.
*/ */
if (table->s->log_table && if (table->s->log_table &&
thd->lex->sql_command != SQLCOM_TRUNCATE && sql_command != SQLCOM_TRUNCATE &&
!(thd->lex->sql_command == SQLCOM_FLUSH && !(sql_command == SQLCOM_FLUSH &&
thd->lex->type & REFRESH_LOG) && type & REFRESH_LOG) &&
(thd != logger.get_general_log_thd()) && !called_by_logger_thread &&
(thd != logger.get_slow_log_thd()) &&
(table->reginfo.lock_type >= TL_READ_NO_INSERT)) (table->reginfo.lock_type >= TL_READ_NO_INSERT))
{ {
/* /*
...@@ -665,7 +667,7 @@ int ha_tina::write_row(byte * buf) ...@@ -665,7 +667,7 @@ int ha_tina::write_row(byte * buf)
int size; int size;
DBUG_ENTER("ha_tina::write_row"); DBUG_ENTER("ha_tina::write_row");
statistic_increment(table->in_use->status_var.ha_write_count, &LOCK_status); ha_statistic_increment(&SSV::ha_write_count);
if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_INSERT) if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_INSERT)
table->timestamp_field->set_time(); table->timestamp_field->set_time();
...@@ -714,9 +716,7 @@ int ha_tina::update_row(const byte * old_data, byte * new_data) ...@@ -714,9 +716,7 @@ int ha_tina::update_row(const byte * old_data, byte * new_data)
int size; int size;
DBUG_ENTER("ha_tina::update_row"); DBUG_ENTER("ha_tina::update_row");
ha_statistic_increment(&SSV::ha_read_rnd_next_count);
statistic_increment(table->in_use->status_var.ha_read_rnd_next_count,
&LOCK_status);
if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE) if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE)
table->timestamp_field->set_time(); table->timestamp_field->set_time();
...@@ -751,8 +751,7 @@ int ha_tina::update_row(const byte * old_data, byte * new_data) ...@@ -751,8 +751,7 @@ int ha_tina::update_row(const byte * old_data, byte * new_data)
int ha_tina::delete_row(const byte * buf) int ha_tina::delete_row(const byte * buf)
{ {
DBUG_ENTER("ha_tina::delete_row"); DBUG_ENTER("ha_tina::delete_row");
statistic_increment(table->in_use->status_var.ha_delete_count, ha_statistic_increment(&SSV::ha_delete_count);
&LOCK_status);
if (chain_append()) if (chain_append())
DBUG_RETURN(-1); DBUG_RETURN(-1);
...@@ -903,8 +902,7 @@ int ha_tina::rnd_next(byte *buf) ...@@ -903,8 +902,7 @@ int ha_tina::rnd_next(byte *buf)
{ {
DBUG_ENTER("ha_tina::rnd_next"); DBUG_ENTER("ha_tina::rnd_next");
statistic_increment(table->in_use->status_var.ha_read_rnd_next_count, ha_statistic_increment(&SSV::ha_read_rnd_next_count);
&LOCK_status);
current_position= next_position; current_position= next_position;
if (!share->mapped_file) if (!share->mapped_file)
...@@ -941,8 +939,7 @@ void ha_tina::position(const byte *record) ...@@ -941,8 +939,7 @@ void ha_tina::position(const byte *record)
int ha_tina::rnd_pos(byte * buf, byte *pos) int ha_tina::rnd_pos(byte * buf, byte *pos)
{ {
DBUG_ENTER("ha_tina::rnd_pos"); DBUG_ENTER("ha_tina::rnd_pos");
statistic_increment(table->in_use->status_var.ha_read_rnd_next_count, ha_statistic_increment(&SSV::ha_read_rnd_next_count);
&LOCK_status);
current_position= my_get_ptr(pos,ref_length); current_position= my_get_ptr(pos,ref_length);
DBUG_RETURN(find_current_row(buf)); DBUG_RETURN(find_current_row(buf));
} }
......
...@@ -104,7 +104,10 @@ class ha_tina: public handler ...@@ -104,7 +104,10 @@ class ha_tina: public handler
*/ */
ha_rows estimate_rows_upper_bound() { return HA_POS_ERROR; } ha_rows estimate_rows_upper_bound() { return HA_POS_ERROR; }
virtual bool check_if_locking_is_allowed(THD *thd, TABLE *table, uint count); virtual bool check_if_locking_is_allowed(uint sql_command,
ulong type, TABLE *table,
uint count,
bool called_by_logger_thread);
int open(const char *name, int mode, uint test_if_locked); int open(const char *name, int mode, uint test_if_locked);
int close(void); int close(void);
int write_row(byte * buf); int write_row(byte * buf);
......
...@@ -139,21 +139,11 @@ class StartBackupReq { ...@@ -139,21 +139,11 @@ class StartBackupReq {
friend bool printSTART_BACKUP_REQ(FILE *, const Uint32 *, Uint32, Uint16); friend bool printSTART_BACKUP_REQ(FILE *, const Uint32 *, Uint32, Uint16);
public: public:
STATIC_CONST( MaxTableTriggers = 4 ); STATIC_CONST( SignalLength = 2 );
STATIC_CONST( HeaderLength = 5 );
STATIC_CONST( TableTriggerLength = 4);
private: private:
Uint32 backupId; Uint32 backupId;
Uint32 backupPtr; Uint32 backupPtr;
Uint32 signalNo;
Uint32 noOfSignals;
Uint32 noOfTableTriggers;
struct TableTriggers {
Uint32 tableId;
Uint32 triggerIds[3];
} tableTriggers[MaxTableTriggers];
}; };
class StartBackupRef { class StartBackupRef {
...@@ -169,7 +159,7 @@ class StartBackupRef { ...@@ -169,7 +159,7 @@ class StartBackupRef {
friend bool printSTART_BACKUP_REF(FILE *, const Uint32 *, Uint32, Uint16); friend bool printSTART_BACKUP_REF(FILE *, const Uint32 *, Uint32, Uint16);
public: public:
STATIC_CONST( SignalLength = 5 ); STATIC_CONST( SignalLength = 4 );
enum ErrorCode { enum ErrorCode {
FailedToAllocateTriggerRecord = 1 FailedToAllocateTriggerRecord = 1
...@@ -177,7 +167,6 @@ public: ...@@ -177,7 +167,6 @@ public:
private: private:
Uint32 backupId; Uint32 backupId;
Uint32 backupPtr; Uint32 backupPtr;
Uint32 signalNo;
Uint32 errorCode; Uint32 errorCode;
Uint32 nodeId; Uint32 nodeId;
}; };
...@@ -195,12 +184,11 @@ class StartBackupConf { ...@@ -195,12 +184,11 @@ class StartBackupConf {
friend bool printSTART_BACKUP_CONF(FILE *, const Uint32 *, Uint32, Uint16); friend bool printSTART_BACKUP_CONF(FILE *, const Uint32 *, Uint32, Uint16);
public: public:
STATIC_CONST( SignalLength = 3 ); STATIC_CONST( SignalLength = 2 );
private: private:
Uint32 backupId; Uint32 backupId;
Uint32 backupPtr; Uint32 backupPtr;
Uint32 signalNo;
}; };
class BackupFragmentReq { class BackupFragmentReq {
......
...@@ -48,16 +48,8 @@ printDEFINE_BACKUP_CONF(FILE * out, const Uint32 * data, Uint32 l, Uint16 bno){ ...@@ -48,16 +48,8 @@ printDEFINE_BACKUP_CONF(FILE * out, const Uint32 * data, Uint32 l, Uint16 bno){
bool bool
printSTART_BACKUP_REQ(FILE * out, const Uint32 * data, Uint32 l, Uint16 bno){ printSTART_BACKUP_REQ(FILE * out, const Uint32 * data, Uint32 l, Uint16 bno){
StartBackupReq* sig = (StartBackupReq*)data; StartBackupReq* sig = (StartBackupReq*)data;
fprintf(out, " backupPtr: %d backupId: %d signalNo: %d of %d\n", fprintf(out, " backupPtr: %d backupId: %d\n",
sig->backupPtr, sig->backupId, sig->backupPtr, sig->backupId);
sig->signalNo + 1, sig->noOfSignals);
for(Uint32 i = 0; i<sig->noOfTableTriggers; i++)
fprintf(out,
" Table: %d Triggers = [ insert: %d update: %d delete: %d ]\n",
sig->tableTriggers[i].tableId,
sig->tableTriggers[i].triggerIds[TriggerEvent::TE_INSERT],
sig->tableTriggers[i].triggerIds[TriggerEvent::TE_UPDATE],
sig->tableTriggers[i].triggerIds[TriggerEvent::TE_DELETE]);
return true; return true;
} }
......
...@@ -96,8 +96,6 @@ protected: ...@@ -96,8 +96,6 @@ protected:
void execGET_TABINFO_CONF(Signal* signal); void execGET_TABINFO_CONF(Signal* signal);
void execCREATE_TRIG_REF(Signal* signal); void execCREATE_TRIG_REF(Signal* signal);
void execCREATE_TRIG_CONF(Signal* signal); void execCREATE_TRIG_CONF(Signal* signal);
void execALTER_TRIG_REF(Signal* signal);
void execALTER_TRIG_CONF(Signal* signal);
void execDROP_TRIG_REF(Signal* signal); void execDROP_TRIG_REF(Signal* signal);
void execDROP_TRIG_CONF(Signal* signal); void execDROP_TRIG_CONF(Signal* signal);
...@@ -426,6 +424,7 @@ public: ...@@ -426,6 +424,7 @@ public:
Uint32 clientRef; Uint32 clientRef;
Uint32 clientData; Uint32 clientData;
Uint32 flags; Uint32 flags;
Uint32 signalNo;
Uint32 backupId; Uint32 backupId;
Uint32 backupKey[2]; Uint32 backupKey[2];
Uint32 masterRef; Uint32 masterRef;
...@@ -451,7 +450,18 @@ public: ...@@ -451,7 +450,18 @@ public:
Uint32 backupDataLen; // Used for (un)packing backup request Uint32 backupDataLen; // Used for (un)packing backup request
Array<Page32> pages; // Used for (un)packing backup request Array<Page32> pages; // Used for (un)packing backup request
SimpleProperties props;// Used for (un)packing backup request SimpleProperties props;// Used for (un)packing backup request
struct SlaveData {
SignalCounter trigSendCounter;
Uint32 gsn;
struct {
Uint32 tableId;
} createTrig;
struct {
Uint32 tableId;
} dropTrig;
} slaveData;
struct MasterData { struct MasterData {
MasterData(Backup & b) MasterData(Backup & b)
{ {
...@@ -462,15 +472,6 @@ public: ...@@ -462,15 +472,6 @@ public:
Uint32 gsn; Uint32 gsn;
SignalCounter sendCounter; SignalCounter sendCounter;
Uint32 errorCode; Uint32 errorCode;
struct {
Uint32 tableId;
} createTrig;
struct {
Uint32 tableId;
} dropTrig;
struct {
Uint32 tableId;
} alterTrig;
union { union {
struct { struct {
Uint32 startBackup; Uint32 startBackup;
...@@ -563,7 +564,7 @@ public: ...@@ -563,7 +564,7 @@ public:
void defineBackupReply(Signal* signal, BackupRecordPtr ptr, Uint32 nodeId); void defineBackupReply(Signal* signal, BackupRecordPtr ptr, Uint32 nodeId);
void createTrigReply(Signal* signal, BackupRecordPtr ptr); void createTrigReply(Signal* signal, BackupRecordPtr ptr);
void alterTrigReply(Signal* signal, BackupRecordPtr ptr); void alterTrigReply(Signal* signal, BackupRecordPtr ptr);
void startBackupReply(Signal* signal, BackupRecordPtr ptr, Uint32, Uint32); void startBackupReply(Signal* signal, BackupRecordPtr ptr, Uint32);
void stopBackupReply(Signal* signal, BackupRecordPtr ptr, Uint32 nodeId); void stopBackupReply(Signal* signal, BackupRecordPtr ptr, Uint32 nodeId);
void defineBackupRef(Signal*, BackupRecordPtr, Uint32 errCode = 0); void defineBackupRef(Signal*, BackupRecordPtr, Uint32 errCode = 0);
......
...@@ -25,15 +25,12 @@ BACKUP_REQ ...@@ -25,15 +25,12 @@ BACKUP_REQ
<------------------------------- <-------------------------------
BACKUP_CONF BACKUP_CONF
<---------------- <----------------
CREATE_TRIG
--------------> (If master crashes here -> rouge triggers/memory leak)
<--------------
START_BACKUP START_BACKUP
------------------------------> ------------------------------>
CREATE_TRIG
-------------->
<--------------
<------------------------------ <------------------------------
ALTER_TRIG
-------------->
<--------------
WAIT_GCP WAIT_GCP
--------------> -------------->
<-------------- <--------------
...@@ -46,11 +43,11 @@ BACKUP_CONF ...@@ -46,11 +43,11 @@ BACKUP_CONF
WAIT_GCP WAIT_GCP
--------------> -------------->
<-------------- <--------------
DROP_TRIG
-------------->
<--------------
STOP_BACKUP STOP_BACKUP
------------------------------> ------------------------------>
DROP_TRIG
-------------->
<--------------
<------------------------------ <------------------------------
BACKUP_COMPLETE_REP BACKUP_COMPLETE_REP
<---------------- <----------------
......
...@@ -62,9 +62,6 @@ Backup::Backup(const Configuration & conf) : ...@@ -62,9 +62,6 @@ Backup::Backup(const Configuration & conf) :
addRecSignal(GSN_CREATE_TRIG_REF, &Backup::execCREATE_TRIG_REF); addRecSignal(GSN_CREATE_TRIG_REF, &Backup::execCREATE_TRIG_REF);
addRecSignal(GSN_CREATE_TRIG_CONF, &Backup::execCREATE_TRIG_CONF); addRecSignal(GSN_CREATE_TRIG_CONF, &Backup::execCREATE_TRIG_CONF);
addRecSignal(GSN_ALTER_TRIG_REF, &Backup::execALTER_TRIG_REF);
addRecSignal(GSN_ALTER_TRIG_CONF, &Backup::execALTER_TRIG_CONF);
addRecSignal(GSN_DROP_TRIG_REF, &Backup::execDROP_TRIG_REF); addRecSignal(GSN_DROP_TRIG_REF, &Backup::execDROP_TRIG_REF);
addRecSignal(GSN_DROP_TRIG_CONF, &Backup::execDROP_TRIG_CONF); addRecSignal(GSN_DROP_TRIG_CONF, &Backup::execDROP_TRIG_CONF);
......
...@@ -777,6 +777,10 @@ struct TupTriggerData { ...@@ -777,6 +777,10 @@ struct TupTriggerData {
/** /**
* Trigger id, used by DICT/TRIX to identify the trigger * Trigger id, used by DICT/TRIX to identify the trigger
*
* trigger Ids are unique per block for SUBSCRIPTION triggers.
* This is so that BACKUP can use TUP triggers directly and delete them
* properly.
*/ */
Uint32 triggerId; Uint32 triggerId;
...@@ -2012,7 +2016,9 @@ private: ...@@ -2012,7 +2016,9 @@ private:
bool createTrigger(Tablerec* table, const CreateTrigReq* req); bool createTrigger(Tablerec* table, const CreateTrigReq* req);
Uint32 dropTrigger(Tablerec* table, const DropTrigReq* req); Uint32 dropTrigger(Tablerec* table,
const DropTrigReq* req,
BlockNumber sender);
void void
checkImmediateTriggersAfterInsert(KeyReqStruct *req_struct, checkImmediateTriggersAfterInsert(KeyReqStruct *req_struct,
......
...@@ -186,7 +186,7 @@ Dbtup::execDROP_TRIG_REQ(Signal* signal) ...@@ -186,7 +186,7 @@ Dbtup::execDROP_TRIG_REQ(Signal* signal)
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec); ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
// Drop trigger // Drop trigger
Uint32 r = dropTrigger(tabPtr.p, req); Uint32 r = dropTrigger(tabPtr.p, req, refToBlock(senderRef));
if (r == 0){ if (r == 0){
// Send conf // Send conf
DropTrigConf* const conf = (DropTrigConf*)signal->getDataPtrSend(); DropTrigConf* const conf = (DropTrigConf*)signal->getDataPtrSend();
...@@ -318,7 +318,7 @@ Dbtup::primaryKey(Tablerec* const regTabPtr, Uint32 attrId) ...@@ -318,7 +318,7 @@ Dbtup::primaryKey(Tablerec* const regTabPtr, Uint32 attrId)
/* */ /* */
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
Uint32 Uint32
Dbtup::dropTrigger(Tablerec* table, const DropTrigReq* req) Dbtup::dropTrigger(Tablerec* table, const DropTrigReq* req, BlockNumber sender)
{ {
if (ERROR_INSERTED(4004)) { if (ERROR_INSERTED(4004)) {
CLEAR_ERROR_INSERT_VALUE; CLEAR_ERROR_INSERT_VALUE;
...@@ -330,7 +330,7 @@ Dbtup::dropTrigger(Tablerec* table, const DropTrigReq* req) ...@@ -330,7 +330,7 @@ Dbtup::dropTrigger(Tablerec* table, const DropTrigReq* req)
TriggerActionTime::Value ttime = req->getTriggerActionTime(); TriggerActionTime::Value ttime = req->getTriggerActionTime();
TriggerEvent::Value tevent = req->getTriggerEvent(); TriggerEvent::Value tevent = req->getTriggerEvent();
// ndbout_c("Drop TupTrigger %u = %u %u %u %u", triggerId, table, ttype, ttime, tevent); // ndbout_c("Drop TupTrigger %u = %u %u %u %u by %u", triggerId, table, ttype, ttime, tevent, sender);
ArrayList<TupTriggerData>* tlist = findTriggerList(table, ttype, ttime, tevent); ArrayList<TupTriggerData>* tlist = findTriggerList(table, ttype, ttime, tevent);
ndbrequire(tlist != NULL); ndbrequire(tlist != NULL);
...@@ -339,6 +339,19 @@ Dbtup::dropTrigger(Tablerec* table, const DropTrigReq* req) ...@@ -339,6 +339,19 @@ Dbtup::dropTrigger(Tablerec* table, const DropTrigReq* req)
for (tlist->first(ptr); !ptr.isNull(); tlist->next(ptr)) { for (tlist->first(ptr); !ptr.isNull(); tlist->next(ptr)) {
ljam(); ljam();
if (ptr.p->triggerId == triggerId) { if (ptr.p->triggerId == triggerId) {
if(ttype==TriggerType::SUBSCRIPTION && sender != ptr.p->m_receiverBlock)
{
/**
* You can only drop your own triggers for subscription triggers.
* Trigger IDs are private for each block.
*
* SUMA encodes information in the triggerId
*
* Backup doesn't really care about the Ids though.
*/
ljam();
continue;
}
ljam(); ljam();
tlist->release(ptr.i); tlist->release(ptr.i);
return 0; return 0;
......
...@@ -193,7 +193,7 @@ runDDL(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -193,7 +193,7 @@ runDDL(NDBT_Context* ctx, NDBT_Step* step){
} }
int runRestartInitial(NDBT_Context* ctx, NDBT_Step* step){ int runDropTablesRestart(NDBT_Context* ctx, NDBT_Step* step){
NdbRestarter restarter; NdbRestarter restarter;
Ndb* pNdb = GETNDB(step); Ndb* pNdb = GETNDB(step);
...@@ -201,7 +201,7 @@ int runRestartInitial(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -201,7 +201,7 @@ int runRestartInitial(NDBT_Context* ctx, NDBT_Step* step){
const NdbDictionary::Table *tab = ctx->getTab(); const NdbDictionary::Table *tab = ctx->getTab();
pNdb->getDictionary()->dropTable(tab->getName()); pNdb->getDictionary()->dropTable(tab->getName());
if (restarter.restartAll(true) != 0) if (restarter.restartAll(false) != 0)
return NDBT_FAILED; return NDBT_FAILED;
if (restarter.waitClusterStarted() != 0) if (restarter.waitClusterStarted() != 0)
...@@ -406,6 +406,7 @@ int runRestoreBankAndVerify(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -406,6 +406,7 @@ int runRestoreBankAndVerify(NDBT_Context* ctx, NDBT_Step* step){
// TEMPORARY FIX // TEMPORARY FIX
// To erase all tables from cache(s) // To erase all tables from cache(s)
// To be removed, maybe replaced by ndb.invalidate(); // To be removed, maybe replaced by ndb.invalidate();
runDropTable(ctx,step);
{ {
Bank bank(ctx->m_cluster_connection); Bank bank(ctx->m_cluster_connection);
...@@ -416,8 +417,8 @@ int runRestoreBankAndVerify(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -416,8 +417,8 @@ int runRestoreBankAndVerify(NDBT_Context* ctx, NDBT_Step* step){
} }
// END TEMPORARY FIX // END TEMPORARY FIX
ndbout << "Performing initial restart" << endl; ndbout << "Performing restart" << endl;
if (restarter.restartAll(true) != 0) if (restarter.restartAll(false) != 0)
return NDBT_FAILED; return NDBT_FAILED;
if (restarter.waitClusterStarted() != 0) if (restarter.waitClusterStarted() != 0)
...@@ -465,12 +466,12 @@ TESTCASE("BackupOne", ...@@ -465,12 +466,12 @@ TESTCASE("BackupOne",
"Test that backup and restore works on one table \n" "Test that backup and restore works on one table \n"
"1. Load table\n" "1. Load table\n"
"2. Backup\n" "2. Backup\n"
"3. Restart -i\n" "3. Drop tables and restart \n"
"4. Restore\n" "4. Restore\n"
"5. Verify count and content of table\n"){ "5. Verify count and content of table\n"){
INITIALIZER(runLoadTable); INITIALIZER(runLoadTable);
INITIALIZER(runBackupOne); INITIALIZER(runBackupOne);
INITIALIZER(runRestartInitial); INITIALIZER(runDropTablesRestart);
INITIALIZER(runRestoreOne); INITIALIZER(runRestoreOne);
VERIFIER(runVerifyOne); VERIFIER(runVerifyOne);
FINALIZER(runClearTable); FINALIZER(runClearTable);
......
...@@ -199,7 +199,6 @@ int ...@@ -199,7 +199,6 @@ int
NFDuringBackupM_codes[] = { NFDuringBackupM_codes[] = {
10003, 10003,
10004, 10004,
10005,
10007, 10007,
10008, 10008,
10009, 10009,
...@@ -349,6 +348,7 @@ NdbBackup::NF(NdbRestarter& _restarter, int *NFDuringBackup_codes, const int sz, ...@@ -349,6 +348,7 @@ NdbBackup::NF(NdbRestarter& _restarter, int *NFDuringBackup_codes, const int sz,
int int
FailS_codes[] = { FailS_codes[] = {
10025,
10027, 10027,
10033 10033
}; };
......
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