google-cloud-spanner 1.10.1 → 1.11.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: 6b87978449fd2f7ffb82c0153888807de38900ed7a8f54742f1431e7a2dd95bb
4
- data.tar.gz: f8c7d087d225bc1570adda320ec3dddd1b6fc6d036434012b01f9bb0662c3259
3
+ metadata.gz: e23be8bb214edae828f3b6722eb184b92410f81d450f80e20a7da77ec4500c65
4
+ data.tar.gz: b058d7928f61b7a56bb07eb7d0363ee35d01c328f6724fdb4600db889bc12d83
5
5
  SHA512:
6
- metadata.gz: 1025ac36ed30a071b5f5d1445d6a8f2d4bb507229df207b48cc912c6c0037648a49db8aeeeb759f846c89774c823111eefdae1bfecee7ecc6f9a3b7f3fc01a33
7
- data.tar.gz: 29cf35804b90d60ca00ca07df4eea300f801d5387327f2c9124cf1dbdbf61b3bd529f0ba5861b9379f351e596af28cc3491412dddedad23af8a2659bd5dd99b9
6
+ metadata.gz: 32be60bc2a9dd90922069e6026469386a067e840c655964d1b922c9c6fca619b01aa71fd4fd0b280fc923bcb640730035d1bb1e33755a82f7806e56c8fbc6aed
7
+ data.tar.gz: 29747283465fa90babaa936b5579499167c3c27b4f5d2de9da2e83e4f6eaf0699d2b807c856172838a7abd563fd7122b73c1f0fb7b9a35331b3054d8dc420ea4
@@ -1,5 +1,21 @@
1
1
  # Release History
2
2
 
3
+ ### 1.11.0 / 2019-10-07
4
+
5
+ #### BREAKING CHANGES (LOWER-LEVEL API ONLY)
6
+
7
+ * Make the session_count argument required in the lower-level API batch_create_sessions call
8
+
9
+ #### Performance Improvements
10
+
11
+ * Update Pool#init to use BatchCreateSessions
12
+ * Update pool checkout to pop sessions for LIFO
13
+
14
+ #### Documentation
15
+
16
+ * Update Policy example code
17
+ * Update IAM Policy class description and sample code
18
+
3
19
  ### 1.10.1 / 2019-09-04
4
20
 
5
21
  #### Documentation
@@ -20,27 +20,36 @@ module Google
20
20
  # specify access control policies for Cloud Platform resources.
21
21
  #
22
22
  #
23
- # A `Policy` consists of a list of `bindings`. A `binding` binds a list of
24
- # `members` to a `role`, where the members can be user accounts, Google groups,
25
- # Google domains, and service accounts. A `role` is a named list of permissions
26
- # defined by IAM.
23
+ # A `Policy` is a collection of `bindings`. A `binding` binds one or more
24
+ # `members` to a single `role`. Members can be user accounts, service accounts,
25
+ # Google groups, and domains (such as G Suite). A `role` is a named list of
26
+ # permissions (defined by IAM or configured by users). A `binding` can
27
+ # optionally specify a `condition`, which is a logic expression that further
28
+ # constrains the role binding based on attributes about the request and/or
29
+ # target resource.
27
30
  #
28
31
  # **JSON Example**
29
32
  #
30
33
  # {
31
34
  # "bindings": [
32
35
  # {
33
- # "role": "roles/owner",
36
+ # "role": "roles/resourcemanager.organizationAdmin",
34
37
  # "members": [
35
38
  # "user:mike@example.com",
36
39
  # "group:admins@example.com",
37
40
  # "domain:google.com",
38
- # "serviceAccount:my-other-app@appspot.gserviceaccount.com"
41
+ # "serviceAccount:my-project-id@appspot.gserviceaccount.com"
39
42
  # ]
40
43
  # },
41
44
  # {
42
- # "role": "roles/viewer",
43
- # "members": ["user:sean@example.com"]
45
+ # "role": "roles/resourcemanager.organizationViewer",
46
+ # "members": ["user:eve@example.com"],
47
+ # "condition": {
48
+ # "title": "expirable access",
49
+ # "description": "Does not grant access after Sep 2020",
50
+ # "expression": "request.time <
51
+ # timestamp('2020-10-01T00:00:00.000Z')",
52
+ # }
44
53
  # }
