summaryrefslogtreecommitdiff
path: root/jstests/noPassthrough/cursor_timeout.js
blob: 46a054da0eaf5344ee45ba6e03a14c614e17a4d4 (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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Basic integration tests for the background job that periodically kills idle cursors, in both
// mongod and mongos.  This test creates the following four cursors:
//
// 1. A no-timeout cursor through mongos.
// 2. A no-timeout cursor through mongod.
// 3. A normal cursor through mongos.
// 4. A normal cursor through mongod.
//
// After a period of inactivity, the test asserts that cursors #1 and #2 are still alive, and that
// #3 and #4 have been killed.

var st = new ShardingTest({
    shards: 2,
    other: {
        chunkSize: 1,
        shardOptions: {setParameter: "cursorTimeoutMillis=1000"},
        mongosOptions: {setParameter: "cursorTimeoutMillis=1000"}
    }
});
st.stopBalancer();

var adminDB = st.admin;
var configDB = st.config;
var coll = st.s.getDB('test').user;

adminDB.runCommand({enableSharding: coll.getDB().getName()});
st.ensurePrimaryShard(coll.getDB().getName(), 'shard0001');
adminDB.runCommand({shardCollection: coll.getFullName(), key: {x: 1}});

var data = 'c';
for (var x = 0; x < 18; x++) {
    data += data;
}

for (x = 0; x < 200; x++) {
    coll.insert({x: x, v: data});
}

var chunkDoc = configDB.chunks.findOne();
var chunkOwner = chunkDoc.shard;
var toShard = configDB.shards.findOne({_id: {$ne: chunkOwner}})._id;
var cmd = {moveChunk: coll.getFullName(), find: chunkDoc.min, to: toShard, _waitForDelete: true};
var res = adminDB.runCommand(cmd);

jsTest.log('move result: ' + tojson(res));

var shardedCursorWithTimeout = coll.find();
var shardedCursorWithNoTimeout = coll.find();
shardedCursorWithNoTimeout.addOption(DBQuery.Option.noTimeout);

// Query directly to mongod
var shardHost = configDB.shards.findOne({_id: chunkOwner}).host;
var mongod = new Mongo(shardHost);
var shardColl = mongod.getCollection(coll.getFullName());

var cursorWithTimeout = shardColl.find();
var cursorWithNoTimeout = shardColl.find();
cursorWithNoTimeout.addOption(DBQuery.Option.noTimeout);

shardedCursorWithTimeout.next();
shardedCursorWithNoTimeout.next();

cursorWithTimeout.next();
cursorWithNoTimeout.next();

// Wait until the idle cursor background job has killed the cursors that do not have the "no
// timeout" flag set.  We use the "cursorTimeoutMillis" setParameter above to reduce the amount of
// time we need to wait here.
sleep(5000);

assert.throws(function() {
    shardedCursorWithTimeout.itcount();
});
assert.throws(function() {
    cursorWithTimeout.itcount();
});

// +1 because we already advanced once
assert.eq(coll.count(), shardedCursorWithNoTimeout.itcount() + 1);

assert.eq(shardColl.count(), cursorWithNoTimeout.itcount() + 1);

st.stop();