google-cloud-spanner 1.10.1 → 1.11.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: 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