45
54
  # ]
46
55
  # }
@@ -52,15 +61,18 @@ module Google
52
61
  # * user:mike@example.com
53
62
  # * group:admins@example.com
54
63
  # * domain:google.com
55
- # * serviceAccount:my-other-app@appspot.gserviceaccount.com
56
- # role: roles/owner
64
+ # * serviceAccount:my-project-id@appspot.gserviceaccount.com
65
+ # role: roles/resourcemanager.organizationAdmin
57
66
  # * members:
58
- # * user:sean@example.com
59
- # role: roles/viewer
60
- #
61
- #
62
- # For a description of IAM and its features, see the
63
- # [IAM developer's guide](https://cloud.google.com/iam/docs).
67
+ # * user:eve@example.com
68
+ # role: roles/resourcemanager.organizationViewer
69
+ # condition:
70
+ # title: expirable access
71
+ # description: Does not grant access after Sep 2020
72
+ # expression: request.time < timestamp('2020-10-01T00:00:00.000Z')
73
+ #
74
+ # For a description of IAM and its features, see the
75
+ # [IAM developer's guide](https://cloud.google.com/iam/docs).
64
76
  # @!attribute [rw] version
65
77
  # @return [Integer]
66
78
  # Specifies the format of the policy.
@@ -68,12 +80,18 @@ module Google
68
80
  # Valid values are 0, 1, and 3. Requests specifying an invalid value will be
69
81
  # rejected.
70
82
  #
71
- # Policies with any conditional bindings must specify version 3. Policies
72
- # without any conditional bindings may specify any valid value or leave the
73
- # field unset.
83
+ # Operations affecting conditional bindings must specify version 3. This can
84
+ # be either setting a conditional policy, modifying a conditional binding,
85
+ # or removing a conditional binding from the stored conditional policy.
86
+ # Operations on non-conditional policies may specify any valid value or
87
+ # leave the field unset.
88
+ #
89
+ # If no etag is provided in the call to `setIamPolicy`, any version
90
+ # compliance checks on the incoming and/or stored policy is skipped.
74
91
  # @!attribute [rw] bindings
75
92
  # @return [Array<Google::Iam::V1::Binding>]
76
- # Associates a list of `members` to a `role`.
93
+ # Associates a list of `members` to a `role`. Optionally may specify a
94
+ # `condition` that determines when binding is in effect.
77
95
  # `bindings` with no members will result in an error.
78
96
  # @!attribute [rw] etag
79
97
  # @return [String]
@@ -86,7 +104,9 @@ module Google
86
104
  # ensure that their change will be applied to the same version of the policy.
87
105
  #
88
106
  # If no `etag` is provided in the call to `setIamPolicy`, then the existing
89
- # policy is overwritten.
107
+ # policy is overwritten. Due to blind-set semantics of an etag-less policy,
108
+ # 'setIamPolicy' will not fail even if either of incoming or stored policy
109
+ # does not meet the version requirements.
90
110
  class Policy; end
91
111
 
92
112
  # Associates `members` with a `role`.
@@ -20,27 +20,36 @@ module Google
20
20
  # specify access control policies for Cloud Platform resources.
21
21
  #
22
22
  #
23
- # A `Policy` consists of a list of `bindings`. A `binding` binds a list of
24
- # `members` to a `role`, where the members can be user accounts, Google groups,
25
- # Google domains, and service accounts. A `role` is a named list of permissions
26
- # defined by IAM.
23
+ # A `Policy` is a collection of `bindings`. A `binding` binds one or more
24
+ # `members` to a single `role`. Members can be user accounts, service accounts,
25
+ # Google groups, and domains (such as G Suite). A `role` is a named list of
26
+ # permissions (defined by IAM or configured by users). A `binding` can
27
+ # optionally specify a `condition`, which is a logic expression that further
28
+ # constrains the role binding based on attributes about the request and/or
29
+ # target resource.
27
30
  #
28
31
  # **JSON Example**
29
32
  #
30
33
  # {
31
34
  # "bindings": [
32
35
  # {
33
- # "role": "roles/owner",
36
+ # "role": "roles/resourcemanager.organizationAdmin",
34
37
  # "members": [
35
38
  # "user:mike@example.com",
36
39
  # "group:admins@example.com",
37
40
  # "domain:google.com",
38
- # "serviceAccount:my-other-app@appspot.gserviceaccount.com"
41
+ # "serviceAccount:my-project-id@appspot.gserviceaccount.com"
39
42
  # ]
40
43
  # },
41
44
  # {
42
- # "role": "roles/viewer",
43
- # "members": ["user:sean@example.com"]
45
+ # "role": "roles/resourcemanager.organizationViewer",
46
+ # "members": ["user:eve@example.com"],
47
+ # "condition": {
48
+ # "title": "expirable access",
49
+ # "description": "Does not grant access after Sep 2020",
50
+ # "expression": "request.time <
51
+ # timestamp('2020-10-01T00:00:00.000Z')",
52
+ # }
44
53
  # }
45
54
  # ]
46
55
  # }
@@ -52,15 +61,18 @@ module Google
52
61
  # * user:mike@example.com
53
62
  # * group:admins@example.com
54
63
  # * domain:google.com
55
- # * serviceAccount:my-other-app@appspot.gserviceaccount.com
56
- # role: roles/owner
64
+ # * serviceAccount:my-project-id@appspot.gserviceaccount.com
65
+ # role: roles/resourcemanager.organizationAdmin
57
66
  # * members:
58
- # * user:sean@example.com
59
- # role: roles/viewer
60
- #
61
- #
62
- # For a description of IAM and its features, see the
63
- # [IAM developer's guide](https://cloud.google.com/iam/docs).
67
+ # * user:eve@example.com
68
+ # role: roles/resourcemanager.organizationViewer
69
+ # condition:
70
+ # title: expirable access
71
+ # description: Does not grant access after Sep 2020
72
+ # expression: request.time < timestamp('2020-10-01T00:00:00.000Z')
73
+ #
74
+ # For a description of IAM and its features, see the
75
+ # [IAM developer's guide](https://cloud.google.com/iam/docs).
64
76
  # @!attribute [rw] version
65
77
  # @return [Integer]
66
78
  # Specifies the format of the policy.
@@ -68,12 +80,18 @@ module Google
68
80
  # Valid values are 0, 1, and 3. Requests specifying an invalid value will be
69
81
  # rejected.
70
82
  #
71
- # Policies with any conditional bindings must specify version 3. Policies
72
- # without any conditional bindings may specify any valid value or leave the
73
- # field unset.
83
+ # Operations affecting conditional bindings must specify version 3. This can
84
+ # be either setting a conditional policy, modifying a conditional binding,
85
+ # or removing a conditional binding from the stored conditional policy.
86
+ # Operations on non-conditional policies may specify any valid value or
87
+ # leave the field unset.
88
+ #
89
+ # If no etag is provided in the call to `setIamPolicy`, any version
90
+ # compliance checks on the incoming and/or stored policy is skipped.
74
91
  # @!attribute [rw] bindings
75
92
  # @return [Array<Google::Iam::V1::Binding>]
76
- # Associates a list of `members` to a `role`.
93
+ # Associates a list of `members` to a `role`. Optionally may specify a
94
+ # `condition` that determines when binding is in effect.
77
95
  # `bindings` with no members will result in an error.
78
96
  # @!attribute [rw] etag
79
97
  # @return [String]
@@ -86,7 +104,9 @@ module Google
86
104
  # ensure that their change will be applied to the same version of the policy.
87
105
  #
88
106
  # If no `etag` is provided in the call to `setIamPolicy`, then the existing
89
- # policy is overwritten.
107
+ # policy is overwritten. Due to blind-set semantics of an etag-less policy,
108
+ # 'setIamPolicy' will not fail even if either of incoming or stored policy
109
+ # does not meet the version requirements.
90
110
  class Policy; end
91
111
 
92
112
  # Associates `members` with a `role`.
