Files
mongo/jstests/sharding/features2.js
2017-06-28 11:57:04 -04:00

200 lines
5.3 KiB
JavaScript

(function() {
var s = new ShardingTest({name: "features2", shards: 2, mongos: 1});
s.adminCommand({enablesharding: "test"});
s.ensurePrimaryShard('test', 'shard0001');
a = s._connections[0].getDB("test");
b = s._connections[1].getDB("test");
db = s.getDB("test");
// ---- distinct ----
db.foo.save({x: 1});
db.foo.save({x: 2});
db.foo.save({x: 3});
db.foo.ensureIndex({x: 1});
assert.eq("1,2,3", db.foo.distinct("x"), "distinct 1");
assert(a.foo.distinct("x").length == 3 || b.foo.distinct("x").length == 3, "distinct 2");
assert(a.foo.distinct("x").length == 0 || b.foo.distinct("x").length == 0, "distinct 3");
assert.eq(1, s.onNumShards("foo"), "A1");
s.shardColl("foo", {x: 1}, {x: 2}, {x: 3}, null, true /* waitForDelete */);
assert.eq(2, s.onNumShards("foo"), "A2");
assert.eq("1,2,3", db.foo.distinct("x"), "distinct 4");
// ----- delete ---
assert.eq(3, db.foo.count(), "D1");
db.foo.remove({x: 3});
assert.eq(2, db.foo.count(), "D2");
db.foo.save({x: 3});
assert.eq(3, db.foo.count(), "D3");
db.foo.remove({x: {$gt: 2}});
assert.eq(2, db.foo.count(), "D4");
db.foo.remove({x: {$gt: -1}});
assert.eq(0, db.foo.count(), "D5");
db.foo.save({x: 1});
db.foo.save({x: 2});
db.foo.save({x: 3});
assert.eq(3, db.foo.count(), "D6");
db.foo.remove({});
assert.eq(0, db.foo.count(), "D7");
// --- _id key ---
db.foo2.save({_id: new ObjectId()});
db.foo2.save({_id: new ObjectId()});
db.foo2.save({_id: new ObjectId()});
assert.eq(1, s.onNumShards("foo2"), "F1");
printjson(db.foo2.getIndexes());
s.adminCommand({shardcollection: "test.foo2", key: {_id: 1}});
assert.eq(3, db.foo2.count(), "F2");
db.foo2.insert({});
assert.eq(4, db.foo2.count(), "F3");
// --- map/reduce
db.mr.save({x: 1, tags: ["a", "b"]});
db.mr.save({x: 2, tags: ["b", "c"]});
db.mr.save({x: 3, tags: ["c", "a"]});
db.mr.save({x: 4, tags: ["b", "c"]});
db.mr.ensureIndex({x: 1});
m = function() {
this.tags.forEach(function(z) {
emit(z, {count: 1});
});
};
r = function(key, values) {
var total = 0;
for (var i = 0; i < values.length; i++) {
total += values[i].count;
}
return {count: total};
};
doMR = function(n) {
print(n);
// on-disk
var res = db.mr.mapReduce(m, r, "smr1_out");
printjson(res);
assert.eq(4, res.counts.input, "MR T0 " + n);
var x = db[res.result];
assert.eq(3, x.find().count(), "MR T1 " + n);
var z = {};
x.find().forEach(function(a) {
z[a._id] = a.value.count;
});
assert.eq(3, Object.keySet(z).length, "MR T2 " + n);
assert.eq(2, z.a, "MR T3 " + n);
assert.eq(3, z.b, "MR T4 " + n);
assert.eq(3, z.c, "MR T5 " + n);
x.drop();
// inline
var res = db.mr.mapReduce(m, r, {out: {inline: 1}});
printjson(res);
assert.eq(4, res.counts.input, "MR T6 " + n);
var z = {};
res.find().forEach(function(a) {
z[a._id] = a.value.count;
});
printjson(z);
assert.eq(3, Object.keySet(z).length, "MR T7 " + n);
assert.eq(2, z.a, "MR T8 " + n);
assert.eq(3, z.b, "MR T9 " + n);
assert.eq(3, z.c, "MR TA " + n);
};
doMR("before");
assert.eq(1, s.onNumShards("mr"), "E1");
s.shardColl("mr", {x: 1}, {x: 2}, {x: 3}, null, true /* waitForDelete */);
assert.eq(2, s.onNumShards("mr"), "E1");
doMR("after");
s.adminCommand({split: 'test.mr', middle: {x: 3}});
s.adminCommand({split: 'test.mr', middle: {x: 4}});
s.adminCommand({movechunk: 'test.mr', find: {x: 3}, to: s.getPrimaryShard('test').name});
doMR("after extra split");
cmd = {mapreduce: "mr", map: "emit( ", reduce: "fooz + ", out: "broken1"};
x = db.runCommand(cmd);
y = s._connections[0].getDB("test").runCommand(cmd);
printjson(x);
printjson(y);
// count
db.countaa.save({"regex": /foo/i});
db.countaa.save({"regex": /foo/i});
db.countaa.save({"regex": /foo/i});
assert.eq(3, db.countaa.count(), "counta1");
assert.eq(3, db.countaa.find().itcount(), "counta1");
x = null;
y = null;
try {
x = db.runCommand("forceerror");
} catch (e) {
x = e;
}
try {
y = s._connections[0].getDB("test").runCommand("forceerror");
} catch (e) {
y = e;
}
// As the forceerror command is written, it doesnt set a code in the reply.
// OP_COMMAND changes will add a code of 121 (CommandFailed) if a failing command
// does not set one, so this comparison fails as "undefined" != 121.
assert.eq(x.code, y.code, "assert format");
assert.eq(x.errmsg, y.errmsg, "assert format");
assert.eq(x.ok, y.ok, "assert format");
// isMaster and query-wrapped-command
isMaster = db.runCommand({isMaster: 1});
assert(isMaster.ismaster);
assert.eq('isdbgrid', isMaster.msg);
delete isMaster.localTime;
im2 = db.runCommand({query: {isMaster: 1}});
delete im2.localTime;
assert.eq(isMaster, im2);
im2 = db.runCommand({$query: {isMaster: 1}});
delete im2.localTime;
assert.eq(isMaster, im2);
s.stop();
})();