diff options
Diffstat (limited to 'jstests/replsets/initial_sync_fcv.js')
-rw-r--r-- | jstests/replsets/initial_sync_fcv.js | 163 |
1 files changed, 81 insertions, 82 deletions
diff --git a/jstests/replsets/initial_sync_fcv.js b/jstests/replsets/initial_sync_fcv.js index a0fd4420548..af0a466848c 100644 --- a/jstests/replsets/initial_sync_fcv.js +++ b/jstests/replsets/initial_sync_fcv.js @@ -5,86 +5,85 @@ */ (function() { - 'use strict'; - - load("jstests/libs/feature_compatibility_version.js"); - load('jstests/libs/check_log.js'); - - const rst = new ReplSetTest({nodes: 2}); - rst.startSet(); - - // We disallow the secondary node from voting so that the primary's featureCompatibilityVersion - // can be modified while the secondary node is still waiting to complete its initial sync. - const replSetConfig = rst.getReplSetConfig(); - replSetConfig.members[1].priority = 0; - replSetConfig.members[1].votes = 0; - rst.initiate(replSetConfig); - - const primary = rst.getPrimary(); - const dbName = 'foo'; - const collName = 'bar'; - - assert.writeOK(primary.getDB(dbName).getCollection(collName).insert({a: 1})); - - function runInitialSync(cmd, initialFCV) { - assert.commandWorked(primary.adminCommand({setFeatureCompatibilityVersion: initialFCV})); - - jsTestLog('Testing setting fCV with ' + tojson(cmd)); - - const failPointOptions = tojson({mode: 'alwaysOn', data: {database: dbName}}); - rst.restart(1, { - startClean: true, - setParameter: { - 'failpoint.initialSyncHangBeforeListCollections': failPointOptions, - 'failpoint.skipClearInitialSyncState': tojson({mode: 'alwaysOn'}), - numInitialSyncAttempts: 2 - } - }); - const secondary = rst.nodes[1]; - - // Initial sync clones the 'admin' database first, which will set the fCV on the - // secondary to initialFCV. We then block the secondary before issuing 'listCollections' on - // the test database. - checkLog.contains(secondary, - 'initial sync - initialSyncHangBeforeListCollections fail point enabled'); - - // Initial sync is stopped right before 'listCollections' on the test database. We now run - // the test command to modify the fCV. - assert.commandWorked(primary.adminCommand(cmd)); - - // Let initial sync finish, making sure that it fails due to the feature compatibility - // version change. - assert.commandWorked(secondary.adminCommand( - {configureFailPoint: 'initialSyncHangBeforeListCollections', mode: 'off'})); - checkLog.contains(secondary, - 'Applying operation on feature compatibility version document'); - - jsTestLog('Wait for both nodes to be up-to-date'); - rst.awaitSecondaryNodes(); - rst.awaitReplication(); - - let res = assert.commandWorked(secondary.adminCommand({replSetGetStatus: 1})); - assert.eq(res.initialSyncStatus.failedInitialSyncAttempts, 1); - - // We check oplogs and data hashes before we restart the second node. - rst.checkOplogs(); - rst.checkReplicatedDataHashes(); - } - - // Ensure that attempting to downgrade the featureCompatibilityVersion during initial sync - // fails. - runInitialSync({setFeatureCompatibilityVersion: lastStableFCV}, /*initialFCV*/ latestFCV); - - // Ensure that attempting to upgrade the featureCompatibilityVersion during initial sync fails. - runInitialSync({setFeatureCompatibilityVersion: latestFCV}, /*initialFCV*/ lastStableFCV); - - // Modifications to the featureCompatibilityVersion document during initial sync should be - // caught and cause initial sync to fail. - runInitialSync({ - update: 'system.version', - updates: [{q: {_id: 'featureCompatibilityVersion'}, u: {'version': lastStableFCV}}] - }, - /*initialFCV*/ latestFCV); - - rst.stopSet(); +'use strict'; + +load("jstests/libs/feature_compatibility_version.js"); +load('jstests/libs/check_log.js'); + +const rst = new ReplSetTest({nodes: 2}); +rst.startSet(); + +// We disallow the secondary node from voting so that the primary's featureCompatibilityVersion +// can be modified while the secondary node is still waiting to complete its initial sync. +const replSetConfig = rst.getReplSetConfig(); +replSetConfig.members[1].priority = 0; +replSetConfig.members[1].votes = 0; +rst.initiate(replSetConfig); + +const primary = rst.getPrimary(); +const dbName = 'foo'; +const collName = 'bar'; + +assert.writeOK(primary.getDB(dbName).getCollection(collName).insert({a: 1})); + +function runInitialSync(cmd, initialFCV) { + assert.commandWorked(primary.adminCommand({setFeatureCompatibilityVersion: initialFCV})); + + jsTestLog('Testing setting fCV with ' + tojson(cmd)); + + const failPointOptions = tojson({mode: 'alwaysOn', data: {database: dbName}}); + rst.restart(1, { + startClean: true, + setParameter: { + 'failpoint.initialSyncHangBeforeListCollections': failPointOptions, + 'failpoint.skipClearInitialSyncState': tojson({mode: 'alwaysOn'}), + numInitialSyncAttempts: 2 + } + }); + const secondary = rst.nodes[1]; + + // Initial sync clones the 'admin' database first, which will set the fCV on the + // secondary to initialFCV. We then block the secondary before issuing 'listCollections' on + // the test database. + checkLog.contains(secondary, + 'initial sync - initialSyncHangBeforeListCollections fail point enabled'); + + // Initial sync is stopped right before 'listCollections' on the test database. We now run + // the test command to modify the fCV. + assert.commandWorked(primary.adminCommand(cmd)); + + // Let initial sync finish, making sure that it fails due to the feature compatibility + // version change. + assert.commandWorked(secondary.adminCommand( + {configureFailPoint: 'initialSyncHangBeforeListCollections', mode: 'off'})); + checkLog.contains(secondary, 'Applying operation on feature compatibility version document'); + + jsTestLog('Wait for both nodes to be up-to-date'); + rst.awaitSecondaryNodes(); + rst.awaitReplication(); + + let res = assert.commandWorked(secondary.adminCommand({replSetGetStatus: 1})); + assert.eq(res.initialSyncStatus.failedInitialSyncAttempts, 1); + + // We check oplogs and data hashes before we restart the second node. + rst.checkOplogs(); + rst.checkReplicatedDataHashes(); +} + +// Ensure that attempting to downgrade the featureCompatibilityVersion during initial sync +// fails. +runInitialSync({setFeatureCompatibilityVersion: lastStableFCV}, /*initialFCV*/ latestFCV); + +// Ensure that attempting to upgrade the featureCompatibilityVersion during initial sync fails. +runInitialSync({setFeatureCompatibilityVersion: latestFCV}, /*initialFCV*/ lastStableFCV); + +// Modifications to the featureCompatibilityVersion document during initial sync should be +// caught and cause initial sync to fail. +runInitialSync({ + update: 'system.version', + updates: [{q: {_id: 'featureCompatibilityVersion'}, u: {'version': lastStableFCV}}] +}, + /*initialFCV*/ latestFCV); + +rst.stopSet(); })(); |