1
0
mirror of https://github.com/MariaDB/server.git synced 2025-12-06 05:42:06 +03:00

Replication: various small fixes specific to the new binlog format of 5.0

(including one which may explain autobuild's failure of yesterday)


client/mysqlbinlog.cc:
  - In mysqlbinlog, we should not reset the Format event when we see Rotate. If a binlog started with a Format event, it is not going to switch later to 4.0 format.
  I had already did the same fix in Rotate_log_event::exec_event() in replication.
  - Fix for a merge bug.
sql/log_event.cc:
  An event with an uninited catalog (read from a 4.x server) is not the same as an event with a NULL catalog
  (5.0 server which did not specify catalog), the difference is that they are not in the same format;
  so I introduce a way to know if the catalog has been inited or not. This fixes a rpl_trunc_binlog failure
  I had.
  When we leave Load_log_event::exec_event(), we must reset thd->catalog to 0, like we already do
  in Query_log_event::exec_event(). This fixes a Valgrind error which popped in rpl_charset (which may
  be what caused autobuild to crash yesterday).
  And a fix for event's parsing (the position was always computed right because start_dup==end is always true
  and will until we add new string members to Query_log_event.
sql/log_event.h:
  catalog_len changed from uint to int to allow -1, which means "not inited"
  (I preferred to do it like this rather than create a new bool var Query_log_event::catalog_inited
  like we have in Query_log_event::sql_mode_inited; that's because catalog will not use the whole range of int,
  so it's allowed to pick -1 as a special value and have only one var.
sql/slave.cc:
  comments
This commit is contained in:
unknown
2004-07-26 19:42:59 +02:00
parent 1876125e6d
commit 9b867a2a7f
4 changed files with 20 additions and 22 deletions

View File

@@ -418,18 +418,6 @@ Create_file event for file_id: %u\n",exv->file_id);
*/ */
ev= 0; ev= 0;
break; break;
case ROTATE_EVENT:
/* see comments in sql/slave.cc:process_io_rotate() */
if (description_event->binlog_version >= 4)
{
delete description_event;
/* start from format 3 (MySQL 4.0) again */
description_event= new Format_description_log_event(3);
if (!description_event || !description_event->is_valid())
die("Invalid Format_description log event; could be out of memory");
}
ev->print(result_file, short_form, last_event_info);
break;
default: default:
ev->print(result_file, short_form, last_event_info); ev->print(result_file, short_form, last_event_info);
} }
@@ -1011,11 +999,13 @@ static int dump_local_log_entries(const char* logname)
if (!ev) if (!ev)
{ {
if (file->error) if (file->error)
{
fprintf(stderr, fprintf(stderr,
"Could not read entry at offset %s:" "Could not read entry at offset %s:"
"Error in log format or read error\n", "Error in log format or read error\n",
llstr(old_off,llbuff)); llstr(old_off,llbuff));
error= 1; error= 1;
}
// file->error == 0 means EOF, that's OK, we break in this case // file->error == 0 means EOF, that's OK, we break in this case
break; break;
} }

View File

