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

Forbid dropping config.transactions when there are prepared transactions

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major - P3
    • Resolution: Fixed
    • Affects Version/s: 4.2.7, 4.4.0-rc7
    • Fix Version/s: 4.2.9, 4.4.1, 4.7.0
    • Component/s: Replication
    • Labels:
      None
    • Backwards Compatibility:
      Fully Compatible
    • Operating System:
      ALL
    • Backport Requested:
      v4.4, v4.2
    • Steps To Reproduce:
      Hide

      Update no_writes_to_config_transactions_with_prepared_transaction.js with the following diff, so that writes to config.transactions are performed without a session. The update and delete fail correctly, but the drop does not fail as expected.

      diff --git a/jstests/core/txns/no_writes_to_config_transactions_with_prepared_transaction.js b/jstests/core/txns/no_writes_to_config_transactions_with_prepared_transaction.js
      index 067bf1482f..215f4c661b 100644
      --- a/jstests/core/txns/no_writes_to_config_transactions_with_prepared_transaction.js
      +++ b/jstests/core/txns/no_writes_to_config_transactions_with_prepared_transaction.js
      @@ -52,9 +52,9 @@ const txnNum = transactionEntry.txnNum;
       jsTestLog("Test that updates to config.transactions fails when there is a prepared " +
                 "transaction on the session");
       assert.commandFailedWithCode(
      -    sessionConfigDB.transactions.update({_id: transactionEntry._id},
      +    config.transactions.update({_id: transactionEntry._id},
                                               {$set: {"txnNumber": NumberLong(23)}}),
      -    40528);
      +    267);
       
       // Make sure that the txnNumber wasn't modified.
       transactionEntry = config.transactions.findOne();
      @@ -62,8 +62,8 @@ assert.eq(transactionEntry.txnNum, NumberLong(txnNum));
       
       jsTestLog("Test that deletes to config.transactions fails when there is a prepared " +
                 "transaction on the session");
      -assert.commandFailedWithCode(sessionConfigDB.transactions.remove({_id: transactionEntry._id}),
      -                             40528);
      +assert.commandFailedWithCode(config.transactions.remove({_id: transactionEntry._id}),
      +                             267);
       
       // Make sure that the entry in config.transactions wasn't removed.
       transactionEntry = config.transactions.findOne();
      @@ -72,9 +72,9 @@ assert(transactionEntry);
       jsTestLog("Test that dropping config.transactions fails when there is a prepared transaction" +
                 " on the session");
       assert.commandFailedWithCode(assert.throws(function() {
      -                                              sessionConfigDB.transactions.drop();
      +                                              config.transactions.drop();
                                                 }),
      -                                          40528);
      +                                          267);
       
       jsTestLog("Test that we can prepare a transaction on a different session");
       const session2 = db.getMongo().startSession({causalConsistency: false});
      

      Show
      Update no_writes_to_config_transactions_with_prepared_transaction.js with the following diff, so that writes to config.transactions are performed without a session. The update and delete fail correctly, but the drop does not fail as expected. diff --git a/jstests/core/txns/no_writes_to_config_transactions_with_prepared_transaction.js b/jstests/core/txns/no_writes_to_config_transactions_with_prepared_transaction.js index 067bf1482f..215f4c661b 100644 --- a/jstests/core/txns/no_writes_to_config_transactions_with_prepared_transaction.js +++ b/jstests/core/txns/no_writes_to_config_transactions_with_prepared_transaction.js @@ -52,9 +52,9 @@ const txnNum = transactionEntry.txnNum; jsTestLog("Test that updates to config.transactions fails when there is a prepared " + "transaction on the session"); assert.commandFailedWithCode( - sessionConfigDB.transactions.update({_id: transactionEntry._id}, + config.transactions.update({_id: transactionEntry._id}, {$set: {"txnNumber": NumberLong(23)}}), - 40528); + 267); // Make sure that the txnNumber wasn't modified. transactionEntry = config.transactions.findOne(); @@ -62,8 +62,8 @@ assert.eq(transactionEntry.txnNum, NumberLong(txnNum)); jsTestLog("Test that deletes to config.transactions fails when there is a prepared " + "transaction on the session"); -assert.commandFailedWithCode(sessionConfigDB.transactions.remove({_id: transactionEntry._id}), - 40528); +assert.commandFailedWithCode(config.transactions.remove({_id: transactionEntry._id}), + 267); // Make sure that the entry in config.transactions wasn't removed. transactionEntry = config.transactions.findOne(); @@ -72,9 +72,9 @@ assert(transactionEntry); jsTestLog("Test that dropping config.transactions fails when there is a prepared transaction" + " on the session"); assert.commandFailedWithCode(assert.throws(function() { - sessionConfigDB.transactions.drop(); + config.transactions.drop(); }), - 40528); + 267); jsTestLog("Test that we can prepare a transaction on a different session"); const session2 = db.getMongo().startSession({causalConsistency: false});
    • Sprint:
      Repl 2020-06-29, Repl 2020-07-13, Repl 2020-07-27
    • Linked BF Score:
      23

      Attachments

        Issue Links

          Activity

            People

            Assignee:
            vesselina.ratcheva Vesselina Ratcheva
            Reporter:
            tess.avitabile Tess Avitabile
            Participants:
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

              Dates

              Created:
              Updated:
              Resolved: