[SERVER-35483] rollback makes config.transactions fastcount inaccurate Created: 07/Jun/18  Updated: 06/Dec/22  Resolved: 12/Jun/18

Status: Closed
Project: Core Server
Component/s: Replication
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Major - P3
Reporter: Judah Schvimer Assignee: Backlog - Replication Team
Resolution: Won't Fix Votes: 0
Labels: todo_in_code
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Related
related to SERVER-39762 Fix fastcount after rollback recovery... Closed
related to SERVER-42549 Remove TODO listed in SERVER-35483 Closed
related to SERVER-43461 Complete TODO listed in SERVER-35483 Closed
related to SERVER-59057 Do not enforce fast count in validate... Closed
is related to SERVER-34977 subtract capped deletes from fastcoun... Closed
is related to SERVER-35435 Renaming during replication recovery ... Closed
Assigned Teams:
Replication
Operating System: ALL
Steps To Reproduce:

(function() {
    "use strict";
 
    load("jstests/replsets/libs/rollback_test.js");
 
    const testName = "rollback_transactions_count";
    const dbName = testName;
 
    let replSet = new ReplSetTest({name: testName, nodes: 3, useBridge: true});
    replSet.startSet();
 
    const nodes = replSet.nodeList();
    replSet.initiate({
        _id: testName,
        members: [
            {_id: 0, host: nodes[0]},
            {_id: 1, host: nodes[1]},
            {_id: 2, host: nodes[2], arbiterOnly: true}
        ]
    });
 
    // Set up Rollback Test.
    let rollbackTest = new RollbackTest(testName, replSet);
    let primary = rollbackTest.getPrimary();
    assert.commandWorked(primary.setLogLevel(3, 'storage.recovery'));
    let testDb = primary.getDB(dbName);
 
    const txnName = "txnCollName";
 
    const session1 = primary.startSession();
    const sessionDb1 = session1.getDatabase(dbName);
    const sessionColl1 = sessionDb1[txnName];
    assert.commandWorked(sessionColl1.insert({a: 1}));
    session1.startTransaction();
    assert.commandWorked(sessionColl1.insert({b: 1}));
    session1.commitTransaction();
 
    replSet.awaitLastOpCommitted();
    assert.commandWorked(
        primary.adminCommand({configureFailPoint: 'disableSnapshotting', mode: 'alwaysOn'}));
 
    const session2 = primary.startSession();
    const sessionDb2 = session2.getDatabase(dbName);
    const sessionColl2 = sessionDb2[txnName];
    session2.startTransaction();
    assert.commandWorked(sessionColl2.insert({c: 1}));
    session2.commitTransaction();
 
    rollbackTest.transitionToRollbackOperations();
 
    session2.startTransaction();
    assert.commandWorked(sessionColl2.insert({d: 1}));
    session2.commitTransaction();
 
    const session3 = primary.startSession();
    const sessionDb3 = session3.getDatabase(dbName);
    const sessionColl3 = sessionDb3[txnName];
    session3.startTransaction();
    assert.commandWorked(sessionColl3.insert({e: 1}));
    session3.commitTransaction();
 
    rollbackTest.transitionToSyncSourceOperationsBeforeRollback();
    rollbackTest.transitionToSyncSourceOperationsDuringRollback();
    try {
        rollbackTest.transitionToSteadyStateOperations();
    } finally {
        assert.commandWorked(
            primary.adminCommand({configureFailPoint: 'disableSnapshotting', mode: 'off'}));
    }
 
    rollbackTest.stop();
})();

Participants:
Case:

 Description   

When an applyOps entry causes a record to be upserted into the config.transactions table, it's impossible to know whether the entry changed the count of the collection or not. If it's a new session it will change the count, but if it's an existing session it won't. We would need to actually inspect the table for the existence of the session to correct this.



 Comments   
Comment by Githook User [ 26/Sep/19 ]

Author:

{'username': 'judahschvimer', 'email': 'judah.schvimer@10gen.com', 'name': 'Judah Schvimer'}

Message: SERVER-42549 Remove TODO listed in SERVER-35483
Branch: master
https://github.com/mongodb/mongo/commit/3cd26c83f68ee35d5c9f9b7b1cea240b41104ade

Comment by Gregory McKeon (Inactive) [ 12/Jun/18 ]

We don't use this internally, and users shouldn't either.

Comment by Spencer Brody (Inactive) [ 11/Jun/18 ]

Could we tell by checking the 'nUpserted' field of the update results to see if a doc was actually inserted or not?

Generated at Thu Feb 08 04:39:57 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.