summaryrefslogtreecommitdiff
path: root/jstests/sharding/write_cmd_auto_split.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/sharding/write_cmd_auto_split.js')
-rw-r--r--jstests/sharding/write_cmd_auto_split.js151
1 files changed, 151 insertions, 0 deletions
diff --git a/jstests/sharding/write_cmd_auto_split.js b/jstests/sharding/write_cmd_auto_split.js
new file mode 100644
index 00000000000..0e7e3cbd0c9
--- /dev/null
+++ b/jstests/sharding/write_cmd_auto_split.js
@@ -0,0 +1,151 @@
+/**
+ * Tests the auto split will be triggered when using write commands.
+ */
+
+var st = new ShardingTest({ shards: 1, other: { chunkSize: 1 }});
+st.stopBalancer();
+
+var configDB = st.s.getDB('config');
+configDB.adminCommand({ enableSharding: 'test' });
+configDB.adminCommand({ shardCollection: 'test.insert', key: { x: 1 }});
+
+var doc1k = (new Array(1024)).join('x');
+var testDB = st.s.getDB('test');
+
+jsTest.log('Test single batch insert should auto-split');
+
+assert.eq(1, configDB.chunks.find().itcount());
+
+// Note: Estimated 'chunk size' tracked by mongos is initialized with a random value so
+// we are going to be conservative.
+for (var x = 0; x < 1100; x++) {
+ var res = testDB.runCommand({ insert: 'insert',
+ documents: [{ x: x, v: doc1k }],
+ ordered: false,
+ writeConcern: { w: 1 }});
+
+ assert(res.ok, 'insert failed: ' + tojson(res));
+}
+
+assert.gt(configDB.chunks.find().itcount(), 1);
+testDB.dropDatabase();
+
+jsTest.log('Test single batch update should auto-split');
+
+configDB.adminCommand({ enableSharding: 'test' });
+configDB.adminCommand({ shardCollection: 'test.update', key: { x: 1 }});
+
+assert.eq(1, configDB.chunks.find().itcount());
+
+for (var x = 0; x < 1100; x++) {
+ var res = testDB.runCommand({ update: 'update',
+ updates: [{ q: { x: x }, u: { x: x, v: doc1k }, upsert: true }],
+ ordered: false,
+ writeConcern: { w: 1 }});
+
+ assert(res.ok, 'update failed: ' + tojson(res));
+}
+
+assert.gt(configDB.chunks.find().itcount(), 1);
+testDB.dropDatabase();
+
+jsTest.log('Test single delete should not auto-split');
+
+configDB.adminCommand({ enableSharding: 'test' });
+configDB.adminCommand({ shardCollection: 'test.delete', key: { x: 1 }});
+
+assert.eq(1, configDB.chunks.find().itcount());
+
+for (var x = 0; x < 1100; x++) {
+ var res = testDB.runCommand({ delete: 'delete',
+ deletes: [{ q: { x: x, v: doc1k }, limit : NumberInt(0) }],
+ ordered: false,
+ writeConcern: { w: 1 }});
+
+ assert(res.ok, 'delete failed: ' + tojson(res));
+}
+
+assert.eq(1, configDB.chunks.find().itcount());
+testDB.dropDatabase();
+
+jsTest.log('Test batched insert should auto-split');
+
+configDB.adminCommand({ enableSharding: 'test' });
+configDB.adminCommand({ shardCollection: 'test.insert', key: { x: 1 }});
+
+assert.eq(1, configDB.chunks.find().itcount());
+
+// Note: Estimated 'chunk size' tracked by mongos is initialized with a random value so
+// we are going to be conservative.
+for (var x = 0; x < 1100; x += 400) {
+ var docs = [];
+
+ for (var y = 0; y < 400; y++) {
+ docs.push({ x: (x + y), v: doc1k });
+ }
+
+ var res = testDB.runCommand({ insert: 'insert',
+ documents: docs,
+ ordered: false,
+ writeConcern: { w: 1 }});
+
+
+ assert(res.ok, 'insert failed: ' + tojson(res));
+}
+
+assert.gt(configDB.chunks.find().itcount(), 1);
+testDB.dropDatabase();
+
+jsTest.log('Test batched update should auto-split');
+
+configDB.adminCommand({ enableSharding: 'test' });
+configDB.adminCommand({ shardCollection: 'test.update', key: { x: 1 }});
+
+assert.eq(1, configDB.chunks.find().itcount());
+
+for (var x = 0; x < 1100; x += 400) {
+ var docs = [];
+
+ for (var y = 0; y < 400; y++) {
+ var id = x + y;
+ docs.push({ q: { x: id }, u: { x: id, v: doc1k }, upsert: true });
+ }
+
+ var res = testDB.runCommand({ update: 'update',
+ updates: docs,
+ ordered: false,
+ writeConcern: { w: 1 }});
+
+ assert(res.ok, 'update failed: ' + tojson(res));
+}
+
+assert.gt(configDB.chunks.find().itcount(), 1);
+testDB.dropDatabase();
+
+jsTest.log('Test batched delete should not auto-split');
+
+configDB.adminCommand({ enableSharding: 'test' });
+configDB.adminCommand({ shardCollection: 'test.delete', key: { x: 1 }});
+
+assert.eq(1, configDB.chunks.find().itcount());
+
+for (var x = 0; x < 1100; x += 400) {
+ var docs = [];
+
+ for (var y = 0; y < 400; y++) {
+ var id = x + y;
+ docs.push({ q: { x: id, v: doc1k }, top: 0 });
+ }
+
+ var res = testDB.runCommand({ delete: 'delete',
+ deletes: [{ q: { x: x, v: doc1k }, limit : NumberInt(0) }],
+ ordered: false,
+ writeConcern: { w: 1 }});
+
+ assert(res.ok, 'delete failed: ' + tojson(res));
+}
+
+assert.eq(1, configDB.chunks.find().itcount());
+
+st.stop();
+