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
84
85
86
87
88
89
90
91
92
93
94
95
|
/**
* Test that time-series bucket collections support $_requestResumeToken and a subsequent
* $_resumeAfter.
*
* @tags: [
* # Queries on mongoS may not request or provide a resume token.
* assumes_against_mongod_not_mongos,
* does_not_support_stepdowns,
* does_not_support_transactions,
* requires_getmore,
* ]
*/
(function() {
"use strict";
load("jstests/core/timeseries/libs/timeseries.js");
TimeseriesTest.run((insert) => {
const timeFieldName = "time";
const coll = db.timeseries_resume_after;
coll.drop();
assert.commandWorked(
db.createCollection(coll.getName(), {timeseries: {timeField: timeFieldName}}));
const bucketsColl = db.getCollection("system.buckets." + coll.getName());
Random.setRandomSeed();
const numHosts = 10;
const hosts = TimeseriesTest.generateHosts(numHosts);
for (let i = 0; i < 100; i++) {
const host = TimeseriesTest.getRandomElem(hosts);
TimeseriesTest.updateUsages(host.fields);
assert.commandWorked(insert(coll, {
measurement: "cpu",
time: ISODate(),
fields: host.fields,
tags: host.tags,
}));
}
// Run the initial query and request to return a resume token. We're interested only in a single
// document, so 'batchSize' is set to 1.
let res = assert.commandWorked(db.runCommand({
find: bucketsColl.getName(),
hint: {$natural: 1},
batchSize: 1,
$_requestResumeToken: true
}));
// Make sure the query returned a resume token which will be used to resume the query from.
assert.hasFields(res.cursor, ["postBatchResumeToken"]);
let resumeToken = res.cursor.postBatchResumeToken;
jsTestLog("Got resume token " + tojson(resumeToken));
assert.neq(null, resumeToken.$recordId);
// Kill the cursor before attempting to resume.
assert.commandWorked(
db.runCommand({killCursors: bucketsColl.getName(), cursors: [res.cursor.id]}));
// Try to resume the query from the saved resume token.
res = assert.commandWorked(db.runCommand({
find: bucketsColl.getName(),
hint: {$natural: 1},
batchSize: 1,
$_requestResumeToken: true,
$_resumeAfter: resumeToken
}));
assert.hasFields(res.cursor, ["postBatchResumeToken"]);
resumeToken = res.cursor.postBatchResumeToken;
jsTestLog("Got resume token " + tojson(resumeToken));
assert.eq(null, resumeToken.$recordId);
// Try to resume from a null '$recordId'.
res = assert.commandWorked(db.runCommand({
find: bucketsColl.getName(),
hint: {$natural: 1},
batchSize: 1,
$_requestResumeToken: true,
$_resumeAfter: resumeToken
}));
assert.hasFields(res.cursor, ["postBatchResumeToken"]);
resumeToken = res.cursor.postBatchResumeToken;
jsTestLog("Got resume token " + tojson(resumeToken));
});
})();
|