diff options
Diffstat (limited to 'jstests/serial_run/flow_control_replica_set.js')
-rw-r--r-- | jstests/serial_run/flow_control_replica_set.js | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/jstests/serial_run/flow_control_replica_set.js b/jstests/serial_run/flow_control_replica_set.js new file mode 100644 index 00000000000..025c04e4e5b --- /dev/null +++ b/jstests/serial_run/flow_control_replica_set.js @@ -0,0 +1,66 @@ +/** + * This test artificially throttles a replica set by limiting the tickets handed out. It first + * performs a calibrating run that sees how many inserts per second a one node replica set can + * handle. Non-batch inserts should acquire one lock per insert. The test then sets the ticket + * generation to a fraction of this discovered calibration value. A following benchrun validates the + * new insert rate falls within some (generous) range. + * + * @tags: [ + * requires_replication, + * requires_flow_control, + * requires_majority_read_concern, + * ] + */ +(function() { +"use strict"; + +const replTest = new ReplSetTest({nodes: 1}); +replTest.startSet(); +replTest.initiate(); + +const primary = replTest.getPrimary(); + +assert.commandWorked(primary.adminCommand({ + configureFailPoint: "flowControlTicketOverride", + mode: "alwaysOn", + data: {"numTickets": 1000 * 1000 * 1000} +})); +// Sleep 2 seconds for the failpoint to take effect. +sleep(2000); + +let result = benchRun({ + host: primary.host, + seconds: 5, + parallel: 5, + ops: [{op: "insert", ns: "foo.bar", doc: {field: "value"}}] +}); +jsTestLog({CalibratingRun: result}); + +let insertRate = result["insert"]; +let throttledRate = insertRate / 2; +assert.commandWorked(primary.adminCommand({ + configureFailPoint: "flowControlTicketOverride", + mode: "alwaysOn", + data: {"numTickets": NumberInt(throttledRate)} +})); +// Sleep 2 seconds for the failpoint to take effect. +sleep(2000); + +result = benchRun({ + host: primary.host, + seconds: 5, + parallel: 5, + ops: [{op: "insert", ns: "foo.bar", doc: {field: "value"}}] +}); +jsTestLog({ThrottledRun: result, ThrottedRate: throttledRate}); +let maxAllowedRate = 1.5 * throttledRate; +let minAllowedRate = 0.5 * throttledRate; +assert.gt(result["insert"], minAllowedRate); +assert.lt(result["insert"], maxAllowedRate); + +// Cautiously unset to avoid any interaction with shutdown. +assert.commandWorked( + primary.adminCommand({configureFailPoint: "flowControlTicketOverride", mode: "off"})); + +replTest.stopSet(); +})(); |