summaryrefslogtreecommitdiff
path: root/jstests
diff options
context:
space:
mode:
authorGregory Wlodarek <gregory.wlodarek@mongodb.com>2020-05-01 16:18:02 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-05-02 00:50:36 +0000
commit71c1bfd772917c99758550f049226f889768ee18 (patch)
treed1eb62b134862d3e96c5ad03a88ee63a724e4c3c /jstests
parent31187a232e7ee5985849e12fd9ee08603fb99281 (diff)
downloadmongo-71c1bfd772917c99758550f049226f889768ee18.tar.gz
SERVER-47854 Test that currentOp reports validation statistics while validation is running
(cherry picked from commit 4ddd61ae55adf829bece623c9cf923e7151d734a)
Diffstat (limited to 'jstests')
-rw-r--r--jstests/noPassthrough/current_op_reports_validation_io.js70
1 files changed, 70 insertions, 0 deletions
diff --git a/jstests/noPassthrough/current_op_reports_validation_io.js b/jstests/noPassthrough/current_op_reports_validation_io.js
new file mode 100644
index 00000000000..e30a769d134
--- /dev/null
+++ b/jstests/noPassthrough/current_op_reports_validation_io.js
@@ -0,0 +1,70 @@
+/**
+ * Verifies that the 'dataThroughputLastSecond' and 'dataThroughputAverage' fields appear in the
+ * currentOp output while running validation.
+ */
+(function() {
+const dbName = "test";
+const collName = "currentOpValidation";
+
+const conn = MongoRunner.runMongod();
+
+let db = conn.getDB(dbName);
+let coll = db.getCollection(collName);
+
+coll.drop();
+
+assert.commandWorked(coll.ensureIndex({a: 1}));
+for (let i = 0; i < 5; i++) {
+ assert.commandWorked(coll.insert({a: i}));
+}
+
+// The throttle is off by default.
+assert.commandWorked(db.adminCommand({setParameter: 1, maxValidateMBperSec: 1}));
+
+// Simulate each record being 512KB.
+assert.commandWorked(db.adminCommand(
+ {configureFailPoint: "fixedCursorDataSizeOf512KBForDataThrottle", mode: "alwaysOn"}));
+
+// This fail point comes after we've traversed the record store, so currentOp should have some
+// validation statistics once we hit this fail point.
+assert.commandWorked(
+ db.adminCommand({configureFailPoint: "pauseCollectionValidationWithLock", mode: "alwaysOn"}));
+
+TestData.dbName = dbName;
+TestData.collName = collName;
+const awaitValidation = startParallelShell(() => {
+ assert.commandWorked(
+ db.getSiblingDB(TestData.dbName).getCollection(TestData.collName).validate({
+ background: true
+ }));
+}, conn.port);
+
+checkLog.containsJson(conn, 20304);
+
+const curOpFilter = {
+ 'command.validate': collName
+};
+
+let curOp = assert.commandWorked(db.currentOp(curOpFilter));
+assert(curOp.inprog.length == 1);
+assert(curOp.inprog[0].hasOwnProperty("dataThroughputLastSecond") &&
+ curOp.inprog[0].hasOwnProperty("dataThroughputAverage"));
+
+curOp = conn.getDB("admin").aggregate([{$currentOp: {}}, {$match: curOpFilter}]).toArray();
+assert(curOp.length == 1);
+assert(curOp[0].hasOwnProperty("dataThroughputLastSecond") &&
+ curOp[0].hasOwnProperty("dataThroughputAverage"));
+
+// Finish up validating the collection.
+assert.commandWorked(db.adminCommand(
+ {configureFailPoint: "fixedCursorDataSizeOf512KBForDataThrottle", mode: "off"}));
+assert.commandWorked(
+ db.adminCommand({configureFailPoint: "pauseCollectionValidationWithLock", mode: "off"}));
+
+// Setting this to 0 turns off the throttle.
+assert.commandWorked(db.adminCommand({setParameter: 1, maxValidateMBperSec: 0}));
+
+awaitValidation();
+
+MongoRunner.stopMongod(conn);
+}());