Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-34137

Transaction number of committed/aborted transaction can be reused for snapshot read

    XMLWordPrintableJSON

Details

    • Icon: Bug Bug
    • Resolution: Gone away
    • Icon: Major - P3 Major - P3
    • None
    • None
    • Replication, Storage
    • None
    • Storage Execution
    • ALL
    • Hide

      (function() {
          let session = db.getMongo().startSession({causalConsistency: false});
          let sessionDb = session.getDatabase("test");
       
          assert.commandWorked(sessionDb.createCollection("coll", {writeConcern: {w: "majority"}}));
       
          assert.commandWorked(sessionDb.runCommand({
              insert: "coll",
              documents: [{_id: "insert-1"}],
              readConcern: {level: "snapshot"},
              txnNumber: NumberLong(0),
              autocommit: false
          }));
       
          assert.commandWorked(sessionDb.runCommand({
              commitTransaction: 1,    // also passes with 'abortTransaction'
              txnNumber: NumberLong(0)
          }));
       
          assert.commandWorked(sessionDb.runCommand({
              find: "coll",    // also passes with any other command allowing snapshot readConcern
              readConcern: {level: "snapshot"},
              txnNumber: NumberLong(0)    // will fail if autocommit=false is specified, as expected
          }));
       
          session.endSession();
      }());
      

      Show
      (function() { let session = db.getMongo().startSession({causalConsistency: false}); let sessionDb = session.getDatabase("test");   assert.commandWorked(sessionDb.createCollection("coll", {writeConcern: {w: "majority"}}));   assert.commandWorked(sessionDb.runCommand({ insert: "coll", documents: [{_id: "insert-1"}], readConcern: {level: "snapshot"}, txnNumber: NumberLong(0), autocommit: false }));   assert.commandWorked(sessionDb.runCommand({ commitTransaction: 1, // also passes with 'abortTransaction' txnNumber: NumberLong(0) }));   assert.commandWorked(sessionDb.runCommand({ find: "coll", // also passes with any other command allowing snapshot readConcern readConcern: {level: "snapshot"}, txnNumber: NumberLong(0) // will fail if autocommit=false is specified, as expected }));   session.endSession(); }());

    Description

      If there is no _txnResourceStash, we are not in a multi-document transaction, and the readConcern level is snapshot, then we will start a new snapshot read. This allows us to incorrectly reuse a transaction number of a committed/aborted transaction for a snapshot read.

      Attachments

        Activity

          People

            backlog-server-execution Backlog - Storage Execution Team
            tess.avitabile@mongodb.com Tess Avitabile (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: