google-cloud-spanner 2.19.1 → 2.20.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1cf89ec86ecf1bed2fcbec728dca49cb5b7b18c6b27b187289b80bc70cceab87
4
- data.tar.gz: 862f6429db6150c4254005fca8e0697fcda4139a1ce837c0ed88eee82e3c24f2
3
+ metadata.gz: bb4b25a92a8c1064831ca356c5504c6114fde3efbda272ff4553dda86bf1a902
4
+ data.tar.gz: 66c330a8e53e6e9ffac6735008586c5ad0027629e71f66f8401e2c58ea4394a9
5
5
  SHA512:
6
- metadata.gz: 8d6a031a4a1af4aa914725f26fd3ff7921ab718f73df8774fd9aef5d7c419cd0d2733f5987e8d3afe54a3cb25e7bf31bf98579239fcdda4aa582ae872acea441
7
- data.tar.gz: 247ad7856b80831eb5039b8eec87a409a8c88f825dd0c65eebae40ebf9c17814870a14bcbf6316211d53cc6d1b4232b8834629c74960d4ac21b6568cd00240a5
6
+ metadata.gz: 6f296b9eb6930cad1c242402bc2dc8cb0ac47eaef1761acb598f35aaa63779d33192c0d92d5df852fe711ff7ad54c7b0f7695d2a0055b55a7dd05b80aa3d855d
7
+ data.tar.gz: e3de3a8796cbcade1973cd2b4d3d5a632c6677173f24cd1ba0b9dfa7d8355e93122d9d0c0c3926d442271d057517adf9125cfb61e2f896faa54ec324d590aed4
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Release History
2
2
 
