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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
'use strict';
/**
* Concurrently performs DDL commands and verifies guarantees are not broken.
*
* @tags: [
* requires_sharding,
* # TODO (SERVER-56879): Support add/remove shards in new DDL paths
* does_not_support_add_remove_shards,
* ]
*/
const dbPrefix = jsTestName() + '_DB_';
const dbCount = 2;
const collPrefix = 'sharded_coll_';
const collCount = 2;
function getRandomDb(db) {
return db.getSiblingDB(dbPrefix + Random.randInt(dbCount));
}
function getRandomCollection(db) {
return db[collPrefix + Random.randInt(collCount)];
}
function getRandomShard(connCache) {
const shards = Object.keys(connCache.shards);
return shards[Random.randInt(shards.length)];
}
var $config = (function() {
let states = {
create: function(db, collName, connCache) {
db = getRandomDb(db);
const coll = getRandomCollection(db);
const fullNs = coll.getFullName();
jsTestLog('Executing create state: ' + fullNs);
assertAlways.commandWorked(
db.adminCommand({shardCollection: fullNs, key: {_id: 1}, unique: false}));
},
drop: function(db, collName, connCache) {
db = getRandomDb(db);
const coll = getRandomCollection(db);
jsTestLog('Executing drop state: ' + coll.getFullName());
assertAlways.eq(coll.drop(), true);
},
rename: function(db, collName, connCache) {
db = getRandomDb(db);
const srcColl = getRandomCollection(db);
const srcCollName = srcColl.getFullName();
const destCollNS = getRandomCollection(db).getFullName();
const destCollName = destCollNS.split('.')[1];
jsTestLog('Executing rename state:' + srcCollName + ' to ' + destCollNS);
assertAlways.commandWorkedOrFailedWithCode(
srcColl.renameCollection(destCollName, true /* dropTarget */), [
ErrorCodes.NamespaceNotFound,
ErrorCodes.ConflictingOperationInProgress,
ErrorCodes.IllegalOperation
]);
},
movePrimary: function(db, collName, connCache) {
db = getRandomDb(db);
const shardId = getRandomShard(connCache);
jsTestLog('Executing movePrimary state: ' + db.getName() + ' to ' + shardId);
assertAlways.commandWorkedOrFailedWithCode(
db.adminCommand({movePrimary: db.getName(), to: shardId}), [
ErrorCodes.ConflictingOperationInProgress,
// The cloning phase has failed (e.g. as a result of a stepdown). When a failure
// occurs at this phase, the movePrimary operation does not recover.
7120202
]);
// TODO (SERVER-71308): Remove explicit updating of database metadata on recipient. The
// recipient of a movePrimary operation is an agnostic participant of the protocol and
// doesn't update its cached metadata as a consequence of the operation.
assert.commandWorked(db.runCommand({listCollections: 1, nameOnly: true}));
},
collMod: function(db, collName, connCache) {
db = getRandomDb(db);
const coll = getRandomCollection(db);
jsTestLog('Executing collMod state: ' + coll.getFullName());
assertAlways.commandWorkedOrFailedWithCode(
db.runCommand({collMod: coll.getName(), validator: {a: {$gt: 0}}}),
[ErrorCodes.NamespaceNotFound, ErrorCodes.ConflictingOperationInProgress]);
}
};
let setup = function(db, collName, connCache) {
for (var i = 0; i < dbCount; i++) {
const dbName = dbPrefix + i;
const newDb = db.getSiblingDB(dbName);
newDb.adminCommand({enablesharding: dbName});
}
};
let teardown = function(db, collName, cluster) {
const configDB = db.getSiblingDB("config");
assertAlways(configDB.collections.countDocuments({allowMigrations: {$exists: true}}) == 0);
};
let transitions = {
create: {create: 0.25, drop: 0.25, rename: 0.25, movePrimary: 0.25},
drop: {create: 0.25, drop: 0.25, rename: 0.25, movePrimary: 0.25},
rename: {create: 0.25, drop: 0.25, rename: 0.25, movePrimary: 0.25},
movePrimary: {create: 0.25, drop: 0.25, rename: 0.25, movePrimary: 0.25}
};
return {
threadCount: 12,
iterations: 64,
startState: 'create',
states: states,
transitions: transitions,
data: {},
setup: setup,
teardown: teardown,
passConnectionCache: true
};
})();
|