summaryrefslogtreecommitdiff
path: root/jstests/noPassthrough/dropdatabase_respect_maxtimems.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/noPassthrough/dropdatabase_respect_maxtimems.js')
-rw-r--r--jstests/noPassthrough/dropdatabase_respect_maxtimems.js70
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();