google-cloud-pubsub 0.36.0 → 0.37.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 +4 -4
- data/CHANGELOG.md +16 -0
- data/lib/google/cloud/pubsub/async_publisher.rb +30 -24
- data/lib/google/cloud/pubsub/service.rb +4 -3
- data/lib/google/cloud/pubsub/subscriber/inventory.rb +4 -2
- data/lib/google/cloud/pubsub/subscriber/stream.rb +28 -26
- data/lib/google/cloud/pubsub/subscriber/timed_unary_buffer.rb +4 -3
- data/lib/google/cloud/pubsub/subscription.rb +6 -2
- data/lib/google/cloud/pubsub/topic.rb +30 -0
- data/lib/google/cloud/pubsub/v1/publisher_client.rb +2 -1
- data/lib/google/cloud/pubsub/v1/publisher_client_config.json +1 -1
- data/lib/google/cloud/pubsub/v1/subscriber_client.rb +2 -1
- data/lib/google/cloud/pubsub/v1/subscriber_client_config.json +2 -2
- data/lib/google/cloud/pubsub/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff2481f99b8def0df9c9203a64569dc317907152518da6b522d63314524ebea5
|
4
|
+
data.tar.gz: 8773411fca063ab56c81d94951406866747f9137f4c9d9e9860b011412a0bae3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47976e8e93c6a68707a24f26b92110fca18eef669c41c86f93cf9d746c55596abbddde9f067a42b47c68c6472d5655616380f0e334623872455d5932b97ffd9c
|
7
|
+
data.tar.gz: ebf63bd135e128d19f56c9ece11aad5f1fc8cf2489fa7b8c726ccc68e98632ee4751c28079d9dfc17379dbf40cf9871a44b9d1c03d50dc0b1a6c9215de45f25d
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
# Release History
|
2
2
|
|
3
|
+
### 0.37.0 / 2019-06-17
|
4
|
+
|
5
|
+
* Add Topic#persistence_regions
|
6
|
+
* Subscriber changes
|
7
|
+
* Fix potential inventory bug
|
8
|
+
* Messages are removed after callback
|
9
|
+
* This change prevents the Subscriber inventory from filling up
|
10
|
+
when messages are never acked or nacked in the user callback.
|
11
|
+
This might happen due to an error in the user callback code.
|
12
|
+
Removing a message from the inventory will cause the message to
|
13
|
+
be redelivered and reprocessed.
|
14
|
+
* Update concurrency implementation
|
15
|
+
* Use concurrent-ruby Promises framework.
|
16
|
+
* Update network configuration
|
17
|
+
* Enable grpc.service_config_disable_resolution
|
18
|
+
|
3
19
|
### 0.36.0 / 2019-05-21
|
4
20
|
|
5
21
|
* Add Topic#kms_key
|
@@ -193,10 +193,10 @@ module Google
|
|
193
193
|
|
194
194
|
def init_resources!
|
195
195
|
@first_published_at ||= Time.now
|
196
|
-
@publish_thread_pool ||= Concurrent::
|
197
|
-
@publish_threads
|
198
|
-
@callback_thread_pool ||= Concurrent::
|
199
|
-
@callback_threads
|
196
|
+
@publish_thread_pool ||= Concurrent::CachedThreadPool.new \
|
197
|
+
max_threads: @publish_threads
|
198
|
+
@callback_thread_pool ||= Concurrent::CachedThreadPool.new \
|
199
|
+
max_threads: @callback_threads
|
200
200
|
@thread ||= Thread.new { run_background }
|
201
201
|
end
|
202
202
|
|
@@ -235,33 +235,39 @@ module Google
|
|
235
235
|
def publish_batch_async topic_name, batch
|
236
236
|
return unless @publish_thread_pool.running?
|
237
237
|
|
238
|
-
Concurrent::
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
238
|
+
Concurrent::Promises.future_on(
|
239
|
+
@publish_thread_pool, topic_name, batch
|
240
|
+
) do |t_name, btch|
|
241
|
+
publish_batch_sync t_name, btch
|
242
|
+
end
|
243
|
+
end
|
243
244
|
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
rescue StandardError => e
|
249
|
-
batch.items.each do |item|
|
250
|
-
next unless item.callback
|
245
|
+
def publish_batch_sync topic_name, batch
|
246
|
+
grpc = @service.publish topic_name, batch.messages
|
247
|
+
batch.items.zip Array(grpc.message_ids) do |item, id|
|
248
|
+
next unless item.callback
|
251
249
|
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
250
|
+
item.msg.message_id = id
|
251
|
+
publish_result = PublishResult.from_grpc item.msg
|
252
|
+
execute_callback_async item.callback, publish_result
|
253
|
+
end
|
254
|
+
rescue StandardError => e
|
255
|
+
batch.items.each do |item|
|
256
|
+
next unless item.callback
|
257
|
+
|
258
|
+
publish_result = PublishResult.from_error item.msg, e
|
259
|
+
execute_callback_async item.callback, publish_result
|
260
|
+
end
|
257
261
|
end
|
258
262
|
|
259
263
|
def execute_callback_async callback, publish_result
|
260
264
|
return unless @callback_thread_pool.running?
|
261
265
|
|
262
|
-
Concurrent::
|
263
|
-
callback
|
264
|
-
|
266
|
+
Concurrent::Promises.future_on(
|
267
|
+
@callback_thread_pool, callback, publish_result
|
268
|
+
) do |cback, p_result|
|
269
|
+
cback.call p_result
|
270
|
+
end
|
265
271
|
end
|
266
272
|
|
267
273
|
def create_pubsub_message data, attributes
|
@@ -46,9 +46,10 @@ module Google
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def chan_args
|
49
|
-
{ "grpc.max_send_message_length"
|
50
|
-
"grpc.max_receive_message_length"
|
51
|
-
"grpc.keepalive_time_ms"
|
49
|
+
{ "grpc.max_send_message_length" => -1,
|
50
|
+
"grpc.max_receive_message_length" => -1,
|
51
|
+
"grpc.keepalive_time_ms" => 300000,
|
52
|
+
"grpc.service_config_disable_resolution" => 1 }
|
52
53
|
end
|
53
54
|
|
54
55
|
def chan_creds
|
@@ -40,7 +40,8 @@ module Google
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def add *ack_ids
|
43
|
-
ack_ids.flatten
|
43
|
+
ack_ids.flatten!
|
44
|
+
ack_ids.compact!
|
44
45
|
return if ack_ids.empty?
|
45
46
|
|
46
47
|
synchronize do
|
@@ -50,7 +51,8 @@ module Google
|
|
50
51
|
end
|
51
52
|
|
52
53
|
def remove *ack_ids
|
53
|
-
ack_ids.flatten
|
54
|
+
ack_ids.flatten!
|
55
|
+
ack_ids.compact!
|
54
56
|
return if ack_ids.empty?
|
55
57
|
|
56
58
|
synchronize do
|
@@ -48,8 +48,8 @@ module Google
|
|
48
48
|
@pause_cond = new_cond
|
49
49
|
|
50
50
|
@inventory = Inventory.new self, @subscriber.stream_inventory
|
51
|
-
@callback_thread_pool = Concurrent::
|
52
|
-
@subscriber.callback_threads
|
51
|
+
@callback_thread_pool = Concurrent::CachedThreadPool.new \
|
52
|
+
max_threads: @subscriber.callback_threads
|
53
53
|
|
54
54
|
@stream_keepalive_task = Concurrent::TimerTask.new(
|
55
55
|
execution_interval: 30
|
@@ -181,21 +181,25 @@ module Google
|
|
181
181
|
# rubocop:disable all
|
182
182
|
|
183
183
|
def background_run
|
184
|
-
|
185
|
-
|
184
|
+
synchronize do
|
185
|
+
# Don't allow a stream to restart if already stopped
|
186
|
+
return if @stopped
|
186
187
|
|
187
|
-
|
188
|
-
|
189
|
-
old_queue = @request_queue.quit_and_dump_queue if @request_queue
|
188
|
+
@stopped = false
|
189
|
+
@paused = false
|
190
190
|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
old_queue.each { |obj| @request_queue.push obj }
|
195
|
-
enum = @subscriber.service.streaming_pull @request_queue.each
|
191
|
+
# signal to the previous queue to shut down
|
192
|
+
old_queue = []
|
193
|
+
old_queue = @request_queue.quit_and_dump_queue if @request_queue
|
196
194
|
|
197
|
-
|
198
|
-
|
195
|
+
# Always create a new request queue
|
196
|
+
@request_queue = EnumeratorQueue.new self
|
197
|
+
@request_queue.push initial_input_request
|
198
|
+
old_queue.each { |obj| @request_queue.push obj }
|
199
|
+
end
|
200
|
+
|
201
|
+
# Call the StreamingPull API to get the response enumerator
|
202
|
+
enum = @subscriber.service.streaming_pull @request_queue.each
|
199
203
|
|
200
204
|
loop do
|
201
205
|
synchronize do
|
@@ -242,7 +246,7 @@ module Google
|
|
242
246
|
raise RestartStream unless synchronize { @stopped }
|
243
247
|
|
244
248
|
# We must be stopped, tell the stream to quit.
|
245
|
-
|
249
|
+
stop
|
246
250
|
rescue GRPC::Cancelled, GRPC::DeadlineExceeded, GRPC::Internal,
|
247
251
|
GRPC::ResourceExhausted, GRPC::Unauthenticated,
|
248
252
|
GRPC::Unavailable, GRPC::Core::CallError
|
@@ -253,10 +257,7 @@ module Google
|
|
253
257
|
rescue RestartStream
|
254
258
|
retry
|
255
259
|
rescue StandardError => e
|
256
|
-
|
257
|
-
@subscriber.error! e
|
258
|
-
start_streaming! unless @stopped
|
259
|
-
end
|
260
|
+
@subscriber.error! e
|
260
261
|
|
261
262
|
retry
|
262
263
|
end
|
@@ -266,13 +267,17 @@ module Google
|
|
266
267
|
def perform_callback_async rec_msg
|
267
268
|
return unless callback_thread_pool.running?
|
268
269
|
|
269
|
-
Concurrent::
|
270
|
+
Concurrent::Promises.future_on(
|
271
|
+
callback_thread_pool, @subscriber, @inventory, rec_msg
|
272
|
+
) do |sub, inv, msg|
|
270
273
|
begin
|
271
|
-
|
274
|
+
sub.callback.call msg
|
272
275
|
rescue StandardError => callback_error
|
273
|
-
|
276
|
+
sub.error! callback_error
|
277
|
+
ensure
|
278
|
+
inv.remove msg.ack_id
|
274
279
|
end
|
275
|
-
end
|
280
|
+
end
|
276
281
|
end
|
277
282
|
|
278
283
|
def start_streaming!
|
@@ -281,9 +286,6 @@ module Google
|
|
281
286
|
# could not be recovered from, so be it.
|
282
287
|
return if @background_thread
|
283
288
|
|
284
|
-
@stopped = false
|
285
|
-
@paused = false
|
286
|
-
|
287
289
|
# create new background thread to handle new enumerator
|
288
290
|
@background_thread = Thread.new { background_run }
|
289
291
|
end
|
@@ -187,7 +187,8 @@ module Google
|
|
187
187
|
end
|
188
188
|
|
189
189
|
def with_threadpool
|
190
|
-
pool = Concurrent::
|
190
|
+
pool = Concurrent::CachedThreadPool.new \
|
191
|
+
max_threads: @subscriber.push_threads
|
191
192
|
|
192
193
|
yield pool
|
193
194
|
|
@@ -204,13 +205,13 @@ module Google
|
|
204
205
|
end
|
205
206
|
|
206
207
|
def add_future pool
|
207
|
-
Concurrent::
|
208
|
+
Concurrent::Promises.future_on pool do
|
208
209
|
begin
|
209
210
|
yield
|
210
211
|
rescue StandardError => error
|
211
212
|
error! error
|
212
213
|
end
|
213
|
-
end
|
214
|
+
end
|
214
215
|
end
|
215
216
|
end
|
216
217
|
end
|
@@ -501,8 +501,12 @@ module Google
|
|
501
501
|
end
|
502
502
|
|
503
503
|
##
|
504
|
-
# Create a {Subscriber} object that receives
|
505
|
-
# using the code provided in the callback.
|
504
|
+
# Create a {Subscriber} object that receives and processes messages
|
505
|
+
# using the code provided in the callback. Messages passed to the
|
506
|
+
# callback should acknowledge ({ReceivedMessage#acknowledge!}) or reject
|
507
|
+
# ({ReceivedMessage#reject!}) the message. If no action is taken, the
|
508
|
+
# message will be removed from the subscriber and made available for
|
509
|
+
# redelivery after the callback is completed.
|
506
510
|
#
|
507
511
|
# @param [Numeric] deadline The default number of seconds the stream
|
508
512
|
# will hold received messages before modifying the message's ack
|
@@ -182,6 +182,36 @@ module Google
|
|
182
182
|
@resource_name = nil
|
183
183
|
end
|
184
184
|
|
185
|
+
##
|
186
|
+
# The list of GCP region IDs where messages that are published to the
|
187
|
+
# topic may be persisted in storage.
|
188
|
+
#
|
189
|
+
# Messages published by publishers running in non-allowed GCP regions
|
190
|
+
# (or running outside of GCP altogether) will be routed for storage in
|
191
|
+
# one of the allowed regions. An empty list indicates a misconfiguration
|
192
|
+
# at the project or organization level, which will result in all publish
|
193
|
+
# operations failing.
|
194
|
+
#
|
195
|
+
# Makes an API call to retrieve the list of GCP region IDs values when
|
196
|
+
# called on a reference object. See {#reference?}.
|
197
|
+
#
|
198
|
+
# @return [Array<String>]
|
199
|
+
#
|
200
|
+
# @example
|
201
|
+
# require "google/cloud/pubsub"
|
202
|
+
#
|
203
|
+
# pubsub = Google::Cloud::PubSub.new
|
204
|
+
#
|
205
|
+
# topic = pubsub.topic "my-topic"
|
206
|
+
#
|
207
|
+
# topic.persistence_regions #=> ["us-central1", "us-central2"]
|
208
|
+
#
|
209
|
+
def persistence_regions
|
210
|
+
ensure_grpc!
|
211
|
+
return [] if @grpc.message_storage_policy.nil?
|
212
|
+
Array @grpc.message_storage_policy.allowed_persistence_regions
|
213
|
+
end
|
214
|
+
|
185
215
|
##
|
186
216
|
# Permanently deletes the topic.
|
187
217
|
#
|
@@ -28,6 +28,7 @@ require "google/gax"
|
|
28
28
|
require "google/iam/v1/iam_policy_pb"
|
29
29
|
require "google/pubsub/v1/pubsub_pb"
|
30
30
|
require "google/cloud/pubsub/v1/credentials"
|
31
|
+
require "google/cloud/pubsub/version"
|
31
32
|
|
32
33
|
module Google
|
33
34
|
module Cloud
|
@@ -182,7 +183,7 @@ module Google
|
|
182
183
|
updater_proc = credentials.updater_proc
|
183
184
|
end
|
184
185
|
|
185
|
-
package_version =
|
186
|
+
package_version = Google::Cloud::PubSub::VERSION
|
186
187
|
|
187
188
|
google_api_client = "gl-ruby/#{RUBY_VERSION}"
|
188
189
|
google_api_client << " #{lib_name}/#{lib_version}" if lib_name
|
@@ -35,7 +35,7 @@
|
|
35
35
|
"initial_retry_delay_millis": 100,
|
36
36
|
"retry_delay_multiplier": 1.3,
|
37
37
|
"max_retry_delay_millis": 60000,
|
38
|
-
"initial_rpc_timeout_millis":
|
38
|
+
"initial_rpc_timeout_millis": 25000,
|
39
39
|
"rpc_timeout_multiplier": 1.0,
|
40
40
|
"max_rpc_timeout_millis": 30000,
|
41
41
|
"total_timeout_millis": 600000
|
@@ -28,6 +28,7 @@ require "google/gax"
|
|
28
28
|
require "google/iam/v1/iam_policy_pb"
|
29
29
|
require "google/pubsub/v1/pubsub_pb"
|
30
30
|
require "google/cloud/pubsub/v1/credentials"
|
31
|
+
require "google/cloud/pubsub/version"
|
31
32
|
|
32
33
|
module Google
|
33
34
|
module Cloud
|
@@ -206,7 +207,7 @@ module Google
|
|
206
207
|
updater_proc = credentials.updater_proc
|
207
208
|
end
|
208
209
|
|
209
|
-
package_version =
|
210
|
+
package_version = Google::Cloud::PubSub::VERSION
|
210
211
|
|
211
212
|
google_api_client = "gl-ruby/#{RUBY_VERSION}"
|
212
213
|
google_api_client << " #{lib_name}/#{lib_version}" if lib_name
|
@@ -26,9 +26,9 @@
|
|
26
26
|
"initial_retry_delay_millis": 100,
|
27
27
|
"retry_delay_multiplier": 1.3,
|
28
28
|
"max_retry_delay_millis": 60000,
|
29
|
-
"initial_rpc_timeout_millis":
|
29
|
+
"initial_rpc_timeout_millis": 25000,
|
30
30
|
"rpc_timeout_multiplier": 1.0,
|
31
|
-
"max_rpc_timeout_millis":
|
31
|
+
"max_rpc_timeout_millis": 25000,
|
32
32
|
"total_timeout_millis": 600000
|
33
33
|
},
|
34
34
|
"streaming_messaging": {
|
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: 0.
|
4
|
+
version: 0.37.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-
|
12
|
+
date: 2019-06-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: google-cloud-core
|
@@ -79,14 +79,14 @@ dependencies:
|
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '1.
|
82
|
+
version: '1.1'
|
83
83
|
type: :runtime
|
84
84
|
prerelease: false
|
85
85
|
version_requirements: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '1.
|
89
|
+
version: '1.1'
|
90
90
|
- !ruby/object:Gem::Dependency
|
91
91
|
name: minitest
|
92
92
|
requirement: !ruby/object:Gem::Requirement
|