summaryrefslogtreecommitdiff
path: root/jstests/sharding/transactions_distinct_not_allowed_on_sharded_collections.js
blob: b87b5b25e9a89216e75ddf10545cdf44ab136835 (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
/**
 * Verifies running distinct in a multi document transaction on a sharded collection is not allowed.
 * This is because distinct does not filter orphaned documents.
 *
 * @tags: [uses_transactions]
 */
(function() {
"use strict";

load("jstests/sharding/libs/sharded_transactions_helpers.js");

const st = new ShardingTest({shards: 1});

// Set up a sharded and unsharded collection, each with one document.

const unshardedDbName = "unsharded_db";
const unshardedCollName = "unsharded_coll";

const shardedDbName = "sharded_db";
const shardedCollName = "sharded_coll";
const shardedNs = shardedDbName + "." + shardedCollName;

assert.commandWorked(st.s.adminCommand({enableSharding: shardedDbName}));
assert.commandWorked(st.s.adminCommand({shardCollection: shardedNs, key: {_id: 1}}));

const session = st.s.startSession();
const unshardedCollDB = session.getDatabase(unshardedDbName);
const shardedCollDB = session.getDatabase(shardedDbName);

assert.commandWorked(unshardedCollDB[unshardedCollName].insert({_id: "jack"}));
assert.commandWorked(shardedCollDB[shardedCollName].insert({_id: "jack"}));

// Reload metadata to avoid stale config or stale database version errors.
flushRoutersAndRefreshShardMetadata(st, {ns: shardedNs, dbNames: [unshardedDbName]});

// Can run distinct on an unsharded collection.
session.startTransaction();
assert.eq(unshardedCollDB.runCommand({distinct: unshardedCollName, key: "_id"}).values, ["jack"]);
assert.commandWorked(session.commitTransaction_forTesting());

// Cannot run distinct on a sharded collection.
session.startTransaction();
assert.commandFailedWithCode(shardedCollDB.runCommand({distinct: shardedCollName, key: "_id"}),
                             ErrorCodes.OperationNotSupportedInTransaction);
assert.commandFailedWithCode(session.abortTransaction_forTesting(), ErrorCodes.NoSuchTransaction);

session.endSession();
st.stop();
})();