summaryrefslogtreecommitdiff
path: root/jstests/replsets/transaction_commit_abort_on_secondaries.js
blob: 0353a034ea4d4e5e7c600d1e6d5258ca0944c2b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/**
 * Test that commitTransaction and abortTransaction commands work on replica set secondaries.
 *
 * @tags: [uses_transactions]
 */
(function() {
    "use strict";

    const dbName = "test";
    const collName = "transaction_commit_abort_on_secondaries";

    const rst = new ReplSetTest({name: collName, nodes: 2});
    rst.startSet();
    // We want a stable topology, so make the secondary unelectable.
    let config = rst.getReplSetConfig();
    config.members[1].priority = 0;
    rst.initiate(config);

    const primary = rst.getPrimary();
    const secondary = rst.getSecondary();
    const secondaryTestDB = secondary.getDB(dbName);

    // Do an initial write so we have something to find.
    const initialDoc = {_id: 0};
    assert.writeOK(primary.getDB(dbName)[collName].insert(initialDoc));
    rst.awaitLastOpCommitted();

    // Initiate a session on the secondary.
    const sessionOptions = {causalConsistency: false};
    const session = secondaryTestDB.getMongo().startSession(sessionOptions);
    const sessionDb = session.getDatabase(dbName);

    /**
     * Test commitTransaction.
     */

    jsTestLog("Start a read-only transaction on the secondary.");
    session.startTransaction({readConcern: {level: "snapshot"}});

    // Read a document.
    assert.eq(initialDoc, sessionDb[collName].findOne({}));

    jsTestLog("Make sure we can commit the transaction on the secondary.");
    session.commitTransaction();

    /**
     * Test abortTransaction.
     */

    jsTestLog("Start a read-only transaction on the secondary.");
    session.startTransaction({readConcern: {level: "snapshot"}});

    // Read a document.
    assert.eq(initialDoc, sessionDb[collName].findOne({}));

    jsTestLog("Make sure we can abort the transaction on the secondary.");
    assert.commandWorked(session.abortTransaction_forTesting());

    session.endSession();
    rst.stopSet();
}());