google-cloud-pubsub 2.6.1 → 2.7.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: 24eb8350951100fd325571412067861f44eab7575cadd16a8daee35ebf8f26ae
4
- data.tar.gz: ae3c0aef696e531b2f5bfb61bbff09f4f50e4c42e62d94b027b38a620858aa88
3
+ metadata.gz: f6636ac65229c0dc438c63fa9aebda474396701364bfbea7e5da460ceea50a26
4
+ data.tar.gz: a0c0cafbbaf4083c1141d851dc6cecb8cb70bc01df940a139fe21d057aa2fb97
5
5
  SHA512:
6
- metadata.gz: 7103a23c4129c14745401b84e41f6522518d6c64b0a89871c2af1bca4464d6883304a7e752411d35bf2bc2e3a877b3cbffc3afffed71df935cb98a3ee696a347
7
- data.tar.gz: 425057b02a2ced62a0e55db13eddd0c67f377d4a34b98f90d225cc79a1261c99afb9bb7b67f96198c8d183af7708c9f15b409e5fa73c8cdbf96176e6efb441dd
6
+ metadata.gz: a187e9935196b66d4be65c7cf7b34148de36197f9e2c5e9144ccc9f78652370d7a441b33e14a002133b05aa6565cc38998912277e8896d81178bf5712ce9df8c
7
+ data.tar.gz: ee801f9d5959f5e2a38ccf13beaac930ca4629c81a268b627a8bacc7ad9ce430581fd690100fa5ef57b4fa5e20e3c5f40d72e905ce2535d978398f03112a48eb
data/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Release History
2
2
 
3
+ ### 2.7.0 / 2021-06-15
4
+
5
+ #### Features
6
+
7
+ * Add Publisher Flow Control
8
+ * Add flow_control to async options in Project#create_topic and Project#topic
9
+ * Add FlowControlLimitError
10
+
11
+ #### Bug Fixes
12
+
13
+ * Fix Project#schema and #schemas to return full resource
14
+ * Include schema definition in default return values.
15
+ * Fix Schema#definition to return nil instead of empty string when not present.
16
+
3
17
  ### 2.6.1 / 2021-04-28
4
18
 
5
19
  #### Bug Fixes
@@ -33,8 +33,6 @@ module Google
33
33
  # See {file:OVERVIEW.md Google Cloud Pub/Sub Overview}.
34
34
  #
35
35
  module PubSub
36
- # rubocop:disable Metrics/AbcSize
37
-
38
36
  ##
39
37
  # Creates a new object for connecting to the Pub/Sub service.
40
38
  # Each call creates a new connection.
@@ -110,8 +108,6 @@ module Google
110
108
  PubSub::Project.new service
111
109
  end
112
110
 
113
- # rubocop:enable Metrics/AbcSize
114
-
115
111
  ##
116
112
  # Configure the Google Cloud PubSub library.
117
113
  #
@@ -16,6 +16,7 @@
16
16
  require "monitor"
17
17
  require "concurrent"
18
18
  require "google/cloud/pubsub/errors"
19
+ require "google/cloud/pubsub/flow_controller"
19
20
  require "google/cloud/pubsub/async_publisher/batch"
20
21
  require "google/cloud/pubsub/publish_result"
21
22
  require "google/cloud/pubsub/service"
@@ -65,14 +66,21 @@ module Google
65
66
  attr_reader :interval
66
67
  attr_reader :publish_threads
67
68
  attr_reader :callback_threads
69
+ attr_reader :flow_control
68
70
  ##
69
71
  # @private Implementation accessors
70
72
  attr_reader :service, :batch, :publish_thread_pool,
71
- :callback_thread_pool
73
+ :callback_thread_pool, :flow_controller
72
74
 
73
75
  ##
74
76
  # @private Create a new instance of the object.
75
- def initialize topic_name, service, max_bytes: 1_000_000, max_messages: 100, interval: 0.01, threads: {}
77
+ def initialize topic_name,
78
+ service,
79
+ max_bytes: 1_000_000,
80
+ max_messages: 100,
81
+ interval: 0.01,
82
+ threads: {},
83
+ flow_control: {}
76
84
  # init MonitorMixin
77
85
  super()
