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.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +67 -0
  4. data/.rubocop_todo.yml +145 -0
  5. data/.travis.yml +25 -5
  6. data/CHANGES.md +55 -0
  7. data/CONTRIBUTING.md +1 -1
  8. data/LICENSE.txt +17 -9
  9. data/README.md +13 -12
  10. data/Rakefile +15 -11
  11. data/bin/protoc-gen-ruby +8 -3
  12. data/bin/rpc_server +1 -0
  13. data/examples/lib/example/reverse-client.rb +2 -2
  14. data/install-protobuf.sh +28 -0
  15. data/lib/protobuf.rb +57 -53
  16. data/lib/protobuf/cli.rb +94 -74
  17. data/lib/protobuf/code_generator.rb +60 -9
  18. data/lib/protobuf/decoder.rb +19 -65
  19. data/lib/protobuf/deprecation.rb +117 -0
  20. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +11 -1
  21. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +55 -3
  22. data/lib/protobuf/encoder.rb +13 -53
  23. data/lib/protobuf/enum.rb +58 -63
  24. data/lib/protobuf/field.rb +4 -4
  25. data/lib/protobuf/field/base_field.rb +101 -173
  26. data/lib/protobuf/field/bool_field.rb +17 -11
  27. data/lib/protobuf/field/bytes_field.rb +21 -35
  28. data/lib/protobuf/field/double_field.rb +0 -1
  29. data/lib/protobuf/field/enum_field.rb +23 -22
  30. data/lib/protobuf/field/field_array.rb +5 -4
  31. data/lib/protobuf/field/fixed32_field.rb +1 -1
  32. data/lib/protobuf/field/fixed64_field.rb +0 -1
  33. data/lib/protobuf/field/float_field.rb +4 -1
  34. data/lib/protobuf/field/int32_field.rb +0 -1
  35. data/lib/protobuf/field/int64_field.rb +0 -1
  36. data/lib/protobuf/field/integer_field.rb +0 -1
  37. data/lib/protobuf/field/message_field.rb +13 -28
  38. data/lib/protobuf/field/sfixed32_field.rb +0 -1
  39. data/lib/protobuf/field/sfixed64_field.rb +0 -1
  40. data/lib/protobuf/field/signed_integer_field.rb +0 -1
  41. data/lib/protobuf/field/sint32_field.rb +0 -1
  42. data/lib/protobuf/field/sint64_field.rb +0 -1
  43. data/lib/protobuf/field/string_field.rb +2 -4
  44. data/lib/protobuf/field/uint32_field.rb +0 -1
  45. data/lib/protobuf/field/uint64_field.rb +0 -1
  46. data/lib/protobuf/field/varint_field.rb +30 -13
  47. data/lib/protobuf/generators/base.rb +30 -16
  48. data/lib/protobuf/generators/enum_generator.rb +6 -9
  49. data/lib/protobuf/generators/extension_generator.rb +1 -2
  50. data/lib/protobuf/generators/field_generator.rb +25 -13
  51. data/lib/protobuf/generators/file_generator.rb +157 -35
  52. data/lib/protobuf/generators/group_generator.rb +22 -17
  53. data/lib/protobuf/generators/message_generator.rb +13 -14
  54. data/lib/protobuf/generators/option_generator.rb +17 -0
  55. data/lib/protobuf/generators/printable.rb +12 -13
  56. data/lib/protobuf/generators/service_generator.rb +2 -3
  57. data/lib/protobuf/http.rb +2 -2
  58. data/lib/protobuf/lifecycle.rb +20 -33
  59. data/lib/protobuf/logging.rb +39 -0
  60. data/lib/protobuf/message.rb +114 -47
  61. data/lib/protobuf/message/fields.rb +170 -88
  62. data/lib/protobuf/message/serialization.rb +19 -18
  63. data/lib/protobuf/optionable.rb +53 -6
  64. data/lib/protobuf/rpc/buffer.rb +18 -19
  65. data/lib/protobuf/rpc/client.rb +22 -50
  66. data/lib/protobuf/rpc/connectors/base.rb +177 -12
  67. data/lib/protobuf/rpc/connectors/http.rb +14 -9
  68. data/lib/protobuf/rpc/connectors/ping.rb +89 -0
  69. data/lib/protobuf/rpc/connectors/socket.rb +13 -8
  70. data/lib/protobuf/rpc/connectors/zmq.rb +178 -73
  71. data/lib/protobuf/rpc/dynamic_discovery.pb.rb +4 -1
  72. data/lib/protobuf/rpc/env.rb +12 -12
  73. data/lib/protobuf/rpc/error.rb +3 -3
  74. data/lib/protobuf/rpc/error/client_error.rb +4 -4
  75. data/lib/protobuf/rpc/error/server_error.rb +9 -9
  76. data/lib/protobuf/rpc/middleware/exception_handler.rb +6 -2
  77. data/lib/protobuf/rpc/middleware/logger.rb +8 -4
  78. data/lib/protobuf/rpc/middleware/request_decoder.rb +17 -21
  79. data/lib/protobuf/rpc/middleware/response_encoder.rb +22 -27
  80. data/lib/protobuf/rpc/middleware/statsd.rb +3 -3
  81. data/lib/protobuf/rpc/rpc.pb.rb +4 -1
  82. data/lib/protobuf/rpc/server.rb +1 -1
  83. data/lib/protobuf/rpc/servers/http/server.rb +19 -17
  84. data/lib/protobuf/rpc/servers/socket/server.rb +78 -70
  85. data/lib/protobuf/rpc/servers/socket/worker.rb +4 -4
  86. data/lib/protobuf/rpc/servers/socket_runner.rb +27 -15
  87. data/lib/protobuf/rpc/servers/zmq/broker.rb +70 -31
  88. data/lib/protobuf/rpc/servers/zmq/server.rb +55 -47
  89. data/lib/protobuf/rpc/servers/zmq/util.rb +14 -13
  90. data/lib/protobuf/rpc/servers/zmq/worker.rb +16 -16
  91. data/lib/protobuf/rpc/servers/zmq_runner.rb +26 -7
  92. data/lib/protobuf/rpc/service.rb +21 -27
  93. data/lib/protobuf/rpc/service_directory.rb +43 -27
  94. data/lib/protobuf/rpc/service_dispatcher.rb +9 -10
  95. data/lib/protobuf/rpc/service_filters.rb +32 -55
  96. data/lib/protobuf/rpc/stat.rb +4 -8
  97. data/lib/protobuf/socket.rb +1 -2
  98. data/lib/protobuf/tasks/compile.rake +3 -4
  99. data/lib/protobuf/varint.rb +9 -0
  100. data/lib/protobuf/varint_pure.rb +13 -0
  101. data/lib/protobuf/version.rb +1 -1
  102. data/lib/protobuf/zmq.rb +2 -2
  103. data/proto/google/protobuf/descriptor.proto +190 -31
  104. data/protobuffy.gemspec +30 -17
  105. data/spec/benchmark/tasks.rb +27 -19
  106. data/spec/bin/protoc-gen-ruby_spec.rb +11 -6
  107. data/spec/encoding/all_types_spec.rb +96 -84
  108. data/spec/encoding/extreme_values_spec.rb +0 -0
  109. data/spec/functional/class_inheritance_spec.rb +52 -0
  110. data/spec/functional/code_generator_spec.rb +38 -0
  111. data/spec/functional/socket_server_spec.rb +15 -15
  112. data/spec/functional/zmq_server_spec.rb +29 -27
  113. data/spec/lib/protobuf/cli_spec.rb +82 -67
  114. data/spec/lib/protobuf/code_generator_spec.rb +37 -10
  115. data/spec/lib/protobuf/enum_spec.rb +77 -46
  116. data/spec/lib/protobuf/field/bool_field_spec.rb +91 -0
  117. data/spec/lib/protobuf/field/double_field_spec.rb +9 -0
  118. data/spec/lib/protobuf/field/enum_field_spec.rb +26 -0
  119. data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
  120. data/spec/lib/protobuf/field/fixed32_field_spec.rb +7 -0
  121. data/spec/lib/protobuf/field/fixed64_field_spec.rb +7 -0
  122. data/spec/lib/protobuf/field/float_field_spec.rb +90 -0
  123. data/spec/lib/protobuf/field/int32_field_spec.rb +114 -1
  124. data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
  125. data/spec/lib/protobuf/field/message_field_spec.rb +132 -0
  126. data/spec/lib/protobuf/field/sfixed32_field_spec.rb +9 -0
  127. data/spec/lib/protobuf/field/sfixed64_field_spec.rb +9 -0
  128. data/spec/lib/protobuf/field/sint32_field_spec.rb +9 -0
  129. data/spec/lib/protobuf/field/sint64_field_spec.rb +9 -0
  130. data/spec/lib/protobuf/field/string_field_spec.rb +44 -11
  131. data/spec/lib/protobuf/field/uint32_field_spec.rb +7 -0
  132. data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
  133. data/spec/lib/protobuf/field_spec.rb +4 -6
  134. data/spec/lib/protobuf/generators/base_spec.rb +80 -13
  135. data/spec/lib/protobuf/generators/enum_generator_spec.rb +35 -21
  136. data/spec/lib/protobuf/generators/extension_generator_spec.rb +12 -13
  137. data/spec/lib/protobuf/generators/field_generator_spec.rb +73 -21
  138. data/spec/lib/protobuf/generators/file_generator_spec.rb +89 -6
  139. data/spec/lib/protobuf/generators/service_generator_spec.rb +25 -13
  140. data/spec/lib/protobuf/lifecycle_spec.rb +25 -20
  141. data/spec/lib/protobuf/message_spec.rb +578 -79
  142. data/spec/lib/protobuf/optionable_spec.rb +202 -26
  143. data/spec/lib/protobuf/rpc/client_spec.rb +16 -16
  144. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +167 -13
  145. data/spec/lib/protobuf/rpc/connectors/connector_spec.rb +4 -5
  146. data/spec/lib/protobuf/rpc/connectors/http_spec.rb +13 -11
  147. data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
  148. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +6 -7
  149. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +35 -52
  150. data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +10 -10
  151. data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +11 -11
  152. data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +23 -23
  153. data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +11 -11
  154. data/spec/lib/protobuf/rpc/middleware/statsd_spec.rb +6 -6
  155. data/spec/lib/protobuf/rpc/servers/http/server_spec.rb +47 -44
  156. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +6 -6
  157. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +12 -10
  158. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +11 -11
  159. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +7 -7
  160. data/spec/lib/protobuf/rpc/service_directory_spec.rb +47 -49
  161. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +8 -25
  162. data/spec/lib/protobuf/rpc/service_filters_spec.rb +102 -69
  163. data/spec/lib/protobuf/rpc/service_spec.rb +37 -36
  164. data/spec/lib/protobuf/rpc/stat_spec.rb +7 -9
  165. data/spec/lib/protobuf/varint_spec.rb +29 -0
  166. data/spec/lib/protobuf_spec.rb +55 -28
  167. data/spec/spec_helper.rb +12 -27
  168. data/spec/support/all.rb +0 -1
  169. data/spec/support/packed_field.rb +4 -3
  170. data/spec/support/{test → protos}/all_types.data.bin +0 -0
  171. data/spec/support/{test → protos}/all_types.data.txt +0 -0
  172. data/spec/support/{test → protos}/enum.pb.rb +8 -4
  173. data/spec/support/{test → protos}/enum.proto +4 -1
  174. data/spec/support/{test → protos}/extreme_values.data.bin +0 -0
  175. data/spec/support/protos/google_unittest.bin +0 -0
  176. data/spec/support/protos/google_unittest.pb.rb +798 -0
  177. data/spec/support/{test → protos}/google_unittest.proto +237 -66
  178. data/spec/support/protos/google_unittest_custom_options.bin +0 -0
  179. data/spec/support/protos/google_unittest_custom_options.pb.rb +268 -0
  180. data/spec/support/protos/google_unittest_custom_options.proto +424 -0
  181. data/spec/support/protos/google_unittest_import.pb.rb +55 -0
  182. data/spec/support/{test → protos}/google_unittest_import.proto +19 -10
  183. data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
  184. data/spec/support/{test → protos}/google_unittest_import_public.proto +8 -5
  185. data/spec/support/{test → protos}/multi_field_extensions.pb.rb +5 -2
  186. data/spec/support/{test → protos}/multi_field_extensions.proto +2 -0
  187. data/spec/support/{test → protos}/resource.pb.rb +47 -11
  188. data/spec/support/{test → protos}/resource.proto +24 -1
  189. data/spec/support/resource_service.rb +23 -0
  190. data/spec/support/server.rb +32 -61
  191. metadata +119 -59
  192. data/lib/protobuf/deprecator.rb +0 -42
  193. data/lib/protobuf/logger.rb +0 -93
  194. data/lib/protobuf/rpc/connector.rb +0 -21
  195. data/lib/protobuf/rpc/connectors/common.rb +0 -172
  196. data/spec/data/data.bin +0 -3
  197. data/spec/data/types.bin +0 -0
  198. data/spec/lib/protobuf/logger_spec.rb +0 -145
  199. data/spec/lib/protobuf/rpc/connector_spec.rb +0 -26
  200. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +0 -170
  201. data/spec/support/test/defaults.pb.rb +0 -25
  202. data/spec/support/test/defaults.proto +0 -9
  203. data/spec/support/test/extended.pb.rb +0 -22
  204. data/spec/support/test/extended.proto +0 -10
  205. data/spec/support/test/google_unittest.pb.rb +0 -543
  206. data/spec/support/test/google_unittest_import.pb.rb +0 -37
  207. data/spec/support/test/google_unittest_import_public.pb.rb +0 -8
  208. data/spec/support/test/resource_service.rb +0 -26
  209. 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
- unless @beacon_port
66
- unless port = options[:beacon_port]
67
- port = ::Protobuf::Rpc::ServiceDirectory.port
68
- end
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 => self.to_proto
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 => self.to_proto
97
+ :server => to_proto
99
98
  )
100
99
 
101
100
  @beacon_socket.send(heartbeat.encode, 0)
102
101
 
103
- log_debug { sign_message("sent heartbeat to #{beacon_uri}") }
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
- alias_method :backend_ip, :frontend_ip
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
- !!self.options[:zmq_inproc]
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? or worker.join && false
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
- @broker.join unless brokerless?
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
- log_debug { sign_message("#{total_workers} workers started") }
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 total_workers
225
- @total_workers ||= [@options[:threads].to_i, 1].max
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 timeout
229
- if @timeout.nil?
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
- if reap_dead_workers?
255
- reap_dead_workers
256
- start_missing_workers
257
- end
250
+ start_broker unless brokerless?
251
+ reap_dead_workers if reap_dead_workers?
252
+ start_missing_workers
258
253
 
259
- if broadcast_heartbeat?
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 = Thread.new(self) do |server|
295
- ::Protobuf::Rpc::Zmq::Broker.new(server).run
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
- log_error { message }
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/.freeze
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::Logger::LogMethods
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
- unless ::ZMQ::Util.resultcode_ok?(return_code)
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
- #{caller(1).join($/)}
26
- ERROR
27
- end
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).detect do |address|
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, "", encoded_response])
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
- # The server was shutdown and no requests are pending
50
- break if rc == 0 && !running?
51
-
52
- # Something went wrong
53
- break if rc == -1
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
- if inproc?
73
- @zmq_context = @server.zmq_context
74
- else
75
- @zmq_context = ZMQ::Context.new
76
- end
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::Logger::LogMethods
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
- raise "Cannot parser Zmq Server - server options"
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
- log_info { "Increased worker size to: #{@server.total_workers}" }
52
+ logger.info { "Increased worker size to: #{@server.total_workers}" }
42
53
  end
43
54
 
44
55
  trap(:TTOU) do
45
- log_info { "Current worker size: #{@server.workers.size}" }
46
- log_info { "Current worker size: #{@server.busy_worker_count}" }
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
@@ -1,4 +1,5 @@
1
- require 'protobuf/logger'
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::Logger::LogMethods
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
- @_host ||= DEFAULT_HOST
59
+ @host ||= DEFAULT_HOST
58
60
  end
59
61
 
60
62
  # The host location setter.
61
63
  #
62
- def self.host=(new_host)
63
- @_host = new_host
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 = (self.subclasses || []).select do |subclass|
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
- @_port ||= DEFAULT_PORT
93
+ @port ||= DEFAULT_PORT
92
94
  end
93
95
 
94
96
  # The port location setter.
95
97
  #
96
- def self.port=(new_port)
97
- @_port = new_port
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
- @_rpcs ||= {}
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
- # Instance Methods
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
- @_response ||= response_type.new
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
- private
144
+ private
151
145
 
152
146
  def request_type
153
- @_request_type ||= env.request_type
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
- @_response = candidate
155
+ @response = candidate
162
156
  end
163
- alias_method :return_from_whence_you_came, :respond_with
157
+ alias :return_from_whence_you_came respond_with
164
158
 
165
159
  def response_type
166
- @_response_type ||= env.response_type
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
- raise RpcFailed.new(message)
167
+ fail RpcFailed, message
174
168
  end
175
169
  end
176
170