mirror of
https://github.com/mongodb/mongo.git
synced 2024-12-01 01:21:03 +01:00
124 lines
4.2 KiB
JavaScript
124 lines
4.2 KiB
JavaScript
// Basic CRUD client to provide load for Powercycle testing.
|
|
|
|
'use strict';
|
|
|
|
function randString(maxLength) {
|
|
maxLength = maxLength || 1024;
|
|
const randChars = "ABCDEFGHIKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
var rString = "";
|
|
for (var i = 0; i < Random.randInt(maxLength); i++) {
|
|
rString += randChars.charAt(Random.randInt(randChars.length));
|
|
}
|
|
return rString;
|
|
}
|
|
|
|
function weightedChoice(choices) {
|
|
var total = 0;
|
|
for (var choice in choices) {
|
|
total += choices[choice];
|
|
}
|
|
var ran = Random.randInt(total);
|
|
var upto = 0;
|
|
for (choice in choices) {
|
|
var weight = choices[choice];
|
|
if (upto + weight >= ran) {
|
|
return choice;
|
|
}
|
|
upto += weight;
|
|
}
|
|
}
|
|
|
|
var operations = {
|
|
"bulk insert": 15,
|
|
"count": 20,
|
|
"find": 15,
|
|
"remove multi": 15,
|
|
"remove one": 15,
|
|
"upsert one": 15,
|
|
"upsert multi": 5
|
|
};
|
|
|
|
Random.setRandomSeed();
|
|
|
|
if (typeof TestData === "undefined") {
|
|
TestData = {};
|
|
}
|
|
var dbName = TestData.dbName || "test";
|
|
var collectionName = TestData.collectionName || "crud";
|
|
var bulkNum = TestData.bulkNum || 1000;
|
|
var baseNum = TestData.baseNum || 100000;
|
|
// Set numLoops <= 0 to have an infinite loop.
|
|
var numLoops = TestData.numLoops || 0;
|
|
|
|
print("****Starting CRUD client, namespace", dbName, collectionName, "numLoops", numLoops, "****");
|
|
|
|
var coll = db.getSiblingDB(dbName)[collectionName];
|
|
coll.createIndex({x: 1});
|
|
|
|
var shouldLoopForever = numLoops <= 0;
|
|
while (shouldLoopForever || numLoops > 0) {
|
|
if (!shouldLoopForever) {
|
|
numLoops -= 1;
|
|
}
|
|
|
|
var info = db.hostInfo();
|
|
var serverStatus = db.serverStatus();
|
|
print("(" + collectionName + ") dbHostInfo status:",
|
|
info.ok,
|
|
serverStatus.version,
|
|
"uptime:",
|
|
serverStatus.uptime);
|
|
var match = Random.randInt(baseNum);
|
|
var matchQuery = {$gte: match, $lt: match + (baseNum * 0.01)};
|
|
|
|
var operation = weightedChoice(operations);
|
|
|
|
if (operation == "upsert multi") {
|
|
var updateOpts = {upsert: true, multi: true};
|
|
print("(" + collectionName + ") Upsert multi docs",
|
|
tojsononeline(matchQuery),
|
|
tojsononeline(updateOpts),
|
|
tojsononeline(coll.update(
|
|
{x: matchQuery}, {$inc: {x: baseNum}, $set: {n: "hello"}}, updateOpts)));
|
|
} else if (operation == "upsert one") {
|
|
var updateOpts = {upsert: true, multi: false};
|
|
print("(" + collectionName + ") Upsert single doc",
|
|
match,
|
|
tojsononeline(updateOpts),
|
|
tojsononeline(
|
|
coll.update({x: match}, {$inc: {x: baseNum}, $set: {n: "hello"}}, updateOpts)));
|
|
} else if (operation == "bulk insert") {
|
|
var bulk = coll.initializeUnorderedBulkOp();
|
|
for (var i = 0; i < bulkNum; i++) {
|
|
bulk.insert({x: (match + i) % baseNum, doc: randString()});
|
|
}
|
|
print(
|
|
"(" + collectionName + ") Bulk insert", bulkNum, "docs", tojsononeline(bulk.execute()));
|
|
} else if (operation == "count") {
|
|
var countOpts = {count: collectionName, query: {x: matchQuery}};
|
|
print("(" + collectionName + ") Count docs",
|
|
tojsononeline(matchQuery),
|
|
tojsononeline(db.runCommand(countOpts)));
|
|
} else if (operation == "find") {
|
|
var findOpts = {find: collectionName, singleBatch: true, filter: {x: matchQuery}};
|
|
print("(" + collectionName + ") Find docs",
|
|
tojsononeline(matchQuery),
|
|
"find status",
|
|
db.runCommand(findOpts).ok);
|
|
} else if (operation == "remove multi") {
|
|
var removeOpts = {};
|
|
var removeQuery = {x: matchQuery, justOne: false};
|
|
print("(" + collectionName + ") Remove docs",
|
|
tojsononeline(removeQuery),
|
|
tojsononeline(removeOpts),
|
|
tojsononeline(coll.remove(removeQuery, removeOpts)));
|
|
} else if (operation == "remove one") {
|
|
var removeOpts = {};
|
|
var removeQuery = {x: match, justOne: true};
|
|
print("(" + collectionName + ") Remove docs",
|
|
tojsononeline(removeQuery),
|
|
tojsononeline(removeOpts),
|
|
tojsononeline(coll.remove(removeQuery, removeOpts)));
|
|
}
|
|
}
|