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
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'protobuf/rpc/server'
|
2
|
-
|
3
|
-
module Protobuf
|
4
|
-
module Rpc
|
5
|
-
class EventedServer < EventMachine::Connection
|
6
|
-
include Protobuf::Rpc::Server
|
7
|
-
include Protobuf::Logger::LogMethods
|
8
|
-
|
9
|
-
# Initialize a new read buffer for storing client request info
|
10
|
-
def post_init
|
11
|
-
log_debug '[server] Post init, new read buffer created'
|
12
|
-
@stats = Protobuf::Rpc::Stat.new(:SERVER, true)
|
13
|
-
@stats.client = Socket.unpack_sockaddr_in(get_peername)
|
14
|
-
|
15
|
-
@buffer = Protobuf::Rpc::Buffer.new(:read)
|
16
|
-
@did_respond = false
|
17
|
-
end
|
18
|
-
|
19
|
-
# Receive a chunk of data, potentially flushed to handle_client
|
20
|
-
def receive_data(data)
|
21
|
-
log_debug '[server] receive_data: %s' % data
|
22
|
-
@buffer << data
|
23
|
-
handle_client if @buffer.flushed?
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,146 +0,0 @@
|
|
1
|
-
require 'protobuf/rpc/server'
|
2
|
-
|
3
|
-
module Protobuf
|
4
|
-
module Rpc
|
5
|
-
class SocketServer
|
6
|
-
include Protobuf::Rpc::Server
|
7
|
-
include Protobuf::Logger::LogMethods
|
8
|
-
|
9
|
-
|
10
|
-
def self.cleanup?
|
11
|
-
# every 10 connections run a cleanup routine after closing the response
|
12
|
-
@threads.size > (@thread_threshold - 1) && (@threads.size % @thread_threshold) == 0
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.cleanup_threads
|
16
|
-
log_debug "[#{log_signature}] Thread cleanup - #{@threads.size} - start"
|
17
|
-
|
18
|
-
@threads = @threads.select do |t|
|
19
|
-
if t[:thread].alive?
|
20
|
-
true
|
21
|
-
else
|
22
|
-
t[:thread].join
|
23
|
-
@working.delete(t[:socket])
|
24
|
-
false
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
log_debug "[#{log_signature}] Thread cleanup - #{@threads.size} - complete"
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.log_signature
|
32
|
-
@log_signature ||= "server-#{self}"
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.new_worker(socket)
|
36
|
-
Thread.new(socket) do |sock|
|
37
|
-
Protobuf::Rpc::SocketServer::Worker.new(sock) do |s|
|
38
|
-
s.close
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.run(opts = {})
|
44
|
-
log_debug "[#{log_signature}] Run"
|
45
|
-
host = opts.fetch(:host, "127.0.0.1")
|
46
|
-
port = opts.fetch(:port, 9399)
|
47
|
-
backlog = opts.fetch(:backlog, 100)
|
48
|
-
thread_threshold = opts.fetch(:thread_threshold, 100)
|
49
|
-
auto_collect_timeout = opts.fetch(:auto_collect_timeout, 20)
|
50
|
-
|
51
|
-
@running = true
|
52
|
-
@threads = []
|
53
|
-
@thread_threshold = thread_threshold
|
54
|
-
@server = TCPServer.new(host, port)
|
55
|
-
@server.listen(backlog)
|
56
|
-
@working = []
|
57
|
-
@listen_fds = [@server]
|
58
|
-
|
59
|
-
while running?
|
60
|
-
log_debug "[#{log_signature}] Waiting for connections"
|
61
|
-
|
62
|
-
if ready_cnxns = IO.select(@listen_fds, [], [], auto_collect_timeout)
|
63
|
-
cnxns = ready_cnxns.first
|
64
|
-
cnxns.each do |client|
|
65
|
-
case
|
66
|
-
when !running? then
|
67
|
-
# no-op
|
68
|
-
when client == @server then
|
69
|
-
log_debug "[#{log_signature}] Accepted new connection"
|
70
|
-
client, sockaddr = @server.accept
|
71
|
-
@listen_fds << client
|
72
|
-
else
|
73
|
-
if !@working.include?(client)
|
74
|
-
@working << @listen_fds.delete(client)
|
75
|
-
log_debug "[#{log_signature}] Working"
|
76
|
-
@threads << { :thread => new_worker(client), :socket => client }
|
77
|
-
|
78
|
-
cleanup_threads if cleanup?
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
else
|
83
|
-
# Run a cleanup if select times out while waiting
|
84
|
-
cleanup_threads if @threads.size > 1
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
rescue
|
89
|
-
# Closing the server causes the loop to raise an exception here
|
90
|
-
raise if running?
|
91
|
-
end
|
92
|
-
|
93
|
-
def self.running?
|
94
|
-
@running
|
95
|
-
end
|
96
|
-
|
97
|
-
def self.stop
|
98
|
-
@running = false
|
99
|
-
@server.close if @server
|
100
|
-
end
|
101
|
-
|
102
|
-
class Worker
|
103
|
-
include Protobuf::Rpc::Server
|
104
|
-
include Protobuf::Logger::LogMethods
|
105
|
-
|
106
|
-
def initialize(sock, &complete_cb)
|
107
|
-
@did_response = false
|
108
|
-
@socket = sock
|
109
|
-
@request = Protobuf::Socketrpc::Request.new
|
110
|
-
@response = Protobuf::Socketrpc::Response.new
|
111
|
-
@buffer = Protobuf::Rpc::Buffer.new(:read)
|
112
|
-
@stats = Protobuf::Rpc::Stat.new(:SERVER, true)
|
113
|
-
@complete_cb = complete_cb
|
114
|
-
log_debug "[#{log_signature}] Post init, new read buffer created"
|
115
|
-
|
116
|
-
@stats.client = Socket.unpack_sockaddr_in(@socket.getpeername)
|
117
|
-
@buffer << read_data
|
118
|
-
log_debug "[#{log_signature}] handling request"
|
119
|
-
handle_client if @buffer.flushed?
|
120
|
-
end
|
121
|
-
|
122
|
-
def log_signature
|
123
|
-
@log_signature ||= "server-#{self.class}-#{object_id}"
|
124
|
-
end
|
125
|
-
|
126
|
-
def read_data
|
127
|
-
size_io = StringIO.new
|
128
|
-
|
129
|
-
while((size_reader = @socket.getc) != "-")
|
130
|
-
size_io << size_reader
|
131
|
-
end
|
132
|
-
str_size_io = size_io.string
|
133
|
-
|
134
|
-
"#{str_size_io}-#{@socket.read(str_size_io.to_i)}"
|
135
|
-
end
|
136
|
-
|
137
|
-
def send_data(data)
|
138
|
-
log_debug "[#{log_signature}] sending data : %s" % data
|
139
|
-
@socket.write(data)
|
140
|
-
@socket.flush
|
141
|
-
@complete_cb.call(@socket)
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|