protobuf 3.3.6 → 3.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rubocop.yml +48 -0
- data/.rubocop_todo.yml +79 -0
- data/.travis.yml +12 -4
- data/Rakefile +14 -11
- data/bin/protoc-gen-ruby +0 -1
- data/bin/rpc_server +1 -0
- data/install-protobuf.sh +8 -0
- data/lib/protobuf.rb +30 -24
- data/lib/protobuf/cli.rb +35 -35
- data/lib/protobuf/code_generator.rb +11 -8
- data/lib/protobuf/decoder.rb +4 -5
- data/lib/protobuf/deprecation.rb +20 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +2 -0
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +2 -0
- data/lib/protobuf/encoder.rb +9 -4
- data/lib/protobuf/enum.rb +38 -54
- data/lib/protobuf/field.rb +2 -2
- data/lib/protobuf/field/base_field.rb +28 -32
- data/lib/protobuf/field/bool_field.rb +4 -4
- data/lib/protobuf/field/bytes_field.rb +5 -4
- data/lib/protobuf/field/double_field.rb +0 -1
- data/lib/protobuf/field/enum_field.rb +4 -7
- data/lib/protobuf/field/field_array.rb +3 -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 +0 -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 +2 -3
- 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 +0 -1
- 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 +0 -1
- data/lib/protobuf/generators/base.rb +1 -2
- data/lib/protobuf/generators/enum_generator.rb +1 -2
- data/lib/protobuf/generators/extension_generator.rb +1 -2
- data/lib/protobuf/generators/field_generator.rb +4 -5
- data/lib/protobuf/generators/file_generator.rb +22 -27
- data/lib/protobuf/generators/group_generator.rb +15 -16
- data/lib/protobuf/generators/message_generator.rb +13 -14
- data/lib/protobuf/generators/printable.rb +9 -10
- data/lib/protobuf/generators/service_generator.rb +1 -2
- data/lib/protobuf/lifecycle.rb +20 -33
- data/lib/protobuf/logging.rb +4 -6
- data/lib/protobuf/message.rb +22 -16
- data/lib/protobuf/message/fields.rb +14 -17
- data/lib/protobuf/message/serialization.rb +6 -5
- data/lib/protobuf/rpc/buffer.rb +10 -12
- data/lib/protobuf/rpc/client.rb +12 -12
- data/lib/protobuf/rpc/connectors/base.rb +4 -3
- data/lib/protobuf/rpc/connectors/common.rb +15 -17
- data/lib/protobuf/rpc/connectors/socket.rb +2 -2
- data/lib/protobuf/rpc/connectors/zmq.rb +118 -108
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +2 -0
- data/lib/protobuf/rpc/env.rb +12 -12
- data/lib/protobuf/rpc/error.rb +1 -1
- data/lib/protobuf/rpc/error/client_error.rb +4 -4
- data/lib/protobuf/rpc/error/server_error.rb +6 -6
- data/lib/protobuf/rpc/middleware/exception_handler.rb +1 -1
- data/lib/protobuf/rpc/middleware/logger.rb +3 -3
- data/lib/protobuf/rpc/middleware/request_decoder.rb +5 -5
- data/lib/protobuf/rpc/middleware/response_encoder.rb +3 -3
- data/lib/protobuf/rpc/rpc.pb.rb +2 -0
- data/lib/protobuf/rpc/servers/socket/server.rb +75 -65
- data/lib/protobuf/rpc/servers/socket/worker.rb +2 -2
- data/lib/protobuf/rpc/servers/socket_runner.rb +12 -6
- data/lib/protobuf/rpc/servers/zmq/broker.rb +10 -6
- data/lib/protobuf/rpc/servers/zmq/server.rb +20 -26
- data/lib/protobuf/rpc/servers/zmq/util.rb +7 -7
- data/lib/protobuf/rpc/servers/zmq/worker.rb +5 -7
- data/lib/protobuf/rpc/servers/zmq_runner.rb +14 -3
- data/lib/protobuf/rpc/service.rb +15 -15
- data/lib/protobuf/rpc/service_directory.rb +7 -11
- data/lib/protobuf/rpc/service_dispatcher.rb +3 -3
- data/lib/protobuf/rpc/service_filters.rb +27 -28
- data/lib/protobuf/rpc/stat.rb +4 -7
- data/lib/protobuf/socket.rb +0 -1
- data/lib/protobuf/tasks/compile.rake +2 -2
- data/lib/protobuf/version.rb +1 -1
- data/protobuf.gemspec +20 -4
- data/spec/benchmark/tasks.rb +49 -23
- data/spec/bin/protoc-gen-ruby_spec.rb +11 -6
- data/spec/encoding/all_types_spec.rb +91 -77
- data/spec/encoding/extreme_values_spec.rb +0 -0
- data/spec/functional/socket_server_spec.rb +9 -10
- data/spec/functional/zmq_server_spec.rb +21 -19
- data/spec/lib/protobuf/cli_spec.rb +20 -20
- data/spec/lib/protobuf/code_generator_spec.rb +6 -6
- data/spec/lib/protobuf/enum_spec.rb +57 -31
- data/spec/lib/protobuf/field/float_field_spec.rb +2 -2
- data/spec/lib/protobuf/field/int32_field_spec.rb +1 -1
- data/spec/lib/protobuf/field/string_field_spec.rb +7 -8
- data/spec/lib/protobuf/field_spec.rb +3 -6
- data/spec/lib/protobuf/generators/base_spec.rb +6 -6
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +22 -17
- data/spec/lib/protobuf/generators/extension_generator_spec.rb +8 -9
- data/spec/lib/protobuf/generators/field_generator_spec.rb +14 -11
- data/spec/lib/protobuf/generators/file_generator_spec.rb +7 -4
- data/spec/lib/protobuf/generators/service_generator_spec.rb +14 -11
- data/spec/lib/protobuf/lifecycle_spec.rb +9 -4
- data/spec/lib/protobuf/message_spec.rb +63 -35
- data/spec/lib/protobuf/optionable_spec.rb +3 -3
- data/spec/lib/protobuf/rpc/client_spec.rb +2 -2
- data/spec/lib/protobuf/rpc/connector_spec.rb +1 -1
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +6 -6
- data/spec/lib/protobuf/rpc/connectors/common_spec.rb +26 -18
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +4 -4
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +11 -9
- data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +2 -2
- data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +7 -7
- data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +14 -14
- data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +5 -5
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +1 -1
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +9 -7
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +9 -9
- data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +2 -2
- data/spec/lib/protobuf/rpc/service_directory_spec.rb +24 -23
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +4 -4
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +84 -51
- data/spec/lib/protobuf/rpc/service_spec.rb +15 -14
- data/spec/lib/protobuf/rpc/stat_spec.rb +1 -1
- data/spec/lib/protobuf_spec.rb +9 -9
- data/spec/spec_helper.rb +7 -19
- data/spec/support/server.rb +29 -59
- data/spec/support/test/defaults.pb.rb +2 -0
- data/spec/support/test/enum.pb.rb +2 -0
- data/spec/support/test/extended.pb.rb +2 -0
- data/spec/support/test/google_unittest_import.pb.rb +2 -0
- data/spec/support/test/google_unittest_import_public.pb.rb +2 -0
- data/spec/support/test/multi_field_extensions.pb.rb +2 -0
- data/spec/support/test/resource.pb.rb +2 -0
- data/spec/support/test/resource_service.rb +17 -20
- metadata +153 -112
- data/lib/protobuf/deprecator.rb +0 -42
@@ -26,7 +26,7 @@ module Protobuf
|
|
26
26
|
|
27
27
|
loop do
|
28
28
|
process_local_queue
|
29
|
-
rc = @poller.poll(
|
29
|
+
rc = @poller.poll(broker_polling_milliseconds)
|
30
30
|
|
31
31
|
# The server was shutdown and no requests are pending
|
32
32
|
break if rc == 0 && !running? && @server.workers.empty?
|
@@ -51,11 +51,15 @@ module Protobuf
|
|
51
51
|
@backend_poll_weight ||= [ENV["PB_ZMQ_SERVER_BACKEND_POLL_WEIGHT"].to_i, 1].max
|
52
52
|
end
|
53
53
|
|
54
|
+
def broker_polling_milliseconds
|
55
|
+
@broker_polling_milliseconds ||= [ENV["PB_ZMQ_BROKER_POLLING_MILLISECONDS"].to_i, 500].max
|
56
|
+
end
|
57
|
+
|
54
58
|
def check_and_process_backend
|
55
59
|
readables_include_backend = @poller.readables.include?(@backend_socket)
|
56
60
|
message_count_read_from_backend = 0
|
57
61
|
|
58
|
-
while readables_include_backend && message_count_read_from_backend < backend_poll_weight
|
62
|
+
while readables_include_backend && message_count_read_from_backend < backend_poll_weight
|
59
63
|
message_count_read_from_backend += 1
|
60
64
|
process_backend
|
61
65
|
@poller.poll_nonblock
|
@@ -67,7 +71,7 @@ module Protobuf
|
|
67
71
|
readables_include_frontend = @poller.readables.include?(@frontend_socket)
|
68
72
|
message_count_read_from_frontend = 0
|
69
73
|
|
70
|
-
while readables_include_frontend && message_count_read_from_frontend < frontend_poll_weight
|
74
|
+
while readables_include_frontend && message_count_read_from_frontend < frontend_poll_weight
|
71
75
|
message_count_read_from_frontend += 1
|
72
76
|
process_frontend
|
73
77
|
break unless local_queue_available? # no need to read frontend just to throw away messages, will prioritize backend when full
|
@@ -121,7 +125,7 @@ module Protobuf
|
|
121
125
|
end
|
122
126
|
|
123
127
|
def process_backend
|
124
|
-
worker,
|
128
|
+
worker, _ignore, *frames = read_from_backend
|
125
129
|
|
126
130
|
@idle_workers << worker
|
127
131
|
|
@@ -141,9 +145,9 @@ module Protobuf
|
|
141
145
|
end
|
142
146
|
else
|
143
147
|
if @idle_workers.empty?
|
144
|
-
local_queue << [address, ::Protobuf::Rpc::Zmq::EMPTY_STRING, message
|
148
|
+
local_queue << [address, ::Protobuf::Rpc::Zmq::EMPTY_STRING, message].concat(frames)
|
145
149
|
else
|
146
|
-
write_to_backend([@idle_workers.shift, ::Protobuf::Rpc::Zmq::EMPTY_STRING].concat([address, ::Protobuf::Rpc::Zmq::EMPTY_STRING, message
|
150
|
+
write_to_backend([@idle_workers.shift, ::Protobuf::Rpc::Zmq::EMPTY_STRING].concat([address, ::Protobuf::Rpc::Zmq::EMPTY_STRING, message]).concat(frames))
|
147
151
|
end
|
148
152
|
end
|
149
153
|
end
|
@@ -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
|
@@ -84,7 +79,7 @@ module Protobuf
|
|
84
79
|
def broadcast_flatline
|
85
80
|
flatline = ::Protobuf::Rpc::DynamicDiscovery::Beacon.new(
|
86
81
|
:beacon_type => ::Protobuf::Rpc::DynamicDiscovery::BeaconType::FLATLINE,
|
87
|
-
:server =>
|
82
|
+
:server => to_proto,
|
88
83
|
)
|
89
84
|
|
90
85
|
@beacon_socket.send(flatline.encode, 0)
|
@@ -95,7 +90,7 @@ module Protobuf
|
|
95
90
|
|
96
91
|
heartbeat = ::Protobuf::Rpc::DynamicDiscovery::Beacon.new(
|
97
92
|
:beacon_type => ::Protobuf::Rpc::DynamicDiscovery::BeaconType::HEARTBEAT,
|
98
|
-
:server =>
|
93
|
+
:server => to_proto,
|
99
94
|
)
|
100
95
|
|
101
96
|
@beacon_socket.send(heartbeat.encode, 0)
|
@@ -129,7 +124,7 @@ module Protobuf
|
|
129
124
|
end
|
130
125
|
|
131
126
|
def inproc?
|
132
|
-
!!
|
127
|
+
!!options[:zmq_inproc]
|
133
128
|
end
|
134
129
|
|
135
130
|
def maintenance_timeout
|
@@ -167,7 +162,7 @@ module Protobuf
|
|
167
162
|
@last_reaping = Time.now.to_i
|
168
163
|
|
169
164
|
@workers.keep_if do |worker|
|
170
|
-
worker.alive?
|
165
|
+
worker.alive? || worker.join && false
|
171
166
|
end
|
172
167
|
end
|
173
168
|
|
@@ -221,10 +216,6 @@ module Protobuf
|
|
221
216
|
@last_reaping = @last_beacon = @timeout = nil
|
222
217
|
end
|
223
218
|
|
224
|
-
def total_workers
|
225
|
-
@total_workers ||= [@options[:threads].to_i, 1].max
|
226
|
-
end
|
227
|
-
|
228
219
|
def timeout
|
229
220
|
if @timeout.nil?
|
230
221
|
@timeout = 0
|
@@ -233,13 +224,17 @@ module Protobuf
|
|
233
224
|
end
|
234
225
|
end
|
235
226
|
|
227
|
+
def total_workers
|
228
|
+
@total_workers ||= [@options[:threads].to_i, 1].max
|
229
|
+
end
|
230
|
+
|
236
231
|
def to_proto
|
237
232
|
@proto ||= ::Protobuf::Rpc::DynamicDiscovery::Server.new(
|
238
233
|
:uuid => uuid,
|
239
234
|
:address => frontend_ip,
|
240
235
|
:port => frontend_port.to_s,
|
241
236
|
:ttl => (beacon_interval * 1.5).ceil,
|
242
|
-
:services => ::Protobuf::Rpc::Service.implemented_services
|
237
|
+
:services => ::Protobuf::Rpc::Service.implemented_services,
|
243
238
|
)
|
244
239
|
end
|
245
240
|
|
@@ -256,14 +251,13 @@ module Protobuf
|
|
256
251
|
start_missing_workers
|
257
252
|
end
|
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 options[:broadcast_busy] && all_workers_busy?
|
257
|
+
broadcast_flatline
|
258
|
+
else
|
259
|
+
broadcast_heartbeat
|
260
|
+
end
|
267
261
|
end
|
268
262
|
end
|
269
263
|
|
@@ -301,7 +295,7 @@ module Protobuf
|
|
301
295
|
begin
|
302
296
|
::Protobuf::Rpc::Zmq::Worker.new(server).run
|
303
297
|
rescue => e
|
304
|
-
message = "Worker failed: #{e.inspect}\n #{e.backtrace.join(
|
298
|
+
message = "Worker failed: #{e.inspect}\n #{e.backtrace.join($INPUT_RECORD_SEPARATOR)}"
|
305
299
|
$stderr.puts(message)
|
306
300
|
logger.error { message }
|
307
301
|
end
|
@@ -19,13 +19,13 @@ module Protobuf
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def zmq_error_check(return_code, source = nil)
|
22
|
-
|
23
|
-
raise <<-ERROR
|
24
|
-
Last ZMQ API call #{source ? "to #{source}" : ""} failed with "#{::ZMQ::Util.error_string}".
|
22
|
+
return if ::ZMQ::Util.resultcode_ok?(return_code)
|
25
23
|
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|
29
29
|
end
|
30
30
|
|
31
31
|
def log_signature
|
@@ -38,7 +38,7 @@ module Protobuf
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def resolve_ip(hostname)
|
41
|
-
::Resolv.getaddresses(hostname).
|
41
|
+
::Resolv.getaddresses(hostname).find do |address|
|
42
42
|
address =~ ADDRESS_MATCH
|
43
43
|
end
|
44
44
|
end
|
@@ -46,13 +46,11 @@ module Protobuf
|
|
46
46
|
loop do
|
47
47
|
rc = poller.poll(500)
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
if rc > 0
|
49
|
+
if rc == 0 && !running?
|
50
|
+
break # The server was shutdown and no requests are pending
|
51
|
+
elsif rc == -1
|
52
|
+
break # Something went wrong
|
53
|
+
elsif rc > 0
|
56
54
|
::Thread.current[:busy] = true
|
57
55
|
process_request
|
58
56
|
::Thread.current[:busy] = false
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'ostruct'
|
2
|
+
require 'thread'
|
2
3
|
|
3
4
|
module Protobuf
|
4
5
|
module Rpc
|
@@ -12,9 +13,8 @@ module Protobuf
|
|
12
13
|
when options.respond_to?(:to_hash) then
|
13
14
|
options.to_hash
|
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,6 +36,17 @@ 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.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}" }
|
@@ -43,7 +54,7 @@ module Protobuf
|
|
43
54
|
|
44
55
|
trap(:TTOU) do
|
45
56
|
logger.info { "Current worker size: #{@server.workers.size}" }
|
46
|
-
logger.info { "Current worker size: #{@server.busy_worker_count}" }
|
57
|
+
logger.info { "Current busy worker size: #{@server.busy_worker_count}" }
|
47
58
|
end
|
48
59
|
end
|
49
60
|
end
|
data/lib/protobuf/rpc/service.rb
CHANGED
@@ -54,19 +54,19 @@ module Protobuf
|
|
54
54
|
# The host location of the service.
|
55
55
|
#
|
56
56
|
def self.host
|
57
|
-
@
|
57
|
+
@host ||= DEFAULT_HOST
|
58
58
|
end
|
59
59
|
|
60
60
|
# The host location setter.
|
61
61
|
#
|
62
|
-
|
63
|
-
|
62
|
+
class << self
|
63
|
+
attr_writer :host
|
64
64
|
end
|
65
65
|
|
66
66
|
# An array of defined service classes that contain implementation
|
67
67
|
# code
|
68
68
|
def self.implemented_services
|
69
|
-
classes = (
|
69
|
+
classes = (subclasses || []).select do |subclass|
|
70
70
|
subclass.rpcs.any? do |(name, _)|
|
71
71
|
subclass.method_defined? name
|
72
72
|
end
|
@@ -88,13 +88,13 @@ module Protobuf
|
|
88
88
|
# The port of the service on the destination server.
|
89
89
|
#
|
90
90
|
def self.port
|
91
|
-
@
|
91
|
+
@port ||= DEFAULT_PORT
|
92
92
|
end
|
93
93
|
|
94
94
|
# The port location setter.
|
95
95
|
#
|
96
|
-
|
97
|
-
|
96
|
+
class << self
|
97
|
+
attr_writer :port
|
98
98
|
end
|
99
99
|
|
100
100
|
# Define an rpc method with the given request and response types.
|
@@ -108,7 +108,7 @@ module Protobuf
|
|
108
108
|
# Hash containing the set of methods defined via `rpc`.
|
109
109
|
#
|
110
110
|
def self.rpcs
|
111
|
-
@
|
111
|
+
@rpcs ||= {}
|
112
112
|
end
|
113
113
|
|
114
114
|
# Check if the given method name is a known rpc endpoint.
|
@@ -126,13 +126,13 @@ module Protobuf
|
|
126
126
|
# is why we wrap the method call).
|
127
127
|
#
|
128
128
|
def callable_rpc_method(method_name)
|
129
|
-
|
129
|
+
-> { run_filters(method_name) }
|
130
130
|
end
|
131
131
|
|
132
132
|
# Response object for this rpc cycle. Not assignable.
|
133
133
|
#
|
134
134
|
def response
|
135
|
-
@
|
135
|
+
@response ||= response_type.new
|
136
136
|
end
|
137
137
|
|
138
138
|
# Convenience method to get back to class method.
|
@@ -147,10 +147,10 @@ module Protobuf
|
|
147
147
|
self.class.rpcs
|
148
148
|
end
|
149
149
|
|
150
|
-
|
150
|
+
private
|
151
151
|
|
152
152
|
def request_type
|
153
|
-
@
|
153
|
+
@request_type ||= env.request_type
|
154
154
|
end
|
155
155
|
|
156
156
|
# Sugar to make an rpc method feel like a controller method.
|
@@ -158,19 +158,19 @@ module Protobuf
|
|
158
158
|
# object returned by the response reader.
|
159
159
|
#
|
160
160
|
def respond_with(candidate)
|
161
|
-
@
|
161
|
+
@response = candidate
|
162
162
|
end
|
163
163
|
alias_method :return_from_whence_you_came, :respond_with
|
164
164
|
|
165
165
|
def response_type
|
166
|
-
@
|
166
|
+
@response_type ||= env.response_type
|
167
167
|
end
|
168
168
|
|
169
169
|
# Automatically fail a service method.
|
170
170
|
#
|
171
171
|
def rpc_failed(message)
|
172
172
|
message = message.message if message.respond_to?(:message)
|
173
|
-
|
173
|
+
fail RpcFailed, message
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
@@ -17,7 +17,7 @@ module Protobuf
|
|
17
17
|
DEFAULT_PORT = 53000
|
18
18
|
DEFAULT_TIMEOUT = 1
|
19
19
|
|
20
|
-
class Listing <
|
20
|
+
class Listing < SimpleDelegator
|
21
21
|
attr_reader :expires_at
|
22
22
|
|
23
23
|
def initialize(server)
|
@@ -45,13 +45,9 @@ module Protobuf
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def update(server)
|
48
|
-
|
48
|
+
__setobj__(server)
|
49
49
|
@expires_at = Time.now.to_i + ttl
|
50
50
|
end
|
51
|
-
|
52
|
-
def __getobj__
|
53
|
-
@server
|
54
|
-
end
|
55
51
|
end
|
56
52
|
|
57
53
|
# Class Methods
|
@@ -70,11 +66,11 @@ module Protobuf
|
|
70
66
|
|
71
67
|
def self.start
|
72
68
|
yield(self) if block_given?
|
73
|
-
|
69
|
+
instance.start
|
74
70
|
end
|
75
71
|
|
76
72
|
def self.stop
|
77
|
-
|
73
|
+
instance.stop
|
78
74
|
end
|
79
75
|
|
80
76
|
#
|
@@ -117,7 +113,7 @@ module Protobuf
|
|
117
113
|
unless running?
|
118
114
|
init_socket
|
119
115
|
logger.info { sign_message("listening to udp://#{self.class.address}:#{self.class.port}") }
|
120
|
-
@thread = Thread.new {
|
116
|
+
@thread = Thread.new { send(:run) }
|
121
117
|
end
|
122
118
|
|
123
119
|
self
|
@@ -200,11 +196,11 @@ module Protobuf
|
|
200
196
|
end
|
201
197
|
|
202
198
|
def remove_listing(uuid)
|
203
|
-
listing = @listings_by_uuid[uuid]
|
199
|
+
listing = @listings_by_uuid[uuid] || return
|
204
200
|
|
205
201
|
logger.debug { sign_message("Removing listing: #{listing.inspect}") }
|
206
202
|
|
207
|
-
@listings_by_service.
|
203
|
+
@listings_by_service.each_value do |listings|
|
208
204
|
listings.delete(listing)
|
209
205
|
end
|
210
206
|
|
@@ -7,7 +7,7 @@ module Protobuf
|
|
7
7
|
|
8
8
|
attr_reader :env
|
9
9
|
|
10
|
-
def initialize(
|
10
|
+
def initialize(_app)
|
11
11
|
# End of the line...
|
12
12
|
end
|
13
13
|
|
@@ -22,12 +22,12 @@ module Protobuf
|
|
22
22
|
@rpc_service ||= env.rpc_service.new(env)
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
private
|
26
26
|
|
27
27
|
# Call the given service method.
|
28
28
|
def dispatch_rpc_request
|
29
29
|
unless rpc_service.respond_to?(method_name)
|
30
|
-
|
30
|
+
fail MethodNotFound, "#{service_name}##{method_name} is not a publicly defined method."
|
31
31
|
end
|
32
32
|
|
33
33
|
rpc_service.callable_rpc_method(method_name).call
|
@@ -24,7 +24,7 @@ module Protobuf
|
|
24
24
|
# whose values are Sets.
|
25
25
|
#
|
26
26
|
def filters
|
27
|
-
@filters ||= Hash.new { |h,k| h[k] = [] }
|
27
|
+
@filters ||= Hash.new { |h, k| h[k] = [] }
|
28
28
|
end
|
29
29
|
|
30
30
|
# Filters hash keyed based on filter type (e.g. :before, :after, :around),
|
@@ -37,7 +37,7 @@ module Protobuf
|
|
37
37
|
def rescue_from(*ex_klasses, &block)
|
38
38
|
options = ex_klasses.last.is_a?(Hash) ? ex_klasses.pop : {}
|
39
39
|
callable = options.delete(:with) { block }
|
40
|
-
|
40
|
+
fail ArgumentError, 'Option :with missing from rescue_from options' if callable.nil?
|
41
41
|
ex_klasses.each { |ex_klass| rescue_filters[ex_klass] = callable }
|
42
42
|
end
|
43
43
|
|
@@ -45,12 +45,12 @@ module Protobuf
|
|
45
45
|
|
46
46
|
def define_filter(type, filter, options = {})
|
47
47
|
return if filter_defined?(type, filter)
|
48
|
-
filters[type] << options.merge(
|
48
|
+
filters[type] << options.merge(:callable => filter)
|
49
49
|
remember_filter(type, filter)
|
50
50
|
end
|
51
51
|
|
52
52
|
def defined_filters
|
53
|
-
@defined_filters ||= Hash.new { |h,k| h[k] = Set.new }
|
53
|
+
@defined_filters ||= Hash.new { |h, k| h[k] = Set.new }
|
54
54
|
end
|
55
55
|
|
56
56
|
# Check to see if the filter has been defined.
|
@@ -66,8 +66,8 @@ module Protobuf
|
|
66
66
|
end
|
67
67
|
|
68
68
|
# Takes a list of actually (or potentially) callable objects.
|
69
|
-
# TODO add support for if/unless
|
70
|
-
# TODO add support for only/except sub-filters
|
69
|
+
# TODO: add support for if/unless
|
70
|
+
# TODO: add support for only/except sub-filters
|
71
71
|
#
|
72
72
|
def set_filters(type, *args)
|
73
73
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
@@ -94,7 +94,7 @@ module Protobuf
|
|
94
94
|
# if the filter should not be invoked, true if invocation should occur.
|
95
95
|
#
|
96
96
|
def invoke_filter?(rpc_method, filter)
|
97
|
-
|
97
|
+
invoke_via_only?(rpc_method, filter) \
|
98
98
|
&& invoke_via_except?(rpc_method, filter) \
|
99
99
|
&& invoke_via_if?(rpc_method, filter) \
|
100
100
|
&& invoke_via_unless?(rpc_method, filter)
|
@@ -108,8 +108,8 @@ module Protobuf
|
|
108
108
|
# Value should be a symbol/string or an array of symbols/strings.
|
109
109
|
#
|
110
110
|
def invoke_via_except?(rpc_method, filter)
|
111
|
-
except = [
|
112
|
-
|
111
|
+
except = [filter.fetch(:except) { [] }].flatten
|
112
|
+
except.empty? || !except.include?(rpc_method)
|
113
113
|
end
|
114
114
|
|
115
115
|
# Invoke the given :if callable (if any) and return its return value.
|
@@ -119,8 +119,8 @@ module Protobuf
|
|
119
119
|
# Value can either be a symbol/string indicating an instance method to call
|
120
120
|
# or an object that responds to `call`.
|
121
121
|
#
|
122
|
-
def invoke_via_if?(
|
123
|
-
if_check = filter.fetch(:if) {
|
122
|
+
def invoke_via_if?(_rpc_method, filter)
|
123
|
+
if_check = filter.fetch(:if) { ->(_service) { return true } }
|
124
124
|
do_invoke = case
|
125
125
|
when if_check.nil? then
|
126
126
|
true
|
@@ -128,7 +128,7 @@ module Protobuf
|
|
128
128
|
call_or_send(if_check)
|
129
129
|
end
|
130
130
|
|
131
|
-
|
131
|
+
do_invoke
|
132
132
|
end
|
133
133
|
|
134
134
|
# If the target rpc endpoint method is listed in the :only option,
|
@@ -138,8 +138,8 @@ module Protobuf
|
|
138
138
|
# Value should be a symbol/string or an array of symbols/strings.
|
139
139
|
#
|
140
140
|
def invoke_via_only?(rpc_method, filter)
|
141
|
-
only = [
|
142
|
-
|
141
|
+
only = [filter.fetch(:only) { [] }].flatten
|
142
|
+
only.empty? || only.include?(rpc_method)
|
143
143
|
end
|
144
144
|
|
145
145
|
# Invoke the given :unless callable (if any) and return the opposite
|
@@ -149,8 +149,8 @@ module Protobuf
|
|
149
149
|
# Value can either be a symbol/string indicating an instance method to call
|
150
150
|
# or an object that responds to `call`.
|
151
151
|
#
|
152
|
-
def invoke_via_unless?(
|
153
|
-
unless_check = filter.fetch(:unless) {
|
152
|
+
def invoke_via_unless?(_rpc_method, filter)
|
153
|
+
unless_check = filter.fetch(:unless) { ->(_service) { return false } }
|
154
154
|
skip_invoke = case
|
155
155
|
when unless_check.nil? then
|
156
156
|
false
|
@@ -158,7 +158,7 @@ module Protobuf
|
|
158
158
|
call_or_send(unless_check)
|
159
159
|
end
|
160
160
|
|
161
|
-
|
161
|
+
!skip_invoke
|
162
162
|
end
|
163
163
|
|
164
164
|
def rescue_filters
|
@@ -176,7 +176,7 @@ module Protobuf
|
|
176
176
|
end
|
177
177
|
end
|
178
178
|
|
179
|
-
|
179
|
+
true
|
180
180
|
end
|
181
181
|
|
182
182
|
# Reverse build a chain of around filters. To implement an around chain,
|
@@ -209,17 +209,16 @@ module Protobuf
|
|
209
209
|
# end
|
210
210
|
#
|
211
211
|
def run_around_filters(rpc_method)
|
212
|
-
final =
|
213
|
-
filters[:around].reverse.
|
212
|
+
final = -> { __send__(rpc_method) }
|
213
|
+
filters[:around].reverse.reduce(final) do |previous, filter|
|
214
214
|
if invoke_filter?(rpc_method, filter)
|
215
|
-
|
215
|
+
-> { call_or_send(filter[:callable], &previous) }
|
216
216
|
else
|
217
217
|
previous
|
218
218
|
end
|
219
|
-
|
219
|
+
end.call
|
220
220
|
end
|
221
221
|
|
222
|
-
|
223
222
|
# Entry method to call each filter type in the appropriate order. This should
|
224
223
|
# be used instead of the other run methods directly.
|
225
224
|
#
|
@@ -240,10 +239,10 @@ module Protobuf
|
|
240
239
|
begin
|
241
240
|
yield
|
242
241
|
rescue *rescue_filters.keys => ex
|
243
|
-
callable = rescue_filters.fetch(ex.class)
|
244
|
-
mapped_klass = rescue_filters.keys.
|
242
|
+
callable = rescue_filters.fetch(ex.class) do
|
243
|
+
mapped_klass = rescue_filters.keys.find { |child_klass| ex.class < child_klass }
|
245
244
|
rescue_filters[mapped_klass]
|
246
|
-
|
245
|
+
end
|
247
246
|
|
248
247
|
call_or_send(callable, ex)
|
249
248
|
end
|
@@ -260,10 +259,10 @@ module Protobuf
|
|
260
259
|
when respond_to?(callable, true) then
|
261
260
|
__send__(callable, *args, &block)
|
262
261
|
else
|
263
|
-
|
262
|
+
fail "Object #{callable} is not callable"
|
264
263
|
end
|
265
264
|
|
266
|
-
|
265
|
+
return_value
|
267
266
|
end
|
268
267
|
|
269
268
|
end
|