MXS-2374: Set next_pos for skipped events

By always setting the position of the next event, the replication cannot
break if the slave server has to reconnect after receiving an event that
was generated by the binlogfilter.
This commit is contained in:
Markus Mäkelä 2019-03-09 07:48:41 +02:00
parent 17245c4ce3
commit 85c2d3c9ee
No known key found for this signature in database
GPG Key ID: 72D48FCE664F7B19
2 changed files with 8 additions and 8 deletions

View File

@ -229,7 +229,7 @@ int BinlogFilterSession::clientReply(GWBUF* pPacket)
// they are replaced by a RAND_EVENT event packet
if (m_skip)
{
replaceEvent(&pPacket);
replaceEvent(&pPacket, hdr);
}
break;
@ -323,7 +323,7 @@ bool BinlogFilterSession::checkEvent(GWBUF* buffer,
* Some events skipped.
* Set next pos to 0 instead of real one and new CRC32
*/
fixEvent(event + MYSQL_HEADER_LEN + 1, hdr.event_size);
fixEvent(event + MYSQL_HEADER_LEN + 1, hdr.event_size, hdr);
}
break;
@ -444,12 +444,12 @@ static void event_set_crc32(uint8_t* event, uint32_t event_size)
* @param event Pointer to event data
* @event_size The event size
*/
void BinlogFilterSession::fixEvent(uint8_t* event, uint32_t event_size)
void BinlogFilterSession::fixEvent(uint8_t* event, uint32_t event_size, const REP_HEADER& hdr)
{
// Set next pos to 0.
// The next_pos offset is the 13th byte in replication event header 19 bytes
// + 4 (time) + 1 (type) + 4 (server_id) + 4 (event_size)
gw_mysql_set_byte4(event + 4 + 1 + 4 + 4, 0);
gw_mysql_set_byte4(event + 4 + 1 + 4 + 4, hdr.next_pos);
// Set CRC32 in the new event
if (m_crc)
@ -466,7 +466,7 @@ void BinlogFilterSession::fixEvent(uint8_t* event, uint32_t event_size)
*
* @param pPacket The GWBUF with event data
*/
void BinlogFilterSession::replaceEvent(GWBUF** ppPacket)
void BinlogFilterSession::replaceEvent(GWBUF** ppPacket, const REP_HEADER& hdr)
{
uint32_t buf_len = gwbuf_length(*ppPacket);
@ -596,7 +596,7 @@ void BinlogFilterSession::replaceEvent(GWBUF** ppPacket)
}
// Fix Event Next pos = 0 and set new CRC32
fixEvent(ptr + MYSQL_HEADER_LEN + 1, new_event_size);
fixEvent(ptr + MYSQL_HEADER_LEN + 1, new_event_size, hdr);
}
/**

View File

@ -85,13 +85,13 @@ private:
void filterError(GWBUF* pPacket);
// Fix event: set next pos to 0 and set new CRC32
void fixEvent(uint8_t* data, uint32_t event_size);
void fixEvent(uint8_t* data, uint32_t event_size, const REP_HEADER& hdr);
// Whether to skip current event
bool checkEvent(GWBUF* data, const REP_HEADER& hdr);
// Filter the replication event
void replaceEvent(GWBUF** data);
void replaceEvent(GWBUF** data, const REP_HEADER& hdr);
// Handle event size
void handlePackets(uint32_t len, const REP_HEADER& hdr);