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 +4 -4
- data/lib/esse/config.rb +17 -1
- data/lib/esse/errors.rb +1 -0
- data/lib/esse/import/bulk.rb +13 -1
- data/lib/esse/index/attributes.rb +16 -0
- data/lib/esse/index/documents.rb +4 -1
- data/lib/esse/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d5aa2b7107d8bc92810414bacbca1c821024e8771b50be5f5c0afb4b66349874
|
|
4
|
+
data.tar.gz: 7ea6f01e96dc3e7a260f4b2cc8198f88231920dbd3e96a1d2493df34eb1bfeaa
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
data/lib/esse/import/bulk.rb
CHANGED
|
@@ -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
|
data/lib/esse/index/documents.rb
CHANGED
|
@@ -256,7 +256,10 @@ module Esse
|
|
|
256
256
|
delete: to_delete,
|
|
257
257
|
index: to_index,
|
|
258
258
|
update: to_update,
|
|
259
|
-
).each_request
|
|
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
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.
|
|
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-
|
|
11
|
+
date: 2026-05-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: multi_json
|