mirror of
https://github.com/MariaDB/server.git
synced 2025-02-01 19:41:47 +01:00
Merge jbruehe@bk-internal.mysql.com:/home/bk/mysql-5.1-new
into debian.(none):/M51/mysql-5.1
This commit is contained in:
commit
4c5686a90b
26 changed files with 409 additions and 488 deletions
|
@ -377,7 +377,8 @@ static struct my_option my_long_options[] =
|
|||
{"create-schema", OPT_CREATE_SLAP_SCHEMA, "Schema to run tests in.",
|
||||
(gptr*) &create_schema_string, (gptr*) &create_schema_string, 0, GET_STR,
|
||||
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,
|
||||
OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.",
|
||||
|
|
|
@ -39,7 +39,10 @@ then
|
|||
AC_DEFINE([$5])
|
||||
mysql_se_decls="${mysql_se_decls},$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_libs="$mysql_se_libs $9"
|
||||
else
|
||||
|
|
|
@ -2437,8 +2437,8 @@ MYSQL_STORAGE_ENGINE(archive,,,,,,storage/archive,,
|
|||
\$(top_builddir)/storage/archive/libarchive.a, [
|
||||
AC_CONFIG_FILES(storage/archive/Makefile)
|
||||
])
|
||||
MYSQL_STORAGE_ENGINE(csv,,,"yes",,tina_hton,storage/csv,
|
||||
../storage/csv/ha_tina.o,,[
|
||||
MYSQL_STORAGE_ENGINE(csv,,,"yes",,tina_hton,storage/csv,no,
|
||||
\$(top_builddir)/storage/csv/libcsv.a,[
|
||||
AC_CONFIG_FILES(storage/csv/Makefile)
|
||||
])
|
||||
MYSQL_STORAGE_ENGINE(blackhole)
|
||||
|
|
|
@ -296,7 +296,10 @@ err:
|
|||
#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',
|
||||
|
|
|
@ -60,7 +60,10 @@ class ha_myisam: public handler
|
|||
uint max_supported_key_part_length() const { return MI_MAX_KEY_LENGTH; }
|
||||
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 close(void);
|
||||
int write_row(byte * buf);
|
||||
|
|
|
@ -1425,6 +1425,12 @@ int ha_delete_table(THD *thd, handlerton *table_type, const char *path,
|
|||
** 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.
|
||||
|
||||
|
|
|
@ -1006,6 +1006,8 @@ typedef struct st_handler_buffer
|
|||
byte *end_of_used_area; /* End of area that was used by handler */
|
||||
} HANDLER_BUFFER;
|
||||
|
||||
typedef struct system_status_var SSV;
|
||||
|
||||
class handler :public Sql_alloc
|
||||
{
|
||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||
|
@ -1027,6 +1029,9 @@ class handler :public Sql_alloc
|
|||
virtual int rnd_init(bool scan) =0;
|
||||
virtual int rnd_end() { return 0; }
|
||||
|
||||
void ha_statistic_increment(ulong SSV::*offset) const;
|
||||
|
||||
|
||||
private:
|
||||
virtual int reset() { return extra(HA_EXTRA_RESET); }
|
||||
public:
|
||||
|
@ -1109,7 +1114,10 @@ public:
|
|||
TRUE Locking is allowed
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -1932,7 +1932,7 @@ public:
|
|||
virtual Item *real_item() { return ref; }
|
||||
};
|
||||
|
||||
|
||||
#ifdef MYSQL_SERVER
|
||||
#include "gstream.h"
|
||||
#include "spatial.h"
|
||||
#include "item_sum.h"
|
||||
|
@ -1945,6 +1945,7 @@ public:
|
|||
#include "item_uniq.h"
|
||||
#include "item_subselect.h"
|
||||
#include "item_xmlfunc.h"
|
||||
#endif
|
||||
|
||||
class Item_copy_string :public Item
|
||||
{
|
||||
|
|
|
@ -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
|
||||
beacause of handler-specific locking issues.
|
||||
*/
|
||||
if (!table_ptr[i]->file->check_if_locking_is_allowed(thd, table_ptr[i],
|
||||
count))
|
||||
if (!table_ptr[i]-> file->
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -477,6 +477,11 @@ inline THD *_current_thd(void)
|
|||
}
|
||||
#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
|
||||
*/
|
||||
|
@ -507,7 +512,9 @@ enum enum_var_type
|
|||
class sys_var;
|
||||
#include "item.h"
|
||||
extern my_decimal decimal_zero;
|
||||
#ifdef MYSQL_SERVER
|
||||
typedef Comp_creator* (*chooser_compare_func_creator)(bool invert);
|
||||
#endif
|
||||
/* sql_parse.cc */
|
||||
void free_items(Item *item);
|
||||
void cleanup_items(Item *item);
|
||||
|
@ -545,6 +552,7 @@ Item *negate_expression(THD *thd, Item *expr);
|
|||
#include "sql_class.h"
|
||||
#include "sql_acl.h"
|
||||
#include "tztime.h"
|
||||
#ifdef MYSQL_SERVER
|
||||
#include "opt_range.h"
|
||||
|
||||
#ifdef HAVE_QUERY_CACHE
|
||||
|
@ -841,6 +849,8 @@ find_field_in_table(THD *thd, TABLE *table, const char *name, uint length,
|
|||
Field *
|
||||
find_field_in_table_sef(TABLE *table, const char *name);
|
||||
|
||||
#endif /* MYSQL_SERVER */
|
||||
|
||||
#ifdef HAVE_OPENSSL
|
||||
#include <openssl/des.h>
|
||||
struct st_des_keyblock
|
||||
|
@ -858,6 +868,7 @@ extern pthread_mutex_t LOCK_des_key_file;
|
|||
bool load_des_key_file(const char *file_name);
|
||||
#endif /* HAVE_OPENSSL */
|
||||
|
||||
#ifdef MYSQL_SERVER
|
||||
/* sql_do.cc */
|
||||
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);
|
|||
int key_rec_cmp(void *key_info, byte *a, byte *b);
|
||||
|
||||
bool init_errmessage(void);
|
||||
#endif /* MYSQL_SERVER */
|
||||
void sql_perror(const char *message);
|
||||
|
||||
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,
|
|||
|
||||
bool fn_format_relative_to_data_home(my_string to, const char *name,
|
||||
const char *dir, const char *extension);
|
||||
#ifdef MYSQL_SERVER
|
||||
File open_binlog(IO_CACHE *log, const char *log_file_name,
|
||||
const char **errmsg);
|
||||
|
||||
|
@ -1739,4 +1752,5 @@ inline void kill_delayed_threads(void) {}
|
|||
#define check_stack_overrun(A, B, C) 0
|
||||
#endif
|
||||
|
||||
#endif /* MYSQL_SERVER */
|
||||
#endif /* MYSQL_CLIENT */
|
||||
|
|
|
@ -167,6 +167,25 @@ Open_tables_state::Open_tables_state(ulong version_arg)
|
|||
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
|
||||
|
|
|
@ -171,6 +171,7 @@ public:
|
|||
|
||||
class delayed_insert;
|
||||
class select_result;
|
||||
class Time_zone;
|
||||
|
||||
#define THD_SENTRY_MAGIC 0xfeedd1ff
|
||||
#define THD_SENTRY_GONE 0xdeadbeef
|
||||
|
@ -344,6 +345,8 @@ typedef struct system_status_var
|
|||
#define last_system_status_var com_stmt_close
|
||||
|
||||
|
||||
#ifdef MYSQL_SERVER
|
||||
|
||||
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
|
||||
#endif
|
||||
|
||||
|
||||
class Query_arena
|
||||
{
|
||||
public:
|
||||
|
@ -1905,3 +1907,5 @@ public:
|
|||
/* Functions in sql_class.cc */
|
||||
|
||||
void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var);
|
||||
|
||||
#endif /* MYSQL_SERVER */
|
||||
|
|
|
@ -29,6 +29,7 @@ class st_alter_tablespace;
|
|||
class partition_info;
|
||||
class event_timed;
|
||||
|
||||
#ifdef MYSQL_SERVER
|
||||
/*
|
||||
The following hack is needed because mysql_yacc.cc does not define
|
||||
YYSTYPE before including this file
|
||||
|
@ -43,6 +44,7 @@ class event_timed;
|
|||
#include "sql_yacc.h"
|
||||
#define LEX_YYSTYPE YYSTYPE *
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
When a command is added here, be sure it's also added in mysqld.cc
|
||||
|
@ -115,6 +117,8 @@ enum enum_sql_command {
|
|||
*/
|
||||
#define DESCRIBE_PARTITIONS 4
|
||||
|
||||
#ifdef MYSQL_SERVER
|
||||
|
||||
enum enum_sp_suid_behaviour
|
||||
{
|
||||
SP_IS_DEFAULT_SUID= 0,
|
||||
|
@ -1109,3 +1113,5 @@ extern int yylex(void *arg, void *yythd);
|
|||
extern pthread_key(LEX*,THR_LEX);
|
||||
|
||||
#define current_lex (current_thd->lex)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -24,17 +24,16 @@ INCLUDES = -I$(top_srcdir)/include \
|
|||
-I$(top_srcdir)/regex \
|
||||
-I$(top_srcdir)/sql \
|
||||
-I$(srcdir)
|
||||
WRAPLIBS=
|
||||
|
||||
pkglib_LTLIBRARIES = ha_csv.la
|
||||
|
||||
ha_csv_la_LDFLAGS = -module
|
||||
noinst_HEADERS = ha_tina.h
|
||||
ha_csv_la_SOURCES = ha_tina.cc
|
||||
pkglib_LIBRARIES = libcsv.a
|
||||
|
||||
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
|
||||
%::SCCS/s.%
|
||||
|
|
|
@ -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
|
||||
|
@ -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.
|
||||
*/
|
||||
if (table->s->log_table &&
|
||||
thd->lex->sql_command != SQLCOM_TRUNCATE &&
|
||||
!(thd->lex->sql_command == SQLCOM_FLUSH &&
|
||||
thd->lex->type & REFRESH_LOG) &&
|
||||
(thd != logger.get_general_log_thd()) &&
|
||||
(thd != logger.get_slow_log_thd()) &&
|
||||
sql_command != SQLCOM_TRUNCATE &&
|
||||
!(sql_command == SQLCOM_FLUSH &&
|
||||
type & REFRESH_LOG) &&
|
||||
!called_by_logger_thread &&
|
||||
(table->reginfo.lock_type >= TL_READ_NO_INSERT))
|
||||
{
|
||||
/*
|
||||
|
@ -665,7 +667,7 @@ int ha_tina::write_row(byte * buf)
|
|||
int size;
|
||||
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)
|
||||
table->timestamp_field->set_time();
|
||||
|
@ -714,9 +716,7 @@ int ha_tina::update_row(const byte * old_data, byte * new_data)
|
|||
int size;
|
||||
DBUG_ENTER("ha_tina::update_row");
|
||||
|
||||
|
||||
statistic_increment(table->in_use->status_var.ha_read_rnd_next_count,
|
||||
&LOCK_status);
|
||||
ha_statistic_increment(&SSV::ha_read_rnd_next_count);
|
||||
|
||||
if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE)
|
||||
table->timestamp_field->set_time();
|
||||
|
@ -751,8 +751,7 @@ int ha_tina::update_row(const byte * old_data, byte * new_data)
|
|||
int ha_tina::delete_row(const byte * buf)
|
||||
{
|
||||
DBUG_ENTER("ha_tina::delete_row");
|
||||
statistic_increment(table->in_use->status_var.ha_delete_count,
|
||||
&LOCK_status);
|
||||
ha_statistic_increment(&SSV::ha_delete_count);
|
||||
|
||||
if (chain_append())
|
||||
DBUG_RETURN(-1);
|
||||
|
@ -903,8 +902,7 @@ int ha_tina::rnd_next(byte *buf)
|
|||
{
|
||||
DBUG_ENTER("ha_tina::rnd_next");
|
||||
|
||||
statistic_increment(table->in_use->status_var.ha_read_rnd_next_count,
|
||||
&LOCK_status);
|
||||
ha_statistic_increment(&SSV::ha_read_rnd_next_count);
|
||||
|
||||
current_position= next_position;
|
||||
if (!share->mapped_file)
|
||||
|
@ -941,8 +939,7 @@ void ha_tina::position(const byte *record)
|
|||
int ha_tina::rnd_pos(byte * buf, byte *pos)
|
||||
{
|
||||
DBUG_ENTER("ha_tina::rnd_pos");
|
||||
statistic_increment(table->in_use->status_var.ha_read_rnd_next_count,
|
||||
&LOCK_status);
|
||||
ha_statistic_increment(&SSV::ha_read_rnd_next_count);
|
||||
current_position= my_get_ptr(pos,ref_length);
|
||||
DBUG_RETURN(find_current_row(buf));
|
||||
}
|
||||
|
|
|
@ -104,7 +104,10 @@ public:
|
|||
*/
|
||||
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 close(void);
|
||||
int write_row(byte * buf);
|
||||
|
|
|
@ -139,21 +139,11 @@ class StartBackupReq {
|
|||
friend bool printSTART_BACKUP_REQ(FILE *, const Uint32 *, Uint32, Uint16);
|
||||
public:
|
||||
|
||||
STATIC_CONST( MaxTableTriggers = 4 );
|
||||
STATIC_CONST( HeaderLength = 5 );
|
||||
STATIC_CONST( TableTriggerLength = 4);
|
||||
|
||||
STATIC_CONST( SignalLength = 2 );
|
||||
|
||||
private:
|
||||
Uint32 backupId;
|
||||
Uint32 backupPtr;
|
||||
Uint32 signalNo;
|
||||
Uint32 noOfSignals;
|
||||
Uint32 noOfTableTriggers;
|
||||
|
||||
struct TableTriggers {
|
||||
Uint32 tableId;
|
||||
Uint32 triggerIds[3];
|
||||
} tableTriggers[MaxTableTriggers];
|
||||
};
|
||||
|
||||
class StartBackupRef {
|
||||
|
@ -169,7 +159,7 @@ class StartBackupRef {
|
|||
|
||||
friend bool printSTART_BACKUP_REF(FILE *, const Uint32 *, Uint32, Uint16);
|
||||
public:
|
||||
STATIC_CONST( SignalLength = 5 );
|
||||
STATIC_CONST( SignalLength = 4 );
|
||||
|
||||
enum ErrorCode {
|
||||
FailedToAllocateTriggerRecord = 1
|
||||
|
@ -177,7 +167,6 @@ public:
|
|||
private:
|
||||
Uint32 backupId;
|
||||
Uint32 backupPtr;
|
||||
Uint32 signalNo;
|
||||
Uint32 errorCode;
|
||||
Uint32 nodeId;
|
||||
};
|
||||
|
@ -195,12 +184,11 @@ class StartBackupConf {
|
|||
|
||||
friend bool printSTART_BACKUP_CONF(FILE *, const Uint32 *, Uint32, Uint16);
|
||||
public:
|
||||
STATIC_CONST( SignalLength = 3 );
|
||||
STATIC_CONST( SignalLength = 2 );
|
||||
|
||||
private:
|
||||
Uint32 backupId;
|
||||
Uint32 backupPtr;
|
||||
Uint32 signalNo;
|
||||
};
|
||||
|
||||
class BackupFragmentReq {
|
||||
|
|
|
@ -48,16 +48,8 @@ printDEFINE_BACKUP_CONF(FILE * out, const Uint32 * data, Uint32 l, Uint16 bno){
|
|||
bool
|
||||
printSTART_BACKUP_REQ(FILE * out, const Uint32 * data, Uint32 l, Uint16 bno){
|
||||
StartBackupReq* sig = (StartBackupReq*)data;
|
||||
fprintf(out, " backupPtr: %d backupId: %d signalNo: %d of %d\n",
|
||||
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]);
|
||||
fprintf(out, " backupPtr: %d backupId: %d\n",
|
||||
sig->backupPtr, sig->backupId);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -96,8 +96,6 @@ protected:
|
|||
void execGET_TABINFO_CONF(Signal* signal);
|
||||
void execCREATE_TRIG_REF(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_CONF(Signal* signal);
|
||||
|
||||
|
@ -426,6 +424,7 @@ public:
|
|||
Uint32 clientRef;
|
||||
Uint32 clientData;
|
||||
Uint32 flags;
|
||||
Uint32 signalNo;
|
||||
Uint32 backupId;
|
||||
Uint32 backupKey[2];
|
||||
Uint32 masterRef;
|
||||
|
@ -451,7 +450,18 @@ public:
|
|||
Uint32 backupDataLen; // Used for (un)packing backup request
|
||||
Array<Page32> pages; // 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 {
|
||||
MasterData(Backup & b)
|
||||
{
|
||||
|
@ -462,15 +472,6 @@ public:
|
|||
Uint32 gsn;
|
||||
SignalCounter sendCounter;
|
||||
Uint32 errorCode;
|
||||
struct {
|
||||
Uint32 tableId;
|
||||
} createTrig;
|
||||
struct {
|
||||
Uint32 tableId;
|
||||
} dropTrig;
|
||||
struct {
|
||||
Uint32 tableId;
|
||||
} alterTrig;
|
||||
union {
|
||||
struct {
|
||||
Uint32 startBackup;
|
||||
|
@ -563,7 +564,7 @@ public:
|
|||
void defineBackupReply(Signal* signal, BackupRecordPtr ptr, Uint32 nodeId);
|
||||
void createTrigReply(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 defineBackupRef(Signal*, BackupRecordPtr, Uint32 errCode = 0);
|
||||
|
|
|
@ -25,15 +25,12 @@ BACKUP_REQ
|
|||
<-------------------------------
|
||||
BACKUP_CONF
|
||||
<----------------
|
||||
CREATE_TRIG
|
||||
--------------> (If master crashes here -> rouge triggers/memory leak)
|
||||
<--------------
|
||||
START_BACKUP
|
||||
------------------------------>
|
||||
CREATE_TRIG
|
||||
-------------->
|
||||
<--------------
|
||||
<------------------------------
|
||||
ALTER_TRIG
|
||||
-------------->
|
||||
<--------------
|
||||
WAIT_GCP
|
||||
-------------->
|
||||
<--------------
|
||||
|
@ -46,11 +43,11 @@ BACKUP_CONF
|
|||
WAIT_GCP
|
||||
-------------->
|
||||
<--------------
|
||||
DROP_TRIG
|
||||
-------------->
|
||||
<--------------
|
||||
STOP_BACKUP
|
||||
------------------------------>
|
||||
DROP_TRIG
|
||||
-------------->
|
||||
<--------------
|
||||
<------------------------------
|
||||
BACKUP_COMPLETE_REP
|
||||
<----------------
|
||||
|
|
|
@ -62,9 +62,6 @@ Backup::Backup(const Configuration & conf) :
|
|||
addRecSignal(GSN_CREATE_TRIG_REF, &Backup::execCREATE_TRIG_REF);
|
||||
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_CONF, &Backup::execDROP_TRIG_CONF);
|
||||
|
||||
|
|
|
@ -777,6 +777,10 @@ struct TupTriggerData {
|
|||
|
||||
/**
|
||||
* 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;
|
||||
|
||||
|
@ -2012,7 +2016,9 @@ private:
|
|||
|
||||
bool createTrigger(Tablerec* table, const CreateTrigReq* req);
|
||||
|
||||
Uint32 dropTrigger(Tablerec* table, const DropTrigReq* req);
|
||||
Uint32 dropTrigger(Tablerec* table,
|
||||
const DropTrigReq* req,
|
||||
BlockNumber sender);
|
||||
|
||||
void
|
||||
checkImmediateTriggersAfterInsert(KeyReqStruct *req_struct,
|
||||
|
|
|
@ -186,7 +186,7 @@ Dbtup::execDROP_TRIG_REQ(Signal* signal)
|
|||
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
|
||||
|
||||
// Drop trigger
|
||||
Uint32 r = dropTrigger(tabPtr.p, req);
|
||||
Uint32 r = dropTrigger(tabPtr.p, req, refToBlock(senderRef));
|
||||
if (r == 0){
|
||||
// Send conf
|
||||
DropTrigConf* const conf = (DropTrigConf*)signal->getDataPtrSend();
|
||||
|
@ -318,7 +318,7 @@ Dbtup::primaryKey(Tablerec* const regTabPtr, Uint32 attrId)
|
|||
/* */
|
||||
/* ---------------------------------------------------------------- */
|
||||
Uint32
|
||||
Dbtup::dropTrigger(Tablerec* table, const DropTrigReq* req)
|
||||
Dbtup::dropTrigger(Tablerec* table, const DropTrigReq* req, BlockNumber sender)
|
||||
{
|
||||
if (ERROR_INSERTED(4004)) {
|
||||
CLEAR_ERROR_INSERT_VALUE;
|
||||
|
@ -330,7 +330,7 @@ Dbtup::dropTrigger(Tablerec* table, const DropTrigReq* req)
|
|||
TriggerActionTime::Value ttime = req->getTriggerActionTime();
|
||||
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);
|
||||
ndbrequire(tlist != NULL);
|
||||
|
@ -339,6 +339,19 @@ Dbtup::dropTrigger(Tablerec* table, const DropTrigReq* req)
|
|||
for (tlist->first(ptr); !ptr.isNull(); tlist->next(ptr)) {
|
||||
ljam();
|
||||
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();
|
||||
tlist->release(ptr.i);
|
||||
return 0;
|
||||
|
|
|
@ -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;
|
||||
|
||||
Ndb* pNdb = GETNDB(step);
|
||||
|
@ -201,7 +201,7 @@ int runRestartInitial(NDBT_Context* ctx, NDBT_Step* step){
|
|||
const NdbDictionary::Table *tab = ctx->getTab();
|
||||
pNdb->getDictionary()->dropTable(tab->getName());
|
||||
|
||||
if (restarter.restartAll(true) != 0)
|
||||
if (restarter.restartAll(false) != 0)
|
||||
return NDBT_FAILED;
|
||||
|
||||
if (restarter.waitClusterStarted() != 0)
|
||||
|
@ -406,6 +406,7 @@ int runRestoreBankAndVerify(NDBT_Context* ctx, NDBT_Step* step){
|
|||
// TEMPORARY FIX
|
||||
// To erase all tables from cache(s)
|
||||
// To be removed, maybe replaced by ndb.invalidate();
|
||||
runDropTable(ctx,step);
|
||||
{
|
||||
Bank bank(ctx->m_cluster_connection);
|
||||
|
||||
|
@ -416,8 +417,8 @@ int runRestoreBankAndVerify(NDBT_Context* ctx, NDBT_Step* step){
|
|||
}
|
||||
// END TEMPORARY FIX
|
||||
|
||||
ndbout << "Performing initial restart" << endl;
|
||||
if (restarter.restartAll(true) != 0)
|
||||
ndbout << "Performing restart" << endl;
|
||||
if (restarter.restartAll(false) != 0)
|
||||
return NDBT_FAILED;
|
||||
|
||||
if (restarter.waitClusterStarted() != 0)
|
||||
|
@ -465,12 +466,12 @@ TESTCASE("BackupOne",
|
|||
"Test that backup and restore works on one table \n"
|
||||
"1. Load table\n"
|
||||
"2. Backup\n"
|
||||
"3. Restart -i\n"
|
||||
"3. Drop tables and restart \n"
|
||||
"4. Restore\n"
|
||||
"5. Verify count and content of table\n"){
|
||||
INITIALIZER(runLoadTable);
|
||||
INITIALIZER(runBackupOne);
|
||||
INITIALIZER(runRestartInitial);
|
||||
INITIALIZER(runDropTablesRestart);
|
||||
INITIALIZER(runRestoreOne);
|
||||
VERIFIER(runVerifyOne);
|
||||
FINALIZER(runClearTable);
|
||||
|
|
|
@ -199,7 +199,6 @@ int
|
|||
NFDuringBackupM_codes[] = {
|
||||
10003,
|
||||
10004,
|
||||
10005,
|
||||
10007,
|
||||
10008,
|
||||
10009,
|
||||
|
@ -349,6 +348,7 @@ NdbBackup::NF(NdbRestarter& _restarter, int *NFDuringBackup_codes, const int sz,
|
|||
|
||||
int
|
||||
FailS_codes[] = {
|
||||
10025,
|
||||
10027,
|
||||
10033
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue