diff --git a/lib/en57/benchmark.rb b/lib/en57/benchmark.rb index bb963f2..ae52c94 100644 --- a/lib/en57/benchmark.rb +++ b/lib/en57/benchmark.rb @@ -17,6 +17,7 @@ module En57 :min, :max, :median, + :retry_count, :verified, ) @@ -33,6 +34,7 @@ module En57 "Min", "Max", "Median", + "Retries", ] body = rows.map do |result| @@ -44,6 +46,7 @@ module En57 milliseconds(result.min), milliseconds(result.max), milliseconds(result.median), + result.retry_count.to_s, ] end widths = header.zip(*body).map { |values| values.map(&:length).max } @@ -51,9 +54,9 @@ module En57 [ rule, - table_row(header, widths, %i[left left left left left left left]), + table_row(header, widths, %i[left left left left left left left left]), rule, - *body.map { table_row(it, widths, %i[left right right right right right right]) }, + *body.map { table_row(it, widths, %i[left right right right right right right right]) }, rule, ].join("\n") end @@ -124,14 +127,17 @@ module En57 @database_url = database_url @measure = measure @runs = runs + @retry_count = Concurrent::AtomicFixnum.new(0) @warmup_runs = warmup_runs end attr_reader :name, :runs + def retry_count = @retry_count.value def run warmup + reset_retry_count @runs.times { call } verify end @@ -140,6 +146,8 @@ module En57 def total_runs = @runs + @warmup_runs def call = nil + def record_retry = @retry_count.increment + def reset_retry_count = @retry_count.value = 0 def verify = true def warmup = @warmup_runs.times { call } @@ -228,6 +236,7 @@ module En57 min: measurement.min, max: measurement.max, median: measurement.median, + retry_count: scenario.retry_count, verified:, ) end @@ -261,6 +270,7 @@ module En57 begin @event_store.append(events) rescue AppendConditionViolated + record_retry retry end end @@ -297,6 +307,7 @@ module En57 begin @event_store.append(events, fail_if: scope.after(position = 0)) rescue AppendConditionViolated + record_retry retry end end @@ -334,6 +345,7 @@ module En57 begin @event_store.append(events, fail_if: scope.after(position)) rescue AppendConditionViolated + record_retry scope.each_with_position do |_event, event_position| position = event_position end diff --git a/test/test_benchmark.rb b/test/test_benchmark.rb index 4dcd5ed..b28998e 100644 --- a/test/test_benchmark.rb +++ b/test/test_benchmark.rb @@ -18,17 +18,18 @@ module En57 min: 0.001, max: 0.002, median: 0.0015, + retry_count: 12, verified: true, ), ], ) assert_equal(<<~TABLE.chomp, output) - +----------+------+--------------+---------+---------+---------+---------+ - | Scenario | Runs | Mean latency | Stddev | Min | Max | Median | - +----------+------+--------------+---------+---------+---------+---------+ - | scenario | 50 | 1.23 ms | 0.45 ms | 1.00 ms | 2.00 ms | 1.50 ms | - +----------+------+--------------+---------+---------+---------+---------+ + +----------+------+--------------+---------+---------+---------+---------+---------+ + | Scenario | Runs | Mean latency | Stddev | Min | Max | Median | Retries | + +----------+------+--------------+---------+---------+---------+---------+---------+ + | scenario | 50 | 1.23 ms | 0.45 ms | 1.00 ms | 2.00 ms | 1.50 ms | 12 | + +----------+------+--------------+---------+---------+---------+---------+---------+ TABLE end @@ -45,6 +46,7 @@ module En57 min: 0.001, max: 0.002, median: 0.0015, + retry_count: 12, verified: false, ), ], @@ -146,6 +148,30 @@ module En57 assert_equal(0.3, formatted_results.fetch(0).mean) end + def test_scenario_counts_retries_after_warmup + scenario = + Class + .new(Scenario) do + def initialize + super( + name: "retrying", + database_url: "postgres://example", + measure: ->(&block) { block.call }, + runs: 2, + warmup_runs: 1, + concurrency: 1, + batch_size: 1, + ) + end + + def call = record_retry + end + .new + + assert_equal(true, scenario.run) + assert_equal(2, scenario.retry_count) + end + def test_measurement_calculates_summary_statistics measurement = Measurement.from([0.3, 0.1, 0.2])