require_relative "base" require_relative "../logger" module RightSpeed module Worker class RoundRobin < Base def run @ractor = Ractor.new(@id, @handler) do |id, handler| logger = RightSpeed.logger while conn = Ractor.receive begin handler.session(conn).process # TODO: keep-alive? Ractor.yield(conn, move: true) # to yield closing connections to ConnectionCloser rescue => e logger.error { "Unexpected error: #{e.message}\n" + e.backtrace.map{"\t#{_1}\n"}.join } # TODO: print backtrace in better way end end logger.info { "Worker#{id}: Finishing the Ractor" } Ractor.yield(:closing) # to tell the outgoing path will be closed when stopping end end def process(conn) @ractor.send(conn, move: true) end def wait @ractor.take end end end end