diff --git a/lib/en57/configuration.rb b/lib/en57/configuration.rb index 1670cbf..00aa196 100644 --- a/lib/en57/configuration.rb +++ b/lib/en57/configuration.rb @@ -6,9 +6,10 @@ module En57 class Configuration include Singleton - attr_accessor :serializer + attr_accessor :append_retries, :serializer def initialize + @append_retries = 9 @serializer = JsonSerializer.new end end diff --git a/lib/en57/repository.rb b/lib/en57/repository.rb index 0d4c72e..0d1b02c 100644 --- a/lib/en57/repository.rb +++ b/lib/en57/repository.rb @@ -39,7 +39,7 @@ module En57 JSON.generate(append_condition), ] - attempts_remaining = 3 + attempts_remaining = En57.configuration.append_retries begin row = if fail_if_events_match.empty? diff --git a/test/test_en57.rb b/test/test_en57.rb index 3a0f030..eadbeb8 100644 --- a/test/test_en57.rb +++ b/test/test_en57.rb @@ -24,6 +24,10 @@ module En57 RUBY end + def test_configuration_default_append_retries + assert_equal 9, En57.configuration.append_retries + end + def test_configuration_default_serializer assert_kind_of JsonSerializer, En57.configuration.serializer end @@ -31,8 +35,12 @@ module En57 def test_configure with_empty_configuration do serializer = Object.new - En57.configure { |c| c.serializer = serializer } + En57.configure do |c| + c.append_retries = 2 + c.serializer = serializer + end + assert_equal 2, En57.configuration.append_retries assert_equal serializer, En57.configuration.serializer end end diff --git a/test/test_repository.rb b/test/test_repository.rb index cf6355a..3aefccf 100644 --- a/test/test_repository.rb +++ b/test/test_repository.rb @@ -550,11 +550,11 @@ module En57 end end - def test_append_raises_serialization_error_after_four_attempts + def test_append_raises_serialization_error_after_default_retries attempts = 0 with_connection do |connection| - 4.times do + 10.times do connection.expect(:exec, nil, ["BEGIN ISOLATION LEVEL SERIALIZABLE"]) connection.expect(:exec_params, nil) do attempts += 1 @@ -569,10 +569,41 @@ module En57 JsonSerializer.new, ).append([], fail_if: fail_if_with_criteria) end - assert_equal(4, attempts) + assert_equal(10, attempts) end end + def test_append_raises_serialization_error_after_configured_retries + attempts = 0 + + En57 + .configuration + .stub(:append_retries, 1) do + with_connection do |connection| + 2.times do + connection.expect( + :exec, + nil, + ["BEGIN ISOLATION LEVEL SERIALIZABLE"], + ) + connection.expect(:exec_params, nil) do + attempts += 1 + raise PG::TRSerializationFailure.new + end + connection.expect(:exec, nil, ["ROLLBACK"]) + end + + assert_raises(AppendRetriesExhausted) do + Repository.new( + PgAdapter.for_connection(connection), + JsonSerializer.new, + ).append([], fail_if: fail_if_with_criteria) + end + assert_equal(2, attempts) + end + end + end + private def ids = @ids ||= Hash.new { |h, k| h[k] = SecureRandom.uuid_v7 } diff --git a/test/test_stress.rb b/test/test_stress.rb index 6441ecb..9d9eb5e 100644 --- a/test/test_stress.rb +++ b/test/test_stress.rb @@ -51,7 +51,9 @@ module En57 assert_equal(1, results.select { Success === it }.size) assert_equal( (concurrency - 1), - results.select { Failure === it || AppendRetriesExhausted === it }.size, + results + .select { Failure === it || AppendRetriesExhausted === it } + .size, ) assert_equal( 1,