google-cloud-pubsub 0.26.0 → 2.6.1
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 +5 -5
- data/.yardopts +12 -2
- data/AUTHENTICATION.md +178 -0
- data/CHANGELOG.md +659 -0
- data/CODE_OF_CONDUCT.md +40 -0
- data/CONTRIBUTING.md +187 -0
- data/EMULATOR.md +37 -0
- data/LICENSE +2 -2
- data/LOGGING.md +32 -0
- data/OVERVIEW.md +528 -0
- data/TROUBLESHOOTING.md +31 -0
- data/lib/google/cloud/pubsub/async_publisher/batch.rb +310 -0
- data/lib/google/cloud/pubsub/async_publisher.rb +402 -0
- data/lib/google/cloud/pubsub/batch_publisher.rb +100 -0
- data/lib/google/cloud/pubsub/convert.rb +91 -0
- data/lib/google/cloud/pubsub/credentials.rb +26 -10
- data/lib/google/cloud/pubsub/errors.rb +85 -0
- data/lib/google/cloud/pubsub/message.rb +80 -17
- data/lib/google/cloud/pubsub/policy.rb +17 -14
- data/lib/google/cloud/pubsub/project.rb +364 -250
- data/lib/google/cloud/pubsub/publish_result.rb +103 -0
- data/lib/google/cloud/pubsub/received_message.rb +162 -24
- data/lib/google/cloud/pubsub/retry_policy.rb +88 -0
- data/lib/google/cloud/pubsub/schema/list.rb +180 -0
- data/lib/google/cloud/pubsub/schema.rb +310 -0
- data/lib/google/cloud/pubsub/service.rb +281 -265
- data/lib/google/cloud/pubsub/snapshot/list.rb +21 -21
- data/lib/google/cloud/pubsub/snapshot.rb +55 -15
- data/lib/google/cloud/pubsub/subscriber/enumerator_queue.rb +54 -0
- data/lib/google/cloud/pubsub/subscriber/inventory.rb +173 -0
- data/lib/google/cloud/pubsub/subscriber/sequencer.rb +115 -0
- data/lib/google/cloud/pubsub/subscriber/stream.rb +400 -0
- data/lib/google/cloud/pubsub/subscriber/timed_unary_buffer.rb +230 -0
- data/lib/google/cloud/pubsub/subscriber.rb +417 -0
- data/lib/google/cloud/pubsub/subscription/list.rb +28 -28
- data/lib/google/cloud/pubsub/subscription/push_config.rb +268 -0
- data/lib/google/cloud/pubsub/subscription.rb +900 -172
- data/lib/google/cloud/pubsub/topic/list.rb +21 -21
- data/lib/google/cloud/pubsub/topic.rb +674 -95
- data/lib/google/cloud/pubsub/version.rb +6 -4
- data/lib/google/cloud/pubsub.rb +104 -439
- data/lib/google-cloud-pubsub.rb +60 -29
- metadata +88 -50
- data/README.md +0 -69
- data/lib/google/cloud/pubsub/topic/publisher.rb +0 -86
- data/lib/google/cloud/pubsub/v1/doc/google/protobuf/duration.rb +0 -77
- data/lib/google/cloud/pubsub/v1/doc/google/protobuf/field_mask.rb +0 -223
- data/lib/google/cloud/pubsub/v1/doc/google/protobuf/timestamp.rb +0 -81
- data/lib/google/cloud/pubsub/v1/doc/google/pubsub/v1/pubsub.rb +0 -503
- data/lib/google/cloud/pubsub/v1/publisher_client.rb +0 -605
- data/lib/google/cloud/pubsub/v1/publisher_client_config.json +0 -96
- data/lib/google/cloud/pubsub/v1/subscriber_client.rb +0 -1104
- data/lib/google/cloud/pubsub/v1/subscriber_client_config.json +0 -127
- data/lib/google/cloud/pubsub/v1.rb +0 -17
- data/lib/google/pubsub/v1/pubsub_pb.rb +0 -187
- data/lib/google/pubsub/v1/pubsub_services_pb.rb +0 -159
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2017 Google
|
1
|
+
# Copyright 2017 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -17,7 +17,7 @@ require "delegate"
|
|
17
17
|
|
18
18
|
module Google
|
19
19
|
module Cloud
|
20
|
-
module
|
20
|
+
module PubSub
|
21
21
|
class Snapshot
|
22
22
|
##
|
23
23
|
# Snapshot::List is a special case Array with additional values.
|
@@ -25,7 +25,7 @@ module Google
|
|
25
25
|
##
|
26
26
|
# If not empty, indicates that there are more snapshots
|
27
27
|
# that match the request and this value should be passed to
|
28
|
-
# the next {Google::Cloud::
|
28
|
+
# the next {Google::Cloud::PubSub::Project#snapshots} to continue.
|
29
29
|
attr_accessor :token
|
30
30
|
|
31
31
|
##
|
@@ -45,7 +45,7 @@ module Google
|
|
45
45
|
# @example
|
46
46
|
# require "google/cloud/pubsub"
|
47
47
|
#
|
48
|
-
# pubsub = Google::Cloud::
|
48
|
+
# pubsub = Google::Cloud::PubSub.new
|
49
49
|
#
|
50
50
|
# snapshots = pubsub.snapshots
|
51
51
|
# if snapshots.next?
|
@@ -64,7 +64,7 @@ module Google
|
|
64
64
|
# @example
|
65
65
|
# require "google/cloud/pubsub"
|
66
66
|
#
|
67
|
-
# pubsub = Google::Cloud::
|
67
|
+
# pubsub = Google::Cloud::PubSub.new
|
68
68
|
#
|
69
69
|
# snapshots = pubsub.snapshots
|
70
70
|
# if snapshots.next?
|
@@ -98,7 +98,7 @@ module Google
|
|
98
98
|
# @example Iterating each snapshot by passing a block:
|
99
99
|
# require "google/cloud/pubsub"
|
100
100
|
#
|
101
|
-
# pubsub = Google::Cloud::
|
101
|
+
# pubsub = Google::Cloud::PubSub.new
|
102
102
|
#
|
103
103
|
# snapshots = pubsub.snapshots
|
104
104
|
# snapshots.all do |snapshot|
|
@@ -108,7 +108,7 @@ module Google
|
|
108
108
|
# @example Using the enumerator by not passing a block:
|
109
109
|
# require "google/cloud/pubsub"
|
110
110
|
#
|
111
|
-
# pubsub = Google::Cloud::
|
111
|
+
# pubsub = Google::Cloud::PubSub.new
|
112
112
|
#
|
113
113
|
# snapshots = pubsub.snapshots
|
114
114
|
# all_names = snapshots.all.map do |snapshot|
|
@@ -118,24 +118,22 @@ module Google
|
|
118
118
|
# @example Limit the number of API calls made:
|
119
119
|
# require "google/cloud/pubsub"
|
120
120
|
#
|
121
|
-
# pubsub = Google::Cloud::
|
121
|
+
# pubsub = Google::Cloud::PubSub.new
|
122
122
|
#
|
123
123
|
# snapshots = pubsub.snapshots
|
124
124
|
# snapshots.all(request_limit: 10) do |snapshot|
|
125
125
|
# puts snapshot.name
|
126
126
|
# end
|
127
127
|
#
|
128
|
-
def all request_limit: nil
|
128
|
+
def all request_limit: nil, &block
|
129
129
|
request_limit = request_limit.to_i if request_limit
|
130
|
-
unless block_given?
|
131
|
-
return enum_for(:all, request_limit: request_limit)
|
132
|
-
end
|
130
|
+
return enum_for :all, request_limit: request_limit unless block_given?
|
133
131
|
results = self
|
134
132
|
loop do
|
135
|
-
results.each
|
133
|
+
results.each(&block)
|
136
134
|
if request_limit
|
137
135
|
request_limit -= 1
|
138
|
-
break if request_limit
|
136
|
+
break if request_limit.negative?
|
139
137
|
end
|
140
138
|
break unless results.next?
|
141
139
|
results = results.next
|
@@ -144,16 +142,16 @@ module Google
|
|
144
142
|
|
145
143
|
##
|
146
144
|
# @private New Snapshots::List from a
|
147
|
-
# Google::
|
145
|
+
# Google::Cloud::PubSub::V1::ListSnapshotsRequest object.
|
148
146
|
def self.from_grpc grpc_list, service, max = nil
|
149
147
|
subs = new(Array(grpc_list.snapshots).map do |grpc|
|
150
148
|
Snapshot.from_grpc grpc, service
|
151
149
|
end)
|
152
150
|
token = grpc_list.next_page_token
|
153
|
-
token = nil if token == ""
|
154
|
-
subs.instance_variable_set
|
155
|
-
subs.instance_variable_set
|
156
|
-
subs.instance_variable_set
|
151
|
+
token = nil if token == "".freeze
|
152
|
+
subs.instance_variable_set :@token, token
|
153
|
+
subs.instance_variable_set :@service, service
|
154
|
+
subs.instance_variable_set :@max, max
|
157
155
|
subs
|
158
156
|
end
|
159
157
|
|
@@ -163,7 +161,7 @@ module Google
|
|
163
161
|
# @private Raise an error unless an active connection to the service
|
164
162
|
# is available.
|
165
163
|
def ensure_service!
|
166
|
-
|
164
|
+
raise "Must have active connection to service" unless @service
|
167
165
|
end
|
168
166
|
|
169
167
|
def next_snapshots
|
@@ -174,5 +172,7 @@ module Google
|
|
174
172
|
end
|
175
173
|
end
|
176
174
|
end
|
175
|
+
|
176
|
+
Pubsub = PubSub unless const_defined? :Pubsub
|
177
177
|
end
|
178
178
|
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# Copyright 2017 Google
|
1
|
+
# Copyright 2017 Google LLC
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
8
|
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
@@ -15,10 +15,11 @@
|
|
15
15
|
|
16
16
|
require "google/cloud/errors"
|
17
17
|
require "google/cloud/pubsub/snapshot/list"
|
18
|
+
require "google/cloud/pubsub/v1"
|
18
19
|
|
19
20
|
module Google
|
20
21
|
module Cloud
|
21
|
-
module
|
22
|
+
module PubSub
|
22
23
|
##
|
23
24
|
# # Snapshot
|
24
25
|
#
|
@@ -35,7 +36,7 @@ module Google
|
|
35
36
|
# @example
|
36
37
|
# require "google/cloud/pubsub"
|
37
38
|
#
|
38
|
-
# pubsub = Google::Cloud::
|
39
|
+
# pubsub = Google::Cloud::PubSub.new
|
39
40
|
# sub = pubsub.subscription "my-sub"
|
40
41
|
#
|
41
42
|
# snapshot = sub.create_snapshot "my-snapshot"
|
@@ -47,19 +48,21 @@ module Google
|
|
47
48
|
attr_accessor :service
|
48
49
|
|
49
50
|
##
|
50
|
-
# @private The gRPC Google::
|
51
|
+
# @private The gRPC Google::Cloud::PubSub::V1::Snapshot object.
|
51
52
|
attr_accessor :grpc
|
52
53
|
|
53
54
|
##
|
54
55
|
# @private Create an empty {Snapshot} object.
|
55
56
|
def initialize
|
56
57
|
@service = nil
|
57
|
-
@grpc = Google::
|
58
|
+
@grpc = Google::Cloud::PubSub::V1::Snapshot.new
|
58
59
|
end
|
59
60
|
|
60
61
|
##
|
61
|
-
# The name of the snapshot.
|
62
|
-
#
|
62
|
+
# The name of the snapshot.
|
63
|
+
#
|
64
|
+
# @return [String] A fully-qualified snapshot name in the form
|
65
|
+
# `projects/{project_id}/snapshots/{snapshot_id}`.
|
63
66
|
def name
|
64
67
|
@grpc.name
|
65
68
|
end
|
@@ -72,14 +75,14 @@ module Google
|
|
72
75
|
# @example
|
73
76
|
# require "google/cloud/pubsub"
|
74
77
|
#
|
75
|
-
# pubsub = Google::Cloud::
|
78
|
+
# pubsub = Google::Cloud::PubSub.new
|
76
79
|
# sub = pubsub.subscription "my-sub"
|
77
80
|
#
|
78
81
|
# snapshot = sub.create_snapshot "my-snapshot"
|
79
82
|
# snapshot.topic.name #=> "projects/my-project/topics/my-topic"
|
80
83
|
#
|
81
84
|
def topic
|
82
|
-
Topic.
|
85
|
+
Topic.from_name @grpc.topic, service
|
83
86
|
end
|
84
87
|
|
85
88
|
##
|
@@ -99,7 +102,7 @@ module Google
|
|
99
102
|
# @example
|
100
103
|
# require "google/cloud/pubsub"
|
101
104
|
#
|
102
|
-
# pubsub = Google::Cloud::
|
105
|
+
# pubsub = Google::Cloud::PubSub.new
|
103
106
|
# sub = pubsub.subscription "my-sub"
|
104
107
|
#
|
105
108
|
# snapshot = sub.create_snapshot "my-snapshot"
|
@@ -107,7 +110,42 @@ module Google
|
|
107
110
|
# snapshot.expiration_time
|
108
111
|
#
|
109
112
|
def expiration_time
|
110
|
-
self.class.timestamp_from_grpc @grpc.
|
113
|
+
self.class.timestamp_from_grpc @grpc.expire_time
|
114
|
+
end
|
115
|
+
|
116
|
+
##
|
117
|
+
# A hash of user-provided labels associated with this snapshot.
|
118
|
+
# Labels can be used to organize and group snapshots.See [Creating and
|
119
|
+
# Managing Labels](https://cloud.google.com/pubsub/docs/labels).
|
120
|
+
#
|
121
|
+
# The returned hash is frozen and changes are not allowed. Use
|
122
|
+
# {#labels=} to update the labels for this snapshot.
|
123
|
+
#
|
124
|
+
# @return [Hash] The frozen labels hash.
|
125
|
+
#
|
126
|
+
def labels
|
127
|
+
@grpc.labels.to_h.freeze
|
128
|
+
end
|
129
|
+
|
130
|
+
##
|
131
|
+
# Sets the hash of user-provided labels associated with this
|
132
|
+
# snapshot. Labels can be used to organize and group snapshots.
|
133
|
+
# Label keys and values can be no longer than 63 characters, can only
|
134
|
+
# contain lowercase letters, numeric characters, underscores and dashes.
|
135
|
+
# International characters are allowed. Label values are optional. Label
|
136
|
+
# keys must start with a letter and each label in the list must have a
|
137
|
+
# different key. See [Creating and Managing
|
138
|
+
# Labels](https://cloud.google.com/pubsub/docs/labels).
|
139
|
+
#
|
140
|
+
# @param [Hash] new_labels The new labels hash.
|
141
|
+
#
|
142
|
+
def labels= new_labels
|
143
|
+
raise ArgumentError, "Value must be a Hash" if new_labels.nil?
|
144
|
+
labels_map = Google::Protobuf::Map.new :string, :string
|
145
|
+
Hash(new_labels).each { |k, v| labels_map[String(k)] = String(v) }
|
146
|
+
update_grpc = @grpc.dup
|
147
|
+
update_grpc.labels = labels_map
|
148
|
+
@grpc = service.update_snapshot update_grpc, :labels
|
111
149
|
end
|
112
150
|
|
113
151
|
##
|
@@ -122,7 +160,7 @@ module Google
|
|
122
160
|
# @example
|
123
161
|
# require "google/cloud/pubsub"
|
124
162
|
#
|
125
|
-
# pubsub = Google::Cloud::
|
163
|
+
# pubsub = Google::Cloud::PubSub.new
|
126
164
|
#
|
127
165
|
# pubsub.snapshots.each do |snapshot|
|
128
166
|
# snapshot.delete
|
@@ -135,7 +173,7 @@ module Google
|
|
135
173
|
end
|
136
174
|
|
137
175
|
##
|
138
|
-
# @private New Snapshot from a Google::
|
176
|
+
# @private New Snapshot from a Google::Cloud::PubSub::V1::Snapshot
|
139
177
|
# object.
|
140
178
|
def self.from_grpc grpc, service
|
141
179
|
new.tap do |f|
|
@@ -157,9 +195,11 @@ module Google
|
|
157
195
|
# @private Raise an error unless an active connection to the service is
|
158
196
|
# available.
|
159
197
|
def ensure_service!
|
160
|
-
|
198
|
+
raise "Must have active connection to service" unless service
|
161
199
|
end
|
162
200
|
end
|
163
201
|
end
|
202
|
+
|
203
|
+
Pubsub = PubSub unless const_defined? :Pubsub
|
164
204
|
end
|
165
205
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# Copyright 2017 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 PubSub
|
19
|
+
class Subscriber
|
20
|
+
# @private
|
21
|
+
class EnumeratorQueue
|
22
|
+
def initialize sentinel = nil
|
23
|
+
@queue = Queue.new
|
24
|
+
@sentinel = sentinel
|
25
|
+
end
|
26
|
+
|
27
|
+
def push obj
|
28
|
+
@queue.push obj
|
29
|
+
end
|
30
|
+
|
31
|
+
def quit_and_dump_queue
|
32
|
+
objs = []
|
33
|
+
objs << @queue.pop until @queue.empty?
|
34
|
+
# Signal that the enumerator is ready to end
|
35
|
+
@queue.push @sentinel
|
36
|
+
objs
|
37
|
+
end
|
38
|
+
|
39
|
+
def each
|
40
|
+
return enum_for :each unless block_given?
|
41
|
+
|
42
|
+
loop do
|
43
|
+
obj = @queue.pop
|
44
|
+
break if obj.equal? @sentinel
|
45
|
+
yield obj
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
Pubsub = PubSub unless const_defined? :Pubsub
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,173 @@
|
|
1
|
+
# Copyright 2017 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 "monitor"
|
17
|
+
|
18
|
+
module Google
|
19
|
+
module Cloud
|
20
|
+
module PubSub
|
21
|
+
class Subscriber
|
22
|
+
##
|
23
|
+
# @private
|
24
|
+
class Inventory
|
25
|
+
InventoryItem = Struct.new :bytesize, :pulled_at do
|
26
|
+
def self.from rec_msg
|
27
|
+
new rec_msg.to_proto.bytesize, Time.now
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
include MonitorMixin
|
32
|
+
|
33
|
+
attr_reader :stream
|
34
|
+
attr_reader :limit
|
35
|
+
attr_reader :bytesize
|
36
|
+
attr_reader :extension
|
37
|
+
attr_reader :max_duration_per_lease_extension
|
38
|
+
attr_reader :use_legacy_flow_control
|
39
|
+
|
40
|
+
def initialize stream, limit:, bytesize:, extension:, max_duration_per_lease_extension:,
|
41
|
+
use_legacy_flow_control:
|
42
|
+
super()
|
43
|
+
@stream = stream
|
44
|
+
@limit = limit
|
45
|
+
@bytesize = bytesize
|
46
|
+
@extension = extension
|
47
|
+
@max_duration_per_lease_extension = max_duration_per_lease_extension
|
48
|
+
@use_legacy_flow_control = use_legacy_flow_control
|
49
|
+
@inventory = {}
|
50
|
+
@wait_cond = new_cond
|
51
|
+
end
|
52
|
+
|
53
|
+
def ack_ids
|
54
|
+
@inventory.keys
|
55
|
+
end
|
56
|
+
|
57
|
+
def add *rec_msgs
|
58
|
+
rec_msgs.flatten!
|
59
|
+
rec_msgs.compact!
|
60
|
+
return if rec_msgs.empty?
|
61
|
+
|
62
|
+
synchronize do
|
63
|
+
rec_msgs.each do |rec_msg|
|
64
|
+
@inventory[rec_msg.ack_id] = InventoryItem.from rec_msg
|
65
|
+
end
|
66
|
+
@wait_cond.broadcast
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def remove *ack_ids
|
71
|
+
ack_ids.flatten!
|
72
|
+
ack_ids.compact!
|
73
|
+
return if ack_ids.empty?
|
74
|
+
|
75
|
+
synchronize do
|
76
|
+
@inventory.delete_if { |ack_id, _| ack_ids.include? ack_id }
|
77
|
+
@wait_cond.broadcast
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def remove_expired!
|
82
|
+
synchronize do
|
83
|
+
extension_time = Time.new - extension
|
84
|
+
@inventory.delete_if { |_ack_id, item| item.pulled_at < extension_time }
|
85
|
+
@wait_cond.broadcast
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def count
|
90
|
+
synchronize do
|
91
|
+
@inventory.count
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def total_bytesize
|
96
|
+
synchronize do
|
97
|
+
@inventory.values.sum(&:bytesize)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def empty?
|
102
|
+
synchronize do
|
103
|
+
@inventory.empty?
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def start
|
108
|
+
@background_thread ||= Thread.new { background_run }
|
109
|
+
|
110
|
+
self
|
111
|
+
end
|
112
|
+
|
113
|
+
def stop
|
114
|
+
synchronize do
|
115
|
+
@stopped = true
|
116
|
+
@wait_cond.broadcast
|
117
|
+
end
|
118
|
+
|
119
|
+
self
|
120
|
+
end
|
121
|
+
|
122
|
+
def stopped?
|
123
|
+
synchronize { @stopped }
|
124
|
+
end
|
125
|
+
|
126
|
+
def full?
|
127
|
+
synchronize do
|
128
|
+
@inventory.count >= limit || @inventory.values.sum(&:bytesize) >= bytesize
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
protected
|
133
|
+
|
134
|
+
def background_run
|
135
|
+
delay_target = nil
|
136
|
+
|
137
|
+
until stopped?
|
138
|
+
if empty?
|
139
|
+
delay_target = nil
|
140
|
+
|
141
|
+
synchronize { @wait_cond.wait } # wait until broadcast
|
142
|
+
next
|
143
|
+
end
|
144
|
+
|
145
|
+
delay_target ||= calc_target
|
146
|
+
delay_gap = delay_target - Time.now
|
147
|
+
|
148
|
+
unless delay_gap.positive?
|
149
|
+
delay_target = calc_target
|
150
|
+
stream.renew_lease!
|
151
|
+
next
|
152
|
+
end
|
153
|
+
|
154
|
+
synchronize { @wait_cond.wait delay_gap }
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def calc_target
|
159
|
+
Time.now + calc_delay
|
160
|
+
end
|
161
|
+
|
162
|
+
def calc_delay
|
163
|
+
delay = (stream.subscriber.deadline - 3) * rand(0.8..0.9)
|
164
|
+
delay = [delay, max_duration_per_lease_extension].min if max_duration_per_lease_extension.positive?
|
165
|
+
delay
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
Pubsub = PubSub unless const_defined? :Pubsub
|
172
|
+
end
|
173
|
+
end
|