Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-40459

binlog_format=MIXED primary/replica row divergence with multi-row witness insert after savepoint rollback

    XMLWordPrintable

Details

    • Unexpected results
    • Hide
      In {{binlog_format=MIXED}}, the trigger-called stored-procedure reproduction also leaves the replica with different committed rows when the post-savepoint witness operation inserts two rows in one statement. This variant shows a contiguous committed {{AUTO_INCREMENT}} sequence shift on the replica.
      Show
      In {{binlog_format=MIXED}}, the trigger-called stored-procedure reproduction also leaves the replica with different committed rows when the post-savepoint witness operation inserts two rows in one statement. This variant shows a contiguous committed {{AUTO_INCREMENT}} sequence shift on the replica.

    Description

      Summary

      In binlog_format=MIXED, the trigger-called stored-procedure reproduction
      also leaves the replica with different committed rows when the post-savepoint
      witness operation inserts two rows in one statement. This variant shows a
      contiguous committed AUTO_INCREMENT sequence shift on the replica.

      Environment

      • Product: MariaDB Server primary/replica replication
      • Replication mode: file/position
      • binlog_format: MIXED
      • Observed affected versions: MariaDB 10.6, 12.2
      • Clean controls: MariaDB 10.6/12.2 with ROW; MySQL 5.6/5.7/8.0
        with MIXED
      • Storage engine: InnoDB

      Steps To Reproduce

      1. Start a MariaDB primary/replica pair with binlog_format=MIXED.
      2. Run the SQL in the Minimal Reproduction SQL section on the primary.
      3. Wait for the replica to catch up.
      4. Run this query on both primary and replica:

      SELECT seq, src_id, frame_v, note
      FROM acl_repl_ai_proc_mw_frame
      ORDER BY seq;
      

      Minimal Reproduction SQL

      -- Variant: multi-row witness.
      -- Configure MariaDB primary/replica with binlog_format=MIXED.
       
      CREATE TABLE acl_repl_ai_proc_mw_src(
        id INT PRIMARY KEY,
        v INT NOT NULL,
        note VARCHAR(32) NOT NULL
      ) ENGINE=InnoDB;
       
      CREATE TABLE acl_repl_ai_proc_mw_audit(
        seq INT AUTO_INCREMENT PRIMARY KEY,
        src_id INT NOT NULL,
        seen_v INT NOT NULL,
        note VARCHAR(32) NOT NULL,
        KEY acl_repl_ai_proc_mw_audit_src_idx(src_id),
        CONSTRAINT acl_repl_ai_proc_mw_audit_fk
          FOREIGN KEY(src_id) REFERENCES acl_repl_ai_proc_mw_src(id)
          ON UPDATE CASCADE ON DELETE CASCADE
      ) ENGINE=InnoDB;
       
      CREATE TABLE acl_repl_ai_proc_mw_frame(
        seq INT AUTO_INCREMENT PRIMARY KEY,
        src_id INT NOT NULL,
        frame_v INT NOT NULL,
        note VARCHAR(64) NOT NULL
      ) ENGINE=InnoDB;
       
      DELIMITER //
      CREATE PROCEDURE acl_repl_ai_proc_mw_apply(
        IN p_src_id INT,
        IN p_seen_v INT,
        IN p_note VARCHAR(32)
      )
      BEGIN
        INSERT INTO acl_repl_ai_proc_mw_audit(src_id, seen_v, note)
        VALUES (p_src_id, p_seen_v, p_note);
        INSERT INTO acl_repl_ai_proc_mw_frame(src_id, frame_v, note)
        VALUES (p_src_id, p_seen_v + 7000, CONCAT('proc-', p_note));
      END//
       
      CREATE TRIGGER acl_repl_ai_proc_mw_ai
      AFTER INSERT ON acl_repl_ai_proc_mw_src
      FOR EACH ROW
      BEGIN
        CALL acl_repl_ai_proc_mw_apply(NEW.id, NEW.v, NEW.note);
      END//
      DELIMITER ;
       
      INSERT INTO acl_repl_ai_proc_mw_src(id, v, note)
      VALUES (1, 10, 'seed');
       
      START TRANSACTION;
      INSERT INTO acl_repl_ai_proc_mw_src(id, v, note)
      VALUES (2, 20, 'prefix');
      SAVEPOINT acl_repl_ai_proc_mw_sp;
      INSERT INTO acl_repl_ai_proc_mw_src(id, v, note)
      VALUES (3, 30, 'suffix');
      ROLLBACK TO SAVEPOINT acl_repl_ai_proc_mw_sp;
      COMMIT;
       
      INSERT INTO acl_repl_ai_proc_mw_src(id, v, note)
      VALUES (4, 40, 'witness'), (5, 50, 'witness2');
       
      SELECT seq, src_id, frame_v, note
      FROM acl_repl_ai_proc_mw_frame
      ORDER BY seq;
      

      Expected Result

      The primary and replica should return the same committed rows.

      Expected rows:

      1, 1, 7010, proc-seed
      2, 2, 7020, proc-prefix
      4, 4, 7040, proc-witness
      5, 5, 7050, proc-witness2
      

      Actual Result

      Primary:

      1, 1, 7010, proc-seed
      2, 2, 7020, proc-prefix
      4, 4, 7040, proc-witness
      5, 5, 7050, proc-witness2
      

      Replica:

      1, 1, 7010, proc-seed
      2, 2, 7020, proc-prefix
      3, 4, 7040, proc-witness
      4, 5, 7050, proc-witness2
      

      Separate Verification Request

      Please verify this multi-row witness form separately. It shows a contiguous committed sequence shift on the replica, not only a single-row mismatch.

      Attachments

        Issue Links

          Activity

            People

              ParadoxV5 Jimmy Hú
              JaysonL Zhensheng Luo
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

                Created:
                Updated:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.