0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-12-01 01:21:03 +01:00
mongodb/jstests/noPassthrough/killop.js
2019-07-27 11:02:23 -04:00

73 lines
2.6 KiB
JavaScript

// Confirms basic killOp execution via mongod and mongos.
// @tags: [requires_replication, requires_sharding]
(function() {
"use strict";
const dbName = "killop";
const collName = "test";
// 'conn' is a connection to either a mongod when testing a replicaset or a mongos when testing
// a sharded cluster. 'shardConn' is a connection to the mongod we enable failpoints on.
function runTest(conn, shardConn) {
const db = conn.getDB(dbName);
assert.commandWorked(db.dropDatabase());
assert.writeOK(db.getCollection(collName).insert({x: 1}));
assert.commandWorked(
shardConn.adminCommand({setParameter: 1, internalQueryExecYieldIterations: 1}));
assert.commandWorked(
shardConn.adminCommand({"configureFailPoint": "setYieldAllLocksHang", "mode": "alwaysOn"}));
const queryToKill = "assert.commandWorked(db.getSiblingDB('" + dbName +
"').runCommand({find: '" + collName + "', filter: {x: 1}}));";
const awaitShell = startParallelShell(queryToKill, conn.port);
let opId;
assert.soon(
function() {
const result = db.currentOp({"ns": dbName + "." + collName, "command.filter": {x: 1}});
assert.commandWorked(result);
if (result.inprog.length === 1 && result.inprog[0].numYields > 0) {
opId = result.inprog[0].opid;
return true;
}
return false;
},
function() {
return "Failed to find operation in currentOp() output: " +
tojson(db.currentOp({"ns": dbName + "." + collName}));
});
assert.commandWorked(db.killOp(opId));
let result = db.currentOp({"ns": dbName + "." + collName, "command.filter": {x: 1}});
assert.commandWorked(result);
assert(result.inprog.length === 1, tojson(db.currentOp()));
assert(result.inprog[0].hasOwnProperty("killPending"));
assert.eq(true, result.inprog[0].killPending);
assert.commandWorked(
shardConn.adminCommand({"configureFailPoint": "setYieldAllLocksHang", "mode": "off"}));
const exitCode = awaitShell({checkExitSuccess: false});
assert.neq(0, exitCode, "Expected shell to exit with failure due to operation kill");
result = db.currentOp({"ns": dbName + "." + collName, "query.filter": {x: 1}});
assert.commandWorked(result);
assert(result.inprog.length === 0, tojson(db.currentOp()));
}
const st = new ShardingTest({shards: 1, rs: {nodes: 1}, mongos: 1});
const shardConn = st.rs0.getPrimary();
// Test killOp against mongod.
runTest(shardConn, shardConn);
// Test killOp against mongos.
runTest(st.s, shardConn);
st.stop();
})();