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
|
/**
* Test replication recovery as standalone with 'recoverToOplogTimestamp' in read-only mode
* (i.e. queryableBackupMode).
*
* @tags: [
* requires_majority_read_concern,
* requires_persistence,
* requires_replication,
* requires_wiredtiger,
* ]
*/
(function() {
"use strict";
const dbName = "test";
const collName = jsTestName();
const rst = new ReplSetTest({nodes: 1});
rst.startSet();
rst.initiateWithHighElectionTimeout();
const primary = rst.getPrimary();
const primaryDB = primary.getDB(dbName);
const recoveryTimestamp = assert.commandWorked(primaryDB.runCommand({ping: 1})).operationTime;
// Hold back the recovery timestamp before doing another write so we have some oplog entries to
// apply when restart in queryableBackupMode with recoverToOplogTimestamp.
assert.commandWorked(primaryDB.adminCommand({
"configureFailPoint": 'holdStableTimestampAtSpecificTimestamp',
"mode": 'alwaysOn',
"data": {"timestamp": recoveryTimestamp}
}));
assert.commandWorked(primaryDB.getCollection(collName).createIndex({a: 1}));
const docs = [{_id: 1, a: 1}];
const operationTime =
assert.commandWorked(primaryDB.runCommand({insert: collName, documents: docs})).operationTime;
rst.stopSet(/*signal=*/null, /*forRestart=*/true);
// Restart as standalone in queryableBackupMode and run replication recovery up to the last insert.
const primaryStandalone = MongoRunner.runMongod({
dbpath: primary.dbpath,
noReplSet: true,
noCleanData: true,
setParameter: {recoverToOplogTimestamp: tojson({timestamp: operationTime})},
queryableBackupMode: ""
});
// Test that the last insert is visible after replication recovery.
assert.eq(primaryStandalone.getDB(dbName)[collName].find().toArray(), docs);
MongoRunner.stopMongod(primaryStandalone);
}());
|