esse 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 15b531b7c6876d665c12fd773d25fa68acda30c4c92cf7999790315f4fe35b2d
4
- data.tar.gz: 9520b76a128e752bed3db6d2a1a96e38e2107ca790c6d0c0327c2690d91b21d7
3
+ metadata.gz: d5aa2b7107d8bc92810414bacbca1c821024e8771b50be5f5c0afb4b66349874
4
+ data.tar.gz: 7ea6f01e96dc3e7a260f4b2cc8198f88231920dbd3e96a1d2493df34eb1bfeaa
5
5
  SHA512:
6
- metadata.gz: 865aa67f404a82e573009e73186dd60ee9c3f978ba3c93b39337184c2b8c9c9415bc116573c5eb4f21cb7e4ffc7e19aae4957e54fe7b8aa99a8804e86469b13f
7
- data.tar.gz: bcacb23ae7b1b1a073298a59090455e30d6aa9531b93a815871762ed9e3364de873795c47ca0b2d495d8d9394110fd623011d3e4e3054a34ddf89b5e35947ded
6
+ metadata.gz: bce16d5dd68a36e0f75215994a96746982d84529fddd0f667660ca644cf8ca3c89c79211db91499161323c025528a48e2b371bddf743a4e19de4a95988121196
7
+ data.tar.gz: e87a03b8fc0c10fcbbfb7945483c740af2958a2991a1ea5330503f41ca8390988110dbddce59a62cb61987cf020b9f24bb4a02c3770d5dc2bed56bf124163226
data/lib/esse/config.rb CHANGED
@@ -43,7 +43,7 @@ module Esse
43
43
  # end
44
44
  class Config
45
45
  DEFAULT_CLUSTER_ID = :default
46
- ATTRIBUTES = %i[indices_directory bulk_wait_interval].freeze
46
+ ATTRIBUTES = %i[indices_directory bulk_wait_interval bulk_retry_on_failure_max_retries bulk_retry_on_failure_wait].freeze
47
47
 
48
48
  # The location of the indices. Defaults to the `app/indices`
49
49
  attr_reader :indices_directory
@@ -51,9 +51,17 @@ module Esse
51
51
  # wait a given period between posting pages to give Elasticsearch time to catch up.
52
52
  attr_reader :bulk_wait_interval
53
53
 
54
+ # number of retries on transient server errors (502, 503, 504, 429) before raising
55
+ attr_reader :bulk_retry_on_failure_max_retries
56
+
57
+ # base wait in seconds between transient-error retries (doubles each attempt)
58
+ attr_reader :bulk_retry_on_failure_wait
59
+
54
60
  def initialize
55
61
  self.indices_directory = 'app/indices'
56
62
  self.bulk_wait_interval = 0.1
63
+ self.bulk_retry_on_failure_max_retries = 3
64
+ self.bulk_retry_on_failure_wait = 2.0
57
65
  @clusters = {}
58
66
  cluster(DEFAULT_CLUSTER_ID) # initialize the :default client
59
67
  end
@@ -81,6 +89,14 @@ module Esse
81
89
  @bulk_wait_interval = value.to_f
82
90
  end
83
91
 
92
+ def bulk_retry_on_failure_max_retries=(value)
93
+ @bulk_retry_on_failure_max_retries = value.to_i
94
+ end
95
+
96
+ def bulk_retry_on_failure_wait=(value)
97
+ @bulk_retry_on_failure_wait = value.to_f
98
+ end
99
+
84
100
  def load(arg)
85
101
  case arg
86
102
  when Hash
data/lib/esse/errors.rb CHANGED
@@ -57,6 +57,7 @@ module Esse
57
57
  'ExpectationFailed' => 'ExpectationFailedError', # 417
58
58
  'ImATeapot' => 'ImATeapotError', # 418
59
59
  'TooManyConnectionsFromThisIP' => 'TooManyConnectionsFromThisIPError', # 421
