summaryrefslogtreecommitdiff
path: root/jstests/noPassthrough/timeseries_compression_fail.js
blob: 5ab5c79c3fbc9b2d66bf26ff3747b1c98dc1e657 (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
/**
 * Tests that the server can detect when timeseries bucket compression is not decompressible without
 * data loss. Bucket should remain uncompressed and we log that this happened.
 */
(function() {
"use strict";

load("jstests/libs/feature_flag_util.js");

let conn = MongoRunner.runMongod();

const dbName = jsTestName();
const db = conn.getDB(dbName);
const coll = db.getCollection('t');

// Only run test when bucket compression is enabled
if (!FeatureFlagUtil.isEnabled(db, "TimeseriesBucketCompression")) {
    MongoRunner.stopMongod(conn);
    return;
}

// Assumes each bucket has a limit of 1000 measurements.
const bucketMaxCount = 1000;
const numDocs = bucketMaxCount + 100;

// Simulate compression data loss by enabling fail point
assert.commandWorked(db.adminCommand(
    {configureFailPoint: "simulateBsonColumnCompressionDataLoss", mode: "alwaysOn"}));

// Create timeseries collection
assert.commandWorked(db.createCollection(coll.getName(), {timeseries: {timeField: "time"}}));

const bucketsColl = db.getCollection('system.buckets.' + coll.getName());

// Insert enough documents to trigger bucket compression
for (let i = 0; i < numDocs; i++) {
    let doc = {_id: i, time: ISODate(), x: i};
    assert.commandWorked(coll.insert(doc), 'failed to insert docs: ' + tojson(doc));
}

// Check for "Time-series bucket compression failed due to decompression data loss" log entry
checkLog.containsJson(conn, 6179301);

// Check for "numFailedDecompressBuckets" in collStats
const stats = assert.commandWorked(coll.stats());
assert(stats.timeseries.hasOwnProperty('numFailedDecompressBuckets'));
assert.gt(stats.timeseries["numFailedDecompressBuckets"], 0);

// Check that we did not compress the bucket
const bucketDocs = bucketsColl.find().sort({'control.min._id': 1}).toArray();
assert.eq(2, bucketDocs.length, tojson(bucketDocs));
assert.eq(1, bucketDocs[0].control.version);
assert.eq(1, bucketDocs[1].control.version);

MongoRunner.stopMongod(conn);
})();