diff options
author | Gregory Wlodarek <gregory.wlodarek@mongodb.com> | 2020-05-01 16:18:02 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-05-02 00:50:36 +0000 |
commit | 71c1bfd772917c99758550f049226f889768ee18 (patch) | |
tree | d1eb62b134862d3e96c5ad03a88ee63a724e4c3c | |
parent | 31187a232e7ee5985849e12fd9ee08603fb99281 (diff) | |
download | mongo-71c1bfd772917c99758550f049226f889768ee18.tar.gz |
SERVER-47854 Test that currentOp reports validation statistics while validation is running
(cherry picked from commit 4ddd61ae55adf829bece623c9cf923e7151d734a)
-rw-r--r-- | jstests/noPassthrough/current_op_reports_validation_io.js | 70 |
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); +}()); |