summaryrefslogtreecommitdiff
path: root/jstests/sharding/create_new_collections_prepared_transactions.js
blob: 52aa344971f660f37dfdf93b2e7d0b734a108f6d (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
// Test that new collection creation fails in a cross-shard write transaction, but succeeds in a
// single-shard write transaction.
//
// @tags: [
//   requires_sharding,
//   uses_multi_shard_transaction,
//   uses_transactions,
// ]
(function() {
"use strict";

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

const dbNameShard0 = "test";
const dbNameShard2 = "testOther";
const collName = "foo";

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

// Create two databases with different shards as their primaries.

assert.commandWorked(
    st.s.getDB(dbNameShard0)[collName].insert({_id: 5}, {writeConcern: {w: "majority"}}));

assert.commandWorked(st.s.adminCommand({enableSharding: dbNameShard0}));
st.ensurePrimaryShard(dbNameShard0, st.shard0.shardName);

// Set up another collection with a different shard (shard2) as its primary shard.
assert.commandWorked(
    st.s.getDB(dbNameShard2)[collName].insert({_id: 4}, {writeConcern: {w: "majority"}}));
st.ensurePrimaryShard(dbNameShard2, st.shard2.shardName);

const session = st.s.getDB(dbNameShard0).getMongo().startSession({causalConsistency: false});

let sessionDBShard0 = session.getDatabase(dbNameShard0);
let sessionDBShard2 = session.getDatabase(dbNameShard2);
let newCollName = "newColl";

// Ensure no stale version errors occur.
let doc = st.s.getDB(dbNameShard0).getCollection(collName).findOne({_id: 5});
assert.eq(doc._id, 5);
let doc2 = st.s.getDB(dbNameShard2).getCollection(collName).findOne({_id: 4});
assert.eq(doc2._id, 4);

jsTest.log("Testing collection creation in a cross-shard write transaction.");
const txnOptions = {
    writeConcern: {w: "majority"}
};
session.startTransaction(txnOptions);
retryOnceOnTransientAndRestartTxnOnMongos(session, () => {
    assert.commandWorked(sessionDBShard0.createCollection(newCollName));
    assert.commandWorked(sessionDBShard2.createCollection(newCollName));
}, txnOptions);
assert.commandFailedWithCode(session.commitTransaction_forTesting(),
                             ErrorCodes.OperationNotSupportedInTransaction);

jsTest.log("Testing collection creation in a single-shard write transaction.");
// TODO (SERVER-48340): Re-enable the single-write-shard transaction commit optimization.
session.startTransaction(txnOptions);
assert.commandWorked(sessionDBShard0.createCollection(newCollName));
doc2 = sessionDBShard2.getCollection(collName).findOne({_id: 4});
assert.eq(doc2._id, 4);
assert.commandFailedWithCode(session.commitTransaction_forTesting(),
                             ErrorCodes.OperationNotSupportedInTransaction);

st.stop();
})();