google-cloud-bigtable 2.9.1 → 2.10.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: 869ab13c901934adc004a44d5db261a522ec046f0d041e7c4459e547553f09fd
4
- data.tar.gz: 0f8695ea7333b81550cb133821688cecc27659a198d5f8d33080a87380c06416
3
+ metadata.gz: bb8ed222ed2c24d4b39856180ede2faa2f861759a8166bcd86f1c76a969d8c24
4
+ data.tar.gz: 6a3575d2c69f0820899d14727a76bdeeeb89d05fde99abe90ff1b068ced220b0
5
5
  SHA512:
6
- metadata.gz: 94f86b473863ecfdada6caf7233b6bfcae87560703e40c0333df435422ea84d56382772eab6bc409e479838bf0710a65a7e54ce753a210fe80736bd7876fcabc
7
- data.tar.gz: e488a6e549ba34f836edb8b50e6c1eb3925af84d59f9bd0d19c9d4a7f664f042f37815df40388bf2b1f9dd8c0b728dcf06c9f80969ac0e1ff982ec65b8c092ce
6
+ metadata.gz: d1cd0db63088866f0aaf1ee4829b5d6af9a7f9b30ae0b2315cba9e3f6a2ccfb6171820970fb6bc8a2f3c8628c946a7dc37df5665c58b1eb0614337118b94831b
7
+ data.tar.gz: c56bd73b38d3f8b031200f78228c018d9c59d81e170067755204983b8f51c162f31c7183e09cde5be27be89b69cfef3d1c221db31d0247343bf68d03d6bde5e9
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Release History
2
2
 
