mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
BUG#12662190:COM_COMMIT IS NOT INCREMENTED FROM THE BINARY LOGS ON SLAVE, COM_BEGIN IS
PROBLEM: -------- When binary log statements are replayed on the slave, BEGIN is represented in com_counters but COMMIT is not. Similarly in 'ROW' based replication 'INSERT','UPDATE',and 'DELETE' com_counters are not getting incremented when the binary log statements are replayed at slave. ANALYSIS: --------- In 'ROW' based replication for COMMIT,INSERT,UPDATE and DELETE operations following special events are invoked. Xid_log_event,Write_rows_log_event,Update_rows_log_event,Update_rows_log_event. The above mentioned events doesn't go through the parser where the 'COM_COUNTERS' are incremented. FIX: ----- Increment statements are added at appropriate events. Respective functions are listed below. 'Xid_log_event::do_apply_event' 'Write_rows_log_event::do_before_row_operations' 'Update_rows_log_event::do_before_row_operations' 'Delete_rows_log_event::do_before_row_operations' sql/log_event.cc: Added code to increment counts for 'COM_INSERT','COM_UPDATE', 'COM_DELETE' and 'COM_COMMIT'during ROW based replicaiton
This commit is contained in:
@ -6,6 +6,15 @@
|
||||
# First we test tables with only an index.
|
||||
#
|
||||
|
||||
#BUG#12662190 - COM_COMMIT IS NOT INCREMENTED FROM THE BINARY LOGS ON SLAVE, COM_BEGIN IS
|
||||
#Testing command counters -BEFORE
|
||||
#Storing the before counts of Slave
|
||||
connection slave;
|
||||
let $slave_com_commit_before= query_get_value(SHOW GLOBAL STATUS LIKE 'com_commit', Value, 1);
|
||||
let $slave_com_insert_before= query_get_value(SHOW GLOBAL STATUS LIKE 'com_insert', Value, 1);
|
||||
let $slave_com_delete_before= query_get_value(SHOW GLOBAL STATUS LIKE 'com_delete', Value, 1);
|
||||
let $slave_com_update_before= query_get_value(SHOW GLOBAL STATUS LIKE 'com_update', Value, 1);
|
||||
|
||||
connection master;
|
||||
eval CREATE TABLE t1 (C1 CHAR(1), C2 CHAR(1), INDEX (C1)$extra_index_t1) ENGINE = $type ;
|
||||
SELECT * FROM t1;
|
||||
@ -40,6 +49,32 @@ SELECT * FROM t1 ORDER BY C1,C2;
|
||||
sync_slave_with_master;
|
||||
SELECT * FROM t1 ORDER BY C1,C2;
|
||||
|
||||
#BUG#12662190 - COM_COMMIT IS NOT INCREMENTED FROM THE BINARY LOGS ON SLAVE, COM_BEGIN IS
|
||||
#Testing command counters -AFTER
|
||||
#Storing the after counts of Slave
|
||||
connection slave;
|
||||
let $slave_com_commit_after= query_get_value(SHOW GLOBAL STATUS LIKE 'com_commit', Value, 1);
|
||||
let $slave_com_insert_after= query_get_value(SHOW GLOBAL STATUS LIKE 'com_insert', Value, 1);
|
||||
let $slave_com_delete_after= query_get_value(SHOW GLOBAL STATUS LIKE 'com_delete', Value, 1);
|
||||
let $slave_com_update_after= query_get_value(SHOW GLOBAL STATUS LIKE 'com_update', Value, 1);
|
||||
|
||||
#Commit count check
|
||||
--let $assert_text= Counter for COM_COMMIT is consistent with the number of actual commits
|
||||
--let $assert_cond= $slave_com_commit_after - $slave_com_commit_before = 4
|
||||
--source include/assert.inc
|
||||
#Insert count check
|
||||
--let $assert_text= Counter for COM_INSERT is consistent with the number of actual inserts
|
||||
--let $assert_cond= $slave_com_insert_after - $slave_com_insert_before = 2
|
||||
--source include/assert.inc
|
||||
#Delete count check
|
||||
--let $assert_text= Counter for COM_DELETE is consistent with the number of actual deletes
|
||||
--let $assert_cond= $slave_com_delete_after - $slave_com_delete_before = 1
|
||||
--source include/assert.inc
|
||||
#Update count check
|
||||
--let $assert_text= Counter for COM_UPDATE is consistent with the number of actual updates
|
||||
--let $assert_cond= $slave_com_update_after - $slave_com_update_before = 1
|
||||
--source include/assert.inc
|
||||
|
||||
# Testing update with a condition that does not match any rows, but
|
||||
# which has a match for the index.
|
||||
connection master;
|
||||
|
@ -49,6 +49,10 @@ A B
|
||||
A I
|
||||
X Y
|
||||
X Z
|
||||
include/assert.inc [Counter for COM_COMMIT is consistent with the number of actual commits]
|
||||
include/assert.inc [Counter for COM_INSERT is consistent with the number of actual inserts]
|
||||
include/assert.inc [Counter for COM_DELETE is consistent with the number of actual deletes]
|
||||
include/assert.inc [Counter for COM_UPDATE is consistent with the number of actual updates]
|
||||
UPDATE t1 SET c2 = 'Q' WHERE c1 = 'A' AND c2 = 'N';
|
||||
SELECT * FROM t1 ORDER BY c1,c2;
|
||||
C1 C2
|
||||
|
@ -49,6 +49,10 @@ A B
|
||||
A I
|
||||
X Y
|
||||
X Z
|
||||
include/assert.inc [Counter for COM_COMMIT is consistent with the number of actual commits]
|
||||
include/assert.inc [Counter for COM_INSERT is consistent with the number of actual inserts]
|
||||
include/assert.inc [Counter for COM_DELETE is consistent with the number of actual deletes]
|
||||
include/assert.inc [Counter for COM_UPDATE is consistent with the number of actual updates]
|
||||
UPDATE t1 SET c2 = 'Q' WHERE c1 = 'A' AND c2 = 'N';
|
||||
SELECT * FROM t1 ORDER BY c1,c2;
|
||||
C1 C2
|
||||
|
@ -5594,6 +5594,11 @@ int Xid_log_event::do_apply_event(Relay_log_info const *rli)
|
||||
res= trans_commit(thd); /* Automatically rolls back on error. */
|
||||
thd->mdl_context.release_transactional_locks();
|
||||
|
||||
/*
|
||||
Increment the global status commit count variable
|
||||
*/
|
||||
status_var_increment(thd->status_var.com_stat[SQLCOM_COMMIT]);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -8749,6 +8754,12 @@ Write_rows_log_event::do_before_row_operations(const Slave_reporting_capability
|
||||
{
|
||||
int error= 0;
|
||||
|
||||
/*
|
||||
Increment the global status insert count variable
|
||||
*/
|
||||
if (get_flags(STMT_END_F))
|
||||
status_var_increment(thd->status_var.com_stat[SQLCOM_INSERT]);
|
||||
|
||||
/**
|
||||
todo: to introduce a property for the event (handler?) which forces
|
||||
applying the event in the replace (idempotent) fashion.
|
||||
@ -9682,6 +9693,12 @@ Delete_rows_log_event::Delete_rows_log_event(const char *buf, uint event_len,
|
||||
int
|
||||
Delete_rows_log_event::do_before_row_operations(const Slave_reporting_capability *const)
|
||||
{
|
||||
/*
|
||||
Increment the global status delete count variable
|
||||
*/
|
||||
if (get_flags(STMT_END_F))
|
||||
status_var_increment(thd->status_var.com_stat[SQLCOM_DELETE]);
|
||||
|
||||
if ((m_table->file->ha_table_flags() & HA_PRIMARY_KEY_REQUIRED_FOR_POSITION) &&
|
||||
m_table->s->primary_key < MAX_KEY)
|
||||
{
|
||||
@ -9811,6 +9828,12 @@ Update_rows_log_event::Update_rows_log_event(const char *buf, uint event_len,
|
||||
int
|
||||
Update_rows_log_event::do_before_row_operations(const Slave_reporting_capability *const)
|
||||
{
|
||||
/*
|
||||
Increment the global status update count variable
|
||||
*/
|
||||
if (get_flags(STMT_END_F))
|
||||
status_var_increment(thd->status_var.com_stat[SQLCOM_UPDATE]);
|
||||
|
||||
if (m_table->s->keys > 0)
|
||||
{
|
||||
// Allocate buffer for key searches
|
||||
|
Reference in New Issue
Block a user