diff options
Diffstat (limited to 'jstests/sharding/write_cmd_auto_split.js')
| -rw-r--r-- | jstests/sharding/write_cmd_auto_split.js | 151 |
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(); + |
