diff options
Diffstat (limited to 'jstests/noPassthrough/dropdatabase_respect_maxtimems.js')
-rw-r--r-- | jstests/noPassthrough/dropdatabase_respect_maxtimems.js | 70 |
1 files changed, 46 insertions, 24 deletions
diff --git a/jstests/noPassthrough/dropdatabase_respect_maxtimems.js b/jstests/noPassthrough/dropdatabase_respect_maxtimems.js index db93575c993..a6f16456a7a 100644 --- a/jstests/noPassthrough/dropdatabase_respect_maxtimems.js +++ b/jstests/noPassthrough/dropdatabase_respect_maxtimems.js @@ -7,17 +7,30 @@ const rst = ReplSetTest({nodes: 1}); rst.startSet(); rst.initiate(); -const adminDB = rst.getPrimary().getDB("admin"); -const txnDB = rst.getPrimary().getDB("txn"); const dropDB = rst.getPrimary().getDB("drop"); -(function assertColletionDropCanBeInterrupted() { - assert.commandWorked(txnDB.foo.insert({})); +const waitForCommand = function(waitingFor, opFilter) { + let opId = -1; + assert.soon(function() { + print(`Checking for ${waitingFor}`); + const curopRes = dropDB.getSiblingDB("admin").currentOp(); + assert.commandWorked(curopRes); + const foundOp = curopRes["inprog"].filter(opFilter); + + if (foundOp.length == 1) { + opId = foundOp[0]["opid"]; + } + return (foundOp.length == 1); + }); + return opId; +}; + +(function assertCollectionDropCanBeInterrupted() { assert.commandWorked(dropDB.bar.insert({})); - const session = txnDB.getMongo().startSession({causalConsistency: false}); - const sessionDB = session.getDatabase("txn"); + const session = dropDB.getMongo().startSession({causalConsistency: false}); + const sessionDB = session.getDatabase("drop"); session.startTransaction(); - assert.commandWorked(sessionDB.foo.insert({})); + assert.commandWorked(sessionDB.bar.insert({})); assert.commandFailedWithCode(dropDB.runCommand({dropDatabase: 1, maxTimeMS: 100}), ErrorCodes.MaxTimeMSExpired); @@ -26,38 +39,47 @@ const dropDB = rst.getPrimary().getDB("drop"); })(); (function assertDatabaseDropCanBeInterrupted() { - assert.commandWorked(txnDB.foo.insert({})); + load("jstests/libs/check_log.js"); + assert.commandWorked(dropDB.bar.insert({})); assert.commandWorked(rst.getPrimary().adminCommand( {configureFailPoint: "dropDatabaseHangAfterAllCollectionsDrop", mode: "alwaysOn"})); // This will get blocked by the failpoint when collection drop phase finishes. - let dropDatabaseShell = startParallelShell( - "assert.commandFailedWithCode(db.getSiblingDB(\"drop\").runCommand({dropDatabase: 1, maxTimeMS: 5000}), ErrorCodes.MaxTimeMSExpired);", - rst.getPrimary().port); + let dropDatabaseShell = startParallelShell(() => { + assert.commandFailedWithCode( + db.getSiblingDB("drop").runCommand({dropDatabase: 1, maxTimeMS: 5000}), + ErrorCodes.MaxTimeMSExpired); + }, rst.getPrimary().port); - assert.soon(function() { - const sessionFilter = {active: true, "command.dropDatabase": 1}; - const res = adminDB.aggregate([{$currentOp: {}}, {$match: sessionFilter}]); - return res.hasNext(); - }, "Timeout waiting for dropDatabase to start"); + checkLog.contains( + dropDB.getMongo(), + "dropDatabase - fail point dropDatabaseHangAfterAllCollectionsDrop enabled. Blocking until fail point is disabled."); - const session = txnDB.getMongo().startSession({causalConsistency: false}); - const sessionDB = session.getDatabase("txn"); - session.startTransaction(); - assert.commandWorked(sessionDB.foo.insert({})); + let sleepCommand = startParallelShell(() => { + // Make dropDatabase timeout. + assert.commandFailedWithCode( + db.getSiblingDB("drop").adminCommand( + {sleep: 1, secs: 500, lockTarget: "drop", lock: "ir", $comment: "Lock sleep"}), + ErrorCodes.Interrupted); + }, rst.getPrimary().port); + + checkLog.contains(dropDB.getMongo(), "test only command sleep invoked"); // dropDatabase now gets unblocked by the failpoint but will immediately - // get blocked by acquiring the GlobalWrite lock for dropping the database. + // get blocked by acquiring the database lock for dropping the database. assert.commandWorked(rst.getPrimary().adminCommand( {configureFailPoint: "dropDatabaseHangAfterAllCollectionsDrop", mode: "off"})); - // This should timeout. dropDatabaseShell(); - assert.commandWorked(session.commitTransaction_forTesting()); - session.endSession(); + // Interrupt the sleep command. + const sleepID = waitForCommand( + "sleepCmd", op => (op["ns"] == "admin.$cmd" && op["command"]["$comment"] == "Lock sleep")); + assert.commandWorked(dropDB.getSiblingDB("admin").killOp(sleepID)); + + sleepCommand(); })(); rst.stopSet(); |