summaryrefslogtreecommitdiff
path: root/jstests/core/rollback_index_drop.js
blob: 3e7c3a9795277ff02f3267f3bfbca783ef417ca1 (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
// Test that when an index drop rolls back, the index remains valid, and the server continues to
// correctly maintain the index's set of keys.
//
// This test was designed to reproduce SERVER-38372.
//
// @tags: [does_not_support_stepdowns, assumes_unsharded_collection]
(function() {
    "use strict";

    const coll = db.rollback_index_drop;
    coll.drop();

    assert.commandWorked(coll.insert([{a: 1}, {a: 2}, {a: 3}]));
    assert.commandWorked(coll.createIndex({a: 1}));

    // Verify that the index has the expected set of keys.
    assert.eq([{a: 1}, {a: 2}, {a: 3}],
              coll.find().hint({a: 1}).sort({a: 1}).returnKey().toArray());

    // Run a dropIndexes command that attempts to drop both {a: 1} and an invalid index. This should
    // cause the drop of {a: 1} to rollback, since the set of index drops happen atomically.
    assert.commandFailedWithCode(
        db.runCommand({dropIndexes: coll.getName(), index: ["a_1", "unknown"]}),
        ErrorCodes.IndexNotFound);

    // Verify that the {a: 1} index is still present in listIndexes output.
    const indexList = coll.getIndexes();
    assert.neq(undefined, indexList.find((idx) => idx.name === "a_1"), indexList);

    // Write to the collection and ensure that the resulting set of index keys is correct.
    assert.commandWorked(coll.update({a: 3}, {$inc: {a: 1}}));
    assert.commandWorked(coll.insert({a: 5}));
    assert.eq([{a: 1}, {a: 2}, {a: 4}, {a: 5}],
              coll.find().hint({a: 1}).sort({a: 1}).returnKey().toArray());
}());