mongo/jstests/sharding/collection_uuid_create_inde...

72 lines
2.5 KiB
JavaScript

/**
* Tests the collectionUUID parameter of the createIndexes command when one collection is sharded
* and the other collection is unsharded.
*
* @tags: [
* requires_fcv_60,
* ]
*/
import {ShardingTest} from "jstests/libs/shardingtest.js";
const st = new ShardingTest({shards: 2});
const mongos = st.s;
const db = mongos.getDB(jsTestName());
assert.commandWorked(mongos.adminCommand({enableSharding: db.getName(), primaryShard: 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}),
);
// 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({
createIndexes: shardedColl.getName(),
indexes: [{key: {a: 1}, name: "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({
createIndexes: unshardedColl.getName(),
indexes: [{key: {a: 1}, name: "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();