2013-10-23 12:03:33 -04:00
|
|
|
/**
|
|
|
|
|
* Tests the auto split will be triggered when using write commands.
|
|
|
|
|
*/
|
2015-11-25 11:20:43 -05:00
|
|
|
(function() {
|
|
|
|
|
'use strict';
|
2013-10-23 12:03:33 -04:00
|
|
|
|
|
|
|
|
var st = new ShardingTest({ shards: 1, other: { chunkSize: 1 }});
|
|
|
|
|
|
|
|
|
|
var configDB = st.s.getDB('config');
|
2015-11-25 11:20:43 -05:00
|
|
|
assert.commandWorked(configDB.adminCommand({ enableSharding: 'test' }));
|
|
|
|
|
assert.commandWorked(configDB.adminCommand({ shardCollection: 'test.insert', key: { x: 1 }}));
|
2013-10-23 12:03:33 -04:00
|
|
|
|
|
|
|
|
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.
|
2015-10-23 13:49:53 -04:00
|
|
|
for (var x = 0; x < 3100; x++) {
|
2013-10-23 12:03:33 -04:00
|
|
|
var res = testDB.runCommand({ insert: 'insert',
|
|
|
|
|
documents: [{ x: x, v: doc1k }],
|
|
|
|
|
ordered: false,
|
|
|
|
|
writeConcern: { w: 1 }});
|
|
|
|
|
|
|
|
|
|
assert(res.ok, 'insert failed: ' + tojson(res));
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-23 13:49:53 -04:00
|
|
|
// Inserted batch is a multiple of the chunkSize, expect the chunks to split into
|
|
|
|
|
// more than 2.
|
|
|
|
|
assert.gt(configDB.chunks.find().itcount(), 2);
|
2013-10-23 12:03:33 -04:00
|
|
|
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',
|
2013-10-30 11:07:21 -04:00
|
|
|
deletes: [{ q: { x: x, v: doc1k }, limit : NumberInt(0) }],
|
2013-10-23 12:03:33 -04:00
|
|
|
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',
|
2013-10-30 11:07:21 -04:00
|
|
|
deletes: [{ q: { x: x, v: doc1k }, limit : NumberInt(0) }],
|
2013-10-23 12:03:33 -04:00
|
|
|
ordered: false,
|
|
|
|
|
writeConcern: { w: 1 }});
|
|
|
|
|
|
|
|
|
|
assert(res.ok, 'delete failed: ' + tojson(res));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert.eq(1, configDB.chunks.find().itcount());
|
|
|
|
|
|
|
|
|
|
st.stop();
|
|
|
|
|
|
2015-11-25 11:20:43 -05:00
|
|
|
})();
|