protobuf 1.1.3 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/lib/protobuf/rpc/client.rb
CHANGED
@@ -29,7 +29,7 @@ module Protobuf
|
|
29
29
|
def initialize(opts={})
|
30
30
|
raise "Invalid client configuration. Service must be defined." if opts[:service].nil?
|
31
31
|
@connector = Connector.connector_for_client.new(opts)
|
32
|
-
log_debug "[#{log_signature}] Initialized with options: %s" % opts.inspect
|
32
|
+
log_debug { "[#{log_signature}] Initialized with options: %s" % opts.inspect }
|
33
33
|
end
|
34
34
|
|
35
35
|
def log_signature
|
@@ -109,25 +109,25 @@ module Protobuf
|
|
109
109
|
def method_missing(method, *params)
|
110
110
|
service = options[:service]
|
111
111
|
unless service.rpcs[service].keys.include?(method)
|
112
|
-
log_error "[#{log_signature}] %s#%s not rpc method, passing to super" % [service.name, method.to_s]
|
112
|
+
log_error { "[#{log_signature}] %s#%s not rpc method, passing to super" % [service.name, method.to_s] }
|
113
113
|
super(method, *params)
|
114
114
|
else
|
115
|
-
log_debug "[#{log_signature}] %s#%s" % [service.name, method.to_s]
|
115
|
+
log_debug { "[#{log_signature}] %s#%s" % [service.name, method.to_s] }
|
116
116
|
rpc = service.rpcs[service][method.to_sym]
|
117
117
|
options[:request_type] = rpc.request_type
|
118
|
-
log_debug "[#{log_signature}] Request Type: %s" % options[:request_type].name
|
118
|
+
log_debug { "[#{log_signature}] Request Type: %s" % options[:request_type].name }
|
119
119
|
options[:response_type] = rpc.response_type
|
120
|
-
log_debug "[#{log_signature}] Response Type: %s" % options[:response_type].name
|
120
|
+
log_debug { "[#{log_signature}] Response Type: %s" % options[:response_type].name }
|
121
121
|
options[:method] = method.to_s
|
122
122
|
options[:request] = params[0].is_a?(Hash) ? options[:request_type].new(params[0]) : params[0]
|
123
|
-
log_debug "[#{log_signature}] Request Data: %s" % options[:request].inspect
|
123
|
+
log_debug { "[#{log_signature}] Request Data: %s" % options[:request].inspect }
|
124
124
|
|
125
125
|
# Call client to setup on_success and on_failure event callbacks
|
126
126
|
if block_given?
|
127
|
-
log_debug "[#{log_signature}] client setup callback given, invoking"
|
127
|
+
log_debug { "[#{log_signature}] client setup callback given, invoking" }
|
128
128
|
yield(self)
|
129
129
|
else
|
130
|
-
log_debug "[#{log_signature}] no block given for callbacks"
|
130
|
+
log_debug { "[#{log_signature}] no block given for callbacks" }
|
131
131
|
end
|
132
132
|
|
133
133
|
send_request
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Protobuf
|
2
|
-
module Rpc
|
2
|
+
module Rpc
|
3
3
|
module Connectors
|
4
|
-
module Common
|
5
|
-
|
4
|
+
module Common
|
5
|
+
|
6
6
|
attr_reader :error
|
7
7
|
|
8
8
|
def any_callbacks?
|
@@ -14,30 +14,34 @@ module Protobuf
|
|
14
14
|
def complete
|
15
15
|
@stats.end
|
16
16
|
@stats.log_stats
|
17
|
-
log_debug "[#{log_signature}] Response proceessing complete"
|
17
|
+
log_debug { "[#{log_signature}] Response proceessing complete" }
|
18
18
|
@complete_cb.call(self) unless @complete_cb.nil?
|
19
19
|
rescue
|
20
|
-
log_error "[#{log_signature}] Complete callback error encountered: %s" % $!.message
|
21
|
-
log_error "[#{log_signature}] %s" % $!.backtrace.join("\n")
|
20
|
+
log_error { "[#{log_signature}] Complete callback error encountered: %s" % $!.message }
|
21
|
+
log_error { "[#{log_signature}] %s" % $!.backtrace.join("\n") }
|
22
22
|
raise
|
23
23
|
end
|
24
24
|
|
25
25
|
def data_callback(data)
|
26
|
-
log_debug "[#{log_signature}] Using data_callback"
|
26
|
+
log_debug { "[#{log_signature}] Using data_callback" }
|
27
27
|
@used_data_callback = true
|
28
28
|
@data = data
|
29
29
|
end
|
30
30
|
|
31
|
+
# All failures should be routed through this method
|
32
|
+
#
|
33
|
+
# @param [Symbol] code The code we're using (see ::Protobuf::Socketrpc::ErrorReason)
|
34
|
+
# @param [String] message The error message
|
31
35
|
def fail(code, message)
|
32
36
|
@error = ClientError.new
|
33
37
|
@error.code = code.is_a?(Symbol) ? Protobuf::Socketrpc::ErrorReason.values[code] : code
|
34
38
|
@error.message = message
|
35
|
-
log_debug "[#{log_signature}] Server failed request (invoking on_failure): %s" % @error.inspect
|
36
|
-
|
39
|
+
log_debug { "[#{log_signature}] Server failed request (invoking on_failure): %s" % @error.inspect }
|
40
|
+
|
37
41
|
@failure_cb.call(@error) unless @failure_cb.nil?
|
38
42
|
rescue
|
39
|
-
log_error "[#{log_signature}] Failure callback error encountered: %s" % $!.message
|
40
|
-
log_error "[#{log_signature}] %s" % $!.backtrace.join("\n")
|
43
|
+
log_error { "[#{log_signature}] Failure callback error encountered: %s" % $!.message }
|
44
|
+
log_error { "[#{log_signature}] %s" % $!.backtrace.join("\n") }
|
41
45
|
raise
|
42
46
|
ensure
|
43
47
|
complete
|
@@ -47,10 +51,9 @@ module Protobuf
|
|
47
51
|
@stats = Protobuf::Rpc::Stat.new(:CLIENT, true)
|
48
52
|
@stats.server = [@options[:port], @options[:host]]
|
49
53
|
@stats.service = @options[:service].name
|
50
|
-
@stats.method = @options[:method]
|
51
|
-
self
|
54
|
+
@stats.method = @options[:method].to_s
|
52
55
|
rescue => ex
|
53
|
-
fail(:RPC_ERROR, "Invalid stats configuration. #{ex.message}")
|
56
|
+
fail(:RPC_ERROR, "Invalid stats configuration. #{ex.message}")
|
54
57
|
end
|
55
58
|
|
56
59
|
def log_signature
|
@@ -61,22 +64,21 @@ module Protobuf
|
|
61
64
|
# Close up the connection as we no longer need it
|
62
65
|
close_connection
|
63
66
|
|
64
|
-
log_debug "[#{log_signature}] Parsing response from server (connection closed)"
|
65
|
-
@stats.response_size = @buffer.size
|
67
|
+
log_debug { "[#{log_signature}] Parsing response from server (connection closed)" }
|
66
68
|
|
67
69
|
# Parse out the raw response
|
68
70
|
response_wrapper = Protobuf::Socketrpc::Response.new
|
69
|
-
response_wrapper.parse_from_string(@
|
71
|
+
response_wrapper.parse_from_string(@response_data)
|
70
72
|
|
71
73
|
# Determine success or failure based on parsed data
|
72
74
|
if response_wrapper.has_field?(:error_reason)
|
73
|
-
log_debug "[#{log_signature}] Error response parsed"
|
75
|
+
log_debug { "[#{log_signature}] Error response parsed" }
|
74
76
|
|
75
77
|
# fail the call if we already know the client is failed
|
76
78
|
# (don't try to parse out the response payload)
|
77
79
|
fail(response_wrapper.error_reason, response_wrapper.error)
|
78
80
|
else
|
79
|
-
log_debug "[#{log_signature}] Successful response parsed"
|
81
|
+
log_debug { "[#{log_signature}] Successful response parsed" }
|
80
82
|
|
81
83
|
# Ensure client_response is an instance
|
82
84
|
response_type = @options[:response_type].new
|
@@ -92,52 +94,51 @@ module Protobuf
|
|
92
94
|
end
|
93
95
|
end
|
94
96
|
|
95
|
-
# Setup the read buffer for data coming back
|
96
97
|
def post_init
|
97
|
-
|
98
|
-
@data = nil
|
99
|
-
log_debug "[#{log_signature}] Post init, new read buffer created"
|
100
|
-
@buffer = Protobuf::Rpc::Buffer.new(:read)
|
101
|
-
_send_request unless error?
|
102
|
-
log_debug "[#{log_signature}] Post init, new read buffer created just sent"
|
98
|
+
send_data unless error?
|
103
99
|
rescue
|
104
100
|
fail(:RPC_ERROR, 'Connection error: %s' % $!.message)
|
105
101
|
end
|
106
102
|
|
107
|
-
|
108
|
-
|
109
|
-
request_wrapper = Protobuf::Socketrpc::Request.new
|
110
|
-
request_wrapper.service_name = @options[:service].name
|
111
|
-
request_wrapper.method_name = @options[:method].to_s
|
103
|
+
def rpc_request_data
|
104
|
+
validate_request_type
|
112
105
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
106
|
+
return Protobuf::Socketrpc::Request.new(
|
107
|
+
:service_name => @options[:service].name,
|
108
|
+
:method_name => @options[:method].to_s,
|
109
|
+
:request_proto => @options[:request].serialize_to_string
|
110
|
+
).serialize_to_string
|
111
|
+
rescue
|
112
|
+
fail :INVALID_REQUEST_PROTO, "Could not set request proto: #{$!.message}"
|
113
|
+
end
|
120
114
|
|
121
|
-
|
122
|
-
|
123
|
-
@
|
124
|
-
send_data(request_buffer.write)
|
115
|
+
def setup_connection
|
116
|
+
initialize_stats
|
117
|
+
@request_data = rpc_request_data
|
125
118
|
end
|
126
119
|
|
127
120
|
def succeed(response)
|
128
|
-
log_debug "[#{log_signature}] Server succeeded request (invoking on_success)"
|
121
|
+
log_debug { "[#{log_signature}] Server succeeded request (invoking on_success)" }
|
129
122
|
@success_cb.call(response) unless @success_cb.nil?
|
130
123
|
rescue
|
131
|
-
log_error "[#{log_signature}] Success callback error encountered: %s" % $!.message
|
132
|
-
log_error "[#{log_signature}] %s" % $!.backtrace.join("\n")
|
124
|
+
log_error { "[#{log_signature}] Success callback error encountered: %s" % $!.message }
|
125
|
+
log_error { "[#{log_signature}] %s" % $!.backtrace.join("\n") }
|
133
126
|
fail :RPC_ERROR, 'An exception occurred while calling on_success: %s' % $!.message
|
134
|
-
ensure
|
127
|
+
ensure
|
135
128
|
complete
|
136
129
|
end
|
137
130
|
|
131
|
+
def validate_request_type
|
132
|
+
unless @options[:request].class == @options[:request_type]
|
133
|
+
expected = @options[:request_type].name
|
134
|
+
actual = @options[:request].class.name
|
135
|
+
fail :INVALID_REQUEST_PROTO, 'Expected request type to be type of %s, got %s instead' % [expected, actual]
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
138
139
|
def verify_callbacks
|
139
140
|
if !any_callbacks?
|
140
|
-
log_debug "[#{log_signature}] No callbacks set, using data_callback"
|
141
|
+
log_debug { "[#{log_signature}] No callbacks set, using data_callback" }
|
141
142
|
@success_cb = @failure_cb = self.method(:data_callback)
|
142
143
|
end
|
143
144
|
end
|
@@ -148,7 +149,6 @@ module Protobuf
|
|
148
149
|
fail(:RPC_ERROR, "Invalid client connection configuration. #{opt} must be a defined option.") if @options[opt].nil?
|
149
150
|
end
|
150
151
|
end
|
151
|
-
|
152
152
|
end
|
153
153
|
end
|
154
154
|
end
|
@@ -2,56 +2,82 @@
|
|
2
2
|
module Protobuf
|
3
3
|
module Rpc
|
4
4
|
module Connectors
|
5
|
-
|
5
|
+
|
6
6
|
class EMClient < EM::Connection
|
7
7
|
include Protobuf::Logger::LogMethods
|
8
8
|
include Protobuf::Rpc::Connectors::Common
|
9
|
-
|
9
|
+
|
10
10
|
attr_reader :options, :request, :response
|
11
11
|
attr_reader :error, :error_reason, :error_message
|
12
|
-
|
13
|
-
class << self
|
14
|
-
|
15
|
-
def connect(options={})
|
16
|
-
options = DEFAULT_OPTIONS.merge(options)
|
17
|
-
log_debug "[client-#{self}] Connecting to server: %s" % options.inspect
|
18
|
-
EM.connect(options[:host], options[:port], self, options)
|
19
|
-
end
|
20
12
|
|
21
|
-
|
22
|
-
|
13
|
+
##
|
14
|
+
# Constructor
|
15
|
+
#
|
23
16
|
def initialize(options={}, &failure_cb)
|
24
17
|
@failure_cb = failure_cb
|
25
18
|
@options = DEFAULT_OPTIONS.merge(options)
|
19
|
+
@response_buffer = ::Protobuf::Rpc::Buffer.new(:read)
|
26
20
|
verify_options
|
27
|
-
initialize_stats
|
28
21
|
|
29
|
-
log_debug "[#{log_signature}] Client Initialized: %s" % options.inspect
|
22
|
+
log_debug { "[#{log_signature}] Client Initialized: %s" % options.inspect }
|
30
23
|
rescue
|
31
24
|
fail(:RPC_ERROR, 'Failed to initialize connection: %s' % $!.message)
|
32
25
|
end
|
33
26
|
|
34
|
-
|
35
|
-
|
36
|
-
|
27
|
+
##
|
28
|
+
# Class Methods
|
29
|
+
#
|
30
|
+
def self.connect(options={})
|
31
|
+
options = DEFAULT_OPTIONS.merge(options)
|
32
|
+
log_debug { "[client-#{self}] Connecting to server: %s" % options.inspect }
|
33
|
+
EM.connect(options[:host], options[:port], self, options)
|
37
34
|
end
|
38
|
-
|
39
|
-
#
|
40
|
-
def
|
41
|
-
@failure_cb = failure_cb
|
35
|
+
|
36
|
+
# turn post_init back into a no-op for event machine
|
37
|
+
def post_init
|
42
38
|
end
|
43
|
-
|
39
|
+
|
40
|
+
##
|
41
|
+
# Instance Methods
|
42
|
+
#
|
44
43
|
# Completion callback registration
|
45
44
|
def on_complete(&complete_cb)
|
46
45
|
@complete_cb = complete_cb
|
47
46
|
end
|
48
|
-
|
47
|
+
|
48
|
+
# Failure callback registration
|
49
|
+
def on_failure(&failure_cb)
|
50
|
+
@failure_cb = failure_cb
|
51
|
+
end
|
52
|
+
|
53
|
+
# Success callback registration
|
54
|
+
def on_success(&success_cb)
|
55
|
+
@success_cb = success_cb
|
56
|
+
end
|
57
|
+
|
49
58
|
def receive_data(data)
|
50
|
-
log_debug "[#{log_signature}] receive_data: %s" % data
|
51
|
-
@
|
52
|
-
|
59
|
+
log_debug { "[#{log_signature}] receive_data: %s" % data }
|
60
|
+
@response_buffer << data
|
61
|
+
@response_data = @response_buffer.data
|
62
|
+
parse_response if(!@response_data.nil? && @response_buffer.flushed?)
|
53
63
|
end
|
54
|
-
|
64
|
+
|
65
|
+
def send_data
|
66
|
+
request_buffer = ::Protobuf::Rpc::Buffer.new(:write)
|
67
|
+
request_buffer.set_data(@request_data)
|
68
|
+
log_debug { "[#{log_signature}] sending data: #{request_buffer.inspect}" }
|
69
|
+
super(request_buffer.write)
|
70
|
+
rescue
|
71
|
+
fail(:RPC_ERROR, 'Connection error: %s' % $!.message)
|
72
|
+
end
|
73
|
+
|
74
|
+
# overwriting this method for java because it's broken in eventmachine. See https://github.com/eventmachine/eventmachine/issues/14
|
75
|
+
if RUBY_PLATFORM =~ /java/
|
76
|
+
def error?
|
77
|
+
!!@error
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
55
81
|
end
|
56
82
|
end
|
57
83
|
end
|
@@ -11,12 +11,14 @@ module Protobuf
|
|
11
11
|
f = Fiber.current
|
12
12
|
|
13
13
|
EM.next_tick do
|
14
|
-
log_debug "[#{log_signature}] Scheduling EventMachine client request to be created on next tick"
|
14
|
+
log_debug { "[#{log_signature}] Scheduling EventMachine client request to be created on next tick" }
|
15
15
|
cnxn = EMClient.connect(options, &ensure_cb)
|
16
16
|
cnxn.on_success(&success_cb) if success_cb
|
17
17
|
cnxn.on_failure(&ensure_cb)
|
18
18
|
cnxn.on_complete { resume_fiber(f) } unless async?
|
19
|
-
|
19
|
+
cnxn.setup_connection
|
20
|
+
cnxn.send_data
|
21
|
+
log_debug { "[#{log_signature}] Connection scheduled" }
|
20
22
|
end
|
21
23
|
|
22
24
|
async? ? true : set_timeout_and_validate_fiber
|
@@ -41,10 +43,10 @@ module Protobuf
|
|
41
43
|
|
42
44
|
def ensure_em_running(&blk)
|
43
45
|
if EM.reactor_running?
|
44
|
-
@
|
46
|
+
@using_global_reactor = true
|
45
47
|
yield
|
46
48
|
else
|
47
|
-
@
|
49
|
+
@using_global_reactor = false
|
48
50
|
EM.fiber_run do
|
49
51
|
blk.call
|
50
52
|
EM.stop
|
@@ -56,32 +58,27 @@ module Protobuf
|
|
56
58
|
EM::cancel_timer(@timeout_timer)
|
57
59
|
fib.resume(true)
|
58
60
|
rescue => ex
|
59
|
-
log_error "[#{log_signature}] An exception occurred while waiting for server response:"
|
60
|
-
log_error ex.message
|
61
|
-
log_error ex.backtrace.join("\n")
|
62
|
-
|
63
61
|
message = 'Synchronous client failed: %s' % ex.message
|
64
|
-
|
65
|
-
ensure_cb.call(err)
|
66
|
-
EM.stop if !@global_reactor
|
62
|
+
error_stop_reactor(message)
|
67
63
|
end
|
68
64
|
|
69
65
|
def set_timeout_and_validate_fiber
|
70
66
|
@timeout_timer = EM::add_timer(@options[:timeout]) do
|
71
67
|
message = 'Client timeout of %d seconds expired' % @options[:timeout]
|
72
|
-
|
73
|
-
ensure_cb.call(err)
|
74
|
-
EM.stop if !@global_reactor
|
68
|
+
error_stop_reactor(message)
|
75
69
|
end
|
76
70
|
|
77
71
|
Fiber.yield
|
78
72
|
rescue FiberError
|
79
73
|
message = "Synchronous calls must be in 'EM.fiber_run' block"
|
74
|
+
error_stop_reactor(message)
|
75
|
+
end
|
76
|
+
|
77
|
+
def error_stop_reactor(message)
|
80
78
|
err = Protobuf::Rpc::ClientError.new(Protobuf::Socketrpc::ErrorReason::RPC_ERROR, message)
|
81
79
|
ensure_cb.call(err)
|
82
|
-
EM.stop
|
83
|
-
|
84
|
-
|
80
|
+
EM.stop unless @using_global_reactor
|
81
|
+
end
|
85
82
|
end
|
86
83
|
end
|
87
84
|
end
|
@@ -6,12 +6,12 @@ module Protobuf
|
|
6
6
|
class Socket < Base
|
7
7
|
include Protobuf::Rpc::Connectors::Common
|
8
8
|
include Protobuf::Logger::LogMethods
|
9
|
-
|
9
|
+
|
10
10
|
def send_request
|
11
11
|
check_async
|
12
|
-
|
12
|
+
setup_connection
|
13
13
|
connect_to_rpc_server
|
14
|
-
post_init
|
14
|
+
post_init
|
15
15
|
read_response
|
16
16
|
end
|
17
17
|
|
@@ -19,26 +19,25 @@ module Protobuf
|
|
19
19
|
|
20
20
|
def check_async
|
21
21
|
if async?
|
22
|
-
log_error "[client-#{self.class}] Cannot run in async mode"
|
23
|
-
raise "Cannot use Socket client in async mode"
|
24
|
-
|
25
|
-
log_debug "[client-#{self.class}] Async check passed"
|
26
|
-
end
|
22
|
+
log_error { "[client-#{self.class}] Cannot run in async mode" }
|
23
|
+
raise "Cannot use Socket client in async mode"
|
24
|
+
end
|
27
25
|
end
|
28
26
|
|
29
27
|
def close_connection
|
30
28
|
@socket.close
|
31
|
-
log_debug "[client-#{self.class}] Connector closed"
|
29
|
+
log_debug { "[client-#{self.class}] Connector closed" }
|
32
30
|
end
|
33
31
|
|
34
32
|
def connect_to_rpc_server
|
35
33
|
@socket = TCPSocket.new(options[:host], options[:port])
|
36
|
-
log_debug "[client-#{self.class}] Connection established #{options[:host]}:#{options[:port]}"
|
34
|
+
log_debug { "[client-#{self.class}] Connection established #{options[:host]}:#{options[:port]}" }
|
37
35
|
end
|
38
36
|
|
39
37
|
# Method to determine error state, must be used with Connector api
|
40
38
|
def error?
|
41
|
-
|
39
|
+
return true if(@error)
|
40
|
+
log_debug { "[client-#{self.class}] Error state : #{@socket.closed?}" }
|
42
41
|
@socket.closed?
|
43
42
|
end
|
44
43
|
|
@@ -54,14 +53,22 @@ module Protobuf
|
|
54
53
|
end
|
55
54
|
|
56
55
|
def read_response
|
57
|
-
|
58
|
-
|
56
|
+
log_debug { "[client-#{self.class}] error? is #{error?}" }
|
57
|
+
return if(error?)
|
58
|
+
response_buffer = ::Protobuf::Rpc::Buffer.new(:read)
|
59
|
+
response_buffer << read_data
|
60
|
+
@stats.response_size = response_buffer.size
|
61
|
+
@response_data = response_buffer.data
|
62
|
+
parse_response if response_buffer.flushed?
|
59
63
|
end
|
60
64
|
|
61
|
-
def send_data
|
62
|
-
|
65
|
+
def send_data
|
66
|
+
return if(error?)
|
67
|
+
request_buffer = ::Protobuf::Rpc::Buffer.new(:write)
|
68
|
+
request_buffer.set_data(@request_data)
|
69
|
+
@socket.write(request_buffer.write)
|
63
70
|
@socket.flush
|
64
|
-
log_debug "[client-#{self.class}] write closed"
|
71
|
+
log_debug { "[client-#{self.class}] write closed" }
|
65
72
|
end
|
66
73
|
|
67
74
|
end
|