@@ -1287,6 +1287,35 @@ module Google
1287
1287
  Session.from_grpc grpc, @project.service
1288
1288
  end
1289
1289
 
1290
+ ##
1291
+ # @private
1292
+ # Creates a batch of new session objects of size `total`.
1293
+ # Makes multiple RPCs if necessary. Returns empty array if total is 0.
1294
+ def batch_create_new_sessions total
1295
+ sessions = []
1296
+ remaining = total
1297
+ while remaining > 0
1298
+ sessions += batch_create_sessions remaining
1299
+ remaining = total - sessions.count
1300
+ end
1301
+ sessions
1302
+ end
1303
+
1304
+ ##
1305
+ # @private
1306
+ # The response may have fewer sessions than requested in the RPC.
1307
+ #
1308
+ def batch_create_sessions session_count
1309
+ ensure_service!
1310
+ resp = @project.service.batch_create_sessions \
1311
+ Admin::Database::V1::DatabaseAdminClient.database_path(
1312
+ project_id, instance_id, database_id
1313
+ ),
1314
+ session_count,
1315
+ labels: @session_labels
1316
+ resp.session.map { |grpc| Session.from_grpc grpc, @project.service }
1317
+ end
1318
+
1290
1319
  # @private
1291
1320
  def to_s
1292
1321
  "(project_id: #{project_id}, instance_id: #{instance_id}, " \
@@ -65,9 +65,11 @@ module Google
65
65
  loop do
66
66
  raise ClientClosedError if @closed
67
67
 
68
- read_session = session_queue.shift
68
+ # Use LIFO to ensure sessions are used from backend caches, which
69
+ # will reduce the read / write latencies on user requests.
70
+ read_session = session_queue.pop # LIFO
69
71
  return read_session if read_session
70
- write_transaction = transaction_queue.shift
72
+ write_transaction = transaction_queue.pop # LIFO
71
73
  return write_transaction.session if write_transaction
72
74
 
73
75
  if can_allocate_more_sessions?
@@ -117,9 +119,9 @@ module Google
117
119
  loop do
118
120
  raise ClientClosedError if @closed
119
121
 
120
- write_transaction = transaction_queue.shift
122
+ write_transaction = transaction_queue.pop # LIFO
121
123
  return write_transaction if write_transaction
122
- read_session = session_queue.shift
124
+ read_session = session_queue.pop
123
125
  if read_session
124
126
  action = read_session
125
127
  break
@@ -204,21 +206,19 @@ module Google
204
206
  max_threads: @threads
205
207
  # init the queues
206
208
  @new_sessions_in_process = 0
207
- @all_sessions = []
208
- @session_queue = []
209
209
  @transaction_queue = []
210
210
  # init the keepalive task
211
211
  create_keepalive_task!
212
212
  # init session queue
213
+ @all_sessions = @client.batch_create_new_sessions @min
214
+ sessions = @all_sessions.dup
213
215
  num_transactions = (@min * @write_ratio).round
214
- num_sessions = @min.to_i - num_transactions
215
- num_sessions.times.each do
216
- future { checkin_session new_session! }
217
- end
216
+ pending_transactions = sessions.shift num_transactions
218
217
  # init transaction queue
219
- num_transactions.times.each do
220
- future { checkin_transaction new_transaction! }
218
+ pending_transactions.each do |transaction|
219
+ future { checkin_transaction transaction.create_transaction }
221
220
  end
221
+ @session_queue = sessions
222
222
  end
223
223
 
224
224
  def shutdown
@@ -259,6 +259,18 @@ module Google
259
259
  end
260
260
  end
261
261
 
262
+ def batch_create_sessions database_name, session_count, labels: nil
263
+ opts = default_options_from_session database_name
264
+ session = Google::Spanner::V1::Session.new labels: labels if labels
265
+ execute do
266
+ # The response may have fewer sessions than requested in the RPC.
267
+ service.batch_create_sessions database_name,
268
+ session_count,
269
+ session_template: session,
270
+ options: opts
271
+ end
272
+ end
273
+
262
274
  def delete_session session_name
263
275
  opts = default_options_from_session session_name
264
276
  execute do
