summaryrefslogtreecommitdiff
path: root/jstests/sharding/collection_uuid_drop_indexes.js
blob: 660c2bddfddae40bc178683ce87ab668fd79c224 (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
/**
 * Tests the collectionUUID parameter of the dropIndexes command when one collection is sharded and
 * the other collection is unsharded.
 *
 * @tags: [
 *   requires_fcv_60,
 * ]
 */
(function() {
'use strict';

const st = new ShardingTest({shards: 2});
const mongos = st.s;

const db = mongos.getDB(jsTestName());
assert.commandWorked(mongos.adminCommand({enableSharding: db.getName()}));
assert.commandWorked(mongos.adminCommand({movePrimary: db.getName(), to: st.shard0.name}));

const shardedColl = db.sharded;
const unshardedColl = db.unsharded;

assert.commandWorked(shardedColl.insert({_id: 0}));
assert.commandWorked(shardedColl.insert({_id: 1}));
assert.commandWorked(unshardedColl.insert({_id: 2}));

const uuid = function(coll) {
    return assert.commandWorked(db.runCommand({listCollections: 1}))
        .cursor.firstBatch.find(c => c.name === coll.getName())
        .info.uuid;
};

assert.commandWorked(
    mongos.adminCommand({shardCollection: shardedColl.getFullName(), key: {_id: 1}}));

// Move {_id: 0} to shard0 and {_id: 1} to shard1.
assert.commandWorked(st.splitAt(shardedColl.getFullName(), {_id: 1}));
assert.commandWorked(mongos.adminCommand(
    {moveChunk: shardedColl.getFullName(), find: {_id: 0}, to: st.shard0.shardName}));
assert.commandWorked(mongos.adminCommand(
    {moveChunk: shardedColl.getFullName(), find: {_id: 1}, to: st.shard1.shardName}));

assert.commandWorked(shardedColl.createIndex({a: 1}));
assert.commandWorked(unshardedColl.createIndex({a: 1}));

// Run the command on the collection which is sharded, while specifying the UUID of the unsharded
// collection that exists only on shard0.
let res = assert.commandFailedWithCode(db.runCommand({
    dropIndexes: shardedColl.getName(),
    index: {a: 1},
    collectionUUID: uuid(unshardedColl),
}),
                                       ErrorCodes.CollectionUUIDMismatch);
assert.eq(res.db, db.getName());
assert.eq(res.collectionUUID, uuid(unshardedColl));
assert.eq(res.expectedCollection, shardedColl.getName());
assert.eq(res.actualCollection, unshardedColl.getName());

// Run the command on the collection which is unsharded and exists only on shard0, while specifying
// the UUID of the collection that is sharded.
res = assert.commandFailedWithCode(db.runCommand({
    dropIndexes: unshardedColl.getName(),
    index: {a: 1},
    collectionUUID: uuid(shardedColl),
}),
                                   ErrorCodes.CollectionUUIDMismatch);
assert.eq(res.db, db.getName());
assert.eq(res.collectionUUID, uuid(shardedColl));
assert.eq(res.expectedCollection, unshardedColl.getName());
assert.eq(res.actualCollection, shardedColl.getName());

st.stop();
})();