Aborted multi-doc transaction can leave inconsistent multikey fields within a replica set

XMLWordPrintableJSON

    • Type: Bug
    • Resolution: Duplicate
    • Priority: Major - P3
    • None
    • Affects Version/s: None
    • Component/s: None
    • Catalog and Routing
    • ALL
    • Hide
      import {ReplSetTest} from "jstests/libs/replsettest.js";
      
      const rst = new ReplSetTest({nodes: 2});
      rst.startSet();
      rst.initiate();
      
      const primary = rst.getPrimary();
      const db = primary.getDB("test");
      const coll = db.getCollection("test");
      
      assert.commandWorked(coll.createIndex({a: 1}));
      const session = db.getSession();
      const sessionColl = session.getDatabase("test")["test"];
      session.startTransaction();assert.commandWorked(sessionColl.insert({a: [1, 2, 3]}));
      session.abortTransaction_forTesting(); 
      
      jsTest.log.info(
          db
              .getSiblingDB("admin")
              .aggregate([{$listCatalog: {}}, {$match: {ns: "test.test"}}])
              .toArray(),
      );
      jsTest.log.info(
          rst
              .getSecondaries()[0]
              .getDB("admin")
              .aggregate([{$listCatalog: {}}, {$match: {ns: "test.test"}}])
              .toArray(),
      );
      
      rst.stopSet();
      
      
      Show
      import {ReplSetTest} from "jstests/libs/replsettest.js"; const rst = new ReplSetTest({nodes: 2}); rst.startSet(); rst.initiate(); const primary = rst.getPrimary(); const db = primary.getDB("test"); const coll = db.getCollection("test"); assert.commandWorked(coll.createIndex({a: 1})); const session = db.getSession(); const sessionColl = session.getDatabase("test")["test"]; session.startTransaction();assert.commandWorked(sessionColl.insert({a: [1, 2, 3]})); session.abortTransaction_forTesting(); jsTest.log.info( db .getSiblingDB("admin") .aggregate([{$listCatalog: {}}, {$match: {ns: "test.test"}}]) .toArray(), ); jsTest.log.info( rst .getSecondaries()[0] .getDB("admin") .aggregate([{$listCatalog: {}}, {$match: {ns: "test.test"}}]) .toArray(), ); rst.stopSet();
    • CAR Team 2026-01-05
    • None
    • None
    • None
    • None
    • None
    • None
    • None

      The write to update multikey fields of an index is not transactional with the operation that causes it. In a multi-doc transaction, the catalog write for multikey can commit while the operation aborts. In such situations, the repl set will end up having the primary with multikey fields set while not on the secondaries.

            Assignee:
            Josef Ahmad
            Reporter:
            Yuhong Zhang
            Votes:
            0 Vote for this issue
            Watchers:
            7 Start watching this issue

              Created:
              Updated:
              Resolved: