protobuffy 3.6.0 → 4.0.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/.gitignore +1 -0
- data/.rubocop.yml +67 -0
- data/.rubocop_todo.yml +145 -0
- data/.travis.yml +25 -5
- data/CHANGES.md +55 -0
- data/CONTRIBUTING.md +1 -1
- data/LICENSE.txt +17 -9
- data/README.md +13 -12
- data/Rakefile +15 -11
- data/bin/protoc-gen-ruby +8 -3
- data/bin/rpc_server +1 -0
- data/examples/lib/example/reverse-client.rb +2 -2
- data/install-protobuf.sh +28 -0
- data/lib/protobuf.rb +57 -53
- data/lib/protobuf/cli.rb +94 -74
- data/lib/protobuf/code_generator.rb +60 -9
- data/lib/protobuf/decoder.rb +19 -65
- data/lib/protobuf/deprecation.rb +117 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +11 -1
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +55 -3
- data/lib/protobuf/encoder.rb +13 -53
- data/lib/protobuf/enum.rb +58 -63
- data/lib/protobuf/field.rb +4 -4
- data/lib/protobuf/field/base_field.rb +101 -173
- data/lib/protobuf/field/bool_field.rb +17 -11
- data/lib/protobuf/field/bytes_field.rb +21 -35
- data/lib/protobuf/field/double_field.rb +0 -1
- data/lib/protobuf/field/enum_field.rb +23 -22
- data/lib/protobuf/field/field_array.rb +5 -4
- data/lib/protobuf/field/fixed32_field.rb +1 -1
- data/lib/protobuf/field/fixed64_field.rb +0 -1
- data/lib/protobuf/field/float_field.rb +4 -1
- data/lib/protobuf/field/int32_field.rb +0 -1
- data/lib/protobuf/field/int64_field.rb +0 -1
- data/lib/protobuf/field/integer_field.rb +0 -1
- data/lib/protobuf/field/message_field.rb +13 -28
- data/lib/protobuf/field/sfixed32_field.rb +0 -1
- data/lib/protobuf/field/sfixed64_field.rb +0 -1
- data/lib/protobuf/field/signed_integer_field.rb +0 -1
- data/lib/protobuf/field/sint32_field.rb +0 -1
- data/lib/protobuf/field/sint64_field.rb +0 -1
- data/lib/protobuf/field/string_field.rb +2 -4
- data/lib/protobuf/field/uint32_field.rb +0 -1
- data/lib/protobuf/field/uint64_field.rb +0 -1
- data/lib/protobuf/field/varint_field.rb +30 -13
- data/lib/protobuf/generators/base.rb +30 -16
- data/lib/protobuf/generators/enum_generator.rb +6 -9
- data/lib/protobuf/generators/extension_generator.rb +1 -2
- data/lib/protobuf/generators/field_generator.rb +25 -13
- data/lib/protobuf/generators/file_generator.rb +157 -35
- data/lib/protobuf/generators/group_generator.rb +22 -17
- data/lib/protobuf/generators/message_generator.rb +13 -14
- data/lib/protobuf/generators/option_generator.rb +17 -0
- data/lib/protobuf/generators/printable.rb +12 -13
- data/lib/protobuf/generators/service_generator.rb +2 -3
- data/lib/protobuf/http.rb +2 -2
- data/lib/protobuf/lifecycle.rb +20 -33
- data/lib/protobuf/logging.rb +39 -0
- data/lib/protobuf/message.rb +114 -47
- data/lib/protobuf/message/fields.rb +170 -88
- data/lib/protobuf/message/serialization.rb +19 -18
- data/lib/protobuf/optionable.rb +53 -6
- data/lib/protobuf/rpc/buffer.rb +18 -19
- data/lib/protobuf/rpc/client.rb +22 -50
- data/lib/protobuf/rpc/connectors/base.rb +177 -12
- data/lib/protobuf/rpc/connectors/http.rb +14 -9
- data/lib/protobuf/rpc/connectors/ping.rb +89 -0
- data/lib/protobuf/rpc/connectors/socket.rb +13 -8
- data/lib/protobuf/rpc/connectors/zmq.rb +178 -73
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +4 -1
- data/lib/protobuf/rpc/env.rb +12 -12
- data/lib/protobuf/rpc/error.rb +3 -3
- data/lib/protobuf/rpc/error/client_error.rb +4 -4
- data/lib/protobuf/rpc/error/server_error.rb +9 -9
- data/lib/protobuf/rpc/middleware/exception_handler.rb +6 -2
- data/lib/protobuf/rpc/middleware/logger.rb +8 -4
- data/lib/protobuf/rpc/middleware/request_decoder.rb +17 -21
- data/lib/protobuf/rpc/middleware/response_encoder.rb +22 -27
- data/lib/protobuf/rpc/middleware/statsd.rb +3 -3
- data/lib/protobuf/rpc/rpc.pb.rb +4 -1
- data/lib/protobuf/rpc/server.rb +1 -1
- data/lib/protobuf/rpc/servers/http/server.rb +19 -17
- data/lib/protobuf/rpc/servers/socket/server.rb +78 -70
- data/lib/protobuf/rpc/servers/socket/worker.rb +4 -4
- data/lib/protobuf/rpc/servers/socket_runner.rb +27 -15
- data/lib/protobuf/rpc/servers/zmq/broker.rb +70 -31
- data/lib/protobuf/rpc/servers/zmq/server.rb +55 -47
- data/lib/protobuf/rpc/servers/zmq/util.rb +14 -13
- data/lib/protobuf/rpc/servers/zmq/worker.rb +16 -16
- data/lib/protobuf/rpc/servers/zmq_runner.rb +26 -7
- data/lib/protobuf/rpc/service.rb +21 -27
- data/lib/protobuf/rpc/service_directory.rb +43 -27
- data/lib/protobuf/rpc/service_dispatcher.rb +9 -10
- data/lib/protobuf/rpc/service_filters.rb +32 -55
- data/lib/protobuf/rpc/stat.rb +4 -8
- data/lib/protobuf/socket.rb +1 -2
- data/lib/protobuf/tasks/compile.rake +3 -4
- data/lib/protobuf/varint.rb +9 -0
- data/lib/protobuf/varint_pure.rb +13 -0
- data/lib/protobuf/version.rb +1 -1
- data/lib/protobuf/zmq.rb +2 -2
- data/proto/google/protobuf/descriptor.proto +190 -31
- data/protobuffy.gemspec +30 -17
- data/spec/benchmark/tasks.rb +27 -19
- data/spec/bin/protoc-gen-ruby_spec.rb +11 -6
- data/spec/encoding/all_types_spec.rb +96 -84
- data/spec/encoding/extreme_values_spec.rb +0 -0
- data/spec/functional/class_inheritance_spec.rb +52 -0
- data/spec/functional/code_generator_spec.rb +38 -0
- data/spec/functional/socket_server_spec.rb +15 -15
- data/spec/functional/zmq_server_spec.rb +29 -27
- data/spec/lib/protobuf/cli_spec.rb +82 -67
- data/spec/lib/protobuf/code_generator_spec.rb +37 -10
- data/spec/lib/protobuf/enum_spec.rb +77 -46
- data/spec/lib/protobuf/field/bool_field_spec.rb +91 -0
- data/spec/lib/protobuf/field/double_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/enum_field_spec.rb +26 -0
- data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
- data/spec/lib/protobuf/field/fixed32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/fixed64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/float_field_spec.rb +90 -0
- data/spec/lib/protobuf/field/int32_field_spec.rb +114 -1
- data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/message_field_spec.rb +132 -0
- data/spec/lib/protobuf/field/sfixed32_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sfixed64_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sint32_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sint64_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/string_field_spec.rb +44 -11
- data/spec/lib/protobuf/field/uint32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field_spec.rb +4 -6
- data/spec/lib/protobuf/generators/base_spec.rb +80 -13
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +35 -21
- data/spec/lib/protobuf/generators/extension_generator_spec.rb +12 -13
- data/spec/lib/protobuf/generators/field_generator_spec.rb +73 -21
- data/spec/lib/protobuf/generators/file_generator_spec.rb +89 -6
- data/spec/lib/protobuf/generators/service_generator_spec.rb +25 -13
- data/spec/lib/protobuf/lifecycle_spec.rb +25 -20
- data/spec/lib/protobuf/message_spec.rb +578 -79
- data/spec/lib/protobuf/optionable_spec.rb +202 -26
- data/spec/lib/protobuf/rpc/client_spec.rb +16 -16
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +167 -13
- data/spec/lib/protobuf/rpc/connectors/connector_spec.rb +4 -5
- data/spec/lib/protobuf/rpc/connectors/http_spec.rb +13 -11
- data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +6 -7
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +35 -52
- data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +10 -10
- data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +23 -23
- data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/middleware/statsd_spec.rb +6 -6
- data/spec/lib/protobuf/rpc/servers/http/server_spec.rb +47 -44
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +6 -6
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +12 -10
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +7 -7
- data/spec/lib/protobuf/rpc/service_directory_spec.rb +47 -49
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +8 -25
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +102 -69
- data/spec/lib/protobuf/rpc/service_spec.rb +37 -36
- data/spec/lib/protobuf/rpc/stat_spec.rb +7 -9
- data/spec/lib/protobuf/varint_spec.rb +29 -0
- data/spec/lib/protobuf_spec.rb +55 -28
- data/spec/spec_helper.rb +12 -27
- data/spec/support/all.rb +0 -1
- data/spec/support/packed_field.rb +4 -3
- data/spec/support/{test → protos}/all_types.data.bin +0 -0
- data/spec/support/{test → protos}/all_types.data.txt +0 -0
- data/spec/support/{test → protos}/enum.pb.rb +8 -4
- data/spec/support/{test → protos}/enum.proto +4 -1
- data/spec/support/{test → protos}/extreme_values.data.bin +0 -0
- data/spec/support/protos/google_unittest.bin +0 -0
- data/spec/support/protos/google_unittest.pb.rb +798 -0
- data/spec/support/{test → protos}/google_unittest.proto +237 -66
- data/spec/support/protos/google_unittest_custom_options.bin +0 -0
- data/spec/support/protos/google_unittest_custom_options.pb.rb +268 -0
- data/spec/support/protos/google_unittest_custom_options.proto +424 -0
- data/spec/support/protos/google_unittest_import.pb.rb +55 -0
- data/spec/support/{test → protos}/google_unittest_import.proto +19 -10
- data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
- data/spec/support/{test → protos}/google_unittest_import_public.proto +8 -5
- data/spec/support/{test → protos}/multi_field_extensions.pb.rb +5 -2
- data/spec/support/{test → protos}/multi_field_extensions.proto +2 -0
- data/spec/support/{test → protos}/resource.pb.rb +47 -11
- data/spec/support/{test → protos}/resource.proto +24 -1
- data/spec/support/resource_service.rb +23 -0
- data/spec/support/server.rb +32 -61
- metadata +119 -59
- data/lib/protobuf/deprecator.rb +0 -42
- data/lib/protobuf/logger.rb +0 -93
- data/lib/protobuf/rpc/connector.rb +0 -21
- data/lib/protobuf/rpc/connectors/common.rb +0 -172
- data/spec/data/data.bin +0 -3
- data/spec/data/types.bin +0 -0
- data/spec/lib/protobuf/logger_spec.rb +0 -145
- data/spec/lib/protobuf/rpc/connector_spec.rb +0 -26
- data/spec/lib/protobuf/rpc/connectors/common_spec.rb +0 -170
- data/spec/support/test/defaults.pb.rb +0 -25
- data/spec/support/test/defaults.proto +0 -9
- data/spec/support/test/extended.pb.rb +0 -22
- data/spec/support/test/extended.proto +0 -10
- data/spec/support/test/google_unittest.pb.rb +0 -543
- data/spec/support/test/google_unittest_import.pb.rb +0 -37
- data/spec/support/test/google_unittest_import_public.pb.rb +0 -8
- data/spec/support/test/resource_service.rb +0 -26
- data/spec/support/tolerance_matcher.rb +0 -40
@@ -16,7 +16,7 @@ module Protobuf
|
|
16
16
|
:broadcast_beacons => false,
|
17
17
|
:broadcast_busy => false,
|
18
18
|
:zmq_inproc => true,
|
19
|
-
}
|
19
|
+
}.freeze
|
20
20
|
|
21
21
|
attr_accessor :options, :workers
|
22
22
|
attr_reader :zmq_context
|
@@ -62,15 +62,10 @@ module Protobuf
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def beacon_port
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
@beacon_port = port.to_i
|
71
|
-
end
|
72
|
-
|
73
|
-
@beacon_port
|
65
|
+
@beacon_port ||= options.fetch(
|
66
|
+
:beacon_port,
|
67
|
+
::Protobuf::Rpc::ServiceDirectory.port
|
68
|
+
).to_i
|
74
69
|
end
|
75
70
|
|
76
71
|
def beacon_uri
|
@@ -81,10 +76,14 @@ module Protobuf
|
|
81
76
|
!brokerless? && options[:broadcast_beacons]
|
82
77
|
end
|
83
78
|
|
79
|
+
def broadcast_busy?
|
80
|
+
broadcast_beacons? && options[:broadcast_busy]
|
81
|
+
end
|
82
|
+
|
84
83
|
def broadcast_flatline
|
85
84
|
flatline = ::Protobuf::Rpc::DynamicDiscovery::Beacon.new(
|
86
85
|
:beacon_type => ::Protobuf::Rpc::DynamicDiscovery::BeaconType::FLATLINE,
|
87
|
-
:server =>
|
86
|
+
:server => to_proto
|
88
87
|
)
|
89
88
|
|
90
89
|
@beacon_socket.send(flatline.encode, 0)
|
@@ -95,12 +94,12 @@ module Protobuf
|
|
95
94
|
|
96
95
|
heartbeat = ::Protobuf::Rpc::DynamicDiscovery::Beacon.new(
|
97
96
|
:beacon_type => ::Protobuf::Rpc::DynamicDiscovery::BeaconType::HEARTBEAT,
|
98
|
-
:server =>
|
97
|
+
:server => to_proto
|
99
98
|
)
|
100
99
|
|
101
100
|
@beacon_socket.send(heartbeat.encode, 0)
|
102
101
|
|
103
|
-
|
102
|
+
logger.debug { sign_message("sent heartbeat to #{beacon_uri}") }
|
104
103
|
end
|
105
104
|
|
106
105
|
def broadcast_heartbeat?
|
@@ -118,7 +117,7 @@ module Protobuf
|
|
118
117
|
def frontend_ip
|
119
118
|
@frontend_ip ||= resolve_ip(options[:host])
|
120
119
|
end
|
121
|
-
|
120
|
+
alias :backend_ip frontend_ip
|
122
121
|
|
123
122
|
def frontend_port
|
124
123
|
options[:port]
|
@@ -129,7 +128,7 @@ module Protobuf
|
|
129
128
|
end
|
130
129
|
|
131
130
|
def inproc?
|
132
|
-
!!
|
131
|
+
!!options[:zmq_inproc]
|
133
132
|
end
|
134
133
|
|
135
134
|
def maintenance_timeout
|
@@ -167,7 +166,7 @@ module Protobuf
|
|
167
166
|
@last_reaping = Time.now.to_i
|
168
167
|
|
169
168
|
@workers.keep_if do |worker|
|
170
|
-
worker.alive?
|
169
|
+
worker.alive? || worker.join && false
|
171
170
|
end
|
172
171
|
end
|
173
172
|
|
@@ -181,15 +180,11 @@ module Protobuf
|
|
181
180
|
|
182
181
|
def run
|
183
182
|
@running = true
|
184
|
-
|
185
|
-
start_broker unless brokerless?
|
186
|
-
start_missing_workers
|
187
|
-
|
188
183
|
yield if block_given? # runs on startup
|
189
184
|
wait_for_shutdown_signal
|
190
185
|
broadcast_flatline if broadcast_beacons?
|
191
186
|
Thread.pass until reap_dead_workers.empty?
|
192
|
-
@
|
187
|
+
@broker_thread.join unless brokerless?
|
193
188
|
ensure
|
194
189
|
@running = false
|
195
190
|
teardown
|
@@ -204,7 +199,7 @@ module Protobuf
|
|
204
199
|
|
205
200
|
if missing_workers > 0
|
206
201
|
missing_workers.times { start_worker }
|
207
|
-
|
202
|
+
logger.debug { sign_message("#{total_workers} workers started") }
|
208
203
|
end
|
209
204
|
end
|
210
205
|
|
@@ -221,16 +216,17 @@ module Protobuf
|
|
221
216
|
@last_reaping = @last_beacon = @timeout = nil
|
222
217
|
end
|
223
218
|
|
224
|
-
def
|
225
|
-
@
|
219
|
+
def timeout
|
220
|
+
@timeout =
|
221
|
+
if @timeout.nil?
|
222
|
+
0
|
223
|
+
else
|
224
|
+
[minimum_timeout, maintenance_timeout].max
|
225
|
+
end
|
226
226
|
end
|
227
227
|
|
228
|
-
def
|
229
|
-
|
230
|
-
@timeout = 0
|
231
|
-
else
|
232
|
-
@timeout = [minimum_timeout, maintenance_timeout].max
|
233
|
-
end
|
228
|
+
def total_workers
|
229
|
+
@total_workers ||= [@options[:threads].to_i, 1].max
|
234
230
|
end
|
235
231
|
|
236
232
|
def to_proto
|
@@ -251,19 +247,17 @@ module Protobuf
|
|
251
247
|
loop do
|
252
248
|
break if IO.select([@shutdown_r], nil, nil, timeout)
|
253
249
|
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
end
|
250
|
+
start_broker unless brokerless?
|
251
|
+
reap_dead_workers if reap_dead_workers?
|
252
|
+
start_missing_workers
|
258
253
|
|
259
|
-
|
260
|
-
if all_workers_busy? && options[:broadcast_busy]
|
261
|
-
broadcast_flatline
|
262
|
-
else
|
263
|
-
broadcast_heartbeat
|
264
|
-
end
|
265
|
-
end
|
254
|
+
next unless broadcast_heartbeat?
|
266
255
|
|
256
|
+
if broadcast_busy? && all_workers_busy?
|
257
|
+
broadcast_flatline
|
258
|
+
else
|
259
|
+
broadcast_heartbeat
|
260
|
+
end
|
267
261
|
end
|
268
262
|
end
|
269
263
|
|
@@ -291,19 +285,33 @@ module Protobuf
|
|
291
285
|
end
|
292
286
|
|
293
287
|
def start_broker
|
294
|
-
@broker
|
295
|
-
|
288
|
+
return if @broker && @broker.running? && @broker_thread.alive?
|
289
|
+
if @broker && !@broker.running?
|
290
|
+
broadcast_flatline if broadcast_busy?
|
291
|
+
@broker_thread.join if @broker_thread
|
292
|
+
init_zmq_context # need a new context to restart the broker
|
293
|
+
end
|
294
|
+
|
295
|
+
@broker = ::Protobuf::Rpc::Zmq::Broker.new(self)
|
296
|
+
@broker_thread = Thread.new(@broker) do |broker|
|
297
|
+
begin
|
298
|
+
broker.run
|
299
|
+
rescue => e
|
300
|
+
message = "Broker failed: #{e.inspect}\n #{e.backtrace.join($INPUT_RECORD_SEPARATOR)}"
|
301
|
+
$stderr.puts(message)
|
302
|
+
logger.error { message }
|
303
|
+
end
|
296
304
|
end
|
297
305
|
end
|
298
306
|
|
299
307
|
def start_worker
|
300
|
-
@workers << Thread.new(self) do |server|
|
308
|
+
@workers << Thread.new(self, @broker) do |server, broker|
|
301
309
|
begin
|
302
|
-
::Protobuf::Rpc::Zmq::Worker.new(server).run
|
310
|
+
::Protobuf::Rpc::Zmq::Worker.new(server, broker).run
|
303
311
|
rescue => e
|
304
|
-
message = "Worker failed: #{e.inspect}\n #{e.backtrace.join(
|
312
|
+
message = "Worker failed: #{e.inspect}\n #{e.backtrace.join($INPUT_RECORD_SEPARATOR)}"
|
305
313
|
$stderr.puts(message)
|
306
|
-
|
314
|
+
logger.error { message }
|
307
315
|
end
|
308
316
|
end
|
309
317
|
end
|
@@ -4,27 +4,28 @@ module Protobuf
|
|
4
4
|
module Rpc
|
5
5
|
module Zmq
|
6
6
|
|
7
|
-
ADDRESS_MATCH = /\A\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z
|
8
|
-
WORKER_READY_MESSAGE = "\1"
|
9
|
-
CHECK_AVAILABLE_MESSAGE = "\3"
|
10
|
-
NO_WORKERS_AVAILABLE = "\4"
|
11
|
-
WORKERS_AVAILABLE = "\5"
|
7
|
+
ADDRESS_MATCH = /\A\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/
|
8
|
+
WORKER_READY_MESSAGE = "\1".freeze
|
9
|
+
CHECK_AVAILABLE_MESSAGE = "\3".freeze
|
10
|
+
NO_WORKERS_AVAILABLE = "\4".freeze
|
11
|
+
WORKERS_AVAILABLE = "\5".freeze
|
12
|
+
EMPTY_STRING = "".freeze
|
12
13
|
|
13
14
|
module Util
|
14
|
-
include ::Protobuf::
|
15
|
+
include ::Protobuf::Logging
|
15
16
|
|
16
17
|
def self.included(base)
|
17
18
|
base.extend(::Protobuf::Rpc::Zmq::Util)
|
18
19
|
end
|
19
20
|
|
20
21
|
def zmq_error_check(return_code, source = nil)
|
21
|
-
|
22
|
-
raise <<-ERROR
|
23
|
-
Last ZMQ API call #{source ? "to #{source}" : ""} failed with "#{::ZMQ::Util.error_string}".
|
22
|
+
return if ::ZMQ::Util.resultcode_ok?(return_code)
|
24
23
|
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
fail <<-ERROR
|
25
|
+
Last ZMQ API call #{source ? "to #{source}" : ''} failed with "#{::ZMQ::Util.error_string}".
|
26
|
+
|
27
|
+
#{caller(1).join($INPUT_RECORD_SEPARATOR)}
|
28
|
+
ERROR
|
28
29
|
end
|
29
30
|
|
30
31
|
def log_signature
|
@@ -37,7 +38,7 @@ module Protobuf
|
|
37
38
|
end
|
38
39
|
|
39
40
|
def resolve_ip(hostname)
|
40
|
-
::Resolv.getaddresses(hostname).
|
41
|
+
::Resolv.getaddresses(hostname).find do |address|
|
41
42
|
address =~ ADDRESS_MATCH
|
42
43
|
end
|
43
44
|
end
|
@@ -12,8 +12,9 @@ module Protobuf
|
|
12
12
|
##
|
13
13
|
# Constructor
|
14
14
|
#
|
15
|
-
def initialize(server)
|
15
|
+
def initialize(server, broker)
|
16
16
|
@server = server
|
17
|
+
@broker = broker
|
17
18
|
|
18
19
|
init_zmq_context
|
19
20
|
init_backend_socket
|
@@ -31,7 +32,7 @@ module Protobuf
|
|
31
32
|
|
32
33
|
gc_pause do
|
33
34
|
encoded_response = handle_request(data)
|
34
|
-
write_to_backend([client_address,
|
35
|
+
write_to_backend([client_address, ::Protobuf::Rpc::Zmq::EMPTY_STRING, encoded_response])
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
@@ -46,13 +47,11 @@ module Protobuf
|
|
46
47
|
loop do
|
47
48
|
rc = poller.poll(500)
|
48
49
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
if rc > 0
|
50
|
+
if rc == 0 && !running? # rubocop:disable Style/GuardClause
|
51
|
+
break # The server was shutdown and no requests are pending
|
52
|
+
elsif rc == -1
|
53
|
+
break # Something went wrong
|
54
|
+
elsif rc > 0
|
56
55
|
::Thread.current[:busy] = true
|
57
56
|
process_request
|
58
57
|
::Thread.current[:busy] = false
|
@@ -63,17 +62,18 @@ module Protobuf
|
|
63
62
|
end
|
64
63
|
|
65
64
|
def running?
|
66
|
-
@server.running?
|
65
|
+
@broker.running? && @server.running?
|
67
66
|
end
|
68
67
|
|
69
68
|
private
|
70
69
|
|
71
70
|
def init_zmq_context
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
71
|
+
@zmq_context =
|
72
|
+
if inproc?
|
73
|
+
@server.zmq_context
|
74
|
+
else
|
75
|
+
ZMQ::Context.new
|
76
|
+
end
|
77
77
|
end
|
78
78
|
|
79
79
|
def init_backend_socket
|
@@ -93,7 +93,7 @@ module Protobuf
|
|
93
93
|
|
94
94
|
def teardown
|
95
95
|
@backend_socket.try(:close)
|
96
|
-
@zmq_context.try(:terminate)
|
96
|
+
@zmq_context.try(:terminate) unless inproc?
|
97
97
|
end
|
98
98
|
|
99
99
|
def write_to_backend(frames)
|
@@ -1,20 +1,20 @@
|
|
1
1
|
require 'ostruct'
|
2
|
+
require 'thread'
|
2
3
|
|
3
4
|
module Protobuf
|
4
5
|
module Rpc
|
5
6
|
class ZmqRunner
|
6
|
-
include ::Protobuf::
|
7
|
+
include ::Protobuf::Logging
|
7
8
|
|
8
9
|
def initialize(options)
|
9
10
|
@options = case
|
10
11
|
when options.is_a?(OpenStruct) then
|
11
12
|
options.marshal_dump
|
12
13
|
when options.respond_to?(:to_hash) then
|
13
|
-
options.to_hash
|
14
|
+
options.to_hash.symbolize_keys
|
14
15
|
else
|
15
|
-
|
16
|
+
fail "Cannot parser Zmq Server - server options"
|
16
17
|
end
|
17
|
-
|
18
18
|
end
|
19
19
|
|
20
20
|
def run
|
@@ -36,16 +36,35 @@ module Protobuf
|
|
36
36
|
private
|
37
37
|
|
38
38
|
def register_signals
|
39
|
+
trap(:TRAP) do
|
40
|
+
::Thread.list.each do |thread|
|
41
|
+
logger.info do
|
42
|
+
<<-THREAD_TRACE
|
43
|
+
#{thread.inspect}:
|
44
|
+
#{thread.backtrace.try(:join, $INPUT_RECORD_SEPARATOR)}"
|
45
|
+
THREAD_TRACE
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
39
50
|
trap(:TTIN) do
|
40
51
|
@server.add_worker
|
41
|
-
|
52
|
+
logger.info { "Increased worker size to: #{@server.total_workers}" }
|
42
53
|
end
|
43
54
|
|
44
55
|
trap(:TTOU) do
|
45
|
-
|
46
|
-
|
56
|
+
logger.info { "Current worker size: #{@server.workers.size}" }
|
57
|
+
logger.info { "Current busy worker size: #{@server.busy_worker_count}" }
|
47
58
|
end
|
48
59
|
end
|
49
60
|
end
|
50
61
|
end
|
51
62
|
end
|
63
|
+
|
64
|
+
module Protobuf
|
65
|
+
module Rpc
|
66
|
+
module Servers # bad file namespacing
|
67
|
+
ZmqRunner = ::Protobuf::Rpc::ZmqRunner
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/protobuf/rpc/service.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require 'protobuf/
|
1
|
+
require 'protobuf/logging'
|
2
|
+
require 'protobuf/message'
|
2
3
|
require 'protobuf/rpc/client'
|
3
4
|
require 'protobuf/rpc/error'
|
4
5
|
require 'protobuf/rpc/service_filters'
|
@@ -10,8 +11,9 @@ module Protobuf
|
|
10
11
|
RpcMethod = Struct.new("RpcMethod", :method, :request_type, :response_type)
|
11
12
|
|
12
13
|
class Service
|
13
|
-
include ::Protobuf::
|
14
|
+
include ::Protobuf::Logging
|
14
15
|
include ::Protobuf::Rpc::ServiceFilters
|
16
|
+
::Protobuf::Optionable.inject(self) { ::Google::Protobuf::ServiceOptions }
|
15
17
|
|
16
18
|
DEFAULT_HOST = '127.0.0.1'.freeze
|
17
19
|
DEFAULT_PORT = 9399
|
@@ -54,19 +56,19 @@ module Protobuf
|
|
54
56
|
# The host location of the service.
|
55
57
|
#
|
56
58
|
def self.host
|
57
|
-
@
|
59
|
+
@host ||= DEFAULT_HOST
|
58
60
|
end
|
59
61
|
|
60
62
|
# The host location setter.
|
61
63
|
#
|
62
|
-
|
63
|
-
|
64
|
+
class << self
|
65
|
+
attr_writer :host
|
64
66
|
end
|
65
67
|
|
66
68
|
# An array of defined service classes that contain implementation
|
67
69
|
# code
|
68
70
|
def self.implemented_services
|
69
|
-
classes = (
|
71
|
+
classes = (subclasses || []).select do |subclass|
|
70
72
|
subclass.rpcs.any? do |(name, _)|
|
71
73
|
subclass.method_defined? name
|
72
74
|
end
|
@@ -88,13 +90,13 @@ module Protobuf
|
|
88
90
|
# The port of the service on the destination server.
|
89
91
|
#
|
90
92
|
def self.port
|
91
|
-
@
|
93
|
+
@port ||= DEFAULT_PORT
|
92
94
|
end
|
93
95
|
|
94
96
|
# The port location setter.
|
95
97
|
#
|
96
|
-
|
97
|
-
|
98
|
+
class << self
|
99
|
+
attr_writer :port
|
98
100
|
end
|
99
101
|
|
100
102
|
# Define an rpc method with the given request and response types.
|
@@ -108,7 +110,7 @@ module Protobuf
|
|
108
110
|
# Hash containing the set of methods defined via `rpc`.
|
109
111
|
#
|
110
112
|
def self.rpcs
|
111
|
-
@
|
113
|
+
@rpcs ||= {}
|
112
114
|
end
|
113
115
|
|
114
116
|
# Check if the given method name is a known rpc endpoint.
|
@@ -117,22 +119,14 @@ module Protobuf
|
|
117
119
|
rpcs.key?(name)
|
118
120
|
end
|
119
121
|
|
120
|
-
|
121
|
-
|
122
|
-
#
|
123
|
-
# Get a callable object that will be used by the dispatcher
|
124
|
-
# to invoke the specified rpc method. Facilitates callback dispatch.
|
125
|
-
# The returned lambda is expected to be called at a later time (which
|
126
|
-
# is why we wrap the method call).
|
127
|
-
#
|
128
|
-
def callable_rpc_method(method_name)
|
129
|
-
lambda { run_filters(method_name) }
|
122
|
+
def call(method_name)
|
123
|
+
run_filters(method_name)
|
130
124
|
end
|
131
125
|
|
132
126
|
# Response object for this rpc cycle. Not assignable.
|
133
127
|
#
|
134
128
|
def response
|
135
|
-
@
|
129
|
+
@response ||= response_type.new
|
136
130
|
end
|
137
131
|
|
138
132
|
# Convenience method to get back to class method.
|
@@ -147,10 +141,10 @@ module Protobuf
|
|
147
141
|
self.class.rpcs
|
148
142
|
end
|
149
143
|
|
150
|
-
|
144
|
+
private
|
151
145
|
|
152
146
|
def request_type
|
153
|
-
@
|
147
|
+
@request_type ||= env.request_type
|
154
148
|
end
|
155
149
|
|
156
150
|
# Sugar to make an rpc method feel like a controller method.
|
@@ -158,19 +152,19 @@ module Protobuf
|
|
158
152
|
# object returned by the response reader.
|
159
153
|
#
|
160
154
|
def respond_with(candidate)
|
161
|
-
@
|
155
|
+
@response = candidate
|
162
156
|
end
|
163
|
-
|
157
|
+
alias :return_from_whence_you_came respond_with
|
164
158
|
|
165
159
|
def response_type
|
166
|
-
@
|
160
|
+
@response_type ||= env.response_type
|
167
161
|
end
|
168
162
|
|
169
163
|
# Automatically fail a service method.
|
170
164
|
#
|
171
165
|
def rpc_failed(message)
|
172
166
|
message = message.message if message.respond_to?(:message)
|
173
|
-
|
167
|
+
fail RpcFailed, message
|
174
168
|
end
|
175
169
|
end
|
176
170
|
|