pinot-client 1.22.0 → 1.24.0

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: 8fa5d08fb08bee353252e2da56932948941faa5fdbdd4f3410e5ff8887755e04
4
- data.tar.gz: c8bb9cbe06c5d209d8f9f63031776fc604a153730b4be207b7fd6d8a3b69e5f0
3
+ metadata.gz: b893ea9b2cefc1aca8cf86940399d36be6e071e88adc8023affb660d94ad8ce7
4
+ data.tar.gz: 539a393551125f7169975b0e641f4d1b60fd0cc6390fc1c9c10b4f86c4036db0
5
5
  SHA512:
6
- metadata.gz: 6d5c85b83effd2ce352b09c03d350eedd817415a18994ed23ef7be972f80dfb8d72cbbbace9c83bfddedb095b6695af0b8b4538f2f0023ee40844e6b554849a9
7
- data.tar.gz: c450ffb393a8798ae3ea3e608cf2cb976bdf5aeb6f7145121764c41bed33069807fdb3087d02c3963552f79568fb6f2020088794cccf47f97218d10fe7041c99
6
+ metadata.gz: 13d9d34e4a86ac6d62b15db000f4220e28cd5498e78cfdb42b2c9edcfac5645c68332a43048d96bc16089381fc4ea9c3d0ce429a95480c481766d1ebd9dfd6ca
7
+ data.tar.gz: 679bde8940819c309cbc351712cf2c4d4f3cfa1601e81ae023e5bf03a944404bd907b1f0a6fa44c2d5925909f3b8ce6533adf2a91cfea5aa284be7ab86afc9cf
@@ -27,13 +27,14 @@ module Pinot
27
27
  @trace = false
28
28
  end
29
29
 
30
- def execute_sql(table, query, query_timeout_ms: nil)
30
+ def execute_sql(table, query, query_timeout_ms: nil, headers: {})
31
31
  Pinot::Instrumentation.instrument(table: table, query: query) do
32
32
  logger.debug "Executing SQL on table=#{table}: #{query}"
33
33
  broker = @broker_selector.select_broker(table)
34
34
  effective_timeout = query_timeout_ms || @query_timeout_ms
35
35
  run_with_circuit_breaker(broker) do
36
- @transport.execute(broker, build_request(query, timeout_ms: effective_timeout))
36
+ @transport.execute(broker, build_request(query, timeout_ms: effective_timeout),
37
+ extra_request_headers: headers)
37
38
  end
38
39
  end
39
40
  end
@@ -42,11 +43,10 @@ module Pinot
42
43
  execute_sql(table, query, query_timeout_ms: timeout_ms)
43
44
  end
44
45
 
45
- def execute_sql_with_params(table, query_pattern, params, query_timeout_ms: nil)
46
+ def execute_sql_with_params(table, query_pattern, params, query_timeout_ms: nil, headers: {})
46
47
  query = format_query(query_pattern, params)
47
- execute_sql(table, query, query_timeout_ms: query_timeout_ms)
48
+ execute_sql(table, query, query_timeout_ms: query_timeout_ms, headers: headers)
48
49
  rescue => e
49
- # Re-raise format errors directly (they already have the right message)
50
50
  raise e
51
51
  end
52
52
 
@@ -60,7 +60,7 @@ module Pinot
60
60
  nil
61
61
  end
62
62
 
63
- def execute
63
+ def execute(headers: {})
64
64
  @mutex.synchronize do
65
65
  raise PreparedStatementClosedError, "prepared statement is closed" if @closed
66
66
  @parameters.each_with_index do |p, i|
@@ -72,10 +72,10 @@ module Pinot
72
72
  rescue => e
73
73
  raise "failed to build query: #{e.message}"
74
74
  end
75
- @connection.execute_sql(@table, query)
75
+ @connection.execute_sql(@table, query, headers: headers)
76
76
  end
77
77
 
78
- def execute_with_params(*params)
78
+ def execute_with_params(*params, headers: {})
79
79
  @mutex.synchronize { raise PreparedStatementClosedError, "prepared statement is closed" if @closed }
80
80
  if params.length != @param_count
81
81
  raise "expected #{@param_count} parameters, got #{params.length}"
@@ -85,7 +85,7 @@ module Pinot
85
85
  rescue => e
86
86
  raise "failed to build query: #{e.message}"
87
87
  end
88
- @connection.execute_sql(@table, query)
88
+ @connection.execute_sql(@table, query, headers: headers)
89
89
  end
90
90
 
91
91
  def clear_parameters
@@ -171,6 +171,7 @@ module Pinot
171
171
 
172
172
  # HTTP status codes that map to specific error classes and are safe to retry
173
173
  HTTP_ERROR_MAP = {
174
+ "408" => QueryTimeoutError,
174
175
  "429" => RateLimitError,
175
176
  "503" => BrokerUnavailableError,
176
177
  "504" => BrokerUnavailableError
@@ -178,6 +179,10 @@ module Pinot
178
179
 
179
180
  RETRYABLE_HTTP_ERRORS = [RateLimitError, BrokerUnavailableError].freeze
180
181
 
182
+ # Pinot exception errorCode values that indicate query timeout.
183
+ # 250 = ExecutionTimeoutError (server-side), 400 = BrokerTimeoutError.
184
+ TIMEOUT_ERROR_CODES = [250, 400].freeze
185
+
181
186
  def initialize(http_client:, extra_headers: {}, timeout_ms: nil, logger: nil,
182
187
  max_retries: 0, retry_interval_ms: 200)
183
188
  @http_client = http_client
@@ -188,7 +193,7 @@ module Pinot
188
193
  @retry_interval_ms = retry_interval_ms
189
194
  end
190
195
 
191
- def execute(broker_address, request)
196
+ def execute(broker_address, request, extra_request_headers: {})
192
197
  logger.debug "Pinot query to #{broker_address}: #{request.query}"
193
198
 
194
199
  attempts = 0
@@ -202,6 +207,7 @@ module Pinot
202
207
  headers = DEFAULT_HEADERS
203
208
  .merge(@extra_headers)
204
209
  .merge("X-Correlation-Id" => SecureRandom.uuid)
210
+ .merge(extra_request_headers)
205
211
 
206
212
  resp = @http_client.post(url, body: body, headers: headers)
207
213
 
@@ -215,18 +221,24 @@ module Pinot
215
221
  raise TransportError, "http exception with HTTP status code #{resp.code}"
216
222
  end
217
223
 
218
- begin
224
+ broker_response = begin
219
225
  BrokerResponse.from_json(resp.body)
220
226
  rescue JSON::ParserError => e
221
227
  raise e.message
222
228
  end
229
+
230
+ if (timeout_ex = broker_response.exceptions.find { |ex| TIMEOUT_ERROR_CODES.include?(ex.error_code) })
231
+ raise QueryTimeoutError, timeout_ex.message
232
+ end
233
+
234
+ broker_response
223
235
  rescue *RETRYABLE_HTTP_ERRORS, *RETRYABLE_ERRORS => e
224
236
  if attempts < max_attempts
225
237
  sleep_ms = (@retry_interval_ms || 200) * (2 ** (attempts - 1))
226
238
  sleep(sleep_ms / 1000.0)
227
239
  retry
228
240
  end
229
- raise
241
+ raise Net::ReadTimeout === e || Net::WriteTimeout === e ? QueryTimeoutError.new(e.message) : e
230
242
  end
231
243
  end
232
244
 
data/lib/pinot/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Pinot
2
- VERSION = "1.22.0"
2
+ VERSION = "1.24.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pinot-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.22.0
4
+ version: 1.24.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xiang Fu