summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <sasha@mysql.sashanet.com>2001-04-10 21:17:21 -0600
committerunknown <sasha@mysql.sashanet.com>2001-04-10 21:17:21 -0600
commit2adf9320a45a28415d08658015b66d31a590e0e9 (patch)
tree5838b91568f8c08dfafa5e892ec51ce052383a58 /sql
parenta5052f001bd138a02e1075d5f7ba87742fbbe275 (diff)
parent0969368d13772f8a61ddefb53efd64d4cf42d9d3 (diff)
downloadmariadb-git-2adf9320a45a28415d08658015b66d31a590e0e9.tar.gz
Merge work:/home/bk/mysql
into mysql.sashanet.com:/home/sasha/src/bk/mysql BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted
Diffstat (limited to 'sql')
-rw-r--r--sql/log_event.h2
-rw-r--r--sql/slave.cc67
-rw-r--r--sql/sql_base.cc16
3 files changed, 65 insertions, 20 deletions
diff --git a/sql/log_event.h b/sql/log_event.h
index 79186e329da..0f4945bae3c 100644
--- a/sql/log_event.h
+++ b/sql/log_event.h
@@ -136,7 +136,7 @@ public:
Query_log_event(THD* thd_arg, const char* query_arg, bool using_trans=0):
Log_event(thd_arg->start_time,0,1,thd_arg->server_id), data_buf(0),
query(query_arg), db(thd_arg->db), q_len(thd_arg->query_length),
- error_code(thd_arg->net.last_errno),
+ error_code(thd_arg->killed ? ER_SERVER_SHUTDOWN: thd_arg->net.last_errno),
thread_id(thd_arg->thread_id), thd(thd_arg),
cache_stmt(using_trans &&
(thd_arg->options & (OPTION_NOT_AUTO_COMMIT | OPTION_BEGIN)))
diff --git a/sql/slave.cc b/sql/slave.cc
index be1d919c4cd..5e6b616c720 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -59,6 +59,8 @@ static int request_table_dump(MYSQL* mysql, char* db, char* table);
static int create_table_from_dump(THD* thd, NET* net, const char* db,
const char* table_name);
inline char* rewrite_db(char* db);
+static int check_expected_error(THD* thd, int expected_error);
+
static void free_table_ent(TABLE_RULE_ENT* e)
{
my_free((gptr) e, MYF(0));
@@ -834,6 +836,27 @@ server_errno=%d)",
return len - 1;
}
+static int check_expected_error(THD* thd, int expected_error)
+{
+ switch(expected_error)
+ {
+ case ER_NET_READ_ERROR:
+ case ER_NET_ERROR_ON_WRITE:
+ case ER_SERVER_SHUTDOWN:
+ case ER_NEW_ABORTING_CONNECTION:
+ my_snprintf(last_slave_error, sizeof(last_slave_error),
+ "Slave: query '%s' partially completed on the master \
+and was aborted. There is a chance that your master is inconsistent at this \
+point. If you are sure that your master is ok, run this query manually on the\
+ slave and then restart the slave with SET SQL_SLAVE_SKIP_COUNTER=1;\
+ SLAVE START;", thd->query);
+ last_slave_errno = expected_error;
+ sql_print_error(last_slave_error);
+ return 1;
+ default:
+ return 0;
+ }
+}
static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
{
@@ -883,22 +906,38 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
thd->net.last_errno = 0;
thd->net.last_error[0] = 0;
thd->slave_proxy_id = qev->thread_id; // for temp tables
- mysql_parse(thd, thd->query, q_len);
- if ((expected_error = qev->error_code) !=
- (actual_error = thd->net.last_errno) && expected_error)
- {
- const char* errmsg = "Slave: did not get the expected error\
+
+ // 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)))
+ {
+ mysql_parse(thd, thd->query, q_len);
+ if (expected_error !=
+ (actual_error = thd->net.last_errno) && expected_error)
+ {
+ const char* errmsg = "Slave: did not get the expected error\
running query from master - expected: '%s', got '%s'";
- sql_print_error(errmsg, ER(expected_error),
- actual_error ? thd->net.last_error:"no error"
- );
- thd->query_error = 1;
- }
- else if (expected_error == actual_error)
+ sql_print_error(errmsg, ER(expected_error),
+ actual_error ? thd->net.last_error:"no error"
+ );
+ thd->query_error = 1;
+ }
+ else if (expected_error == actual_error)
+ {
+ thd->query_error = 0;
+ *last_slave_error = 0;
+ last_slave_errno = 0;
+ }
+ }
+ else // master could be inconsistent, abort and tell DBA to
+ // check/fix it
{
- thd->query_error = 0;
- *last_slave_error = 0;
- last_slave_errno = 0;
+ thd->db = thd->query = 0;
+ thd->convert_set = 0;
+ close_thread_tables(thd);
+ free_root(&thd->mem_root,0);
+ delete ev;
+ return 1;
}
}
thd->db = 0; // prevent db from being freed
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 38dfcbdaa7a..49c858b7a16 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -497,13 +497,14 @@ void close_temporary_tables(THD *thd)
TABLE *table,*next;
uint init_query_buf_size = 11, query_buf_size; // "drop table "
char* query, *p;
+ bool found_user_tables = 0;
+
LINT_INIT(p);
query_buf_size = init_query_buf_size;
for (table=thd->temporary_tables ; table ; table=table->next)
{
query_buf_size += table->key_length;
-
}
if(query_buf_size == init_query_buf_size)
@@ -519,15 +520,20 @@ void close_temporary_tables(THD *thd)
{
if(query) // we might be out of memory, but this is not fatal
{
- p = strxmov(p,table->table_cache_key,".",
+ // skip temporary tables not created directly by the user
+ if(table->table_name[0] != '#')
+ {
+ p = strxmov(p,table->table_cache_key,".",
table->table_name,",", NullS);
- // here we assume table_cache_key always starts
- // with \0 terminated db name
+ // here we assume table_cache_key always starts
+ // with \0 terminated db name
+ found_user_tables = 1;
+ }
}
next=table->next;
close_temporary(table);
}
- if (query && mysql_bin_log.is_open())
+ if (query && found_user_tables && mysql_bin_log.is_open())
{
uint save_query_len = thd->query_length;
*--p = 0;