@@ -76,6 +76,10 @@ def broadcast_beacons?
7676 !brokerless? && options [ :broadcast_beacons ]
7777 end
7878
79+ def broadcast_busy?
80+ broadcast_beacons? && options [ :broadcast_busy ]
81+ end
82+
7983 def broadcast_flatline
8084 flatline = ::Protobuf ::Rpc ::DynamicDiscovery ::Beacon . new (
8185 :beacon_type => ::Protobuf ::Rpc ::DynamicDiscovery ::BeaconType ::FLATLINE ,
@@ -176,15 +180,11 @@ def reaping_interval
176180
177181 def run
178182 @running = true
179-
180- start_broker unless brokerless?
181- start_missing_workers
182-
183183 yield if block_given? # runs on startup
184184 wait_for_shutdown_signal
185185 broadcast_flatline if broadcast_beacons?
186186 Thread . pass until reap_dead_workers . empty?
187- @broker . join unless brokerless?
187+ @broker_thread . join unless brokerless?
188188 ensure
189189 @running = false
190190 teardown
@@ -246,14 +246,13 @@ def wait_for_shutdown_signal
246246 loop do
247247 break if IO . select ( [ @shutdown_r ] , nil , nil , timeout )
248248
249- if reap_dead_workers?
250- reap_dead_workers
251- start_missing_workers
252- end
249+ start_broker unless brokerless?
250+ reap_dead_workers if reap_dead_workers?
251+ start_missing_workers
253252
254253 next unless broadcast_heartbeat?
255254
256- if options [ : broadcast_busy] && all_workers_busy?
255+ if broadcast_busy? && all_workers_busy?
257256 broadcast_flatline
258257 else
259258 broadcast_heartbeat
@@ -285,15 +284,29 @@ def init_zmq_context
285284 end
286285
287286 def start_broker
288- @broker = Thread . new ( self ) do |server |
289- ::Protobuf ::Rpc ::Zmq ::Broker . new ( server ) . run
287+ return if @broker && @broker . running? && !@broker_thread . stop?
288+ if @broker && !@broker . running?
289+ broadcast_flatline if broadcast_busy?
290+ @broker_thread . join if @broker_thread
291+ init_zmq_context # need a new context to restart the broker
292+ end
293+
294+ @broker = ::Protobuf ::Rpc ::Zmq ::Broker . new ( self )
295+ @broker_thread = Thread . new ( @broker ) do |broker |
296+ begin
297+ broker . run
298+ rescue => e
299+ message = "Broker failed: #{ e . inspect } \n #{ e . backtrace . join ( $INPUT_RECORD_SEPARATOR) } "
300+ $stderr. puts ( message )
301+ logger . error { message }
302+ end
290303 end
291304 end
292305
293306 def start_worker
294- @workers << Thread . new ( self ) do |server |
307+ @workers << Thread . new ( self , @broker ) do |server , broker |
295308 begin
296- ::Protobuf ::Rpc ::Zmq ::Worker . new ( server ) . run
309+ ::Protobuf ::Rpc ::Zmq ::Worker . new ( server , broker ) . run
297310 rescue => e
298311 message = "Worker failed: #{ e . inspect } \n #{ e . backtrace . join ( $INPUT_RECORD_SEPARATOR) } "
299312 $stderr. puts ( message )
0 commit comments