78
86
  @topic_name = service.topic_path topic_name
@@ -83,6 +91,10 @@ module Google
83
91
  @interval = interval
84
92
  @publish_threads = (threads[:publish] || 2).to_i
85
93
  @callback_threads = (threads[:callback] || 4).to_i
94
+ @flow_control = {
95
+ message_limit: 10 * @max_messages,
96
+ byte_limit: 10 * @max_bytes
97
+ }.merge(flow_control).freeze
86
98
 
87
99
  @published_at = nil
88
100
  @publish_thread_pool = Concurrent::ThreadPoolExecutor.new max_threads: @publish_threads
@@ -91,7 +103,7 @@ module Google
91
103
  @ordered = false
92
104
  @batches = {}
93
105
  @cond = new_cond
94
-
106
+ @flow_controller = FlowController.new(**@flow_control)
95
107
  @thread = Thread.new { run_background }
96
108
  end
97
109
 
@@ -121,13 +133,22 @@ module Google
121
133
  #
122
134
  def publish data = nil, attributes = nil, ordering_key: nil, **extra_attrs, &callback
123
135
  msg = Convert.pubsub_message data, attributes, ordering_key, extra_attrs
136
+ begin
137
+ @flow_controller.acquire msg.to_proto.bytesize
138
+ rescue FlowControlLimitError => e
139
+ stop_publish ordering_key, e if ordering_key
140
+ raise
141
+ end
124
142
 
125
143
  synchronize do
126
144
  raise AsyncPublisherStopped if @stopped
127
145
  raise OrderedMessagesDisabled if !@ordered && !msg.ordering_key.empty? # default is empty string
128
146
 
129
147
  batch = resolve_batch_for_message msg
130
- raise OrderingKeyError, batch.ordering_key if batch.canceled?
148
+ if batch.canceled?
149
+ @flow_controller.release msg.to_proto.bytesize
150
+ raise OrderingKeyError, batch.ordering_key
151
+ end
131
152
  batch_action = batch.add msg, callback
132
153
  if batch_action == :full
133
154
  publish_batches!
@@ -305,6 +326,21 @@ module Google
305
326
  @batches[ordering_key]
306
327
  end
307
328
 
329
+ def stop_publish ordering_key, err
330
+ synchronize do
331
+ batch = resolve_batch_for_ordering_key ordering_key
332
+ return if batch.nil?
333
+ items = batch.cancel!
334
+ items.each do |item|
335
+ @flow_controller.release item.bytesize
336
+ next unless item.callback
337
+
338
+ publish_result = PublishResult.from_error item.msg, err
339
+ execute_callback_async item.callback, publish_result
340
+ end
341
+ end
342
+ end
343
+
308
344
  def publish_batches! stop: nil
309
345
  @batches.reject! { |_ordering_key, batch| batch.empty? }
310
346
  @batches.each_value do |batch|
@@ -325,7 +361,6 @@ module Google
325
361
  end
326
362
 
327
363
  # rubocop:disable Metrics/AbcSize
328
- # rubocop:disable Metrics/MethodLength
329
364
 
330
365
  def publish_batch_sync topic_name, batch
331
366
  # The only batch methods that are safe to call from the loop are
@@ -337,6 +372,7 @@ module Google
337
372
  unless items.empty?
338
373
  grpc = @service.publish topic_name, items.map(&:msg)
339
374
  items.zip Array(grpc.message_ids) do |item, id|
375
+ @flow_controller.release item.bytesize
340
376
  next unless item.callback
341
377
 
342
378
  item.msg.message_id = id
@@ -363,6 +399,7 @@ module Google
363
399
  end
364
400
 
365
401
  items.each do |item|
402
+ @flow_controller.release item.bytesize
366
403
  next unless item.callback
367
404
 
368
405
  publish_result = PublishResult.from_error item.msg, e
@@ -374,7 +411,6 @@ module Google
374
411
  end
375
412
 
376
413
  # rubocop:enable Metrics/AbcSize
377
- # rubocop:enable Metrics/MethodLength
378
414
 
