Files
mongo/jstests/libs/write_concern_util.js

102 lines
3.3 KiB
JavaScript

/**
* Utilities for testing writeConcern.
*/
load("jstests/libs/check_log.js");
// Shards a collection with 'numDocs' documents and creates 2 chunks, one on each of two shards.
function shardCollectionWithChunks(st, coll, numDocs) {
var _db = coll.getDB();
var numberDoc = numDocs || 20;
coll.ensureIndex({x: 1}, {unique: true});
st.ensurePrimaryShard(_db.toString(), st.shard0.shardName);
st.shardColl(
coll.getName(), {x: 1}, {x: numberDoc / 2}, {x: numberDoc / 2}, _db.toString(), true);
for (var i = 0; i < numberDoc; i++) {
coll.insert({x: i});
}
assert.eq(coll.count(), numberDoc);
}
// Stops replication on the given server(s).
function stopServerReplication(conn) {
if (conn.length) {
conn.forEach(function(n) {
stopServerReplication(n);
});
return;
}
// Clear ramlog so checkLog can't find log messages from previous times this fail point was
// enabled.
assert.commandWorked(conn.adminCommand({clearLog: 'global'}));
var errMsg = 'Failed to enable stopReplProducer failpoint.';
assert.commandWorked(
conn.adminCommand({configureFailPoint: 'stopReplProducer', mode: 'alwaysOn'}), errMsg);
// Wait until the fail point is actually hit. Don't wait if the node is the primary, because
// the fail point won't be hit until the node transitions from being the primary.
if (assert.commandWorked(conn.adminCommand('replSetGetStatus')).myState !=
ReplSetTest.State.PRIMARY) {
checkLog.contains(conn, 'bgsync - stopReplProducer fail point enabled');
}
}
// Stops replication at all replicaset secondaries.
function stopReplicationOnSecondaries(rs) {
stopServerReplication(rs.getSecondaries());
}
// Stops replication at all shard secondaries.
function stopReplicationOnSecondariesOfAllShards(st) {
st._rsObjects.forEach(stopReplicationOnSecondaries);
}
// Restarts replication on the given server(s).
function restartServerReplication(conn) {
if (conn.length) {
conn.forEach(function(n) {
restartServerReplication(n);
});
return;
}
var errMsg = 'Failed to disable stopReplProducer failpoint.';
assert.commandWorked(
conn.getDB('admin').runCommand({configureFailPoint: 'stopReplProducer', mode: 'off'}),
errMsg);
}
// Restarts replication at all nodes in a replicaset.
function restartReplSetReplication(rs) {
restartServerReplication(rs.nodes);
}
// Restarts replication at all replicaset secondaries.
function restartReplicationOnSecondaries(rs) {
restartServerReplication(rs.getSecondaries());
}
// Restarts replication at all nodes in a sharded cluster.
function restartReplicationOnAllShards(st) {
st._rsObjects.forEach(restartReplSetReplication);
restartReplSetReplication(st.configRS);
}
// Asserts that a writeConcernError was received.
function assertWriteConcernError(res) {
assert(res.writeConcernError, "No writeConcernError received, got: " + tojson(res));
assert(res.writeConcernError.code);
assert(res.writeConcernError.errmsg);
}
// Run the specified command, on the admin database if specified.
function runCommandCheckAdmin(db, cmd) {
if (cmd.admin) {
return db.adminCommand(cmd.req);
} else {
return db.runCommand(cmd.req);
}
}