3
+ ### 2.20.0 (2024-01-31)
4
+
5
+ #### Features
6
+
7
+ * Support Leader Aware Routing ([#78](https://github.com/googleapis/ruby-spanner/issues/78))
8
+
3
9
  ### 2.19.1 (2024-01-24)
4
10
 
5
11
  #### Bug Fixes
@@ -24,6 +24,7 @@ require "google/cloud/spanner/range"
24
24
  require "google/cloud/spanner/column_value"
25
25
  require "google/cloud/spanner/convert"
26
26
  require "google/cloud/spanner/commit_response"
27
+ require "google/cloud/spanner/lar_headers"
27
28
 
28
29
  module Google
29
30
  module Cloud
@@ -466,12 +467,14 @@ module Google
466
467
  request_options = Convert.to_request_options request_options,
467
468
  tag_type: :request_tag
468
469
  single_use_tx = single_use_transaction single_use
470
+ route_to_leader = LARHeaders.execute_query true
469
471
  results = nil
470
472
  @pool.with_session do |session|
471
473
  results = session.execute_query \
472
474
  sql, params: params, types: types, transaction: single_use_tx,
473
475
  query_options: query_options, request_options: request_options,
474
- call_options: call_options, directed_read_options: (directed_read_options || @directed_read_options)
476
+ call_options: call_options, directed_read_options: (directed_read_options || @directed_read_options),
477
+ route_to_leader: route_to_leader
475
478
  end
476
479
  results
477
480
  end
@@ -735,14 +738,14 @@ module Google
735
738
  params, types = Convert.to_input_params_and_types params, types
736
739
  request_options = Convert.to_request_options request_options,
737
740
  tag_type: :request_tag
738
-
741
+ route_to_leader = LARHeaders.partition_query
739
742
  results = nil
740
743
  @pool.with_session do |session|
741
744
  results = session.execute_query \
742
745
  sql, params: params, types: types,
743
746
  transaction: pdml_transaction(session),
744
747
  query_options: query_options, request_options: request_options,
745
- call_options: call_options
748
+ call_options: call_options, route_to_leader: route_to_leader
746
749
  end
747
750
  # Stream all PartialResultSet to get ResultSetStats
748
751
  results.rows.to_a
@@ -956,6 +959,7 @@ module Google
956
959
  columns = Array(columns).map(&:to_s)
957
960
  keys = Convert.to_key_set keys
958
961
  single_use_tx = single_use_transaction single_use
962
+ route_to_leader = LARHeaders.read false
959
963
  request_options = Convert.to_request_options request_options,
960
964
  tag_type: :request_tag
961
965
 
@@ -966,7 +970,8 @@ module Google
966
970
  transaction: single_use_tx,
967
971
  request_options: request_options,
968
972
  call_options: call_options,
969
- directed_read_options: (directed_read_options || @directed_read_options)
973
+ directed_read_options: (directed_read_options || @directed_read_options),
974
+ route_to_leader: route_to_leader
970
975
  end
971
976
  results
972
977
  end
@@ -0,0 +1,100 @@
1
+ # Copyright 2024 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ module Google
17
+ module Cloud
18
+ module Spanner
19
+ ##
20
+ # @private Helper module to access header values
21
+ # for Leader Aware Routing (LAR).
22
+ #
23
+ # For a multi-region Cloud Spanner instance, the majority of
24
+ # the write latency is attributed to the network round trip
25
+ # caused by several RPCs between SpanFE and SpanServer. This
26
+ # latency is amplified when the client application is deployed
27
+ # away from the leader region.
28
+ #
29
+ # To decrease the latency, we use LAR to help Google Front End (GFE)
30
+ # or Cloudpath Front End (CFE) to route requests directly to the
31
+ # leader region or the nearest non-leader region.
32
+ #
33
+ # For every RPC, we pass the header `x-goog-spanner-route-to-leader`,
34
+ # whose value is either 'true' or 'false'. Some RPCs (such as admin APIs)
35
+ # don't pass the header since they're deprecated in the handwritten
36
+ # client. Also, users of the client can choose to opt out of the
37
+ # LAR feature, in which case, we don't pass the header.
38
+ #
39
+ # This module lists the header values for different RPCs to be used
40
+ # by the client. These values are expected to be constant. Some RPCs
41
+ # (such as `execute_streaming_sql`) can have different values
42
+ # depending on whether they're run within read-only transactions
43
+ # or read-write transactions.
44
+ #
45
+ module LARHeaders
46
+ class << self
47
+ def begin_transaction is_read_write_tx
48
+ is_read_write_tx ? "true" : "false"
49
+ end
50
+
51
+ def read is_read_write_tx
52
+ is_read_write_tx ? "true" : "false"
53
+ end
54
+
55
+ def execute_query is_read_write_tx
56
+ is_read_write_tx ? "true" : "false"
57
+ end
58
+
59
+ def commit
60
+ "true"
61
+ end
62
+
63
+ def execute_batch_dml
64
+ "true"
65
+ end
66
+
67
+ def create_session
68
+ "true"
69
+ end
70
+
71
+ def batch_create_sessions
72
+ "true"
73
+ end
74
+
75
+ def delete_session
76
+ "false"
77
+ end
78
+
79
+ # rubocop:disable Naming/AccessorMethodName
80
+ def get_session
81
+ "true"
82
+ end
83
+ # rubocop:enable Naming/AccessorMethodName
84
+
85
+ def partition_read
86
+ "true"
87
+ end
88
+
89
+ def partition_query
90
+ "true"
91
+ end
92
+
93
+ def rollback
94
+ "true"
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -20,6 +20,7 @@ require "google/cloud/spanner/v1"
20
20
  require "google/cloud/spanner/admin/instance/v1"
21
21
  require "google/cloud/spanner/admin/database/v1"
22
22
  require "google/cloud/spanner/convert"
23
+ require "google/cloud/spanner/lar_headers"
23
24
 
24
25
  module Google
25
26
  module Cloud
@@ -35,6 +36,7 @@ module Google
35
36
  attr_accessor :lib_name
36
37
  attr_accessor :lib_version
37
38
  attr_accessor :quota_project
39
+ attr_accessor :enable_leader_aware_routing
38
40
 
39
41
  RST_STREAM_INTERNAL_ERROR = "Received RST_STREAM".freeze
40
42
  EOS_INTERNAL_ERROR = "Received unexpected EOS on DATA frame from server".freeze
@@ -42,7 +44,8 @@ module Google
42
44
  ##
43
45
  # Creates a new Service instance.
44
46
  def initialize project, credentials, quota_project: nil,
45
- host: nil, timeout: nil, lib_name: nil, lib_version: nil
47
+ host: nil, timeout: nil, lib_name: nil, lib_version: nil,
48
+ enable_leader_aware_routing: nil
46
49
  @project = project
47
50
  @credentials = credentials
48
51
  @quota_project = quota_project || (credentials.quota_project_id if credentials.respond_to? :quota_project_id)
@@ -50,6 +53,7 @@ module Google
50
53
  @timeout = timeout
51
54
  @lib_name = lib_name
52
55
  @lib_version = lib_version
56
+ @enable_leader_aware_routing = enable_leader_aware_routing
53
57
  end
54
58
 
55
59
  def channel
@@ -290,15 +294,19 @@ module Google
290
294
  end
291
295
 
292
296
  def get_session session_name, call_options: nil
297
+ route_to_leader = LARHeaders.get_session
293
298
  opts = default_options session_name: session_name,
294
- call_options: call_options
299
+ call_options: call_options,
300
+ route_to_leader: route_to_leader
295
301
  service.get_session({ name: session_name }, opts)
296
302
  end
297
303
 
298
304
  def create_session database_name, labels: nil,
299
305
  call_options: nil, database_role: nil
306
+ route_to_leader = LARHeaders.create_session
300
307
  opts = default_options session_name: database_name,
301
- call_options: call_options
308
+ call_options: call_options,
309
+ route_to_leader: route_to_leader
302
310
  session = V1::Session.new labels: labels, creator_role: database_role if labels || database_role
303
311
  service.create_session(
304
312
  { database: database_name, session: session }, opts
@@ -307,8 +315,10 @@ module Google
307
315
 
308
316
  def batch_create_sessions database_name, session_count, labels: nil,
309
317
  call_options: nil, database_role: nil
318
+ route_to_leader = LARHeaders.batch_create_sessions
310
319
  opts = default_options session_name: database_name,
311
- call_options: call_options
320
+ call_options: call_options,
321
+ route_to_leader: route_to_leader
312
322
  session = V1::Session.new labels: labels, creator_role: database_role if labels || database_role
313
323
  # The response may have fewer sessions than requested in the RPC.
314
324
  request = {
@@ -320,8 +330,10 @@ module Google
320
330
  end
321
331
 
322
332
  def delete_session session_name, call_options: nil
333
+ route_to_leader = LARHeaders.delete_session
323
334
  opts = default_options session_name: session_name,
324
- call_options: call_options
335
+ call_options: call_options,
336
+ route_to_leader: route_to_leader
325
337
  service.delete_session({ name: session_name }, opts)
326
338
  end
327
339
 
@@ -330,9 +342,11 @@ module Google
330
342
  partition_token: nil, seqno: nil,
331
343
  query_options: nil, request_options: nil,
332
344
  call_options: nil, data_boost_enabled: nil,
333
- directed_read_options: nil
345
+ directed_read_options: nil,
346
+ route_to_leader: nil
334
347
  opts = default_options session_name: session_name,
335
- call_options: call_options
348
+ call_options: call_options,
349
+ route_to_leader: route_to_leader
336
350
  request = {
337
351
  session: session_name,
338
352
  sql: sql,
@@ -352,8 +366,10 @@ module Google
352
366
 
353
367
  def execute_batch_dml session_name, transaction, statements, seqno,
354
368
  request_options: nil, call_options: nil
369
+ route_to_leader = LARHeaders.execute_batch_dml
355
370
  opts = default_options session_name: session_name,
356
- call_options: call_options
371
+ call_options: call_options,
372
+ route_to_leader: route_to_leader
357
373
  statements = statements.map(&:to_grpc)
358
374
  request = {
359
375
  session: session_name,
@@ -369,9 +385,11 @@ module Google
369
385
  index: nil, transaction: nil, limit: nil,
370
386
  resume_token: nil, partition_token: nil,
371
387
  request_options: nil, call_options: nil,
372
- data_boost_enabled: nil, directed_read_options: nil
388
+ data_boost_enabled: nil, directed_read_options: nil,
389
+ route_to_leader: nil
373
390
  opts = default_options session_name: session_name,
374
- call_options: call_options
391
+ call_options: call_options,
392
+ route_to_leader: route_to_leader
375
393
  request = {
376
394
  session: session_name, table: table_name, columns: columns,
377
395
  key_set: keys, transaction: transaction, index: index,
@@ -388,9 +406,10 @@ module Google
388
406
  max_partitions: nil, call_options: nil
389
407
  partition_opts = partition_options partition_size_bytes,
390
408
  max_partitions
391
-
409
+ route_to_leader = LARHeaders.partition_read
392
410
  opts = default_options session_name: session_name,
393
- call_options: call_options
411
+ call_options: call_options,
412
+ route_to_leader: route_to_leader
394
413
  request = {
395
414
  session: session_name, table: table_name, key_set: keys,
396
415
  transaction: transaction, index: index, columns: columns,
@@ -404,9 +423,10 @@ module Google
404
423
  max_partitions: nil, call_options: nil
405
424
  partition_opts = partition_options partition_size_bytes,
406
425
  max_partitions
407
-
426
+ route_to_leader = LARHeaders.partition_query
408
427
  opts = default_options session_name: session_name,
409
- call_options: call_options
428
+ call_options: call_options,
429
+ route_to_leader: route_to_leader
410
430
  request = {
411
431
  session: session_name, sql: sql, transaction: transaction,
412
432
  params: params, param_types: types,
@@ -417,6 +437,7 @@ module Google
417
437
 
418
438
  def commit session_name, mutations = [], transaction_id: nil,
419
439
  commit_options: nil, request_options: nil, call_options: nil
440
+ route_to_leader = LARHeaders.commit
420
441
  tx_opts = nil
421
442
  if transaction_id.nil?
422
443
  tx_opts = V1::TransactionOptions.new(
@@ -424,7 +445,8 @@ module Google
424
445
  )
425
446
  end
426
447
  opts = default_options session_name: session_name,
427
- call_options: call_options
448
+ call_options: call_options,
449
+ route_to_leader: route_to_leader
428
450
  request = {
429
451
  session: session_name, transaction_id: transaction_id,
430
452
  single_use_transaction: tx_opts, mutations: mutations,
@@ -439,19 +461,23 @@ module Google
439
461
  end
440
462
 
441
463
  def rollback session_name, transaction_id, call_options: nil
464
+ route_to_leader = LARHeaders.rollback
442
465
  opts = default_options session_name: session_name,
443
- call_options: call_options
466
+ call_options: call_options,
467
+ route_to_leader: route_to_leader
444
468
  request = { session: session_name, transaction_id: transaction_id }
445
469
  service.rollback request, opts
446
470
  end
447
471
 
448
472
  def begin_transaction session_name, request_options: nil,
449
- call_options: nil
473
+ call_options: nil,
474
+ route_to_leader: nil
450
475
  tx_opts = V1::TransactionOptions.new(
451
476
  read_write: V1::TransactionOptions::ReadWrite.new
452
477
  )
453
478
  opts = default_options session_name: session_name,
454
- call_options: call_options
479
+ call_options: call_options,
480
+ route_to_leader: route_to_leader
455
481
  request = {
456
482
  session: session_name,
457
483
  options: tx_opts,
@@ -482,8 +508,10 @@ module Google
482
508
  tx_opts = V1::TransactionOptions.new(
483
509
  partitioned_dml: V1::TransactionOptions::PartitionedDml.new
484
510
  )
511
+ route_to_leader = LARHeaders.begin_transaction true
485
512
  opts = default_options session_name: session_name,
486
- call_options: call_options
513
+ call_options: call_options,
514
+ route_to_leader: route_to_leader
487
515
  request = { session: session_name, options: tx_opts }
488
516
  service.begin_transaction request, opts
489
517
  end
@@ -608,12 +636,17 @@ module Google
608
636
  value << " gccl"
609
637
  end
610
638
 
611
- def default_options session_name: nil, call_options: nil
639
+ def default_options session_name: nil, call_options: nil, route_to_leader: nil
612
640
  opts = {}
641
+ metadata = {}
613
642
  if session_name
614
643
  default_prefix = session_name.split("/sessions/").first
615
- opts[:metadata] = { "google-cloud-resource-prefix" => default_prefix }
644
+ metadata["google-cloud-resource-prefix"] = default_prefix
645
+ end
646
+ if @enable_leader_aware_routing && !route_to_leader.nil?
647
+ metadata["x-goog-spanner-route-to-leader"] = route_to_leader
616
648
  end
649
+ opts[:metadata] = metadata
617
650
  if call_options
618
651
  opts[:timeout] = call_options[:timeout] if call_options[:timeout]
619
652
  opts[:retry_policy] = call_options[:retry_policy] if call_options[:retry_policy]
@@ -339,7 +339,7 @@ module Google
339
339
  def execute_query sql, params: nil, types: nil, transaction: nil,
340
340
  partition_token: nil, seqno: nil, query_options: nil,
341
341
  request_options: nil, call_options: nil, data_boost_enabled: nil,
342
- directed_read_options: nil
342
+ directed_read_options: nil, route_to_leader: nil
343
343
  ensure_service!
344
344
  query_options = merge_if_present query_options, @query_options
345
345
 
@@ -347,7 +347,8 @@ module Google
347
347
  transaction: transaction, params: params, types: types,
348
348
  partition_token: partition_token, seqno: seqno,
349
349
  query_options: query_options, request_options: request_options,
350
- call_options: call_options
350
+ call_options: call_options,
351
+ route_to_leader: route_to_leader
351
352
  }
352
353
  execute_query_options[:data_boost_enabled] = data_boost_enabled unless data_boost_enabled.nil?
353
354
  execute_query_options[:directed_read_options] = directed_read_options unless directed_read_options.nil?
@@ -497,7 +498,8 @@ module Google
497
498
  #
498
499
  def read table, columns, keys: nil, index: nil, limit: nil,
499
500
  transaction: nil, partition_token: nil, request_options: nil,
500
- call_options: nil, data_boost_enabled: nil, directed_read_options: nil
501
+ call_options: nil, data_boost_enabled: nil, directed_read_options: nil,
502
+ route_to_leader: nil
501
503
  ensure_service!
502
504
 
503
505
  read_options = {
@@ -505,7 +507,8 @@ module Google
505
507
  transaction: transaction,
506
508
  partition_token: partition_token,
507
509
  request_options: request_options,
508
- call_options: call_options
510
+ call_options: call_options,
511
+ route_to_leader: route_to_leader
509
512
  }
510
513
  read_options[:data_boost_enabled] = data_boost_enabled unless data_boost_enabled.nil?
511
514
  read_options[:directed_read_options] = directed_read_options unless directed_read_options.nil?
@@ -1178,7 +1181,8 @@ module Google
1178
1181
  # @private
1179
1182
  # Creates a new transaction object every time.
1180
1183
  def create_transaction
1181
- tx_grpc = service.begin_transaction path
1184
+ route_to_leader = LARHeaders.begin_transaction true
1185
+ tx_grpc = service.begin_transaction path, route_to_leader: route_to_leader
1182
1186
  Transaction.from_grpc tx_grpc, self
1183
1187
  end
1184
1188
 
@@ -1214,7 +1218,8 @@ module Google
1214
1218
  # Keeps the session alive by executing `"SELECT 1"`.
1215
1219
  def keepalive!
1216
1220
  ensure_service!
1217
- execute_query "SELECT 1"
1221
+ route_to_leader = LARHeaders.execute_query false
1222
+ execute_query "SELECT 1", route_to_leader: route_to_leader
1218
1223
  true
1219
1224
  rescue Google::Cloud::NotFoundError
1220
1225
  labels = @grpc.labels.to_h unless @grpc.labels.to_h.empty?
@@ -18,6 +18,7 @@ require "google/cloud/spanner/convert"
18
18
  require "google/cloud/spanner/results"
19
19
  require "google/cloud/spanner/commit"
20
20
  require "google/cloud/spanner/batch_update_results"
21
+ require "google/cloud/spanner/lar_headers"
21
22
 
22
23
  module Google
23
24
  module Cloud
@@ -361,13 +362,15 @@ module Google
361
362
 
362
363
  params, types = Convert.to_input_params_and_types params, types
363
364
  request_options = build_request_options request_options
365
+ route_to_leader = LARHeaders.execute_query true
364
366
 
365
367
  safe_execute do |seqno|
366
368
  results = session.execute_query sql, params: params, types: types,
367
369
  transaction: tx_selector, seqno: seqno,
368
370
  query_options: query_options,
369
371
  request_options: request_options,
370
- call_options: call_options
372
+ call_options: call_options,
373
+ route_to_leader: route_to_leader
371
374
  @grpc ||= results.transaction
372
375
  results
373
376
  end
@@ -715,12 +718,14 @@ module Google
715
718
  columns = Array(columns).map(&:to_s)
716
719
  keys = Convert.to_key_set keys
717
720
  request_options = build_request_options request_options
721
+ route_to_leader = LARHeaders.read true
718
722
 
719
723
  safe_execute do
720
724
  results = session.read table, columns, keys: keys, index: index, limit: limit,
721
725
  transaction: tx_selector,
722
726
  request_options: request_options,
723
- call_options: call_options
727
+ call_options: call_options,
728
+ route_to_leader: route_to_leader
724
729
  @grpc ||= results.transaction
725
730
  results
726
731
  end
@@ -1190,7 +1195,8 @@ module Google
1190
1195
  @mutex.synchronize do
1191
1196
  return if existing_transaction?
1192
1197
  ensure_session!
1193
- @grpc = service.begin_transaction session.path
1198
+ route_to_leader = LARHeaders.begin_transaction true
1199
+ @grpc = service.begin_transaction session.path, route_to_leader: route_to_leader
1194
1200
  end
1195
1201
  end
1196
1202
 
@@ -16,7 +16,7 @@
16
16
  module Google
17
17
  module Cloud
18
18
  module Spanner
19
- VERSION = "2.19.1".freeze
19
+ VERSION = "2.20.0".freeze
20
20
  end
21
21
  end
22
22
  end
@@ -82,6 +82,8 @@ module Google
82
82
  # `spanner-activerecord/0.0.1` is provided custom library name and
83
83
  # version and `gccl/1.13.1` represents the Cloud Spanner Ruby library
84
84
  # with version.
85
+ # @param enable_leader_aware_routing [Boolean] Specifies whether Leader
86
+ # Aware Routing should be enabled. Defaults to true.
85
87
  #
86
88
  # @return [Google::Cloud::Spanner::Project]
87
89
  #
@@ -92,7 +94,8 @@ module Google
92
94
  #
93
95
  def self.new project_id: nil, credentials: nil, scope: nil, timeout: nil,
94
96
  endpoint: nil, project: nil, keyfile: nil,
95
- emulator_host: nil, lib_name: nil, lib_version: nil
97
+ emulator_host: nil, lib_name: nil, lib_version: nil,
98
+ enable_leader_aware_routing: true
96
99
  project_id ||= project || default_project_id
97
100
  scope ||= configure.scope
98
101
  timeout ||= configure.timeout
@@ -122,7 +125,8 @@ module Google
122
125
  Spanner::Service.new(
123
126
  project_id, credentials, quota_project: configure.quota_project,
124
127
  host: endpoint, timeout: timeout, lib_name: lib_name,
125
- lib_version: lib_version
128
+ lib_version: lib_version,
129
+ enable_leader_aware_routing: enable_leader_aware_routing
126
130
  ),
127
131
  query_options: configure.query_options
128
132
  )
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-cloud-spanner
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.19.1
4
+ version: 2.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Moore
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-01-24 00:00:00.000000000 Z
12
+ date: 2024-01-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: google-cloud-core
@@ -317,6 +317,7 @@ files:
317
317
  - lib/google/cloud/spanner/instance/config/list.rb
318
318
  - lib/google/cloud/spanner/instance/job.rb
319
319
  - lib/google/cloud/spanner/instance/list.rb
320
+ - lib/google/cloud/spanner/lar_headers.rb
320
321
  - lib/google/cloud/spanner/partition.rb
321
322
  - lib/google/cloud/spanner/policy.rb
322
323
  - lib/google/cloud/spanner/pool.rb