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

binlog_format=MIXED primary/replica row divergence with INSERT IGNORE witness 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 is {{INSERT IGNORE}}. This variant changes the witness DML form while keeping the trigger, procedure, FK, {{AUTO_INCREMENT}}, and {{ROLLBACK TO SAVEPOINT}} shape.
      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 is {{INSERT IGNORE}}. This variant changes the witness DML form while keeping the trigger, procedure, FK, {{AUTO_INCREMENT}}, and {{ROLLBACK TO SAVEPOINT}} shape.

    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 is INSERT IGNORE. This variant changes the witness DML
      form while keeping the trigger, procedure, FK, AUTO_INCREMENT, and
      ROLLBACK TO SAVEPOINT shape.

      Environment

      • Product: MariaDB Server primary/replica replication
      • Replication mode: file/position
      • binlog_format: MIXED
      • Observed affected versions: MariaDB 10.6, 12.2
      • Clean controls: MySQL 5.7/8.0 with MIXED; MariaDB 10.6/12.2
        with ROW
      • 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_ign_frame
      ORDER BY seq;
      

      Minimal Reproduction SQL

      -- Variant: INSERT IGNORE witness.
      -- Configure MariaDB primary/replica with binlog_format=MIXED.
       
      CREATE TABLE acl_repl_ai_proc_ign_src(
        id INT PRIMARY KEY,
        v INT NOT NULL,
        note VARCHAR(32) NOT NULL
      ) ENGINE=InnoDB;
       
      CREATE TABLE acl_repl_ai_proc_ign_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_ign_audit_src_idx(src_id),
        CONSTRAINT acl_repl_ai_proc_ign_audit_fk
          FOREIGN KEY(src_id) REFERENCES acl_repl_ai_proc_ign_src(id)
          ON UPDATE CASCADE ON DELETE CASCADE
      ) ENGINE=InnoDB;
       
      CREATE TABLE acl_repl_ai_proc_ign_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_ign_apply(
        IN p_src_id INT,
        IN p_seen_v INT,
        IN p_note VARCHAR(32)
      )
      BEGIN
        INSERT INTO acl_repl_ai_proc_ign_audit(src_id, seen_v, note)
        VALUES (p_src_id, p_seen_v, p_note);
        INSERT INTO acl_repl_ai_proc_ign_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_ign_ai
      AFTER INSERT ON acl_repl_ai_proc_ign_src
      FOR EACH ROW
      BEGIN
        CALL acl_repl_ai_proc_ign_apply(NEW.id, NEW.v, NEW.note);
      END//
      DELIMITER ;
       
      INSERT INTO acl_repl_ai_proc_ign_src(id, v, note)
      VALUES (1, 10, 'seed');
       
      START TRANSACTION;
      INSERT INTO acl_repl_ai_proc_ign_src(id, v, note)
      VALUES (2, 20, 'prefix');
      SAVEPOINT acl_repl_ai_proc_ign_sp;
      INSERT INTO acl_repl_ai_proc_ign_src(id, v, note)
      VALUES (3, 30, 'suffix');
      ROLLBACK TO SAVEPOINT acl_repl_ai_proc_ign_sp;
      COMMIT;
       
      INSERT IGNORE INTO acl_repl_ai_proc_ign_src(id, v, note)
      VALUES (4, 40, 'witness');
       
      SELECT seq, src_id, frame_v, note
      FROM acl_repl_ai_proc_ign_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
      

      Actual Result

      Primary:

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

      Replica:

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

      Separate Verification Request

      Please verify this INSERT IGNORE witness form separately. The witness statement uses a different DML form from the ordinary INSERT reproduction and may need its own mixed-logging regression test.

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              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.