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();
}());
|