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

XMLWordPrintableJSON

    • Type: Bug
    • Resolution: Unresolved
    • Priority: Major - P3
    • None
    • Affects Version/s: None
    • Component/s: None
    • Storage Execution
    • 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();
    • 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:
            Unassigned
            Reporter:
            Yuhong Zhang
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated: