protobuffy 3.6.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|