@@ -406,10 +406,6 @@ module Google
406
406
  #
407
407
  # @param database [String]
408
408
  # Required. The database in which the new sessions are created.
409
- # @param session_template [Google::Spanner::V1::Session | Hash]
410
- # Parameters to be applied to each created session.
411
- # A hash of the same form as `Google::Spanner::V1::Session`
412
- # can also be provided.
413
409
  # @param session_count [Integer]
414
410
  # Required. The number of sessions to be created in this batch call.
415
411
  # The API may return fewer than the requested number of sessions. If a
@@ -417,6 +413,10 @@ module Google
417
413
  # calls to BatchCreateSessions (adjusting
418
414
  # {Google::Spanner::V1::BatchCreateSessionsRequest#session_count session_count}
419
415
  # as necessary).
416
+ # @param session_template [Google::Spanner::V1::Session | Hash]
417
+ # Parameters to be applied to each created session.
418
+ # A hash of the same form as `Google::Spanner::V1::Session`
419
+ # can also be provided.
420
420
  # @param options [Google::Gax::CallOptions]
421
421
  # Overrides the default settings for this call, e.g, timeout,
422
422
  # retries, etc.
@@ -430,18 +430,21 @@ module Google
430
430
  #
431
431
  # spanner_client = Google::Cloud::Spanner::V1::SpannerClient.new
432
432
  # formatted_database = Google::Cloud::Spanner::V1::SpannerClient.database_path("[PROJECT]", "[INSTANCE]", "[DATABASE]")
433
- # response = spanner_client.batch_create_sessions(formatted_database)
433
+ #
434
+ # # TODO: Initialize `session_count`:
435
+ # session_count = 0
436
+ # response = spanner_client.batch_create_sessions(formatted_database, session_count)
434
437
 
435
438
  def batch_create_sessions \
436
439
  database,
440
+ session_count,
437
441
  session_template: nil,
438
- session_count: nil,
439
442
  options: nil,
440
443
  &block
441
444
  req = {
442
445
  database: database,
443
- session_template: session_template,
444
- session_count: session_count
446
+ session_count: session_count,
447
+ session_template: session_template
445
448
  }.delete_if { |_, v| v.nil? }
446
449
  req = Google::Gax::to_proto(req, Google::Spanner::V1::BatchCreateSessionsRequest)
447
450
  @batch_create_sessions.call(req, options, &block)
@@ -15,19 +15,19 @@
15
15
  "initial_retry_delay_millis": 250,
16
16
  "retry_delay_multiplier": 1.3,
17
17
  "max_retry_delay_millis": 32000,
18
- "initial_rpc_timeout_millis": 60000,
18
+ "initial_rpc_timeout_millis": 360000,
19
19
  "rpc_timeout_multiplier": 1.0,
20
- "max_rpc_timeout_millis": 60000,
21
- "total_timeout_millis": 600000
20
+ "max_rpc_timeout_millis": 360000,
21
+ "total_timeout_millis": 3600000
22
22
  },
23
23
  "streaming": {
24
24
  "initial_retry_delay_millis": 250,
25
25
  "retry_delay_multiplier": 1.3,
26
26
  "max_retry_delay_millis": 32000,
27
- "initial_rpc_timeout_millis": 120000,
27
+ "initial_rpc_timeout_millis": 360000,
28
28
  "rpc_timeout_multiplier": 1.0,
29
- "max_rpc_timeout_millis": 120000,
30
- "total_timeout_millis": 1200000
29
+ "max_rpc_timeout_millis": 360000,
30
+ "total_timeout_millis": 3600000
31
31
  },
32
32
  "long_running": {
33
33
  "initial_retry_delay_millis": 250,
@@ -16,7 +16,7 @@
16
16
  module Google
17
17
  module Cloud
18
18
  module Spanner
19
- VERSION = "1.10.1".freeze
19
+ VERSION = "1.11.0".freeze
20
20
  end
21
21
  end
22
22
  end
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: 1.10.1
4
+ version: 1.11.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: 2019-09-04 00:00:00.000000000 Z
12
+ date: 2019-10-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: google-cloud-core