@@ -1034,7 +1034,7 @@ int Query_log_event::write_data(IO_CACHE* file)
int8store(start, sql_mode); int8store(start, sql_mode);
start+= 8; start+= 8;
} }
if (catalog) if (catalog_len >= 0) // i.e. "catalog inited" (false for 4.0 events)
{ {
*(start++)= Q_CATALOG_CODE; *(start++)= Q_CATALOG_CODE;
*(start++)= (uchar) catalog_len; *(start++)= (uchar) catalog_len;
@@ -1119,7 +1119,7 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
Query_log_event::Query_log_event(const char* buf, uint event_len, Query_log_event::Query_log_event(const char* buf, uint event_len,
const Format_description_log_event *description_event) const Format_description_log_event *description_event)
:Log_event(buf, description_event), data_buf(0), query(NULL), :Log_event(buf, description_event), data_buf(0), query(NULL),
catalog(NULL), db(NULL), catalog_len(0), status_vars_len(0), db(NULL), catalog_len(-1), status_vars_len(0),
flags2_inited(0), sql_mode_inited(0) flags2_inited(0), sql_mode_inited(0)
{ {
ulong data_len; ulong data_len;
@@ -1214,9 +1214,10 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
not need (and want) to change start_dup (because this would cut the not need (and want) to change start_dup (because this would cut the
previously marked status vars). previously marked status vars).
*/ */
pos++;
if (start_dup==end) if (start_dup==end)
start_dup= ++pos; start_dup= pos;
pos+= catalog_len+1; pos+= catalog_len+1; // counting the end '\0'
break; break;
default: default:
/* That's why you must write status vars in growing order of code */ /* That's why you must write status vars in growing order of code */
@@ -1236,11 +1237,15 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
const char* tmp_buf= data_buf; const char* tmp_buf= data_buf;
/* Now set event's pointers to point to bits of the new string */ /* Now set event's pointers to point to bits of the new string */
if (catalog_len) if (catalog_len >= 0) // we have seen a catalog (zero-length or not)
{ {
catalog= tmp_buf; catalog= tmp_buf;
tmp_buf+= (uint) (end-start_dup); /* "seek" to db */ tmp_buf+= (uint) (end-start_dup); /* "seek" to db */
} }
#ifndef DBUG_OFF
else
catalog= 0; // for DBUG_PRINT
#endif
db= tmp_buf; db= tmp_buf;
query= tmp_buf + db_len + 1; query= tmp_buf + db_len + 1;
q_len = data_buf + data_len - query; q_len = data_buf + data_len - query;
@@ -1531,7 +1536,7 @@ end:
TEMPORARY TABLE don't suffer from these assignments to 0 as DROP TEMPORARY TEMPORARY TABLE don't suffer from these assignments to 0 as DROP TEMPORARY
TABLE uses the db.table syntax). TABLE uses the db.table syntax).
*/ */
thd->db= 0; // prevent db from being freed thd->db= thd->catalog= 0; // prevent db from being freed
thd->query= 0; // just to be sure thd->query= 0; // just to be sure
thd->query_length= 0; thd->query_length= 0;
VOID(pthread_mutex_unlock(&LOCK_thread_count)); VOID(pthread_mutex_unlock(&LOCK_thread_count));

View File

@@ -604,7 +604,7 @@ public:
concerned) from here. concerned) from here.
*/ */
uint catalog_len; /* <= 255 char */ int catalog_len; // <= 255 char; -1 means uninited
/* /*
We want to be able to store a variable number of N-bit status vars: We want to be able to store a variable number of N-bit status vars:

View File

@@ -372,7 +372,7 @@ int init_relay_log_pos(RELAY_LOG_INFO* rli,const char* log,
(starting from position 4): (starting from position 4):
Format_desc (of slave) Format_desc (of slave)
Rotate (of master) Rotate (of master)
Format_desc (of slave) Format_desc (of master)
So the Format_desc which really describes the rest of the relay log is So the Format_desc which really describes the rest of the relay log is
the 3rd event (it can't be further than that, because we rotate the the 3rd event (it can't be further than that, because we rotate the
relay log when we queue a Rotate event from the master). relay log when we queue a Rotate event from the master).
@@ -3873,7 +3873,10 @@ static int process_io_rotate(MASTER_INFO *mi, Rotate_log_event *rev)
mi->rli.relay_log.description_event_for_queue= new mi->rli.relay_log.description_event_for_queue= new
Format_description_log_event(3); Format_description_log_event(3);
} }
/*
Rotate the relay log makes binlog format detection easier (at next slave
start or mysqlbinlog)
*/
rotate_relay_log(mi); /* will take the right mutexes */ rotate_relay_log(mi); /* will take the right mutexes */
DBUG_RETURN(0); DBUG_RETURN(0);
} }