|
| 1 | +/** |
| 2 | + * Test replication recovery as standalone with 'recoverToOplogTimestamp' in read-only mode |
| 3 | + * (i.e. queryableBackupMode). |
| 4 | + * |
| 5 | + * @tags: [ |
| 6 | + * requires_majority_read_concern, |
| 7 | + * requires_persistence, |
| 8 | + * requires_replication, |
| 9 | + * requires_wiredtiger, |
| 10 | + * ] |
| 11 | + */ |
| 12 | + |
| 13 | +(function() { |
| 14 | +"use strict"; |
| 15 | + |
| 16 | +const dbName = "test"; |
| 17 | +const collName = "foo"; |
| 18 | + |
| 19 | +const rst = new ReplSetTest({nodes: 1}); |
| 20 | +rst.startSet(); |
| 21 | +rst.initiateWithHighElectionTimeout(); |
| 22 | +const primary = rst.getPrimary(); |
| 23 | +const primaryDB = primary.getDB(dbName); |
| 24 | + |
| 25 | +const recoveryTimestamp = assert.commandWorked(primaryDB.runCommand({ping: 1})).operationTime; |
| 26 | + |
| 27 | +// Hold back the recovery timestamp before doing another write so we have some oplog entries to |
| 28 | +// apply when restart in queryableBackupMode with recoverToOplogTimestamp. |
| 29 | +assert.commandWorked(primaryDB.adminCommand({ |
| 30 | + "configureFailPoint": 'holdStableTimestampAtSpecificTimestamp', |
| 31 | + "mode": 'alwaysOn', |
| 32 | + "data": {"timestamp": recoveryTimestamp} |
| 33 | +})); |
| 34 | + |
| 35 | +const docs = [{_id: 1}]; |
| 36 | +const operationTime = |
| 37 | + assert.commandWorked(primaryDB.runCommand({insert: collName, documents: docs})).operationTime; |
| 38 | + |
| 39 | +rst.stopSet(/*signal=*/null, /*forRestart=*/true); |
| 40 | + |
| 41 | +// Restart as standalone in queryableBackupMode and run replication recovery up to the last insert. |
| 42 | +const primaryStandalone = MongoRunner.runMongod({ |
| 43 | + dbpath: primary.dbpath, |
| 44 | + noReplSet: true, |
| 45 | + noCleanData: true, |
| 46 | + setParameter: {recoverToOplogTimestamp: tojson({timestamp: operationTime})}, |
| 47 | + queryableBackupMode: "" |
| 48 | +}); |
| 49 | + |
| 50 | +// Test that the last insert is visible after replication recovery. |
| 51 | +assert.eq(primaryStandalone.getDB(dbName)[collName].find().toArray(), docs); |
| 52 | + |
| 53 | +MongoRunner.stopMongod(primaryStandalone); |
| 54 | +}()); |
0 commit comments