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

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

    • Type: Icon: Bug Bug
    • Resolution: Gone away
    • Priority: Icon: Major - P3 Major - P3
    • None
    • Affects Version/s: None
    • Component/s: Replication, Storage
    • Labels:
      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(); }());

      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.

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

              Created:
              Updated:
              Resolved: