protobuf 1.1.3 → 1.3.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.
- data/.gitignore +3 -0
- data/Gemfile.lock +44 -25
- data/README.md +2 -2
- data/Rakefile +15 -0
- data/bin/rpc_server +52 -11
- data/lib/protobuf.rb +22 -10
- data/lib/protobuf/common/logger.rb +26 -25
- data/lib/protobuf/descriptor/file_descriptor.rb +1 -1
- data/lib/protobuf/message/field.rb +2 -2
- data/lib/protobuf/rpc/buffer.rb +30 -25
- data/lib/protobuf/rpc/client.rb +8 -8
- data/lib/protobuf/rpc/connector.rb +2 -0
- data/lib/protobuf/rpc/connectors/base.rb +0 -1
- data/lib/protobuf/rpc/connectors/common.rb +48 -48
- data/lib/protobuf/rpc/connectors/em_client.rb +53 -27
- data/lib/protobuf/rpc/connectors/eventmachine.rb +14 -17
- data/lib/protobuf/rpc/connectors/socket.rb +23 -16
- data/lib/protobuf/rpc/connectors/zmq.rb +73 -0
- data/lib/protobuf/rpc/error.rb +1 -2
- data/lib/protobuf/rpc/error/client_error.rb +4 -4
- data/lib/protobuf/rpc/server.rb +31 -43
- data/lib/protobuf/rpc/servers/evented/server.rb +43 -0
- data/lib/protobuf/rpc/servers/evented_runner.rb +1 -1
- data/lib/protobuf/rpc/servers/socket/server.rb +108 -0
- data/lib/protobuf/rpc/servers/socket/worker.rb +59 -0
- data/lib/protobuf/rpc/servers/socket_runner.rb +3 -3
- data/lib/protobuf/rpc/servers/zmq/broker.rb +85 -0
- data/lib/protobuf/rpc/servers/zmq/server.rb +50 -0
- data/lib/protobuf/rpc/servers/zmq/util.rb +27 -0
- data/lib/protobuf/rpc/servers/zmq/worker.rb +72 -0
- data/lib/protobuf/rpc/servers/zmq_runner.rb +26 -0
- data/lib/protobuf/rpc/service.rb +5 -5
- data/lib/protobuf/version.rb +1 -1
- data/protobuf.gemspec +12 -10
- data/spec/benchmark/tasks.rb +37 -5
- data/spec/functional/evented_server_spec.rb +64 -0
- data/spec/functional/socket_server_spec.rb +63 -0
- data/spec/functional/zmq_server_spec.rb +63 -0
- data/spec/helper/server.rb +32 -12
- data/spec/lib/protobuf/message/encoder_spec.rb +19 -0
- data/spec/proto/test.pb.rb +3 -3
- data/spec/proto/test.proto +3 -3
- data/spec/proto/test_service.rb +1 -0
- data/spec/spec_helper.rb +6 -0
- data/spec/unit/message_spec.rb +1 -1
- data/spec/unit/rpc/client_spec.rb +11 -3
- data/spec/unit/rpc/connectors/common_spec.rb +0 -1
- data/spec/unit/rpc/connectors/eventmachine_client_spec.rb +32 -0
- data/spec/unit/rpc/connectors/socket_spec.rb +2 -4
- data/spec/unit/rpc/connectors/zmq_spec.rb +27 -0
- data/spec/unit/rpc/servers/evented_server_spec.rb +3 -3
- data/spec/unit/rpc/servers/socket_server_spec.rb +14 -13
- data/spec/unit/rpc/servers/zmq/broker_spec.rb +27 -0
- data/spec/unit/rpc/servers/zmq/server_spec.rb +37 -0
- data/spec/unit/rpc/servers/zmq/util_spec.rb +41 -0
- data/spec/unit/rpc/servers/zmq/worker_spec.rb +36 -0
- data/spec/unit/rpc/service_spec.rb +22 -18
- metadata +87 -40
- data/lib/protobuf/rpc/servers/evented_server.rb +0 -28
- data/lib/protobuf/rpc/servers/socket_server.rb +0 -146
| @@ -0,0 +1,59 @@ | |
| 1 | 
            +
            module Protobuf
         | 
| 2 | 
            +
              module Rpc
         | 
| 3 | 
            +
                module Socket
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                  class Worker
         | 
| 6 | 
            +
                    include ::Protobuf::Rpc::Server
         | 
| 7 | 
            +
                    include ::Protobuf::Logger::LogMethods
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                    def initialize(sock, &complete_cb)
         | 
| 10 | 
            +
                      @did_response = false
         | 
| 11 | 
            +
                      @socket = sock
         | 
| 12 | 
            +
                      @request = Protobuf::Socketrpc::Request.new
         | 
| 13 | 
            +
                      @response = Protobuf::Socketrpc::Response.new
         | 
| 14 | 
            +
                      request_buffer = Protobuf::Rpc::Buffer.new(:read)
         | 
| 15 | 
            +
                      @stats = Protobuf::Rpc::Stat.new(:SERVER, true)
         | 
| 16 | 
            +
                      @complete_cb = complete_cb
         | 
| 17 | 
            +
                      log_debug { "[#{log_signature}] Post init, new read buffer created" }
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                      @stats.client = ::Socket.unpack_sockaddr_in(@socket.getpeername)
         | 
| 20 | 
            +
                      log_debug { "stats are #{@stats.to_s}" }
         | 
| 21 | 
            +
                      request_buffer << read_data
         | 
| 22 | 
            +
                      @request_data = request_buffer.data
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                      @stats.request_size = request_buffer.size
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                      log_debug { "[#{log_signature}] handling request" }
         | 
| 27 | 
            +
                      handle_client if request_buffer.flushed?
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    def log_signature
         | 
| 31 | 
            +
                      @log_signature ||= "server-#{self.class}-#{object_id}"
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    def read_data
         | 
| 35 | 
            +
                      size_io = StringIO.new
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                      while((size_reader = @socket.getc) != "-")
         | 
| 38 | 
            +
                        size_io << size_reader
         | 
| 39 | 
            +
                      end
         | 
| 40 | 
            +
                      str_size_io = size_io.string
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                      "#{str_size_io}-#{@socket.read(str_size_io.to_i)}"
         | 
| 43 | 
            +
                    end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                    def send_data
         | 
| 46 | 
            +
                      raise 'Socket closed unexpectedly' if(@socket.nil? || @socket.closed?)
         | 
| 47 | 
            +
                      response_buffer = Protobuf::Rpc::Buffer.new(:write)
         | 
| 48 | 
            +
                      response_buffer.set_data(@response)
         | 
| 49 | 
            +
                      @stats.response_size = response_buffer.size
         | 
| 50 | 
            +
                      log_debug { "[#{log_signature}] sending data : %s" % response_buffer.data }
         | 
| 51 | 
            +
                      @socket.write(response_buffer.write)
         | 
| 52 | 
            +
                      @socket.flush
         | 
| 53 | 
            +
                      @complete_cb.call(@socket)
         | 
| 54 | 
            +
                    end
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
            end
         | 
| @@ -3,12 +3,12 @@ module Protobuf | |
| 3 3 | 
             
                class SocketRunner 
         | 
| 4 4 |  | 
| 5 5 | 
             
                  def self.stop
         | 
| 6 | 
            -
                    Protobuf::Rpc:: | 
| 6 | 
            +
                    Protobuf::Rpc::Socket::Server.stop 
         | 
| 7 7 | 
             
                    Protobuf::Logger.info 'Shutdown complete'
         | 
| 8 8 | 
             
                  end
         | 
| 9 9 |  | 
| 10 10 | 
             
                  def self.run(server)
         | 
| 11 | 
            -
                    Protobuf::Logger.info " | 
| 11 | 
            +
                    Protobuf::Logger.info "Socket::Server Running"
         | 
| 12 12 | 
             
                    server_config = case 
         | 
| 13 13 | 
             
                                    when server.is_a?(OpenStruct) then 
         | 
| 14 14 | 
             
                                      server.marshal_dump
         | 
| @@ -20,7 +20,7 @@ module Protobuf | |
| 20 20 | 
             
                                      raise "Cannot parser Socket Server - server options"
         | 
| 21 21 | 
             
                                    end
         | 
| 22 22 |  | 
| 23 | 
            -
                    Protobuf::Rpc:: | 
| 23 | 
            +
                    Protobuf::Rpc::Socket::Server.run(server_config)
         | 
| 24 24 | 
             
                  end
         | 
| 25 25 | 
             
                end
         | 
| 26 26 |  | 
| @@ -0,0 +1,85 @@ | |
| 1 | 
            +
            require 'resolv'
         | 
| 2 | 
            +
            require 'protobuf/rpc/servers/zmq/util'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Protobuf
         | 
| 5 | 
            +
              module Rpc
         | 
| 6 | 
            +
                module Zmq
         | 
| 7 | 
            +
                  class Broker
         | 
| 8 | 
            +
                    include ::Protobuf::Rpc::Zmq::Util
         | 
| 9 | 
            +
                    attr_reader :frontend, :backend, :poller, :context
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                    ## 
         | 
| 12 | 
            +
                    # Constructor
         | 
| 13 | 
            +
                    #
         | 
| 14 | 
            +
                    def initialize(opts={})
         | 
| 15 | 
            +
                      @context = ::ZMQ::Context.new
         | 
| 16 | 
            +
                      @frontend = setup_frontend(opts)
         | 
| 17 | 
            +
                      @backend = setup_backend(opts)
         | 
| 18 | 
            +
                      @poller = setup_poller
         | 
| 19 | 
            +
                    end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                    ##
         | 
| 22 | 
            +
                    # Instance Methods
         | 
| 23 | 
            +
                    #
         | 
| 24 | 
            +
                    def poll
         | 
| 25 | 
            +
                      poller.poll(1000)
         | 
| 26 | 
            +
                      poller.readables.each do |socket|
         | 
| 27 | 
            +
                        case socket
         | 
| 28 | 
            +
                        when frontend then
         | 
| 29 | 
            +
                          move_to(backend, socket)
         | 
| 30 | 
            +
                        when backend then
         | 
| 31 | 
            +
                          move_to(frontend, socket)
         | 
| 32 | 
            +
                        end
         | 
| 33 | 
            +
                      end
         | 
| 34 | 
            +
                    end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    def teardown
         | 
| 37 | 
            +
                      frontend.close
         | 
| 38 | 
            +
                      backend.close
         | 
| 39 | 
            +
                      context.terminate
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                    private
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                      def move_to(frontend_or_backend, socket)
         | 
| 45 | 
            +
                        more_data = true
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                        while more_data do
         | 
| 48 | 
            +
                          socket.recv_string(data = "")
         | 
| 49 | 
            +
                          more_data = socket.more_parts?
         | 
| 50 | 
            +
                          more_data_flag = (more_data ? ::ZMQ::SNDMORE : 0)
         | 
| 51 | 
            +
                          frontend_or_backend.send_string(data, more_data_flag)
         | 
| 52 | 
            +
                        end
         | 
| 53 | 
            +
                      end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                      def setup_backend(opts={})
         | 
| 56 | 
            +
                        dealer_options = opts.merge(:port => opts.fetch(:port, 9399) + 1)
         | 
| 57 | 
            +
                        host = dealer_options.fetch(:host, "127.0.0.1")
         | 
| 58 | 
            +
                        port = dealer_options.fetch(:port, 9400)
         | 
| 59 | 
            +
                        protocol = dealer_options.fetch(:protocol, "tcp")
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                        zmq_backend = context.socket(::ZMQ::DEALER)
         | 
| 62 | 
            +
                        zmq_error_check(zmq_backend.bind("#{protocol}://#{resolve_ip(host)}:#{port}"))
         | 
| 63 | 
            +
                        zmq_backend
         | 
| 64 | 
            +
                      end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                      def setup_frontend(opts={})
         | 
| 67 | 
            +
                        host = opts.fetch(:host, "127.0.0.1")
         | 
| 68 | 
            +
                        port = opts.fetch(:port, 9399)
         | 
| 69 | 
            +
                        protocol = opts.fetch(:protocol, "tcp")
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                        zmq_frontend = context.socket(::ZMQ::ROUTER)
         | 
| 72 | 
            +
                        zmq_error_check(zmq_frontend.bind("#{protocol}://#{resolve_ip(host)}:#{port}"))
         | 
| 73 | 
            +
                        zmq_frontend
         | 
| 74 | 
            +
                      end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                      def setup_poller
         | 
| 77 | 
            +
                        zmq_poller = ::ZMQ::Poller.new
         | 
| 78 | 
            +
                        zmq_poller.register(frontend, ::ZMQ::POLLIN)
         | 
| 79 | 
            +
                        zmq_poller.register(backend, ::ZMQ::POLLIN)
         | 
| 80 | 
            +
                        zmq_poller
         | 
| 81 | 
            +
                      end
         | 
| 82 | 
            +
                  end
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
              end
         | 
| 85 | 
            +
            end
         | 
| @@ -0,0 +1,50 @@ | |
| 1 | 
            +
            require 'protobuf/rpc/servers/zmq/broker'
         | 
| 2 | 
            +
            require 'protobuf/rpc/servers/zmq/worker'
         | 
| 3 | 
            +
            require 'protobuf/rpc/servers/zmq/util'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Protobuf
         | 
| 6 | 
            +
              module Rpc
         | 
| 7 | 
            +
                module Zmq
         | 
| 8 | 
            +
                  class Server
         | 
| 9 | 
            +
                    include ::Protobuf::Rpc::Zmq::Util
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                    ##
         | 
| 12 | 
            +
                    # Class Methods
         | 
| 13 | 
            +
                    #
         | 
| 14 | 
            +
                    def self.run(opts = {})
         | 
| 15 | 
            +
                      log_debug { "[#{log_signature}] initializing broker" }
         | 
| 16 | 
            +
                      @broker = ::Protobuf::Rpc::Zmq::Broker.new(opts)
         | 
| 17 | 
            +
                      local_worker_threads = opts.fetch(:threads, 5)
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                      worker_options = opts.merge(:port => opts.fetch(:port, 9399) + 1)
         | 
| 20 | 
            +
                      log_debug { "[#{log_signature}] starting server workers" }
         | 
| 21 | 
            +
                      local_worker_threads.times do
         | 
| 22 | 
            +
                        @threads << Thread.new { ::Protobuf::Rpc::Zmq::Worker.new(worker_options).run }
         | 
| 23 | 
            +
                      end
         | 
| 24 | 
            +
                      @running = true
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                      log_debug { "[#{log_signature}] server started" }
         | 
| 27 | 
            +
                      while self.running? do
         | 
| 28 | 
            +
                        @broker.poll
         | 
| 29 | 
            +
                      end
         | 
| 30 | 
            +
                    ensure
         | 
| 31 | 
            +
                      @broker.teardown if @broker
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    def self.running?
         | 
| 35 | 
            +
                      !!@running
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    def self.stop
         | 
| 39 | 
            +
                      @running = false
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                      @threads.each do |t|
         | 
| 42 | 
            +
                        t.join
         | 
| 43 | 
            +
                      end
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                    @threads ||= []
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            module Protobuf
         | 
| 2 | 
            +
              module Rpc
         | 
| 3 | 
            +
                module Zmq
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                  module Util
         | 
| 6 | 
            +
                    include ::Protobuf::Logger::LogMethods
         | 
| 7 | 
            +
                    def self.included(base)
         | 
| 8 | 
            +
                      base.extend(::Protobuf::Rpc::Zmq::Util)
         | 
| 9 | 
            +
                    end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                    def zmq_error_check(return_code)
         | 
| 12 | 
            +
                      raise "Last API call failed with \"#{::ZMQ::Util.error_string}\"#{$/}#{$/}#{caller(1)}" unless return_code >= 0
         | 
| 13 | 
            +
                    end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    def log_signature
         | 
| 16 | 
            +
                      @log_signature ||= "server-#{self.class}-#{object_id}"
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    def resolve_ip(hostname)
         | 
| 20 | 
            +
                      ::Resolv.getaddress(hostname)
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,72 @@ | |
| 1 | 
            +
            require 'protobuf/rpc/server'
         | 
| 2 | 
            +
            require 'protobuf/rpc/servers/zmq/util'
         | 
| 3 | 
            +
            module Protobuf
         | 
| 4 | 
            +
              module Rpc
         | 
| 5 | 
            +
                module Zmq
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  class Worker
         | 
| 8 | 
            +
                    include ::Protobuf::Rpc::Server
         | 
| 9 | 
            +
                    include ::Protobuf::Rpc::Zmq::Util
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                    ##
         | 
| 12 | 
            +
                    # Constructor
         | 
| 13 | 
            +
                    #
         | 
| 14 | 
            +
                    def initialize(opts={})
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                      @options = opts
         | 
| 17 | 
            +
                      host = @options.fetch(:host, "127.0.0.1")
         | 
| 18 | 
            +
                      port = @options.fetch(:port, 9400)
         | 
| 19 | 
            +
                      protocol = @options.fetch(:protocol, "tcp")
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                      @zmq_context = ::ZMQ::Context.new
         | 
| 22 | 
            +
                      @socket = @zmq_context.socket(::ZMQ::REP)
         | 
| 23 | 
            +
                      zmq_error_check(@socket.connect("#{protocol}://#{resolve_ip(host)}:#{port}"))
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                      @poller = ::ZMQ::Poller.new
         | 
| 26 | 
            +
                      @poller.register(@socket, ::ZMQ::POLLIN)
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                    ##
         | 
| 30 | 
            +
                    # Instance Methods
         | 
| 31 | 
            +
                    #
         | 
| 32 | 
            +
                    def handle_request(socket)
         | 
| 33 | 
            +
                      @request_data = ''
         | 
| 34 | 
            +
                      zmq_error_check(socket.recv_string(@request_data))
         | 
| 35 | 
            +
                      log_debug { "[#{log_signature}] handling request" } if(!@request_data.nil?)
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    def initialize_buffers
         | 
| 39 | 
            +
                      @did_respond = false
         | 
| 40 | 
            +
                      @request = ::Protobuf::Socketrpc::Request.new
         | 
| 41 | 
            +
                      @response = ::Protobuf::Socketrpc::Response.new
         | 
| 42 | 
            +
                      @stats = ::Protobuf::Rpc::Stat.new(:SERVER, true)
         | 
| 43 | 
            +
                      log_debug { "[#{log_signature}] Post init" }
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                    def run
         | 
| 47 | 
            +
                      while ::Protobuf::Rpc::Zmq::Server.running? do
         | 
| 48 | 
            +
                        # poll for 1_000 milliseconds then continue looping
         | 
| 49 | 
            +
                        # This lets us see whether we need to die
         | 
| 50 | 
            +
                        @poller.poll(1_000)
         | 
| 51 | 
            +
                        @poller.readables.each do |socket|
         | 
| 52 | 
            +
                          initialize_buffers
         | 
| 53 | 
            +
                          handle_request(socket)
         | 
| 54 | 
            +
                          handle_client unless(@request_data.nil?)
         | 
| 55 | 
            +
                        end
         | 
| 56 | 
            +
                      end
         | 
| 57 | 
            +
                    ensure
         | 
| 58 | 
            +
                      @socket.close
         | 
| 59 | 
            +
                      @zmq_context.terminate
         | 
| 60 | 
            +
                    end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                    def send_data
         | 
| 63 | 
            +
                      response_data = @response.is_a?(Protobuf::Message) ? @response.serialize_to_string : @response.to_s
         | 
| 64 | 
            +
                      @stats.response_size = response_data.size
         | 
| 65 | 
            +
                      zmq_error_check(@socket.send_string(response_data))
         | 
| 66 | 
            +
                      @did_respond = true
         | 
| 67 | 
            +
                    end
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
              end
         | 
| 72 | 
            +
            end
         | 
| @@ -0,0 +1,26 @@ | |
| 1 | 
            +
            module Protobuf
         | 
| 2 | 
            +
              module Rpc
         | 
| 3 | 
            +
                class ZmqRunner
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                  def self.stop
         | 
| 6 | 
            +
                    Protobuf::Rpc::Zmq::Server.stop 
         | 
| 7 | 
            +
                    Protobuf::Logger.info('Shutdown complete')
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def self.run(server)
         | 
| 11 | 
            +
                    Protobuf::Logger.info "ZmqServer Running"
         | 
| 12 | 
            +
                    server_config = case 
         | 
| 13 | 
            +
                                    when server.is_a?(OpenStruct) then 
         | 
| 14 | 
            +
                                      server.marshal_dump
         | 
| 15 | 
            +
                                    when server.respond_to?(:to_hash) then
         | 
| 16 | 
            +
                                      server.to_hash
         | 
| 17 | 
            +
                                    else
         | 
| 18 | 
            +
                                      raise "Cannot parser Zmq Server - server options"
         | 
| 19 | 
            +
                                    end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                    Protobuf::Rpc::Zmq::Server.run(server_config)
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
            end
         | 
    
        data/lib/protobuf/rpc/service.rb
    CHANGED
    
    | @@ -130,7 +130,7 @@ module Protobuf | |
| 130 130 | 
             
                      log_error exc.message
         | 
| 131 131 | 
             
                      raise exc
         | 
| 132 132 | 
             
                    else
         | 
| 133 | 
            -
                      log_error "-------------- [#{log_signature}] %s#%s not rpc method, passing to super" % [self.class.name, m.to_s]
         | 
| 133 | 
            +
                      log_error { "-------------- [#{log_signature}] %s#%s not rpc method, passing to super" % [self.class.name, m.to_s] }
         | 
| 134 134 | 
             
                      super m, params
         | 
| 135 135 | 
             
                    end
         | 
| 136 136 | 
             
                  end
         | 
| @@ -221,17 +221,17 @@ module Protobuf | |
| 221 221 | 
             
                    # Setup the response
         | 
| 222 222 | 
             
                    @response = rpcs[method].response_type.new
         | 
| 223 223 |  | 
| 224 | 
            -
                    log_debug "[#{log_signature}] calling service method %s#%s" % [self.class, method]
         | 
| 224 | 
            +
                    log_debug { "[#{log_signature}] calling service method %s#%s" % [self.class, method] }
         | 
| 225 225 | 
             
                    # Call the aliased rpc method (e.g. :rpc_find for :find)
         | 
| 226 226 | 
             
                    __send__("rpc_#{method}".to_sym)
         | 
| 227 | 
            -
                    log_debug "[#{log_signature}] completed service method %s#%s" % [self.class, method]
         | 
| 227 | 
            +
                    log_debug { "[#{log_signature}] completed service method %s#%s" % [self.class, method] }
         | 
| 228 228 |  | 
| 229 229 | 
             
                    # Pass the populated response back to the server
         | 
| 230 230 | 
             
                    # Note this will only get called if the rpc method didn't explode (by design)
         | 
| 231 231 | 
             
                    if @async_responder
         | 
| 232 | 
            -
                      log_debug "[#{log_signature}] async request, not sending response (yet)"
         | 
| 232 | 
            +
                      log_debug { "[#{log_signature}] async request, not sending response (yet)" }
         | 
| 233 233 | 
             
                    else
         | 
| 234 | 
            -
                      log_debug "[#{log_signature}] trigger server send_response"
         | 
| 234 | 
            +
                      log_debug { "[#{log_signature}] trigger server send_response" }
         | 
| 235 235 | 
             
                      send_response
         | 
| 236 236 | 
             
                    end
         | 
| 237 237 | 
             
                  end
         | 
    
        data/lib/protobuf/version.rb
    CHANGED
    
    
    
        data/protobuf.gemspec
    CHANGED
    
    | @@ -12,19 +12,21 @@ Gem::Specification.new do |s| | |
| 12 12 | 
             
              s.homepage      = %q{https://github.com/localshred/protobuf}
         | 
| 13 13 | 
             
              s.summary       = 'Ruby implementation for Protocol Buffers. Works with other protobuf rpc implementations (e.g. Java, Python, C++).'
         | 
| 14 14 | 
             
              s.description   = s.summary + "\n\nThis gem has diverged from https://github.com/macks/ruby-protobuf. All credit for serialization and rprotoc work most certainly goes to the original authors. All RPC implementation code (client/server/service) was written and is maintained by this author. Attempts to reconcile the original codebase with the current RPC implementation went unsuccessful."
         | 
| 15 | 
            -
             | 
| 15 | 
            +
             | 
| 16 16 | 
             
              s.files         = `git ls-files`.split("\n")
         | 
| 17 17 | 
             
              s.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")
         | 
| 18 18 | 
             
              s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
         | 
| 19 19 | 
             
              s.require_paths = ["lib"]
         | 
| 20 | 
            -
              
         | 
| 21 | 
            -
              s.add_dependency 'eventmachine', '~> 0.12.10'
         | 
| 22 | 
            -
              s.add_dependency 'eventually', '~> 0.1.0'
         | 
| 23 | 
            -
              s.add_dependency 'json_pure', '~> 1.6.4'
         | 
| 24 20 |  | 
| 25 | 
            -
              s. | 
| 26 | 
            -
              s. | 
| 27 | 
            -
              s. | 
| 28 | 
            -
              s. | 
| 29 | 
            -
             | 
| 21 | 
            +
              s.add_dependency 'eventmachine'
         | 
| 22 | 
            +
              s.add_dependency 'eventually'
         | 
| 23 | 
            +
              s.add_dependency 'json_pure'
         | 
| 24 | 
            +
              s.add_dependency 'ffi-rzmq'
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              s.add_development_dependency 'rake'
         | 
| 27 | 
            +
              s.add_development_dependency 'pry'
         | 
| 28 | 
            +
              s.add_development_dependency 'pry-nav'
         | 
| 29 | 
            +
              s.add_development_dependency 'rspec'
         | 
| 30 | 
            +
              s.add_development_dependency 'yard'
         | 
| 31 | 
            +
              s.add_development_dependency 'simplecov'
         | 
| 30 32 | 
             
            end
         | 
    
        data/spec/benchmark/tasks.rb
    CHANGED
    
    | @@ -2,6 +2,13 @@ require 'benchmark' | |
| 2 2 | 
             
            require 'helper/all'
         | 
| 3 3 | 
             
            require 'proto/test_service_impl'
         | 
| 4 4 |  | 
| 5 | 
            +
            # Including a way to turn on debug logger for spec runs
         | 
| 6 | 
            +
            if ENV["DEBUG"]
         | 
| 7 | 
            +
              puts 'debugging'
         | 
| 8 | 
            +
              debug_log = File.expand_path('../debug_bench.log', File.dirname(__FILE__) )
         | 
| 9 | 
            +
              Protobuf::Logger.configure(:file => debug_log, :level => ::Logger::DEBUG)
         | 
| 10 | 
            +
            end
         | 
| 11 | 
            +
             | 
| 5 12 | 
             
            namespace :benchmark do
         | 
| 6 13 | 
             
              include SilentConstants
         | 
| 7 14 |  | 
| @@ -37,7 +44,7 @@ namespace :benchmark do | |
| 37 44 | 
             
                EM.stop if EM.reactor_running?
         | 
| 38 45 |  | 
| 39 46 | 
             
                EventMachine.fiber_run do
         | 
| 40 | 
            -
                  StubServer.new(:server => Protobuf::Rpc:: | 
| 47 | 
            +
                  StubServer.new(:server => Protobuf::Rpc::Socket::Server, :port => 9399) do |server| 
         | 
| 41 48 | 
             
                    client = Spec::Proto::TestService.client(:async => false, :port => 9399)
         | 
| 42 49 |  | 
| 43 50 | 
             
                    benchmark_wrapper(global_bench) do |bench|
         | 
| @@ -54,7 +61,7 @@ namespace :benchmark do | |
| 54 61 | 
             
              def sock_client_sock_server(number_tests, test_length, global_bench = nil)
         | 
| 55 62 | 
             
                EM.stop if EM.reactor_running?
         | 
| 56 63 |  | 
| 57 | 
            -
                StubServer.new(:server => Protobuf::Rpc:: | 
| 64 | 
            +
                StubServer.new(:server => Protobuf::Rpc::Socket::Server, :port => 9399) do |server| 
         | 
| 58 65 | 
             
                  with_constants "Protobuf::ClientType" => "Socket" do
         | 
| 59 66 | 
             
                    client = Spec::Proto::TestService.client(:async => false, :port => 9399)
         | 
| 60 67 |  | 
| @@ -88,6 +95,30 @@ namespace :benchmark do | |
| 88 95 | 
             
                Thread.kill(em_thread) if em_thread
         | 
| 89 96 | 
             
              end
         | 
| 90 97 |  | 
| 98 | 
            +
              def zmq_client_zmq_server(number_tests, test_length, global_bench = nil)
         | 
| 99 | 
            +
                require 'ffi-rzmq'
         | 
| 100 | 
            +
                require 'protobuf/rpc/connectors/zmq'
         | 
| 101 | 
            +
                require 'protobuf/rpc/servers/zmq/server'
         | 
| 102 | 
            +
                StubServer.new(:port => 9399, :server => Protobuf::Rpc::Zmq::Server) do |server| 
         | 
| 103 | 
            +
                  with_constants "Protobuf::ClientType" => "Zmq" do
         | 
| 104 | 
            +
                    client = Spec::Proto::TestService.client(:async => false, :port => 9399)
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                    benchmark_wrapper(global_bench) do |bench|
         | 
| 107 | 
            +
                      bench.report("ZS / ZC") do 
         | 
| 108 | 
            +
                        (1..number_tests.to_i).each { client.find(:name => "Test Name" * test_length.to_i, :active => true) }
         | 
| 109 | 
            +
                      end
         | 
| 110 | 
            +
                    end
         | 
| 111 | 
            +
                  end
         | 
| 112 | 
            +
                  server.stop
         | 
| 113 | 
            +
                end
         | 
| 114 | 
            +
              end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
              desc "benchmark ZMQ client with ZMQ server"
         | 
| 117 | 
            +
              task :zmq_client_zmq_server, [:number, :length] do |t, args|
         | 
| 118 | 
            +
                args.with_defaults(:number => 1000, :length => 100)
         | 
| 119 | 
            +
                zmq_client_zmq_server(args[:number], args[:length])
         | 
| 120 | 
            +
              end
         | 
| 121 | 
            +
             | 
| 91 122 | 
             
              desc "benchmark EventMachine client with EventMachine server"
         | 
| 92 123 | 
             
              task :em_client_em_server, [:number, :length] do |t, args|
         | 
| 93 124 | 
             
                args.with_defaults(:number => 1000, :length => 100)
         | 
| @@ -117,10 +148,11 @@ namespace :benchmark do | |
| 117 148 | 
             
                args.with_defaults(:number => 1000, :length => 100)
         | 
| 118 149 |  | 
| 119 150 | 
             
                Benchmark.bm(10) do |bench|
         | 
| 120 | 
            -
                   | 
| 121 | 
            -
                   | 
| 151 | 
            +
                  # zmq_client_zmq_server(args[:number], args[:length], bench)
         | 
| 152 | 
            +
                  #      em_client_em_server(args[:number], args[:length], bench)
         | 
| 153 | 
            +
                  #      em_client_sock_server(args[:number], args[:length], bench)
         | 
| 122 154 | 
             
                  sock_client_sock_server(args[:number], args[:length], bench)
         | 
| 123 | 
            -
                  sock_client_em_server(args[:number], args[:length], bench)
         | 
| 155 | 
            +
                  #      sock_client_em_server(args[:number], args[:length], bench)
         | 
| 124 156 | 
             
                end
         | 
| 125 157 | 
             
              end
         | 
| 126 158 | 
             
            end
         |