379
415
  PUBLISH_RETRY_ERRORS = [
380
416
  GRPC::Cancelled, GRPC::DeadlineExceeded, GRPC::Internal,
@@ -129,8 +129,8 @@ module Google
129
129
  end
130
130
 
131
131
  ##
132
- # Rebalances the batch by moving any queued items that will fit into
133
- # the active item list.
132
+ # Fills the batch by sequentially moving the queued items that will
133
+ # fit into the active item list.
134
134
  #
135
135
  # This method is only intended to be used by the active publishing
136
136
  # job.
@@ -152,8 +152,6 @@ module Google
152
152
  end
153
153
  end
154
154
 
155
- # rubocop:disable Metrics/MethodLength
156
-
157
155
  ##
158
156
  # Resets the batch after a successful publish. This clears the active
159
157
  # item list and moves the queued items that will fit into the active
@@ -202,8 +200,6 @@ module Google
202
200
  true
203
201
  end
204
202
 
205
- # rubocop:enable Metrics/MethodLength
206
-
207
203
  ##
208
204
  # Cancel the batch and hault futher batches until resumed. See
209
205
  # {#resume!} and {#canceled?}.
@@ -78,6 +78,14 @@ module Google
78
78
  super "Can't publish message using #{ordering_key}."
79
79
  end
80
80
  end
81
+
82
+ ##
83
+ # Raised when the desired action is `error` and the message would exceed
84
+ # flow control limits, or when the desired action is `block` and the
85
+ # message would block forever against the flow control limits.
86
+ #
87
+ class FlowControlLimitError < Google::Cloud::Error
88
+ end
81
89
  end
82
90
 
83
91
  Pubsub = PubSub unless const_defined? :Pubsub
@@ -0,0 +1,139 @@
1
+ # Copyright 2021 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
+ require "google/cloud/pubsub/errors"
17
+ require "concurrent/atomics"
18
+
19
+ module Google
20
+ module Cloud
21
+ module PubSub
22
+ ##
23
+ # @private
24
+ #
25
+ # Used to control the flow of messages passing through it.
26
+ #
27
+ class FlowController
28
+ attr_reader :message_limit
29
+ attr_reader :byte_limit
30
+ attr_reader :limit_exceeded_behavior
31
+ ##
32
+ # @private Implementation accessors
33
+ attr_reader :outstanding_messages, :outstanding_bytes, :awaiting
34
+
35
+ def initialize message_limit: 1000, byte_limit: 10_000_000, limit_exceeded_behavior: :ignore
36
+ unless [:ignore, :error, :block].include? limit_exceeded_behavior
37
+ raise ArgumentError, "limit_exceeded_behavior must be one of :ignore, :error, :block"
38
+ end
39
+ if [:error, :block].include?(limit_exceeded_behavior) && message_limit < 1
40
+ raise ArgumentError,
41
+ "Flow control message limit (#{message_limit}) exceeded by a single message, would block forever"
42
+ end
43
+ @mutex = Mutex.new
44
+ @message_limit = message_limit
45
+ @byte_limit = byte_limit
46
+ @limit_exceeded_behavior = limit_exceeded_behavior
47
+ @outstanding_messages = 0
48
+ @outstanding_bytes = 0
49
+
50
+ @awaiting = []
51
+ end
52
+
53
+ def acquire message_size
54
+ return if limit_exceeded_behavior == :ignore
55
+ @mutex.lock
56
+ if limit_exceeded_behavior == :error && would_exceed_message_limit?
57
+ raise FlowControlLimitError, "Flow control message limit (#{message_limit}) would be exceeded"
58
+ end
59
+ if limit_exceeded_behavior == :error && would_exceed_byte_limit?(message_size)
60
+ raise FlowControlLimitError,
61
+ "Flow control byte limit (#{byte_limit}) would be exceeded, message_size: #{message_size}"
62
+ end
63
+ if limit_exceeded_behavior == :block && message_size > byte_limit
64
+ raise FlowControlLimitError,
65
+ "Flow control byte limit (#{byte_limit}) exceeded by a single message, would block forever"
66
+ end
67
+
68
+ acquire_or_wait message_size
69
+ ensure
70
+ @mutex.unlock if @mutex.owned?
71
+ end
72
+
73
+ def release message_size
74
+ return if limit_exceeded_behavior == :ignore
75
+ @mutex.synchronize do
76
+ raise "Flow control messages count would be negative" if (@outstanding_messages - 1).negative?
77
+ raise "Flow control bytes count would be negative" if (@outstanding_bytes - message_size).negative?
78
+
79
+ @outstanding_messages -= 1
80
+ @outstanding_bytes -= message_size
81
+ @awaiting.first.set unless @awaiting.empty?
82
+ end
83
+ end
84
+
85
+ protected
86
+
87
+ # rubocop:disable Style/IdenticalConditionalBranches
88
+ # rubocop:disable Style/GuardClause
89
+
90
+ def acquire_or_wait message_size
91
+ waiter = nil
92
+ while is_new_and_others_wait?(waiter) ||
93
+ would_exceed_byte_limit?(message_size) ||
94
+ would_exceed_message_limit?
95
+
96
+ if waiter.nil?
97
+ waiter = Concurrent::Event.new
98
+ # This waiter gets added to the back of the line.
99
+ @awaiting << waiter
100
+ else
101
+ waiter = Concurrent::Event.new
102
+ # This waiter already in line stays at the head of the line.
103
+ @awaiting[0] = waiter
104
+ end
105
+ @mutex.unlock
106
+ waiter.wait
107
+ @mutex.lock
108
+ end
109
+ @outstanding_messages += 1
110
+ @outstanding_bytes += message_size
111
+
112
+ @awaiting.shift if waiter # Remove the newly released waiter from the head of the queue.
113
+
114
+ # There may be some surplus left; let the next message waiting try to acquire a permit.
115
+ if !@awaiting.empty? && @outstanding_bytes < byte_limit && @outstanding_messages < message_limit
116
+ @awaiting.first.set
117
+ end
118
+ end
119
+
120
+ # rubocop:enable Style/IdenticalConditionalBranches
121
+ # rubocop:enable Style/GuardClause
122
+
123
+ def is_new_and_others_wait? waiter
124
+ waiter.nil? && !@awaiting.empty?
125
+ end
126
+
127
+ def would_exceed_message_limit?
128
+ @outstanding_messages + 1 > message_limit
129
+ end
130
+
131
+ def would_exceed_byte_limit? bytes_requested
132
+ @outstanding_bytes + bytes_requested > byte_limit
133
+ end
134
+ end
135
+ end
136
+
137
+ Pubsub = PubSub unless const_defined? :Pubsub
138
+ end
139
+ end
@@ -103,6 +103,16 @@ module Google
103
103
  # * `:threads` (Hash) The number of threads to create to handle concurrent calls by the publisher:
104
104
  # * `:publish` (Integer) The number of threads used to publish messages. Default is 2.
105
105
  # * `:callback` (Integer) The number of threads to handle the published messages' callbacks. Default is 4.
106
+ # * `:flow_control` (Hash) The client flow control settings for message publishing:
107
+ # * `:message_limit` (Integer) The maximum number of messages allowed to wait to be published. Default is
108
+ # `10 * max_messages`.
109
+ # * `:byte_limit` (Integer) The maximum total size of messages allowed to wait to be published. Default is
110
+ # `10 * max_bytes`.
111
+ # * `:limit_exceeded_behavior` (Symbol) The action to take when publish flow control limits are exceeded.
112
+ # Possible values include: `:ignore` - Flow control is disabled. `:error` - Calls to {Topic#publish_async}
113
+ # will raise {FlowControlLimitError} when publish flow control limits are exceeded. `:block` - Calls to
114
+ # {Topic#publish_async} will block until capacity is available when publish flow control limits are
115
+ # exceeded. The default value is `:ignore`.
106
116
  #
107
117
  # @return [Google::Cloud::PubSub::Topic, nil] Returns `nil` if topic
108
118
  # does not exist.
@@ -206,6 +216,16 @@ module Google
206
216
  # Default is 2.
207
217
  # * `:callback` (Integer) The number of threads to handle the published
208
218
  # messages' callbacks. Default is 4.
219
+ # * `:flow_control` (Hash) The client flow control settings for message publishing:
220
+ # * `:message_limit` (Integer) The maximum number of messages allowed to wait to be published. Default is
221
+ # `10 * max_messages`.
222
+ # * `:byte_limit` (Integer) The maximum total size of messages allowed to wait to be published. Default is
223
+ # `10 * max_bytes`.
224
+ # * `:limit_exceeded_behavior` (Symbol) The action to take when publish flow control limits are exceeded.
225
+ # Possible values include: `:ignore` - Flow control is disabled. `:error` - Calls to {Topic#publish_async}
226
+ # will raise {FlowControlLimitError} when publish flow control limits are exceeded. `:block` - Calls to
227
+ # {Topic#publish_async} will block until capacity is available when publish flow control limits are
228
+ # exceeded. The default value is `:ignore`.
209
229
  # @param [String] schema_name The name of the schema that messages
210
230
  # published should be validated against. Optional. The value can be a
211
231
  # simple schema ID (relative name), in which case the current project
@@ -423,7 +443,7 @@ module Google
423
443
  # * `BASIC` - Include the `name` and `type` of the schema, but not the `definition`.
424
444
  # * `FULL` - Include all Schema object fields.
425
445
  #
426
- # The default value is `BASIC`.
446
+ # The default value is `FULL`.
427
447
  # @param [String] project If the schema belongs to a project other
428
448
  # than the one currently connected to, the alternate project ID can be
429
449
  # specified here. Not used if a fully-qualified schema name is
@@ -444,7 +464,7 @@ module Google
444
464
  # schema = pubsub.schema "my-schema"
445
465
  # schema.name #=> "projects/my-project/schemas/my-schema"
446
466
  # schema.type #=> :PROTOCOL_BUFFER
447
- # # schema.definition # nil - Use view: :full to load complete resource.
467
+ # schema.definition # The schema definition
448
468
  #
449
469
  # @example Skip the lookup against the service with `skip_lookup`:
450
470
  # require "google/cloud/pubsub"
@@ -458,21 +478,21 @@ module Google
458
478
  # schema.type #=> nil
459
479
  # schema.definition #=> nil
460
480
  #
461
- # @example Get the schema definition with `view: :full`:
481
+ # @example Omit the schema definition with `view: :basic`:
462
482
  # require "google/cloud/pubsub"
463
483
  #
464
484
  # pubsub = Google::Cloud::PubSub.new
465
485
  #
466
- # schema = pubsub.schema "my-schema", view: :full
486
+ # schema = pubsub.schema "my-schema", view: :basic
467
487
  # schema.name #=> "projects/my-project/schemas/my-schema"
468
488
  # schema.type #=> :PROTOCOL_BUFFER
469
- # schema.definition # The schema definition
489
+ # schema.definition #=> nil
470
490
  #
471
491
  def schema schema_name, view: nil, project: nil, skip_lookup: nil
472
492
  ensure_service!
473
493
  options = { project: project }
474
494
  return Schema.from_name schema_name, view, service, options if skip_lookup
475
- view ||= :BASIC
495
+ view ||= :FULL
476
496
  grpc = service.get_schema schema_name, view, options
477
497
  Schema.from_grpc grpc, service
478
498
  rescue Google::Cloud::NotFoundError
@@ -531,7 +551,7 @@ module Google
531
551
  # * `BASIC` - Include the `name` and `type` of the schema, but not the `definition`.
532
552
  # * `FULL` - Include all Schema object fields.
533
553
  #
534
- # The default value is `BASIC`.
554
+ # The default value is `FULL`.
535
555
  # @param [String] token A previously-returned page token representing
536
556
  # part of the larger set of results to view.
537
557
  # @param [Integer] max Maximum number of schemas to return.
@@ -561,7 +581,7 @@ module Google
561
581
  #
562
582
  def schemas view: nil, token: nil, max: nil
563
583
  ensure_service!
564
- view ||= :BASIC
584
+ view ||= :FULL
565
585
  options = { token: token, max: max }
566
586
  grpc = service.list_schemas view, options
567
587
  Schema::List.from_grpc grpc, service, view, max
@@ -48,7 +48,7 @@ module Google
48
48
  @grpc = grpc
49
49
  @service = service
50
50
  @exists = nil
51
- @view = view || :BASIC
51
+ @view = view || :FULL
52
52
  end
53
53
 
54
54
  ##
@@ -81,7 +81,7 @@ module Google
81
81
  #
82
82
  def definition
83
83
  return nil if reference?
84
- @grpc.definition
84
+ @grpc.definition if @grpc.definition && !@grpc.definition.empty?
85
85
  end
86
86
 
87
87
  ##
@@ -141,7 +141,7 @@ module Google
141
141
  # * `FULL` - Include all Schema object fields.
142
142
  #
143
143
  # Optional. If not provided or `nil`, the last non-nil `view` argument to this method will be used if one has
144
- # been given, othewise `BASIC` will be used.
144
+ # been given, othewise `FULL` will be used.
145
145
  #
146
146
  # @return [Google::Cloud::PubSub::Schema] Returns the reloaded schema.
147
147
  #
@@ -153,7 +153,7 @@ module Google
153
153
  #
154
154
  # schema.reload!
155
155
  #
156
- # @example Use the `view` option to load the full resource:
156
+ # @example Use the `view` option to load the basic or full resource:
157
157
  # require "google/cloud/pubsub"
158
158
  #
159
159
  # pubsub = Google::Cloud::PubSub.new
@@ -267,7 +267,7 @@ module Google
267
267
  # require "google/cloud/pubsub"
268
268
  #
269
269
  # pubsub = Google::Cloud::PubSub.new
270
- # schema = pubsub.schema "my-schema", view: :full
270
+ # schema = pubsub.schema "my-schema"
271
271
  #
272
272
  # schema.resource_full? #=> true
273
273
  #
@@ -684,6 +684,11 @@ module Google
684
684
  # @note At the time of this release, ordering keys are not yet publicly
685
685
  # enabled and requires special project enablements.
686
686
  #
687
+ # Publisher flow control limits the number of outstanding messages that
688
+ # are allowed to wait to be published. See the `flow_control` key in the
689
+ # `async` parameter in {Project#topic} for more information about publisher
690
+ # flow control settings.
691
+ #
687
692
  # @param [String, File] data The message payload. This will be converted
688
693
  # to bytes encoded as ASCII-8BIT.
689
694
  # @param [Hash] attributes Optional attributes for the message.
@@ -703,6 +708,13 @@ module Google
703
708
  # message with an `ordering_key` that has already failed when
704
709
  # publishing. Use {#resume_publish} to allow this `ordering_key` to be
705
710
  # published again.
711
+ # @raise [Google::Cloud::PubSub::FlowControlLimitError] when publish flow
712
+ # control limits are exceeded, and the `async` parameter key
713
+ # `flow_control.limit_exceeded_behavior` is set to `:error` or `:block`.
714
+ # If `flow_control.limit_exceeded_behavior` is set to `:block`, this error
715
+ # will be raised only when a limit would be exceeded by a single message.
716
+ # See the `async` parameter in {Project#topic} for more information about
717
+ # `flow_control` settings.
706
718
  #
707
719
  # @example
708
720
  # require "google/cloud/pubsub"
@@ -16,7 +16,7 @@
16
16
  module Google
17
17
  module Cloud
18
18
  module PubSub
19
- VERSION = "2.6.1".freeze
19
+ VERSION = "2.7.0".freeze
20
20
  end
21
21
 
22
22
  Pubsub = PubSub unless const_defined? :Pubsub
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-cloud-pubsub
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.1
4
+ version: 2.7.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: 2021-04-28 00:00:00.000000000 Z
12
+ date: 2021-06-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: concurrent-ruby
@@ -233,6 +233,7 @@ files:
233
233
  - lib/google/cloud/pubsub/convert.rb
234
234
  - lib/google/cloud/pubsub/credentials.rb
235
235
  - lib/google/cloud/pubsub/errors.rb
236
+ - lib/google/cloud/pubsub/flow_controller.rb
236
237
  - lib/google/cloud/pubsub/message.rb
237
238
  - lib/google/cloud/pubsub/policy.rb
238
239
  - lib/google/cloud/pubsub/project.rb
@@ -275,7 +276,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
275
276
  - !ruby/object:Gem::Version
276
277
  version: '0'
277
278
  requirements: []
278
- rubygems_version: 3.2.16
279
+ rubygems_version: 3.2.17
279
280
  signing_key:
280
281
  specification_version: 4
281
282
  summary: API Client library for Google Cloud Pub/Sub