summaryrefslogtreecommitdiff
path: root/jstests/disk/killall.js
blob: beb3e99e778edf828629f52ab9ccb2a75a2c8a7c (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
/**
 * Verify that killing an instance of mongod while it is in a long running computation or infinite
 * loop still leads to clean shutdown, and that said shutdown is prompt.
 *
 * For our purposes, "prompt" is defined as "before stopMongod() decides to send a SIGKILL", which
 * would not result in a zero return code.
 */

var baseName = "jstests_disk_killall";
var dbpath = MongoRunner.dataPath + baseName;

var mongod = MongoRunner.runMongod({dbpath: dbpath});
var db = mongod.getDB( "test" );
var collection = db.getCollection( baseName );
assert.writeOK(collection.insert({}));

var awaitShell = startParallelShell(
            "db." + baseName + ".count( { $where: function() { while( 1 ) { ; } } } )",
            mongod.port);
sleep( 1000 );

/**
 * 0 == mongod's exit code on Windows, or when it receives TERM, HUP or INT signals.  On UNIX
 * variants, stopMongod sends a TERM signal to mongod, then waits for mongod to stop.  If mongod
 * doesn't stop in a reasonable amount of time, stopMongod sends a KILL signal, in which case mongod
 * will not exit cleanly.  We're checking in this assert that mongod will stop quickly even while
 * evaling an infinite loop in server side js.
 */
var exitCode = MongoRunner.stopMongod(mongod);
assert.eq(0, exitCode, "got unexpected exitCode");

// Waits for shell to complete
exitCode = awaitShell({checkExitSuccess: false});
assert.neq(0, exitCode, "expected shell to exit abnormally due to mongod being terminated");

mongod = MongoRunner.runMongod({
    port: mongod.port,
    restart: true,
    cleanData: false,
    dbpath: mongod.dbpath
});
db = mongod.getDB( "test" );
collection = db.getCollection( baseName );

assert( collection.stats().ok );
assert( collection.drop() );

MongoRunner.stopMongod(mongod);