• unknown's avatar
    Bug#19259 rpl_ndb_dd_partitions failed on Solaris · b9c18aea
    unknown authored
    Actually, this testcase will fail generally on all testing platforms.
    The bugs come from the inconsistent bitmap between rpl master and slave.
    
    In log_event.cc, the n_bits of m_cols and m_cols_ai are intialized with octal-ceiling 
    m_width, in fact, their n_bits should be equal to m_width.
    Wrong n_bits will cause bitmap_bits_set() get incorrect value in unpack_row()
    in rpl_record.cc, 
    then an assertion in unpack_row() will fail and crash sql thread.
      DBUG_ASSERT(null_ptr == row_data + master_null_byte_count);
    
    Meanwhile, because of binlog_prepare_pending_rows_event() changed with correct
    m_cols, some results of specific testcases should be updated:
    binlog_multi_engine.test
    ndb_binlog_multi.test
    rpl_ndb_dd_partitions.test
    rpl_ndb_log.test
    rpl_truncate_7ndb.test
    rpl_truncate_7ndb_2.test
    
    In addition, to ensure rows replication correct between master and slave after the patch, 
    two 'select * from t1' are added in extra/rpl_tests/rpl_log.test, and some testcases include 
    rpl_log.test, therefore, the results of these testcases should be updated likewise:
    rpl_stm_log.test
    rpl_row_log.test
    rpl_ndb_log.test
    rpl_row_log_innodb.test
    
    Totally, results of nine testcases are updated.
    
    
    include/my_bitmap.h:
      add declaration for create_last_word_mask(), since we need to use it in log_event.cc
    mysql-test/extra/rpl_tests/rpl_log.test:
      add 'select * from t1' both on master and slave to ensure the replication consistent after patched
    mysql-test/r/binlog_multi_engine.result:
      update result
      
      the following is commented by Andrei, 
      The differences can be explained.
      Look at
      lines of THD::binlog_prepare_pending_rows_event
      
        if (!pending)
             ...
            !bitmap_cmp(pending->get_cols(), cols))
      
      The row event disappears because after correcting master side Write_rows_log_event's m_col bitmap initialization, 
      this event has the same m_cols as the preceding one and thereafter they got glued into one bigger size event. 
      This is the correct behaviour now.
    mysql-test/r/ndb_binlog_multi.result:
      update result
      same reason with binlog_multi_engine for Write_rows_log_event
    mysql-test/r/rpl_ndb_dd_partitions.result:
      update result,
      reasons:
      1. tablespace description format changed
      2. hex(b1) from 1 to 0 because there is a update sentence in include/rpl_multi_engine3.inc
      UPDATE t1 SET b1 = 0, t="2006-02-22" WHERE id = 412;
    mysql-test/r/rpl_ndb_log.result:
      update result
      Write_rows event disapper for same reason with binlog_multi_engine ;
      In addition, because add new select in extra/rpl_testsrpl_log.test, 
      corresponding new results are accompanying.
    mysql-test/r/rpl_row_log.result:
      because add new select in extra/rpl_testsrpl_log.test, 
      corresponding new results are accompanying.
    mysql-test/r/rpl_row_log_innodb.result:
      because add new select in extra/rpl_testsrpl_log.test, 
      corresponding new results are accompanying.
    mysql-test/r/rpl_stm_log.result:
      because add new select in extra/rpl_testsrpl_log.test, 
      corresponding new results are accompanying.
    mysql-test/r/rpl_truncate_7ndb.result:
      update result
      same reason with binlog_multi_engine for Write_rows_log_event
    mysql-test/r/rpl_truncate_7ndb_2.result:
      update result
      same reason with binlog_multi_engine for Write_rows_log_event
      
      And for the change
      -master-bin.000001  4   Format_desc  1   102 Server ver: SERVER_VERSION, Binlog ver: 4
      +master-bin.000001  4   Format_desc  1   106 Server ver: SERVER_VERSION, Binlog ver
      
      It's  okay as FormatDescription event matured for 4 bytes since the last time the results had been recorded.
    mysql-test/t/disabled.def:
      resume this test case
    sql/log_event.cc:
      initialize m_cols' n_bits with m_width instead of octal-round(m_width);
      initialize m_cols_ai' n_bits with m_width instead of octal-round(m_width);
      after memcpy(), call create_last_word_mask() to clear extra bits in bitmap to ensure safety
    mysql-test/t/rpl_ndb_dd_partitions-master.opt:
      add --new=true passed to mysqld
    mysql-test/t/rpl_ndb_dd_partitions-slave.opt:
      add --new=true passed to mysqld
    b9c18aea
my_bitmap.h 6.19 KB