60
+ 'TooManyRequests' => 'TooManyRequestsError', # 429
60
61
  'UpgradeRequired' => 'UpgradeRequiredError', # 426
61
62
  'BlockedByWindowsParentalControls' => 'BlockedByWindowsParentalControlsError', # 450
62
63
  'RequestHeaderTooLarge' => 'RequestHeaderTooLargeError', # 494
@@ -18,11 +18,13 @@ module Esse
18
18
  # document still returns 413 does the error bubble up.
19
19
  #
20
20
  # @yield [RequestBody] A request body instance
21
- def each_request(max_retries: 4, last_retry_in_small_chunks: true, last_retry_per_document: true)
21
+ def each_request(max_retries: 4, last_retry_in_small_chunks: true, last_retry_per_document: true,
22
+ retry_on_failure_max_retries: 3, retry_on_failure_wait: 2.0)
22
23
  # @TODO create indexes when by checking all the index suffixes (if mapping is not empty)
23
24
  requests = [optimistic_request]
24
25
  retry_count = 0
25
26
  too_large_retry_count = 0
27
+ transient_failure_count = 0
26
28
 
27
29
  begin
28
30
  requests.each do |request|
@@ -64,6 +66,16 @@ module Esse
64
66
  If a single document still exceeds the bulk size, the error will be raised.
65
67
  MSG
66
68
  retry
69
+ rescue Esse::Transport::BadGatewayError,
70
+ Esse::Transport::ServiceUnavailableError,
71
+ Esse::Transport::GatewayTimeoutError,
72
+ Esse::Transport::TooManyRequestsError => e
73
+ transient_failure_count += 1
74
+ raise e if transient_failure_count >= retry_on_failure_max_retries
75
+ wait = retry_on_failure_wait * (2**(transient_failure_count - 1))
76
+ Esse.logger.warn "#{e.class} error, retrying in #{wait}s (attempt #{transient_failure_count}/#{retry_on_failure_max_retries})"
77
+ sleep(wait)
78
+ retry
67
79
  end
68
80
  end
69
81
 
@@ -72,6 +72,22 @@ module Esse
72
72
  @bulk_wait_interval = value.to_f
73
73
  end
74
74
 
75
+ def bulk_retry_on_failure_max_retries
76
+ @bulk_retry_on_failure_max_retries || Esse.config.bulk_retry_on_failure_max_retries
77
+ end
78
+
79
+ def bulk_retry_on_failure_max_retries=(value)
80
+ @bulk_retry_on_failure_max_retries = value.to_i
81
+ end
82
+
83
+ def bulk_retry_on_failure_wait
84
+ @bulk_retry_on_failure_wait || Esse.config.bulk_retry_on_failure_wait
85
+ end
86
+
87
+ def bulk_retry_on_failure_wait=(value)
88
+ @bulk_retry_on_failure_wait = value.to_f
89
+ end
90
+
75
91
  def mapping_single_type=(value)
76
92
  @mapping_single_type = !!value
77
93
  end
@@ -256,7 +256,10 @@ module Esse
256
256
  delete: to_delete,
257
257
  index: to_index,
258
258
  update: to_update,
259
- ).each_request do |request_body|
259
+ ).each_request(
260
+ retry_on_failure_max_retries: bulk_retry_on_failure_max_retries,
261
+ retry_on_failure_wait: bulk_retry_on_failure_wait,
262
+ ) do |request_body|
260
263
  cluster.api.bulk(**definition, body: request_body.body) do |event_payload|
261
264
  event_payload[:body_stats] = request_body.stats
262
265
  if bulk_wait_interval > 0
data/lib/esse/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Esse
4
- VERSION = '0.5.0'
4
+ VERSION = '0.5.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: esse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcos G. Zimmermann
8
8
  autorequire:
9
9
  bindir: exec
10
10
  cert_chain: []
11
- date: 2026-05-15 00:00:00.000000000 Z
11
+ date: 2026-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json