1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
// Test that the dataSize command can be interrupted. Failpoint is defined for mongod only,
// therefore this test is running only in unsharded setup.
(function() {
"use strict";
load("jstests/libs/fail_point_util.js"); // For configureFailPoint.
load("jstests/libs/wait_for_command.js"); // For waitForCommand.
load("jstests/libs/parallel_shell_helpers.js"); // For funWithArgs.
const mongodOptions = {};
const conn = MongoRunner.runMongod(mongodOptions);
assert.neq(null, conn, `mongod failed to start with options ${tojson(mongodOptions)}`);
const dbName = `${jsTest.name()}_db`;
const db = conn.getDB(dbName);
assert.commandWorked(db.dropDatabase());
assert.commandWorked(db.createCollection("foo"));
const coll = db.foo;
coll.drop();
coll.insert({_id: 0, s: "asdasdasdasdasdasdasd"});
const dataSizeCommand = {
"dataSize": dbName + ".foo",
"keyPattern": {"_id": 1},
"min": {"_id": 0},
"max": {"_id": 1}
};
// Set the yield iterations to 1 such that on every getNext() call we check for yield or interrupt.
assert.commandWorked(db.adminCommand({setParameter: 1, internalQueryExecYieldIterations: 1}));
// Configure the failpoint.
const failpoint = configureFailPoint(db, "hangBeforeDatasizeCount");
// Launch a parallel shell that runs the dataSize command, that should fail due to interrupt.
const awaitShell =
startParallelShell(funWithArgs(function(cmd) {
assert.commandFailedWithCode(db.runCommand(cmd), ErrorCodes.Interrupted);
}, dataSizeCommand), db.getMongo().port);
failpoint.wait();
// Find the command opid and kill it.
const opId =
waitForCommand("dataSizeCmd", op => (op["command"]["dataSize"] == dbName + ".foo"), db);
assert.commandWorked(db.killOp(opId));
// The command is not killed just yet. It will be killed, after releasing the failpoint.
assert.neq(waitForCommand("dataSizeCmd", op => (op["command"]["dataSize"] == dbName + ".foo"), db),
-1);
failpoint.off();
awaitShell();
assert.commandWorked(db.dropDatabase());
MongoRunner.stopMongod(conn);
})();
|