rbczmq 0.8 → 0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -1
- data/CHANGELOG.rdoc +5 -0
- data/Gemfile.lock +1 -1
- data/README.rdoc +7 -0
- data/ext/rbczmq/context.c +2 -2
- data/ext/rbczmq/frame.c +1 -1
- data/ext/rbczmq/loop.c +1 -1
- data/ext/rbczmq/message.c +1 -1
- data/ext/rbczmq/poller.c +1 -1
- data/ext/rbczmq/pollitem.c +1 -1
- data/ext/rbczmq/rbczmq_ext.c +1 -1
- data/ext/rbczmq/rbczmq_ext.h +9 -9
- data/ext/rbczmq/rbczmq_prelude.h +4 -4
- data/ext/rbczmq/socket.c +11 -11
- data/ext/rbczmq/socket.h +1 -1
- data/ext/rbczmq/timer.c +1 -1
- data/lib/zmq/socket.rb +47 -7
- data/lib/zmq/version.rb +1 -1
- data/test/test_socket.rb +39 -1
- data/test/test_zmq.rb +3 -1
- metadata +9 -10
data/.travis.yml
CHANGED
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
= Changelog
|
2
2
|
|
3
|
+
== 0.9 (August 18, 2012)
|
4
|
+
* Sockets now record and show all endpoints
|
5
|
+
* Support connect_all for SRV managed topologies
|
6
|
+
* Fix Rubinius specific compile errors
|
7
|
+
|
3
8
|
== 0.8 (June 25, 2012)
|
4
9
|
* Remove entries from the frames pointer map when managed frame objects are freed during GC
|
5
10
|
* czmq's addstr and pushstr functions expect a format string, users of the library aren't (presently) expecting that (James Tucker)
|
data/Gemfile.lock
CHANGED
data/README.rdoc
CHANGED
@@ -222,6 +222,13 @@ Running tests
|
|
222
222
|
|
223
223
|
rake test
|
224
224
|
|
225
|
+
OS X notes:
|
226
|
+
|
227
|
+
If you are installing the package on a new mack ensure you have libtool and autoconf isntalled.
|
228
|
+
You can get those with brew packaging system:
|
229
|
+
|
230
|
+
brew insatll libtool autoconf automake
|
231
|
+
|
225
232
|
== TODO
|
226
233
|
|
227
234
|
* ZMQ::Message#save && ZMQ::Message.load
|
data/ext/rbczmq/context.c
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#include
|
1
|
+
#include "rbczmq_ext.h"
|
2
2
|
|
3
3
|
static VALUE intern_zctx_process;
|
4
4
|
|
@@ -301,7 +301,7 @@ static VALUE rb_czmq_ctx_socket(VALUE obj, VALUE type)
|
|
301
301
|
sock->ctx = ctx->ctx;
|
302
302
|
sock->verbose = FALSE;
|
303
303
|
sock->state = ZMQ_SOCKET_PENDING;
|
304
|
-
sock->
|
304
|
+
sock->endpoints = rb_ary_new();
|
305
305
|
sock->thread = rb_thread_current();
|
306
306
|
rb_obj_call_init(socket, 0, NULL);
|
307
307
|
return socket;
|
data/ext/rbczmq/frame.c
CHANGED
data/ext/rbczmq/loop.c
CHANGED
data/ext/rbczmq/message.c
CHANGED
data/ext/rbczmq/poller.c
CHANGED
data/ext/rbczmq/pollitem.c
CHANGED
data/ext/rbczmq/rbczmq_ext.c
CHANGED
data/ext/rbczmq/rbczmq_ext.h
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
#define ZMQ_NOINLINE
|
15
15
|
#endif
|
16
16
|
|
17
|
-
#include
|
17
|
+
#include "rbczmq_prelude.h"
|
18
18
|
|
19
19
|
#define ZmqRaiseSysError() { \
|
20
20
|
printf("Sys error location: %s:%d\n", __FILE__,__LINE__); \
|
@@ -73,14 +73,14 @@ extern VALUE intern_readable;
|
|
73
73
|
extern VALUE intern_writable;
|
74
74
|
extern VALUE intern_error;
|
75
75
|
|
76
|
-
#include
|
77
|
-
#include
|
78
|
-
#include
|
79
|
-
#include
|
80
|
-
#include
|
81
|
-
#include
|
82
|
-
#include
|
83
|
-
#include
|
76
|
+
#include "context.h"
|
77
|
+
#include "socket.h"
|
78
|
+
#include "frame.h"
|
79
|
+
#include "message.h"
|
80
|
+
#include "loop.h"
|
81
|
+
#include "timer.h"
|
82
|
+
#include "poller.h"
|
83
|
+
#include "pollitem.h"
|
84
84
|
|
85
85
|
static inline char *rb_czmq_formatted_current_time()
|
86
86
|
{
|
data/ext/rbczmq/rbczmq_prelude.h
CHANGED
@@ -6,15 +6,15 @@
|
|
6
6
|
#endif
|
7
7
|
|
8
8
|
#ifdef RUBINIUS
|
9
|
-
#include
|
9
|
+
#include "rubinius.h"
|
10
10
|
#else
|
11
11
|
#ifdef JRUBY
|
12
|
-
#include
|
12
|
+
#include "jruby.h"
|
13
13
|
#else
|
14
14
|
#ifdef HAVE_RB_THREAD_BLOCKING_REGION
|
15
|
-
#include
|
15
|
+
#include "ruby19.h"
|
16
16
|
#else
|
17
|
-
#include
|
17
|
+
#include "ruby18.h"
|
18
18
|
#endif
|
19
19
|
#endif
|
20
20
|
#endif
|
data/ext/rbczmq/socket.c
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#include
|
1
|
+
#include "rbczmq_ext.h"
|
2
2
|
|
3
3
|
/*
|
4
4
|
* :nodoc:
|
@@ -40,7 +40,7 @@ void rb_czmq_mark_sock(void *ptr)
|
|
40
40
|
if (sock){
|
41
41
|
if (sock->verbose)
|
42
42
|
zclock_log ("I: %s socket %p, context %p: GC mark", zsocket_type_str(sock->socket), sock, sock->ctx);
|
43
|
-
rb_gc_mark(sock->
|
43
|
+
rb_gc_mark(sock->endpoints);
|
44
44
|
rb_gc_mark(sock->thread);
|
45
45
|
}
|
46
46
|
}
|
@@ -96,24 +96,24 @@ static VALUE rb_czmq_socket_close(VALUE obj)
|
|
96
96
|
|
97
97
|
/*
|
98
98
|
* call-seq:
|
99
|
-
* sock.
|
99
|
+
* sock.endpoints => Array of Strings
|
100
100
|
*
|
101
|
-
* Returns the
|
101
|
+
* Returns the endpoints this socket is currently connected to, if any.
|
102
102
|
*
|
103
103
|
* === Examples
|
104
104
|
* ctx = ZMQ::Context.new
|
105
105
|
* sock = ctx.socket(:PUSH)
|
106
|
-
* sock.
|
106
|
+
* sock.endpoints => []
|
107
107
|
* sock.bind("inproc://test")
|
108
|
-
* sock.
|
108
|
+
* sock.endpoints => ["inproc://test"]
|
109
109
|
*
|
110
110
|
*/
|
111
111
|
|
112
|
-
static VALUE
|
112
|
+
static VALUE rb_czmq_socket_endpoints(VALUE obj)
|
113
113
|
{
|
114
114
|
zmq_sock_wrapper *sock = NULL;
|
115
115
|
GetZmqSocket(obj);
|
116
|
-
return sock->
|
116
|
+
return sock->endpoints;
|
117
117
|
}
|
118
118
|
|
119
119
|
/*
|
@@ -221,7 +221,7 @@ static VALUE rb_czmq_socket_bind(VALUE obj, VALUE endpoint)
|
|
221
221
|
if (sock->verbose)
|
222
222
|
zclock_log ("I: %s socket %p: bound \"%s\"", zsocket_type_str(sock->socket), obj, StringValueCStr(endpoint));
|
223
223
|
sock->state = ZMQ_SOCKET_BOUND;
|
224
|
-
sock->
|
224
|
+
rb_ary_push(sock->endpoints, rb_str_new4(endpoint));
|
225
225
|
return INT2NUM(rc);
|
226
226
|
}
|
227
227
|
|
@@ -255,7 +255,7 @@ static VALUE rb_czmq_socket_connect(VALUE obj, VALUE endpoint)
|
|
255
255
|
if (sock->verbose)
|
256
256
|
zclock_log ("I: %s socket %p: connected \"%s\"", zsocket_type_str(sock->socket), obj, StringValueCStr(endpoint));
|
257
257
|
sock->state = ZMQ_SOCKET_CONNECTED;
|
258
|
-
sock->
|
258
|
+
rb_ary_push(sock->endpoints, rb_str_new4(endpoint));
|
259
259
|
return Qtrue;
|
260
260
|
}
|
261
261
|
|
@@ -1503,7 +1503,7 @@ void _init_rb_czmq_socket()
|
|
1503
1503
|
rb_define_const(rb_cZmqSocket, "CONNECTED", INT2NUM(ZMQ_SOCKET_CONNECTED));
|
1504
1504
|
|
1505
1505
|
rb_define_method(rb_cZmqSocket, "close", rb_czmq_socket_close, 0);
|
1506
|
-
rb_define_method(rb_cZmqSocket, "
|
1506
|
+
rb_define_method(rb_cZmqSocket, "endpoints", rb_czmq_socket_endpoints, 0);
|
1507
1507
|
rb_define_method(rb_cZmqSocket, "state", rb_czmq_socket_state, 0);
|
1508
1508
|
rb_define_method(rb_cZmqSocket, "real_bind", rb_czmq_socket_bind, 1);
|
1509
1509
|
rb_define_method(rb_cZmqSocket, "real_connect", rb_czmq_socket_connect, 1);
|
data/ext/rbczmq/socket.h
CHANGED
data/ext/rbczmq/timer.c
CHANGED
data/lib/zmq/socket.rb
CHANGED
@@ -24,6 +24,18 @@ class ZMQ::Socket
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
+
|
28
|
+
# Returns the endpoint this socket is currently connected to, if any.
|
29
|
+
#
|
30
|
+
# ctx = ZMQ::Context.new
|
31
|
+
# sock = ctx.socket(:PUSH)
|
32
|
+
# sock.endpoint => nil
|
33
|
+
# sock.bind("inproc://test")
|
34
|
+
# sock.endpoint => "inproc://test"
|
35
|
+
def endpoint
|
36
|
+
endpoints.first
|
37
|
+
end
|
38
|
+
|
27
39
|
# Determines if there are one or more messages to read from this socket. Should be used in conjunction with the
|
28
40
|
# ZMQ_FD socket option for edge-triggered notifications.
|
29
41
|
#
|
@@ -59,9 +71,9 @@ class ZMQ::Socket
|
|
59
71
|
def to_s
|
60
72
|
case state
|
61
73
|
when BOUND
|
62
|
-
"#{type_str} socket bound to #{
|
74
|
+
"#{type_str} socket bound to #{endpoints.join(', ')}"
|
63
75
|
when CONNECTED
|
64
|
-
"#{type_str} socket connected to #{
|
76
|
+
"#{type_str} socket connected to #{endpoints.join(', ')}"
|
65
77
|
else
|
66
78
|
"#{type_str} socket"
|
67
79
|
end
|
@@ -101,15 +113,35 @@ class ZMQ::Socket
|
|
101
113
|
real_connect(uri)
|
102
114
|
end
|
103
115
|
|
116
|
+
# Connects to all endpoints that are returned from a SRV record lookup.
|
117
|
+
#
|
118
|
+
# socket = ctx.socket(:PUB)
|
119
|
+
#
|
120
|
+
# socket.connect "collector.domain.com" # resolves 10.0.0.2:9000 10.0.0.3:9000
|
121
|
+
#
|
122
|
+
def connect_all(uri)
|
123
|
+
if uri =~ PROTO_REXP
|
124
|
+
real_connect(uri)
|
125
|
+
return
|
126
|
+
end
|
127
|
+
|
128
|
+
addresses = resolve_all(uri)
|
129
|
+
if addresses.empty?
|
130
|
+
real_connect(uri)
|
131
|
+
else
|
132
|
+
addresses.each do |address|
|
133
|
+
host = Resolv.getaddress(address.target.to_s)
|
134
|
+
real_connect("tcp://#{host}:#{address.port}")
|
135
|
+
end
|
136
|
+
end
|
137
|
+
self
|
138
|
+
end
|
139
|
+
|
104
140
|
private
|
105
141
|
# Attempt to resolve DNS SRV records ( http://en.wikipedia.org/wiki/SRV_record ). Respects priority and weight
|
106
142
|
# to provide a combination of load balancing and backup.
|
107
143
|
def resolve(uri)
|
108
|
-
|
109
|
-
service = parts.shift
|
110
|
-
domain = parts.join(".")
|
111
|
-
# ZeroMQ does not yet support udp, but may look into possibly supporting [e]pgm here
|
112
|
-
resources = ZMQ.resolver.getresources("_#{service}._tcp.#{domain}", Resolv::DNS::Resource::IN::SRV)
|
144
|
+
resources = resolve_all(uri)
|
113
145
|
# lowest-numbered priority value is preferred
|
114
146
|
resources.sort!{|a,b| a.priority <=> b.priority }
|
115
147
|
res = resources.first
|
@@ -120,10 +152,18 @@ class ZMQ::Socket
|
|
120
152
|
res = priority_peers.sort{|a,b| a.weight <=> b.weight }.last
|
121
153
|
end
|
122
154
|
return uri unless res
|
155
|
+
# ZeroMQ does not yet support udp, but may look into possibly supporting [e]pgm here
|
123
156
|
"tcp://#{Resolv.getaddress(res.target.to_s)}:#{res.port}"
|
124
157
|
rescue
|
125
158
|
uri
|
126
159
|
end
|
160
|
+
|
161
|
+
def resolve_all(uri)
|
162
|
+
parts = uri.split('.')
|
163
|
+
service = parts.shift
|
164
|
+
domain = parts.join(".")
|
165
|
+
ZMQ.resolver.getresources("_#{service}._tcp.#{domain}", Resolv::DNS::Resource::IN::SRV)
|
166
|
+
end
|
127
167
|
end
|
128
168
|
|
129
169
|
module ZMQ::DownstreamSocket
|
data/lib/zmq/version.rb
CHANGED
data/test/test_socket.rb
CHANGED
@@ -131,6 +131,21 @@ class TestZmqSocket < ZmqTestCase
|
|
131
131
|
ctx.destroy
|
132
132
|
end
|
133
133
|
|
134
|
+
def test_connect_all
|
135
|
+
ctx = ZMQ::Context.new
|
136
|
+
rep = ctx.socket(:PAIR)
|
137
|
+
port = rep.bind("inproc://test.socket-connect")
|
138
|
+
req = ctx.socket(:PAIR)
|
139
|
+
assert(req.state & ZMQ::Socket::PENDING)
|
140
|
+
req.connect_all("inproc://test.socket-connect")
|
141
|
+
assert req.fd != -1
|
142
|
+
assert(req.state & ZMQ::Socket::CONNECTED)
|
143
|
+
|
144
|
+
# TODO - test SRV lookups - insufficient infrastructure for resolver tests
|
145
|
+
ensure
|
146
|
+
ctx.destroy
|
147
|
+
end
|
148
|
+
|
134
149
|
def test_bind_connect_errors
|
135
150
|
ctx = ZMQ::Context.new
|
136
151
|
req = ctx.socket(:REQ)
|
@@ -156,6 +171,12 @@ class TestZmqSocket < ZmqTestCase
|
|
156
171
|
assert_equal "PAIR socket", sock.to_s
|
157
172
|
assert_equal "REP socket bound to tcp://127.0.0.1:*", rep.to_s
|
158
173
|
assert_equal "REQ socket connected to tcp://127.0.0.1:#{port}", req.to_s
|
174
|
+
|
175
|
+
|
176
|
+
port2 = rep.bind("tcp://127.0.0.1:*")
|
177
|
+
req.connect("tcp://127.0.0.1:#{port2}")
|
178
|
+
assert_equal "REP socket bound to tcp://127.0.0.1:*, tcp://127.0.0.1:*", rep.to_s
|
179
|
+
assert_equal "REQ socket connected to tcp://127.0.0.1:#{port}, tcp://127.0.0.1:#{port2}", req.to_s
|
159
180
|
ensure
|
160
181
|
ctx.destroy
|
161
182
|
end
|
@@ -172,6 +193,23 @@ class TestZmqSocket < ZmqTestCase
|
|
172
193
|
ctx.destroy
|
173
194
|
end
|
174
195
|
|
196
|
+
def test_endpoints
|
197
|
+
ctx = ZMQ::Context.new
|
198
|
+
rep = ctx.socket(:REP)
|
199
|
+
port = rep.bind("tcp://127.0.0.1:*")
|
200
|
+
req = ctx.socket(:REQ)
|
201
|
+
req.connect("tcp://127.0.0.1:#{port}")
|
202
|
+
assert_equal ["tcp://127.0.0.1:*"], rep.endpoints
|
203
|
+
assert_equal ["tcp://127.0.0.1:#{port}"], req.endpoints
|
204
|
+
|
205
|
+
port2 = rep.bind("tcp://127.0.0.1:*")
|
206
|
+
req.connect("tcp://127.0.0.1:#{port2}")
|
207
|
+
assert_equal ["tcp://127.0.0.1:*", "tcp://127.0.0.1:*"], rep.endpoints
|
208
|
+
assert_equal ["tcp://127.0.0.1:#{port}", "tcp://127.0.0.1:#{port2}"], req.endpoints
|
209
|
+
ensure
|
210
|
+
ctx.destroy
|
211
|
+
end
|
212
|
+
|
175
213
|
def test_close
|
176
214
|
ctx = ZMQ::Context.new
|
177
215
|
sock = ctx.socket(:REP)
|
@@ -451,4 +489,4 @@ class TestZmqSocket < ZmqTestCase
|
|
451
489
|
ensure
|
452
490
|
ctx.destroy
|
453
491
|
end
|
454
|
-
end
|
492
|
+
end
|
data/test/test_zmq.rb
CHANGED
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbczmq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: "0.
|
8
|
+
- 9
|
9
|
+
version: "0.9"
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- "Lourens Naud\xC3\xA9"
|
@@ -15,8 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
19
|
-
default_executable:
|
18
|
+
date: 2012-08-19 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: rake-compiler
|
@@ -26,7 +25,7 @@ dependencies:
|
|
26
25
|
requirements:
|
27
26
|
- - ~>
|
28
27
|
- !ruby/object:Gem::Version
|
29
|
-
hash:
|
28
|
+
hash: 63
|
30
29
|
segments:
|
31
30
|
- 0
|
32
31
|
- 8
|
@@ -146,7 +145,6 @@ files:
|
|
146
145
|
- test/test_threading.rb
|
147
146
|
- test/test_timer.rb
|
148
147
|
- test/test_zmq.rb
|
149
|
-
has_rdoc: true
|
150
148
|
homepage: http://github.com/methodmissing/rbczmq
|
151
149
|
licenses: []
|
152
150
|
|
@@ -160,7 +158,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
160
158
|
requirements:
|
161
159
|
- - ">="
|
162
160
|
- !ruby/object:Gem::Version
|
163
|
-
hash:
|
161
|
+
hash: 3
|
164
162
|
segments:
|
165
163
|
- 0
|
166
164
|
version: "0"
|
@@ -169,14 +167,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
167
|
requirements:
|
170
168
|
- - ">="
|
171
169
|
- !ruby/object:Gem::Version
|
172
|
-
hash:
|
170
|
+
hash: 3
|
173
171
|
segments:
|
174
172
|
- 0
|
175
173
|
version: "0"
|
176
174
|
requirements: []
|
177
175
|
|
178
176
|
rubyforge_project:
|
179
|
-
rubygems_version: 1.
|
177
|
+
rubygems_version: 1.8.15
|
180
178
|
signing_key:
|
181
179
|
specification_version: 3
|
182
180
|
summary: "Ruby extension for CZMQ - High-level C Binding for \xC3\x98MQ (http://czmq.zeromq.org)"
|
@@ -207,3 +205,4 @@ test_files:
|
|
207
205
|
- test/test_threading.rb
|
208
206
|
- test/test_timer.rb
|
209
207
|
- test/test_zmq.rb
|
208
|
+
has_rdoc: true
|