google-cloud-bigtable 2.10.0 → 2.10.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/lib/google/cloud/bigtable/mutation_operations.rb +1 -1
- data/lib/google/cloud/bigtable/read_operations.rb +9 -2
- data/lib/google/cloud/bigtable/rows_reader.rb +77 -32
- data/lib/google/cloud/bigtable/version.rb +1 -1
- data/lib/google/cloud/bigtable.rb +1 -0
- 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: 9661c2574a9fc9c607ab92b8deaed4d722ea8b60b3f79ce3583a21c13b931a7f
|
4
|
+
data.tar.gz: 416f8a2de78b02accd6c157c620bf4a53751d8106302a028074a85a8e01e5ef9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca27ec6d5d9796665d1c6ecc5ab77f79d3ed3343c4beaf9f9263c4bea4b1aa13d493f6cf02603c365ffa52c310d15176b3f36dca9b33666318b59b4cfb279d11
|
7
|
+
data.tar.gz: b6af717d61a0af8e2e11e741ac9ffd1c471a124ed4a9e890d5020817f7605af83395c85a5c19cd9c6d22c3be497b051a959a05baa0c91fe26661239288065c8f
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# Release History
|
2
2
|
|
3
|
+
### 2.10.2 (2024-04-30)
|
4
|
+
|
5
|
+
#### Bug Fixes
|
6
|
+
|
7
|
+
* Fixes for leaving predicate unset in check_and_mutate_row
|
8
|
+
* Fixes for using a preconfigured GRPC channel as credentials
|
9
|
+
|
10
|
+
### 2.10.1 (2024-03-19)
|
11
|
+
|
12
|
+
#### Bug Fixes
|
13
|
+
|
14
|
+
* fix read rows retry so it doesn't trigger a full table scan in t… ([#25391](https://github.com/googleapis/google-cloud-ruby/issues/25391))
|
15
|
+
|
3
16
|
### 2.10.0 (2024-03-07)
|
4
17
|
|
5
18
|
#### Features
|
@@ -245,7 +245,7 @@ module Google
|
|
245
245
|
response = service.check_and_mutate_row(
|
246
246
|
path,
|
247
247
|
key,
|
248
|
-
predicate_filter: predicate
|
248
|
+
predicate_filter: predicate&.to_grpc,
|
249
249
|
true_mutations: true_mutations,
|
250
250
|
false_mutations: false_mutations,
|
251
251
|
app_profile_id: @app_profile_id
|
@@ -159,8 +159,10 @@ module Google
|
|
159
159
|
rescue *RowsReader::RETRYABLE_ERRORS => e
|
160
160
|
rows_reader.retry_count += 1
|
161
161
|
raise Google::Cloud::Error.from_error(e) unless rows_reader.retryable?
|
162
|
-
|
163
|
-
|
162
|
+
resumption_option = rows_reader.retry_options limit, row_set
|
163
|
+
rows_limit = resumption_option.rows_limit
|
164
|
+
row_set = resumption_option.row_set
|
165
|
+
retry unless resumption_option.complete?
|
164
166
|
end
|
165
167
|
end
|
166
168
|
|
@@ -320,6 +322,11 @@ module Google
|
|
320
322
|
row_set[:row_ranges] = row_ranges.map(&:to_grpc)
|
321
323
|
end
|
322
324
|
|
325
|
+
# Set the row range to full table scan if the row set is empty
|
326
|
+
if row_set.empty?
|
327
|
+
row_set[:row_ranges] = [Google::Cloud::Bigtable::V2::RowRange.new]
|
328
|
+
end
|
329
|
+
|
323
330
|
Google::Cloud::Bigtable::V2::RowSet.new row_set
|
324
331
|
end
|
325
332
|
end
|
@@ -75,6 +75,7 @@ module Google
|
|
75
75
|
# Array of row or yield block for each processed row.
|
76
76
|
#
|
77
77
|
def read rows: nil, filter: nil, rows_limit: nil
|
78
|
+
@rows_count = 0
|
78
79
|
response = @table.service.read_rows(
|
79
80
|
@table.instance_id,
|
80
81
|
@table.table_id,
|
@@ -116,40 +117,54 @@ module Google
|
|
116
117
|
# If not specified, reads from all rows.
|
117
118
|
# A hash of the same form as `Google::Cloud::Bigtable::V2::RowSet`
|
118
119
|
# can also be provided.
|
119
|
-
# @return
|
120
|
+
# @return ResumptionOption
|
120
121
|
#
|
121
122
|
def retry_options rows_limit, row_set
|
122
|
-
return
|
123
|
+
return ResumptionOption.new false, rows_limit, row_set unless last_key
|
124
|
+
|
125
|
+
# Check if we've already read read rows_limit number of rows.
|
126
|
+
# If true, mark ResumptionOption is_complete to true.
|
127
|
+
return ResumptionOption.new true, nil, nil if rows_limit && rows_limit == @rows_count
|
123
128
|
|
124
|
-
#
|
129
|
+
# Reduce the limit by the number of already returned responses.
|
125
130
|
rows_limit -= @rows_count if rows_limit
|
126
131
|
|
127
|
-
|
132
|
+
reset_row_set rows_limit, row_set
|
133
|
+
end
|
134
|
+
|
135
|
+
##
|
136
|
+
# Calculate the new row_set for the retry request
|
137
|
+
# @param rows_limit [Integer]
|
138
|
+
# the updated rows_limit
|
139
|
+
# @param row_set [Google::Cloud::Bigtable::V2::RowSet]
|
140
|
+
# original row_set
|
141
|
+
# @return ResumptionOption
|
142
|
+
def reset_row_set rows_limit, row_set
|
143
|
+
# 1. Remove ranges that have already been read, and reduce ranges that
|
128
144
|
# include the last read rows
|
129
145
|
if last_key
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
if end_key_read? range
|
134
|
-
delete_indexes << i
|
135
|
-
elsif start_key_read? range
|
146
|
+
row_set.row_ranges.reject! { |r| end_key_read? r }
|
147
|
+
row_set.row_ranges.each do |range|
|
148
|
+
if start_key_read? range
|
136
149
|
range.start_key_open = last_key
|
137
150
|
end
|
138
151
|
end
|
139
|
-
|
140
|
-
delete_indexes.each { |i| row_set.row_ranges.delete_at i }
|
141
|
-
end
|
142
|
-
|
143
|
-
if row_set.row_ranges.empty?
|
144
|
-
row_set.row_ranges <<
|
145
|
-
Google::Cloud::Bigtable::V2::RowRange.new(start_key_open: last_key)
|
146
152
|
end
|
147
153
|
|
148
|
-
#
|
154
|
+
# 2. Remove all individual keys before and up to the last read key
|
149
155
|
row_set.row_keys.select! { |k| k > last_key }
|
150
156
|
|
157
|
+
# 3. In read_operations, we always add an empty row_range if row_ranges and
|
158
|
+
# row_keys are not defined. So if both row_ranges and row_keys are empty,
|
159
|
+
# it means that we've already read all the ranges and keys, set ResumptionOption
|
160
|
+
# is_complete to true to indicate that this read is successful.
|
161
|
+
if last_key && row_set.row_ranges.empty? && row_set.row_keys.empty?
|
162
|
+
return ResumptionOption.new true, nil, nil
|
163
|
+
end
|
164
|
+
|
151
165
|
@chunk_processor.reset_to_new_row
|
152
|
-
|
166
|
+
|
167
|
+
ResumptionOption.new false, rows_limit, row_set
|
153
168
|
end
|
154
169
|
|
155
170
|
##
|
@@ -170,13 +185,14 @@ module Google
|
|
170
185
|
# @return [Boolean]
|
171
186
|
#
|
172
187
|
def start_key_read? range
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
188
|
+
if !range.start_key_closed.empty?
|
189
|
+
last_key >= range.start_key_closed
|
190
|
+
elsif !range.start_key_open.empty?
|
191
|
+
last_key > range.start_key_closed
|
192
|
+
else
|
193
|
+
# start is unbounded
|
194
|
+
true
|
195
|
+
end
|
180
196
|
end
|
181
197
|
|
182
198
|
##
|
@@ -186,13 +202,42 @@ module Google
|
|
186
202
|
# @return [Boolean]
|
187
203
|
#
|
188
204
|
def end_key_read? range
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
205
|
+
if !range.end_key_closed.empty?
|
206
|
+
range.end_key_closed <= last_key
|
207
|
+
elsif !range.end_key_open.empty?
|
208
|
+
range.end_key_open <= last_key
|
209
|
+
else
|
210
|
+
# end is unbounded
|
211
|
+
false
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
194
215
|
|
195
|
-
|
216
|
+
# @private
|
217
|
+
# ResumptionOption
|
218
|
+
# Helper class returned by retry_options
|
219
|
+
class ResumptionOption
|
220
|
+
# @private
|
221
|
+
# Creates a ResumptionOption instance
|
222
|
+
# @param is_complete [Boolean]
|
223
|
+
# marks if the current read is complete
|
224
|
+
# @param rows_limit [Integer]
|
225
|
+
# limit of the retry request
|
226
|
+
# @param row_set [Google::Cloud::Bigtable::V2::RowSet]
|
227
|
+
# row_set of the retry request
|
228
|
+
def initialize is_complete, rows_limit, row_set
|
229
|
+
@is_complete = is_complete
|
230
|
+
@rows_limit = rows_limit
|
231
|
+
@row_set = row_set
|
232
|
+
end
|
233
|
+
|
234
|
+
attr_reader :rows_limit
|
235
|
+
attr_reader :row_set
|
236
|
+
|
237
|
+
##
|
238
|
+
# returns if this operation should be retried
|
239
|
+
def complete?
|
240
|
+
@is_complete
|
196
241
|
end
|
197
242
|
end
|
198
243
|
end
|
@@ -163,6 +163,7 @@ module Google
|
|
163
163
|
def self.resolve_credentials given_credentials, scope
|
164
164
|
credentials = given_credentials || default_credentials(scope: scope)
|
165
165
|
return credentials if credentials.is_a? Google::Auth::Credentials
|
166
|
+
return credentials if credentials.is_a? GRPC::Core::Channel
|
166
167
|
Bigtable::Credentials.new credentials, scope: scope
|
167
168
|
end
|
168
169
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google-cloud-bigtable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.10.
|
4
|
+
version: 2.10.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Google LLC
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|