3
+ ### 2.10.1 (2024-03-19)
4
+
5
+ #### Bug Fixes
6
+
7
+ * 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))
8
+
9
+ ### 2.10.0 (2024-03-07)
10
+
11
+ #### Features
12
+
13
+ * Update minimum supported Ruby version to 2.7 ([#25298](https://github.com/googleapis/google-cloud-ruby/issues/25298))
14
+
3
15
  ### 2.9.1 (2024-02-09)
4
16
 
5
17
  #### Documentation
@@ -76,11 +76,11 @@ module Google
76
76
  def validate_reset_row
77
77
  return unless chunk.reset_row
78
78
 
79
- value = (!chunk.row_key.empty? ||
80
- chunk.family_name ||
81
- chunk.qualifier ||
82
- !chunk.value.empty? ||
83
- chunk.timestamp_micros.positive?)
79
+ value = !chunk.row_key.empty? ||
80
+ chunk.family_name ||
81
+ chunk.qualifier ||
82
+ !chunk.value.empty? ||
83
+ chunk.timestamp_micros.positive?
84
84
 
85
85
  raise_if value, "A reset should have no data"
86
86
  end
@@ -370,8 +370,7 @@ module Google
370
370
  added_keys = @column_families.keys - comparison_map.keys
371
371
 
372
372
  added_keys.map do |name|
373
- Google::Cloud::Bigtable::Admin::V2::ModifyColumnFamiliesRequest:: \
374
- Modification.new(
373
+ Google::Cloud::Bigtable::Admin::V2::ModifyColumnFamiliesRequest::Modification.new(
375
374
  id: name,
376
375
  create: @column_families[name]
377
376
  )
@@ -394,8 +393,7 @@ module Google
394
393
  end
395
394
 
396
395
  updated_keys.map do |name|
397
- Google::Cloud::Bigtable::Admin::V2::ModifyColumnFamiliesRequest:: \
398
- Modification.new(
396
+ Google::Cloud::Bigtable::Admin::V2::ModifyColumnFamiliesRequest::Modification.new(
399
397
  id: name,
400
398
  update: @column_families[name]
401
399
  )
@@ -415,8 +413,7 @@ module Google
415
413
  dropped_keys = comparison_map.keys - @column_families.keys
416
414
 
417
415
  dropped_keys.map do |name|
418
- Google::Cloud::Bigtable::Admin::V2::ModifyColumnFamiliesRequest:: \
419
- Modification.new(
416
+ Google::Cloud::Bigtable::Admin::V2::ModifyColumnFamiliesRequest::Modification.new(
420
417
  id: name,
421
418
  drop: true
422
419
  )
@@ -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
- rows_limit, row_set = rows_reader.retry_options limit, row_set
163
- retry
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 [Integer, Google::Cloud::Bigtable::V2::RowSet]
120
+ # @return ResumptionOption
120
121
  #
121
122
  def retry_options rows_limit, row_set
122
- return [rows_limit, row_set] unless last_key
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
- # 1. Reduce the limit by the number of already returned responses.
129
+ # Reduce the limit by the number of already returned responses.
125
130
  rows_limit -= @rows_count if rows_limit
126
131
 
127
- # 2. Remove ranges that have already been read, and reduce ranges that
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
- delete_indexes = []
131
-
132
- row_set.row_ranges.each_with_index do |range, i|
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
- # 3. Remove all individual keys before and up to the last read key
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
- [rows_limit, row_set]
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
- start_key = if range.start_key_closed.empty?
174
- range.start_key_open
175
- else
176
- range.start_key_closed
177
- end
178
-
179
- start_key.empty? || last_key >= start_key
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
- end_key = if range.end_key_closed.empty?
190
- range.end_key_open
191
- else
192
- range.end_key_closed
193
- end
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
- end_key && end_key <= last_key
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
@@ -658,13 +658,11 @@ module Google
658
658
 
659
659
  def read_rows instance_id, table_id, app_profile_id: nil, rows: nil, filter: nil, rows_limit: nil
660
660
  client(table_path(instance_id, table_id), app_profile_id).read_rows(
661
- **{
662
- table_name: table_path(instance_id, table_id),
663
- rows: rows,
664
- filter: filter,
665
- rows_limit: rows_limit,
666
- app_profile_id: app_profile_id
667
- }
661
+ table_name: table_path(instance_id, table_id),
662
+ rows: rows,
663
+ filter: filter,
664
+ rows_limit: rows_limit,
665
+ app_profile_id: app_profile_id
668
666
  )
669
667
  end
670
668
 
@@ -16,7 +16,7 @@
16
16
  module Google
17
17
  module Cloud
18
18
  module Bigtable
19
- VERSION = "2.9.1".freeze
19
+ VERSION = "2.10.1".freeze
20
20
  end
21
21
  end
22
22
  end
@@ -65,11 +65,13 @@ module Google
65
65
  # bigtable = gcloud.bigtable
66
66
  #
67
67
  def bigtable scope: nil, timeout: nil, credentials: nil
68
+ credentials ||= @keyfile
69
+ timeout ||= @timeout
68
70
  Google::Cloud.bigtable(
69
71
  project_id: @project,
70
- credentials: (credentials || @keyfile),
72
+ credentials: credentials,
71
73
  scope: scope,
72
- timeout: (timeout || @timeout)
74
+ timeout: timeout
73
75
  )
74
76
  end
75
77
 
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.9.1
4
+ version: 2.10.1
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-02-09 00:00:00.000000000 Z
11
+ date: 2024-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -66,118 +66,6 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.5'
69
- - !ruby/object:Gem::Dependency
70
- name: google-style
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: 1.26.1
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: 1.26.1
83
- - !ruby/object:Gem::Dependency
84
- name: minitest
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '5.16'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '5.16'
97
- - !ruby/object:Gem::Dependency
98
- name: minitest-focus
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '1.1'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '1.1'
111
- - !ruby/object:Gem::Dependency
112
- name: minitest-rg
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '5.2'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: '5.2'
125
- - !ruby/object:Gem::Dependency
126
- name: redcarpet
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '3.0'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '3.0'
139
- - !ruby/object:Gem::Dependency
140
- name: simplecov
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: '0.9'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: '0.9'
153
- - !ruby/object:Gem::Dependency
154
- name: yard
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - "~>"
158
- - !ruby/object:Gem::Version
159
- version: '0.9'
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - "~>"
165
- - !ruby/object:Gem::Version
166
- version: '0.9'
167
- - !ruby/object:Gem::Dependency
168
- name: yard-doctest
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - "~>"
172
- - !ruby/object:Gem::Version
173
- version: 0.1.13
174
- type: :development
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - "~>"
179
- - !ruby/object:Gem::Version
180
- version: 0.1.13
181
69
  description: google-cloud-bigtable is the official library for Cloud Bigtable API.
182
70
  email: googleapis-packages@google.com
183
71
  executables: []
@@ -256,14 +144,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
256
144
  requirements:
257
145
  - - ">="
258
146
  - !ruby/object:Gem::Version
259
- version: '2.6'
147
+ version: '2.7'
260
148
  required_rubygems_version: !ruby/object:Gem::Requirement
261
149
  requirements:
262
150
  - - ">="
263
151
  - !ruby/object:Gem::Version
264
152
  version: '0'
265
153
  requirements: []
266
- rubygems_version: 3.5.3
154
+ rubygems_version: 3.5.6
267
155
  signing_key:
268
156
  specification_version: 4
269
157
  summary: API Client library for Cloud Bigtable API