0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-12-01 01:21:03 +01:00
mongodb/jstests/sharding/lookup_stale_mongos.js
2019-02-07 18:41:36 -05:00

137 lines
5.3 KiB
JavaScript

// Tests the behavior of a $lookup when the mongos contains stale routing information for the
// local and/or foreign collections. This includes when mongos thinks the collection is sharded
// when it's not, and likewise when mongos thinks the collection is unsharded but is actually
// sharded.
(function() {
"use strict";
load("jstests/noPassthrough/libs/server_parameter_helpers.js"); // For setParameterOnAllHosts.
load("jstests/libs/discover_topology.js"); // For findDataBearingNodes.
const testName = "lookup_stale_mongos";
const st = new ShardingTest({
shards: 2,
mongos: 2,
});
setParameterOnAllHosts(DiscoverTopology.findNonConfigNodes(st.s0).concat([st.s1.host]),
"internalQueryAllowShardedLookup",
true);
const mongos0DB = st.s0.getDB(testName);
assert.commandWorked(mongos0DB.dropDatabase());
const mongos0LocalColl = mongos0DB[testName + "_local"];
const mongos0ForeignColl = mongos0DB[testName + "_foreign"];
const mongos1DB = st.s1.getDB(testName);
const mongos1LocalColl = mongos1DB[testName + "_local"];
const mongos1ForeignColl = mongos1DB[testName + "_foreign"];
const pipeline = [
{
$lookup:
{localField: "a", foreignField: "b", from: mongos1ForeignColl.getName(), as: "same"}
},
{$sort: {_id: 1}}
];
const expectedResults = [
{_id: 0, a: 1, "same": [{_id: 0, b: 1}]},
{_id: 1, a: null, "same": [{_id: 1, b: null}, {_id: 2}]},
{_id: 2, "same": [{_id: 1, b: null}, {_id: 2}]}
];
// Ensure that shard0 is the primary shard.
assert.commandWorked(mongos0DB.adminCommand({enableSharding: mongos0DB.getName()}));
st.ensurePrimaryShard(mongos0DB.getName(), st.shard0.shardName);
assert.writeOK(mongos0LocalColl.insert({_id: 0, a: 1}));
assert.writeOK(mongos0LocalColl.insert({_id: 1, a: null}));
assert.writeOK(mongos0ForeignColl.insert({_id: 0, b: 1}));
assert.writeOK(mongos0ForeignColl.insert({_id: 1, b: null}));
// Send writes through mongos1 such that it's aware of the collections and believes they are
// unsharded.
assert.writeOK(mongos1LocalColl.insert({_id: 2}));
assert.writeOK(mongos1ForeignColl.insert({_id: 2}));
//
// Test unsharded local and sharded foreign collections, with mongos unaware that the foreign
// collection is sharded.
//
// Shard the foreign collection through mongos0.
assert.commandWorked(
mongos0DB.adminCommand({shardCollection: mongos0ForeignColl.getFullName(), key: {_id: 1}}));
// Split the collection into 2 chunks: [MinKey, 1), [1, MaxKey).
assert.commandWorked(
mongos0DB.adminCommand({split: mongos0ForeignColl.getFullName(), middle: {_id: 1}}));
// Move the [minKey, 1) chunk to shard1.
assert.commandWorked(mongos0DB.adminCommand({
moveChunk: mongos0ForeignColl.getFullName(),
find: {_id: 0},
to: st.shard1.shardName,
_waitForDelete: true
}));
// Issue a $lookup through mongos1, which is unaware that the foreign collection is sharded.
assert.eq(mongos1LocalColl.aggregate(pipeline).toArray(), expectedResults);
//
// Test sharded local and sharded foreign collections, with mongos unaware that the local
// collection is sharded.
//
// Shard the local collection through mongos0.
assert.commandWorked(
mongos0DB.adminCommand({shardCollection: mongos0LocalColl.getFullName(), key: {_id: 1}}));
// Split the collection into 2 chunks: [MinKey, 1), [1, MaxKey).
assert.commandWorked(
mongos0DB.adminCommand({split: mongos0LocalColl.getFullName(), middle: {_id: 1}}));
// Move the [minKey, 1) chunk to shard1.
assert.commandWorked(mongos0DB.adminCommand({
moveChunk: mongos0LocalColl.getFullName(),
find: {_id: 0},
to: st.shard1.shardName,
_waitForDelete: true
}));
// Issue a $lookup through mongos1, which is unaware that the local collection is sharded.
assert.eq(mongos1LocalColl.aggregate(pipeline).toArray(), expectedResults);
//
// Test sharded local and unsharded foreign collections, with mongos unaware that the foreign
// collection is unsharded.
//
// Recreate the foreign collection as unsharded through mongos0.
mongos0ForeignColl.drop();
assert.writeOK(mongos0ForeignColl.insert({_id: 0, b: 1}));
assert.writeOK(mongos0ForeignColl.insert({_id: 1, b: null}));
assert.writeOK(mongos0ForeignColl.insert({_id: 2}));
// Issue a $lookup through mongos1, which is unaware that the foreign collection is now
// unsharded.
assert.eq(mongos1LocalColl.aggregate(pipeline).toArray(), expectedResults);
//
// Test unsharded local and foreign collections, with mongos unaware that the local
// collection is unsharded.
//
// Recreate the local collection as unsharded through mongos0.
mongos0LocalColl.drop();
assert.writeOK(mongos0LocalColl.insert({_id: 0, a: 1}));
assert.writeOK(mongos0LocalColl.insert({_id: 1, a: null}));
assert.writeOK(mongos0LocalColl.insert({_id: 2}));
// Issue a $lookup through mongos1, which is unaware that the local collection is now
// unsharded.
assert.eq(mongos1LocalColl.aggregate(pipeline).toArray(), expectedResults);
st.stop();
})();