summaryrefslogtreecommitdiff
path: root/jstests/sharding/killop.js
blob: 7f2e4d231739888e20611f533335ff58f1449e35 (plain)
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
59
60
61
62
63
64
65
66
67
// Confirms basic killOp execution via mongos.
// @tags: [requires_replication, requires_sharding]

(function() {
"use strict";

const st = new ShardingTest({shards: 2});
const conn = st.s;

const db = conn.getDB("killOp");
const coll = db.test;
assert.writeOK(db.getCollection(coll.getName()).insert({x: 1}));

const kFailPointName = "waitInFindBeforeMakingBatch";
assert.commandWorked(conn.adminCommand({"configureFailPoint": kFailPointName, "mode": "alwaysOn"}));

const queryToKill = `assert.commandFailedWithCode(db.getSiblingDB('${db.getName()}')` +
    `.runCommand({find: '${coll.getName()}', filter: {x: 1}}), ErrorCodes.Interrupted);`;
const awaitShell = startParallelShell(queryToKill, conn.port);

function runCurOp() {
    const filter = {"ns": coll.getFullName(), "command.filter": {x: 1}};
    return db.getSiblingDB("admin")
        .aggregate([{$currentOp: {localOps: true}}, {$match: filter}])
        .toArray();
}

let opId;

// Wait for the operation to start.
assert.soon(
    function() {
        const result = runCurOp();

        // Check the 'msg' field to be sure that the failpoint has been reached.
        if (result.length === 1 && result[0].msg === kFailPointName) {
            opId = result[0].opid;

            return true;
        }

        return false;
    },
    function() {
        return "Failed to find operation in currentOp() output: " +
            tojson(db.currentOp({"ns": coll.getFullName()}));
    });

// Kill the operation.
assert.commandWorked(db.killOp(opId));

// Ensure that the operation gets marked kill pending while it's still hanging.
let result = runCurOp();
assert(result.length === 1, tojson(result));
assert(result[0].hasOwnProperty("killPending"));
assert.eq(true, result[0].killPending);

// Release the failpoint. The operation should check for interrupt and then finish.
assert.commandWorked(conn.adminCommand({"configureFailPoint": kFailPointName, "mode": "off"}));

awaitShell();

result = runCurOp();
assert(result.length === 0, tojson(result));

st.stop();
})();