This is just a cleanup work to hide some of the private state of ReplSetTest so it is easier to encapsulate and add new logic. Also enables strict mode.
105 lines
2.7 KiB
JavaScript
105 lines
2.7 KiB
JavaScript
// Verify that the plan cache and index filter commands can be run on secondaries, but only
|
|
// if slave ok is explicitly set.
|
|
|
|
var name = "plan_cache_slaveok";
|
|
|
|
function assertPlanCacheCommandsSucceed(db) {
|
|
// .listQueryShapes()
|
|
assert.commandWorked(db.runCommand({
|
|
planCacheListQueryShapes: name
|
|
}));
|
|
|
|
// .getPlansByQuery()
|
|
assert.commandWorked(db.runCommand({
|
|
planCacheListPlans: name,
|
|
query: {a: 1}
|
|
}));
|
|
|
|
// .clear()
|
|
assert.commandWorked(db.runCommand({
|
|
planCacheClear: name,
|
|
query: {a: 1}
|
|
}));
|
|
|
|
// setFilter
|
|
assert.commandWorked(db.runCommand({
|
|
planCacheSetFilter: name,
|
|
query: {a: 1},
|
|
indexes: [{a: 1}]
|
|
}));
|
|
|
|
// listFilters
|
|
assert.commandWorked(db.runCommand({
|
|
planCacheListFilters: name
|
|
}));
|
|
|
|
// clearFilters
|
|
assert.commandWorked(db.runCommand({
|
|
planCacheClearFilters: name,
|
|
query: {a: 1}
|
|
}));
|
|
}
|
|
|
|
function assertPlanCacheCommandsFail(db) {
|
|
// .listQueryShapes()
|
|
assert.commandFailed(db.runCommand({
|
|
planCacheListQueryShapes: name
|
|
}));
|
|
|
|
// .getPlansByQuery()
|
|
assert.commandFailed(db.runCommand({
|
|
planCacheListPlans: name,
|
|
query: {a: 1}
|
|
}));
|
|
|
|
// .clear()
|
|
assert.commandFailed(db.runCommand({
|
|
planCacheClear: name,
|
|
query: {a: 1}
|
|
}));
|
|
|
|
// setFilter
|
|
assert.commandFailed(db.runCommand({
|
|
planCacheSetFilter: name,
|
|
query: {a: 1},
|
|
indexes: [{a: 1}]
|
|
}));
|
|
|
|
// listFilters
|
|
assert.commandFailed(db.runCommand({
|
|
planCacheListFilters: name
|
|
}));
|
|
|
|
// clearFilters
|
|
assert.commandFailed(db.runCommand({
|
|
planCacheClearFilters: name,
|
|
query: {a: 1}
|
|
}));
|
|
}
|
|
|
|
print("Start replica set with two nodes");
|
|
var replTest = new ReplSetTest({name: name, nodes: 2});
|
|
var nodes = replTest.startSet();
|
|
replTest.initiate();
|
|
var primary = replTest.getPrimary();
|
|
|
|
// Insert a document and let it sync to the secondary.
|
|
print("Initial sync");
|
|
primary.getDB("test")[name].insert({a: 1});
|
|
replTest.awaitReplication();
|
|
|
|
// Check that the document is present on the primary.
|
|
assert.eq(1, primary.getDB("test")[name].findOne({a: 1})["a"]);
|
|
|
|
// Make sure the plan cache commands succeed on the primary.
|
|
assertPlanCacheCommandsSucceed(primary.getDB("test"));
|
|
|
|
// With slave ok false, the commands should fail on the secondary.
|
|
var secondary = replTest.getSecondary();
|
|
secondary.getDB("test").getMongo().setSlaveOk(false);
|
|
assertPlanCacheCommandsFail(secondary.getDB("test"));
|
|
|
|
// With slave ok true, the commands should succeed on the secondary.
|
|
secondary.getDB("test").getMongo().setSlaveOk(true);
|
|
assertPlanCacheCommandsSucceed(secondary.getDB("test"));
|