diff options
Diffstat (limited to 'jstests/noPassthrough/serverStatus_does_not_block_on_RSTL.js')
-rw-r--r-- | jstests/noPassthrough/serverStatus_does_not_block_on_RSTL.js | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/jstests/noPassthrough/serverStatus_does_not_block_on_RSTL.js b/jstests/noPassthrough/serverStatus_does_not_block_on_RSTL.js new file mode 100644 index 00000000000..40eb22187fb --- /dev/null +++ b/jstests/noPassthrough/serverStatus_does_not_block_on_RSTL.js @@ -0,0 +1,72 @@ +/** + * Tests that serverStatus is not blocked by an exclusive RSTL lock. Only enforcing on WT. + * + * @tags: [ + * # Certain serverStatus sections might pivot to taking the RSTL lock if an action is unsupported + * # by a non-WT storage engine. + * requires_wiredtiger, + * # Replication requires journaling support so this tag also implies exclusion from --nojournal + * # test configurations. + * requires_sharding, + * requires_replication, + * ] + */ +(function() { +"use strict"; + +load("jstests/libs/parallel_shell_helpers.js"); // startParallelShell +load("jstests/libs/wait_for_command.js"); // waitForCommand + +// Use a sharding environment in order to exercise the sharding specific serverStatus sections. +const st = new ShardingTest( + {mongos: 1, config: 1, shards: 1, rs: {nodes: 1, setParameter: {watchdogPeriodSeconds: 60}}}); +const testDB = st.rs0.getPrimary().getDB("test"); + +jsTestLog("Starting the sleep command in a parallel thread to take the RSTL MODE_X lock"); +let rstlXLockSleepJoin = startParallelShell(() => { + jsTestLog("Parallel Shell: about to start sleep command"); + assert.commandFailedWithCode(db.adminCommand({ + sleep: 1, + secs: 60 * 60, + // RSTL MODE_X lock. + lockTarget: "RSTL", + $comment: "RSTL lock sleep" + }), + ErrorCodes.Interrupted); +}, testDB.getMongo().port); + +jsTestLog("Waiting for the sleep command to start and fetch the opID"); +const sleepCmdOpID = + waitForCommand("RSTL lock", op => (op["command"]["$comment"] == "RSTL lock sleep"), testDB); + +jsTestLog("Wait for the sleep command to log that the RSTL MODE_X lock was acquired"); +checkLog.containsJson(testDB, 6001600); + +try { + jsTestLog("Running serverStatus concurrently with the RSTL X lock held by the sleep cmd"); + const serverStatusResult = assert.commandWorked(testDB.adminCommand({ + serverStatus: 1, + repl: 1, + mirroredReads: 1, + advisoryHostFQDNs: 1, + defaultRWConcern: 1, + heapProfile: 1, + http_client: 1, + latchAnalysis: 1, + opWriteConcernCounters: 1, + oplog: 1, + resourceConsumption: 1, + sharding: 1, + tenantMigrationAccessBlocker: 1, + watchdog: 1, + maxTimeMS: 20 * 1000 + })); + jsTestLog("ServerStatus results: " + tojson(serverStatusResult)); +} finally { + jsTestLog("Ensure the sleep cmd releases the lock so that the server can shutdown"); + assert.commandWorked(testDB.killOp(sleepCmdOpID)); // kill the sleep cmd + rstlXLockSleepJoin(); // wait for the thread running the sleep cmd to finish +} + +st.stop(); +})(); |