summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorsasha@mysql.sashanet.com <>2001-12-12 18:55:33 -0700
committersasha@mysql.sashanet.com <>2001-12-12 18:55:33 -0700
commitf7acf09d9c70afeaf36172e993b5c468f8190182 (patch)
tree7eaf5681e41349d3135b099f195338bc5e4b85c9 /sql
parentab550295e90dcc24db87ba6f1580c46f8ab2d648 (diff)
downloadmariadb-git-f7acf09d9c70afeaf36172e993b5c468f8190182.tar.gz
slave-skip-errors
added extra/mysql_install.c - will work on it in 4.0, but it does not hurt to have it sit in 3.23 tree for now since it will eventually be backported to 3.23 anyway
Diffstat (limited to 'sql')
-rw-r--r--sql/mysqld.cc12
-rw-r--r--sql/slave.cc60
-rw-r--r--sql/slave.h4
3 files changed, 71 insertions, 5 deletions
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 82fc5556bd8..bb6c3c70a27 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -707,6 +707,8 @@ void clean_up(bool print_message)
DBUG_PRINT("exit",("clean_up"));
if (cleanup_done++)
return; /* purecov: inspected */
+ if (use_slave_mask)
+ bitmap_free(&slave_error_mask);
acl_free(1);
grant_free();
sql_cache_free();
@@ -1757,7 +1759,7 @@ int main(int argc, char **argv)
#endif
select_thread=pthread_self();
select_thread_in_use=1;
- if (use_temp_pool && bitmap_init(&temp_pool,1024))
+ if (use_temp_pool && bitmap_init(&temp_pool,1024,1))
unireg_abort(1);
/*
@@ -2600,7 +2602,8 @@ enum options {
OPT_GEMINI_UNBUFFERED_IO, OPT_SKIP_SAFEMALLOC,
OPT_SKIP_STACK_TRACE, OPT_SKIP_SYMLINKS,
OPT_MAX_BINLOG_DUMP_EVENTS, OPT_SPORADIC_BINLOG_DUMP_FAIL,
- OPT_SAFE_USER_CREATE, OPT_SQL_MODE
+ OPT_SAFE_USER_CREATE, OPT_SQL_MODE,
+ OPT_SLAVE_SKIP_ERRORS
};
static struct option long_options[] = {
@@ -2735,6 +2738,8 @@ static struct option long_options[] = {
{"skip-stack-trace", no_argument, 0, (int) OPT_SKIP_STACK_TRACE},
{"skip-symlink", no_argument, 0, (int) OPT_SKIP_SYMLINKS},
{"skip-thread-priority", no_argument, 0, (int) OPT_SKIP_PRIOR},
+ {"slave-skip-errors", required_argument,0,
+ (int) OPT_SLAVE_SKIP_ERRORS},
{"socket", required_argument, 0, (int) OPT_SOCKET},
{"sql-bin-update-same", no_argument, 0, (int) OPT_SQL_BIN_UPDATE_SAME},
{"sql-mode", required_argument, 0, (int) OPT_SQL_MODE},
@@ -3396,6 +3401,9 @@ static void get_options(int argc,char **argv)
case 'P':
mysql_port= (unsigned int) atoi(optarg);
break;
+ case OPT_SLAVE_SKIP_ERRORS:
+ init_slave_skip_errors(optarg);
+ break;
case OPT_SAFEMALLOC_MEM_LIMIT:
#if !defined(DBUG_OFF) && defined(SAFEMALLOC)
safemalloc_mem_limit = atoi(optarg);
diff --git a/sql/slave.cc b/sql/slave.cc
index 5fdbab7c7c6..33097bb7df1 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -29,6 +29,8 @@
volatile bool slave_running = 0;
pthread_t slave_real_id;
MASTER_INFO glob_mi;
+MY_BITMAP slave_error_mask;
+bool use_slave_mask = 0;
HASH replicate_do_table, replicate_ignore_table;
DYNAMIC_ARRAY replicate_wild_do_table, replicate_wild_ignore_table;
bool do_table_inited = 0, ignore_table_inited = 0;
@@ -73,6 +75,50 @@ static byte* get_table_key(TABLE_RULE_ENT* e, uint* len,
return (byte*)e->db;
}
+/* called from get_options() in mysqld.cc on start-up */
+void init_slave_skip_errors(char* arg)
+{
+ char* p,*end;
+ int err_code = 0;
+ my_bool last_was_digit = 0;
+ if (bitmap_init(&slave_error_mask,MAX_SLAVE_ERROR,0))
+ {
+ fprintf(stderr, "Badly out of memory, please check your system status\n");
+ exit(1);
+ }
+ use_slave_mask = 1;
+ for (;isspace(*arg);++arg)
+ /* empty */;
+ /* force first three chars to lower case */
+ for (p = arg, end = arg + 3; *p && p < end; ++p)
+ *p = tolower(*p);
+ if (!memcmp(arg,"all",3))
+ {
+ bitmap_set_all(&slave_error_mask);
+ return;
+ }
+ for (p = arg, end = strend(arg); p < end; ++p)
+ {
+ int digit = *p - '0';
+ if (digit >= 0 && digit < 10) /* found real digit */
+ {
+ err_code = err_code * 10 + digit;
+ last_was_digit = 1;
+ }
+ else /* delimiter */
+ {
+ if (last_was_digit)
+ {
+ if (err_code < MAX_SLAVE_ERROR)
+ {
+ bitmap_set_bit(&slave_error_mask,err_code);
+ }
+ err_code = 0;
+ last_was_digit = 0;
+ }
+ }
+ }
+}
void init_table_rule_hash(HASH* h, bool* h_inited)
{
@@ -869,6 +915,11 @@ point. If you are sure that your master is ok, run this query manually on the\
}
}
+inline int ignored_error_code(int err_code)
+{
+ return use_slave_mask && bitmap_is_set(&slave_error_mask, err_code);
+}
+
static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
{
Log_event * ev = Log_event::read_log_event((const char*)net->read_pos + 1,
@@ -925,11 +976,13 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
// sanity check to make sure the master did not get a really bad
// error on the query
- if (!check_expected_error(thd, (expected_error = qev->error_code)))
+ if (ignored_error_code((expected_error=qev->error_code)) ||
+ !check_expected_error(thd, expected_error))
{
mysql_parse(thd, thd->query, q_len);
if (expected_error !=
- (actual_error = thd->net.last_errno) && expected_error)
+ (actual_error = thd->net.last_errno) && expected_error &&
+ !ignored_error_code(actual_error))
{
const char* errmsg = "Slave: did not get the expected error\
running query from master - expected: '%s' (%d), got '%s' (%d)";
@@ -939,7 +992,8 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
actual_error);
thd->query_error = 1;
}
- else if (expected_error == actual_error)
+ else if (expected_error == actual_error ||
+ ignored_error_code(actual_error))
{
thd->query_error = 0;
*last_slave_error = 0;
diff --git a/sql/slave.h b/sql/slave.h
index 09887ecd82c..2934e675d56 100644
--- a/sql/slave.h
+++ b/sql/slave.h
@@ -2,8 +2,11 @@
#define SLAVE_H
#define SLAVE_NET_TIMEOUT 3600
+#define MAX_SLAVE_ERROR 2000
extern ulong slave_net_timeout, master_retry_count;
+extern MY_BITMAP slave_error_mask;
+extern bool use_slave_mask;
typedef struct st_master_info
{
@@ -89,6 +92,7 @@ int add_table_rule(HASH* h, const char* table_spec);
int add_wild_table_rule(DYNAMIC_ARRAY* a, const char* table_spec);
void init_table_rule_hash(HASH* h, bool* h_inited);
void init_table_rule_array(DYNAMIC_ARRAY* a, bool* a_inited);
+void init_slave_skip_errors(char* arg);
void end_slave(); // clean up
int init_master_info(MASTER_INFO* mi);