chuckremes / ffi-rzmq Goto Github PK
View Code? Open in Web Editor NEWFFI bindings for ZeroMQ so the library can be used under JRuby and other FFI-compliant ruby runtimes
FFI bindings for ZeroMQ so the library can be used under JRuby and other FFI-compliant ruby runtimes
When more than one socket is registered on a ZMQ::Poller
and one socket is deleted from the Poller
, the return value is incorrectly false
.
This is used in ZMQMachine [1]
require 'ffi-rzmq'
context = ZMQ::Context.new
socket1 = con.socket ZMQ::REP
socket2 = con.socket ZMQ::REP
poller = ZMQ::Poller.new
poller.register_readable socket1
poller.register_readable socket2
p poller.delete socket2
The reason this occurs is because one of the success conditions is that the socket was deleted from the @sockets
array. [2]
But in the common case, the #deregister
method actually calls back into #delete
which then deletes the socket from the array. [3]
I am not sure of the best way to resolve this, but it would make sense to only attempt to delete the socket once instead of the 3 times it is occurring now.
[1] https://github.com/chuckremes/zmqmachine/blob/e382367c64bc37c7b82df9b0c440d6b1ddf80d11/lib/zm/reactor.rb#L553
[2] https://github.com/chuckremes/ffi-rzmq/blob/f8e851280e518504cd5c3b7e4bcae9ac8f32d038/lib/ffi-rzmq/poll.rb#L147-148
[3]
Line 107 in f8e8512
I can't get zmq to work. I'm following examples found in another git repository to show me the basics. The sources are:
Source files:
https://github.com/imatix/zguide/blob/master/examples/Ruby/hwclient.rb
https://github.com/imatix/zguide/blob/master/examples/Ruby/hwserver.rb
It's just a basic "Hello world" app.
When I run the apps I get the following output from the server
$ ruby hwserver.rb
Starting Hello World server...
Received request. Data: 0
Received request. Data: 0
Received request. Data: 0
Received request. Data: 0
Received request. Data: 0
Received request. Data: 0
Received request. Data: 0
Received request. Data: 0
Received request. Data: 0
Received request. Data: 0
And the following output from the client:
$ ruby hwclient.rb
Connecting to hello world server...
Sending request 0...
Received reply 0: [0]
Sending request 1...
Received reply 1: [0]
Sending request 2...
Received reply 2: [0]
Sending request 3...
Received reply 3: [0]
Sending request 4...
Received reply 4: [0]
Sending request 5...
Received reply 5: [0]
Sending request 6...
Received reply 6: [0]
Sending request 7...
Received reply 7: [0]
Sending request 8...
Received reply 8: [0]
Sending request 9...
Received reply 9: [0]
Dependencies:
$ dpkg --list | grep zmq
ii libzmq-dev 2.1.9-1 ZeroMQ lightweight messaging kernel (development libraries and header files)
ii libzmq1 2.1.9-1 ZeroMQ lightweight messaging kernel (shared library)
$ gem list | grep zmq
celluloid-zmq (0.10.0)
ffi-rzmq (0.9.3)
I'm running Linux Mint Lisa 12 64 bit with ruby-1.9.3-p125.
Can you please tell me what I'm doing wrong?
The gem searches for libzmq.so in various places, however in Ubuntu natty(-backports), there only exist files named /usr/lib64/libzmq.so.1 and /usr/lib64/libzmq.so.1.0.0. I had to manually symlink them to libzmq.so for the gem to work.
Running ldconfig didn't help.
I guess that might be because there are two versions of libzmq in natty - libzmq0 is in normal natty and libzmq1 is in natty backports.
Don't know of a good way to fix it, and I'm not sure which version of libzmq the gem is actually "linked" (?) against.
They should send the socket as the first argument
rspec spec/device_spec.rb -f d
ZMQ::Device
should create a streamer device without error given valid optsAssertion failed: uri_ != NULL (socket_base.cpp:157)
Abort trap
receiving strings with version 2 is broken. recv is returning a bool and recv_string is passing it to resultcode_ok? which expects an integer.
Unfortunately, as per the 3.2.1 changelog, ffi-rzmq isn't compatible anymore:
This, of course, results in an error during runtime: in `attach_function': Function 'zmq_ctx_set_monitor' not found in /usr/local/lib/libzmq.so
I didn't do a diff, but it looks to me like the gem was built from d69fbfc rather than 775bdd5 as claimed by the tag. Practically this means:
Socket#unbind
and Socket#disconnect
are broken in 1.0.0 (not in agreement with changelog)Any chance of releasing a 1.0.1? Thanks.
BTW I've checked my environment - I verified this claim by downloading the .gem
from rubygems and untaring manually.
(running on OSX)
device_spec.rb doesn't exit cleanly - I'm assuming because the termination of context for sockets of device doesn't happen properly but not sure exactly how. trying to figure it out.
This might be an issue with the ZMQ library itself, but I wanted to post it here first.
Running the following code produces a "Bad file descriptor" error on my linux machine running ZMQ version 3.2.3. It also happens on OSX running ZMQ version 3.2.2. It appears to be caused by creating/destroying many contexts and sockets in rapid succession in different threads.
Using a single context for all the requests removes the error. Creating/destroying the contexts and sockets synchronously removes the error as well.
require 'ffi-rzmq'
server = Thread.new do
zmq_context = ZMQ::Context.new
socket = zmq_context.socket(ZMQ::REP)
rc = socket.bind("tcp://127.0.0.1:55020")
poller = ZMQ::Poller.new
poller.register_readable(socket)
begin
while poller.poll == 1
socket.recv_string(message = "")
print "server rcvd: #{message}\n"
socket.send_string(message)
end
ensure
socket.close
zmq_context.terminate
end
end
100.times do |x|
100.times.map do |y|
Thread.new do
zmq_context = ZMQ::Context.new
socket = zmq_context.socket(ZMQ::REQ)
rc = socket.connect("tcp://127.0.0.1:55020")
socket.send_string("#{x}, #{y}")
socket.recv_string(reply = "")
socket.close
zmq_context.terminate
end
end.each(&:join)
end
server.kill
getting runtime error:
.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/ffi-rzmq-0.9.6/lib/ffi-rzmq/libzmq.rb:273:in `module:ZMQ': The libzmq version 2.0.7 is incompatible with ffi-rzmq. (LoadError)
using rbenv with 1.9.3-p194 and gems :
$ gem list
*** LOCAL GEMS ***
addressable (2.3.2)
bigdecimal (1.1.0)
builder (3.0.0)
celluloid (0.12.1.pre)
celluloid-io (0.12.1)
celluloid-zmq (0.12.1)
certified (0.1.1)
cucumber (0.10.0)
dcell (0.11.0, 0.10.0)
diff-lcs (1.1.2)
dynect_rest (0.4.3)
expectations (2.0.0)
facter (1.6.13)
ffi (1.1.5)
ffi-rzmq (0.9.6)
gherkin (2.3.3)
hiredis (0.4.5)
http (0.3.0)
http_parser.rb (0.5.3)
io-console (0.3)
json (1.5.4, 1.4.6)
mime-types (1.19)
minitest (2.5.1)
mocha (0.9.11)
moneta (0.6.0)
netrc (0.7.7)
nio4r (0.4.0)
parallel (0.5.18)
rack (1.4.1)
rake (0.9.2.2, 0.8.7)
rdoc (3.9.4)
redis (3.0.1)
redis-namespace (1.2.1)
reel (0.0.2)
rest-client (1.6.7)
rspec (2.4.0)
rspec-core (2.4.0)
rspec-expectations (2.4.0)
rspec-mocks (2.4.0)
term-ansicolor (1.0.5)
timers (1.0.1)
websocket_parser (0.1.0)
tried standard gems as well as rebuilding all celluloid celluloid-io celluloid-zmq dcell ffi ffi-rzmq with same result.
running Ubuntu 10.04.4 LTS on x86_64
i tried with the standard ubuntu packages and without :
$ dpkg -l | egrep -i "zmq|zeromq|0mq"
rc libzmq0 2.0.10-1build1 The ZeroMQ messaging library
rc libzmq1 2.2.0-1chl1~lucid1 ZeroMQ lightweight messaging kernel (shared
Sustrik Mentioned this in IRC, thought I'd put it here so it's not forgotten. I'm not sure if we support this as is yet.
in 2.1, zmq_term() should not invalidate the socekts
what it does
it causes the socket to return ETERM on any subsequent call
and wait for the user to close the socket
so you should not see EBADF in such case
if you do, it's a bug
Code:
sub.close
poller.deregister_readable(sub)
Exception:
NoMethodError: undefined method `address' for nil:NilClass
from /ruby/1.9.1/bundler/gems/ffi-rzmq-7bed37cd35a2/lib/ffi-rzmq/poll.rb:146:in `block in delete'
from /ruby/1.9.1/bundler/gems/ffi-rzmq-7bed37cd35a2/lib/ffi-rzmq/poll.rb:146:in `delete_if'
from /ruby/1.9.1/bundler/gems/ffi-rzmq-7bed37cd35a2/lib/ffi-rzmq/poll.rb:146:in `delete'
from /ruby/1.9.1/bundler/gems/ffi-rzmq-7bed37cd35a2/lib/ffi-rzmq/poll.rb:106:in `deregister'
from /ruby/1.9.1/bundler/gems/ffi-rzmq-7bed37cd35a2/lib/ffi-rzmq/poll.rb:128:in `deregister_readable'
Note: deregister before closing works fine.
Hi,
Any change we can get the gem updated? Issue #32 was quite frustrating
I get this guy:
/opt/local/lib/ruby/gems/1.8/gems/ffi-rzmq-0.5.0/lib/ffi-rzmq/message.rb:83: [BUG] unexpected local variable
ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin10]
Abort trap
Trying to write a connection adapter for Mongrel2, like so: http://gist.github.com/476572
And fails when I send a message like this: @resp.send_string("some message", 0)
So, is it 'cause I'm forcing it to use Ruby 1.8.7? Should I be using something more recent?
Thanks.
On CentOS 6.3 as well as Ubuntu 12.10, the default packages creates a libzmq.so.1.
On CentOS, I can easily create a symlink, but on Ubuntu, the location is not in the default array, i.e: /usr/lib/x86_64-linux-gnu.
I can of course just add to the array, and, also append a .1 to the map that searches for the file. But it's not as elegant as I'd like it to be (read: not really something I'd want to do a pull request with).
Any ideas?
I noticed that when calling ZMQ::Socket#send_string
with libzmq-2.0.6 does not actually send any data. I wrote up a small client to connect to a ZeroMQ server and send a string, but no actual packets appeared when watching the connection in WireShark. However, I did see the TCP/ZMQ handshake occurr.
I get an odd error centering around line 12 of ffi-rzmq.rb where it loads the gem version or some such.
It appears this .rb line expects a version.txt file to be at the root dir of the gem install but it is not included in the installation.
Cheers, and good work on the gem.
Hi,
Trying to run some zmq code on an Ubuntu Jaunty server running on Amazon EC2. I've got zeromq-2.0.10 installed along with ruby 1.9.2p0. After a while, 2-3 minutes I get
/home/daniel/.rvm/gems/ruby-1.9.2-p0@apache_tailer/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq/poll_items.rb:26:in +': Memory access offset=0 size=1 is out of bounds (IndexError) from /home/daniel/.rvm/gems/ruby-1.9.2-p0@apache_tailer/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq/poll_items.rb:26:in
get'
from /home/daniel/.rvm/gems/ruby-1.9.2-p0@apache_tailer/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq/poll.rb:65:in register' from /home/daniel/.rvm/gems/ruby-1.9.2-p0@apache_tailer/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq/poll.rb:113:in
register_writable'
from /home/daniel/.rvm/gems/ruby-1.9.2-p0@apache_tailer/gems/zmqmachine-0.3.2/lib/zm/reactor.rb:281:in register_writable' from /home/daniel/.rvm/gems/ruby-1.9.2-p0@apache_tailer/gems/dripdrop-0.5.0/lib/dripdrop/handlers/zeromq.rb:84:in
send_message'
from /home/daniel/.rvm/gems/ruby-1.9.2-p0@apache_tailer/gems/dripdrop-0.5.0/lib/dripdrop/handlers/zeromq.rb:153:in send_message' from tail_apache_zmq.rb:19:in
block in receive_data'
from tail_apache_zmq.rb:17:in each' from tail_apache_zmq.rb:17:in
receive_data'
from /home/daniel/.rvm/gems/ruby-1.9.2-p0@apache_tailer/gems/eventmachine-tail-0.5.20101204110840/lib/em/filetail.rb:256:in read' from /home/daniel/.rvm/gems/ruby-1.9.2-p0@apache_tailer/gems/eventmachine-tail-0.5.20101204110840/lib/em/filetail.rb:238:in
block in schedule_next_read'
from /home/daniel/.rvm/gems/ruby-1.9.2-p0@apache_tailer/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in call' from /home/daniel/.rvm/gems/ruby-1.9.2-p0@apache_tailer/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in
run_machine'
from /home/daniel/.rvm/gems/ruby-1.9.2-p0@apache_tailer/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in run' from /home/daniel/.rvm/gems/ruby-1.9.2-p0@apache_tailer/gems/dripdrop-0.5.0/lib/dripdrop/node.rb:33:in
block in start'
Haven't been able to find any information on how to fix this.
Regards,
Running the poll spec test suite results in a failure:
rspec spec/poll_spec.rb
.....F..
Failures:
1) ZMQ::Context#register should access the raw 0mq socket
Failure/Error: poller.register(socket)
ArgumentError:
value is not a pointer
# ./lib/ffi-rzmq/poll.rb:77:in `[]='
# ./lib/ffi-rzmq/poll.rb:77:in `register'
# ./spec/poll_spec.rb:48:in `block (3 levels) in <module:ZMQ>'
Finished in 0.00335 seconds
8 examples, 1 failure
Anyone else having this issue?
the currently released gem version is not compatible with with zmq 3.2.2.
master (0.9.7) works fine.
could you please release a new gem?
monitor sockets send zmq_event_t structs which are an event id and a union of event data. Would be awesome if there was an Event class that could handle them!
I'm guessing this is not related to the gem itself, but I thot I put a note here as well in case you happen to have any ideas. Or happen to know of anyone successfuly using it under jruby on windows.
Posted information here:
http://jira.codehaus.org/browse/JRUBY-6095
I've tried binding using the format in the ZMQ documentation about PGM multicast (http://api.zeromq.org/3-2:zmq-pgm) with no luck.
Is this something that is not yet supported, or is there a different method used other than bind for this type of pub/sub?
The finalizer should call zmq_term to clean up abandoned/closed contexts.
It would be very helpful to trap the SIGINT signal, so one can quickly control-C out of Ruby when there are ZMQ Sockets open.
Hello, thank you for gem.
I try to use it my os x computer under Ruby 2.0 and Jruby 1.7.4
It's installed fine, but then I try require it i've got message:
jruby-1.7.4 :001 > require 'ffi-rzmq'
Unable to load this gem. The libzmq library (or DLL) could not be found.
If this is a Windows platform, make sure libzmq.dll is on the PATH.
If the DLL was built with mingw, make sure the other two dependent DLLs,
libgcc_s_sjlj-1.dll and libstdc++6.dll, are also on the PATH.
For non-Windows platforms, make sure libzmq is located in this search path:
["/Users/leonko/.rvm/gems/jruby-1.7.4/gems/ffi-rzmq-1.0.1/lib/ffi-rzmq/../../ext/libzmq.dylib", "/usr/local/lib/libzmq.dylib", "/opt/local/lib/libzmq.dylib", "/usr/local/homebrew/lib/libzmq.dylib", "/usr/lib64/libzmq.dylib", "/Users/leonko/.rvm/gems/jruby-1.7.4/bin", "/Users/leonko/.rvm/rubies/jruby-1.7.4/bin", "/Users/leonko/.rvm/bin", "/usr/local/bin", "/usr/bin", "/bin", "/usr/sbin", "/sbin", "/opt/X11/bin", "/usr/local/smlnj-110.75/bin"]
LoadError: The libzmq library (or DLL) could not be loaded
from /Users/leonko/.rvm/gems/jruby-1.7.4/gems/ffi-rzmq-1.0.1/lib/ffi-rzmq/libzmq.rb:37:in LibZMQ' from /Users/leonko/.rvm/gems/jruby-1.7.4/gems/ffi-rzmq-1.0.1/lib/ffi-rzmq/libzmq.rb:6:in
ZMQ'
from /Users/leonko/.rvm/gems/jruby-1.7.4/gems/ffi-rzmq-1.0.1/lib/ffi-rzmq/libzmq.rb:1:in (root)' from org/jruby/RubyKernel.java:1054:in
require'
from /Users/leonko/.rvm/rubies/jruby-1.7.4/lib/ruby/shared/rubygems/custom_require.rb:36:in require' from /Users/leonko/.rvm/gems/jruby-1.7.4/gems/ffi-rzmq-1.0.1/lib/ffi-rzmq.rb:1:in
(root)'
from org/jruby/RubyArray.java:1617:in each' from /Users/leonko/.rvm/gems/jruby-1.7.4/gems/ffi-rzmq-1.0.1/lib/ffi-rzmq.rb:71:in
(root)'
from org/jruby/RubyKernel.java:1054:in require' from /Users/leonko/.rvm/gems/jruby-1.7.4/gems/ffi-rzmq-1.0.1/lib/ffi-rzmq.rb:70:in
(root)'
from /Users/leonko/.rvm/rubies/jruby-1.7.4/lib/ruby/shared/rubygems/custom_require.rb:1:in (root)' from org/jruby/RubyKernel.java:1093:in
eval'
from /Users/leonko/.rvm/rubies/jruby-1.7.4/lib/ruby/shared/rubygems/custom_require.rb:60:in require' from (irb):1:in
evaluate'
travis ci has same issue:
https://travis-ci.org/chuckremes/ffi-rzmq/builds/6446484
Please help me
We installed the zmq library via a Redhat gem which installed it as /usr/lib64/libzmq.so.1. It looks like the libzmq.rb file doesn't find it in this directory. Could you add an override so that the path could be specified via a config/initializer or maybe add /usr/lib64 and /usr/lib to the search paths (although I think the .1 suffix will still confuse it).
Our workaround was to ln -s /usr/lib64/libzmq.so.1 /usr/local/lib/libzmq.so
So far I had no success setting up environment for ffi-rzmq under Windows XPSP3 (32bit). I have successfully built zeromq-2.0.10 - with Visual Studio from Windows package and from sources under Cygwin. So, I have zeromq library working and in path.
Here are the Rubies that I tried (since it is indicated that either JRuby or 1.9.2 are adequate, I only tried those):
Ruby 1.9.2-p0 (Rubyinstaller)
JRuby 1.5.2
Ruby 1.9.2-p0 (built from source under Cygwin)
Y:\Dev\apps\win\learn-ruby-zeromq\001_Socket_Types>jruby -v
jruby 1.5.2 (ruby 1.8.7 patchlevel 249) (2010-08-20 1c5e29d) (Java HotSpot(TM) Client VM 1.6.0_20) [x86-java]
Y:\Dev\apps\win\learn-ruby-zeromq\001_Socket_Types>gem list
columnize (0.3.1)
ffi (0.6.3)
ffi-rzmq (0.6.0)
rake (0.8.7)
rspec (1.3.0)
ruby-debug (0.10.3)
ruby-debug-base (0.10.3.2)
sources (0.0.1)
zmqmachine (0.3.2)
Y:\Dev\apps\win\learn-ruby-zeromq\001_Socket_Types>jruby 001_push_pull.rb
C:/Documents and Settings/bezrodnykh/.pik/rubies/JRuby-152/lib/ruby/site_ruby/shared/ffi/ffi.rb:112:in create_invoker': Function 'valloc' not found in [msvcrt] (FFI::NotFoundError) from C:/Documents and Settings/bezrodnykh/.pik/rubies/JRuby-152/lib/ruby/site_ruby/shared/ffi/library.rb:98:in
attach_function'
from C:/Documents and Settings/bezrodnykh/.pik/rubies/JRuby-152/lib/ruby/site_ruby/shared/ffi/library.rb:96:in each' from C:/Documents and Settings/bezrodnykh/.pik/rubies/JRuby-152/lib/ruby/site_ruby/shared/ffi/library.rb:96:in
attach_function'
from C:/Documents and Settings/bezrodnykh/.pik/rubies/JRuby-152/lib/ruby/gems/1.8/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq/wrapper.rb:11
from C:/Documents and Settings/bezrodnykh/.pik/rubies/JRuby-152/lib/ruby/gems/1.8/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq/wrapper.rb:31:in require' from C:/Documents and Settings/bezrodnykh/.pik/rubies/JRuby-152/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in
require'
from C:/Documents and Settings/bezrodnykh/.pik/rubies/JRuby-152/lib/ruby/gems/1.8/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq.rb:71
from C:/Documents and Settings/bezrodnykh/.pik/rubies/JRuby-152/lib/ruby/gems/1.8/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq.rb:70:in each' from C:/Documents and Settings/bezrodnykh/.pik/rubies/JRuby-152/lib/ruby/gems/1.8/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq.rb:70 from C:/Documents and Settings/bezrodnykh/.pik/rubies/JRuby-152/lib/ruby/gems/1.8/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq.rb:36:in
require'
from C:/Documents and Settings/bezrodnykh/.pik/rubies/JRuby-152/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
from 001_push_pull.rb:2
$ ruby -v
ruby 1.9.2dev (2009-07-18 trunk 24186) [i386-cygwin]
$ gem list
ffi (0.6.3)
ffi-rzmq (0.6.0)
rake (0.8.7)
rubygems-update (1.3.7)
zmqmachine (0.3.2)
vb@vb-mac /y/dev/apps/win/learn-ruby-zeromq/001_Socket_Types
$ ruby 001_push_pull.rb
/home/bezrodnykh/.rvm/gems/ruby-1.9.2-preview1/gems/ffi-0.6.3/lib/ffi/library.rb:129:in attach_function': Function 'valloc' not found in [msvcrt.dll] (FFI::NotFoundError) from /home/bezrodnykh/.rvm/gems/ruby-1.9.2-preview1/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq/wrapper.rb:11:in
module:LibC'
from /home/bezrodnykh/.rvm/gems/ruby-1.9.2-preview1/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq/wrapper.rb:3:in <top (required)>' from /home/bezrodnykh/.rvm/gems/ruby-1.9.2-preview1/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq.rb:71:in
require'
from /home/bezrodnykh/.rvm/gems/ruby-1.9.2-preview1/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq.rb:71:in block in <top (required)>' from /home/bezrodnykh/.rvm/gems/ruby-1.9.2-preview1/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq.rb:70:in
each'
from /home/bezrodnykh/.rvm/gems/ruby-1.9.2-preview1/gems/ffi-rzmq-0.6.0/lib/ffi-rzmq.rb:70:in <top (required)>' from 001_push_pull.rb:2:in
require'
from 001_push_pull.rb:2:in `
Any advice/suggestion/hint to help me moving forward?
Hi chuckremes,
I've upgraded to ffi-rzmq 1.0.0 and notice a difference between the two. My scripts are now hanging on exit. I've created a gist to demonstrate it. https://gist.github.com/TvL2386/4739718
Unfortunately it won't work without broker and worker, but maybe it's clear to you what happens?
Is this wanted behaviour or can it be fixed?
I've been trying to use sock.recv_string
inside of a class that handles all of the zmq connections and message parsing. When a lot of connections stream in, sock.recv_string
returns nil or empty strings in quick succession. It basically locks up everything and will not accept any more messages. The following code will accept about 19-25 connections then just get stuck in a loop, printing @conn.receive
then @conn.reply_http
over and over again.
lood do
puts "@conn.receive"
msg = ""
@conn.request_sock.recv_string msg
puts "@conn.reply_http"
@conn.reply_http(msg, "hello world")
end
While doing a @reqs.recv_string(0), I want to shut down the process so I hit Ctrl+C, but then I get:
^CInterrupted system call
nbytes != -1 (signaler.cpp:269)
Abort trap
Any ideas on what I can do here?
When no sockets are registered for polling, a call to Poller#poll returns immediately regardless of the poll_interval defined. This causes client programs like zmqmachine to busy-wait when they haven't registered any sockets yet and burn up the CPU.
The question now is should #poll sleep for the poll interval or push this responsibility back up the stack?
It seems most reasonable to me for it to push off the responsibility. The caller should note that a call to #poll may block for as long as the poll_interval defines but the time could be shorter. Then it is up to the caller to make sure it doesn't call too often.
Thoughts?
I initially tried to run the examples from learn-ruby-zeromq which failed so I cloned ffi-rzmq and tried to get the specs running. In both instances I can the following error.
bumblebee:~/Documents/src/ffi-rzmq$ rake spec
rake/rdoctask is deprecated. Use rdoc/task instead (in RDoc 2.4.2+)
/Users/daniel/.rvm/rubies/jruby-1.6.4/bin/jruby -S rspec ./spec/context_spec.rb ./spec/device_spec.rb ./spec/message_spec.rb ./spec/multipart_spec.rb ./spec/nonblocking_recv_spec.rb ./spec/poll_spec.rb ./spec/pushpull_spec.rb ./spec/reqrep_spec.rb ./spec/socket_spec.rb
LoadError: Could not open library '/Users/daniel/Documents/src/ffi-rzmq/lib/ffi-rzmq/../../ext/libzmq.dylib' : dlopen(/Users/daniel/Documents/src/ffi-rzmq/lib/ffi-rzmq/../../ext/libzmq.dylib, 5): image not found. Could not open library '/usr/local/lib/libzmq.dylib' : dlopen(/usr/local/lib/libzmq.dylib, 5): no suitable image found. Did find:
/usr/local/lib/libzmq.dylib: mach-o, but wrong architecture. Could not open library '/opt/local/lib/libzmq.dylib' : dlopen(/opt/local/lib/libzmq.dylib, 5): image not found. Could not open library '/usr/local/homebrew/lib/libzmq.dylib' : dlopen(/usr/local/homebrew/lib/libzmq.dylib, 5): image not found. Could not open library 'libzmq' : dlopen(libzmq, 5): image not found. Could not open library 'libzmq.dylib' : dlopen(libzmq.dylib, 5): no suitable image found. Did find:
/usr/local/lib/libzmq.dylib: mach-o, but wrong architecture
ffi_lib at /Users/daniel/.rvm/rubies/jruby-1.6.4/lib/ruby/site_ruby/shared/ffi/library.rb:82
collect at org/jruby/RubyArray.java:2344
ffi_lib at /Users/daniel/.rvm/rubies/jruby-1.6.4/lib/ruby/site_ruby/shared/ffi/library.rb:64
LibZMQ at /Users/daniel/Documents/src/ffi-rzmq/lib/ffi-rzmq/libzmq.rb:12
(root) at /Users/daniel/Documents/src/ffi-rzmq/lib/ffi-rzmq/libzmq.rb:5
require at org/jruby/RubyKernel.java:1047
require at /Users/daniel/.rvm/rubies/jruby-1.6.4/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:29
(root) at /Users/daniel/Documents/src/ffi-rzmq/lib/ffi-rzmq/libzmq.rb:74
each at org/jruby/RubyArray.java:1603
(root) at /Users/daniel/Documents/src/ffi-rzmq/lib/ffi-rzmq.rb:73
require at org/jruby/RubyKernel.java:1047
require at /Users/daniel/.rvm/rubies/jruby-1.6.4/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:29
(root) at /Users/daniel/Documents/src/ffi-rzmq/lib/ffi-rzmq.rb:5
require at org/jruby/RubyKernel.java:1047
require at /Users/daniel/.rvm/rubies/jruby-1.6.4/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:29
(root) at /Users/daniel/Documents/src/ffi-rzmq/spec/spec_helper.rb:3
load at org/jruby/RubyKernel.java:1073
load_spec_files at /Users/daniel/Documents/src/ffi-rzmq/spec/context_spec.rb:419
collect at org/jruby/RubyArray.java:2344
load_spec_files at /Users/daniel/.rvm/gems/jruby-1.6.4@zeromq/gems/rspec-core-2.6.4/lib/rspec/core/configuration.rb:419
run at /Users/daniel/.rvm/gems/jruby-1.6.4@zeromq/gems/rspec-core-2.6.4/lib/rspec/core/command_line.rb:18
run_in_process at /Users/daniel/.rvm/gems/jruby-1.6.4@zeromq/gems/rspec-core-2.6.4/lib/rspec/core/runner.rb:80
run at /Users/daniel/.rvm/gems/jruby-1.6.4@zeromq/gems/rspec-core-2.6.4/lib/rspec/core/runner.rb:69
autorun at /Users/daniel/.rvm/gems/jruby-1.6.4@zeromq/gems/rspec-core-2.6.4/lib/rspec/core/runner.rb:11
org.jruby.exceptions.RaiseException: (SystemExit) exit
rake aborted!
ruby -S rspec ./spec/context_spec.rb ./spec/device_spec.rb ./spec/message_spec.rb ./spec/multipart_spec.rb ./spec/nonblocking_recv_spec.rb ./spec/poll_spec.rb ./spec/pushpull_spec.rb ./spec/reqrep_spec.rb ./spec/socket_spec.rb failed
Tasks: TOP => spec
(See full trace by running task with --trace)
I've installed ZeroMQ using Homebrew and the version is 2.1.10. As you can see from the trace I'm trying to run it with JRuby 1.6.4 installed with RVM.
The installed lib seems ok?
bumblebee:~/Documents/src/ffi-rzmq$ lipo -info /usr/local/lib/libzmq.dylib
Non-fat file: /usr/local/lib/libzmq.dylib is architecture: x86_64
Appreciate any help to get me up and running. Thanks.
Regarding: https://github.com/chuckremes/ffi-rzmq/blob/master/lib/ffi-rzmq/socket.rb Line 535
I understand that LibZMQ version 3 uses unsigned 16-bit integer for identity instead of a uuid-as-string. Should this line be altered to cast .to_i, or does it pack in a string (of numerals) of the integer? Some clarification would be appreciated.
Thanks
The accessor is never assigned.
Hi,
Why did you change the signature of the call in latest version instead of raising an error ?
If you wanted to make your api looks like C I think you succeeded but that's not really the ruby way...
The current code:
array = []
rc = socket.getsockopt(ZMQ::HWM, array)
hwm = array.first if ZMQ::Util.resultcode_ok?(rc)
And what it could be:
begin
hwm = socket.getsockopt(ZMQ::HWM)
rescue ZMQ::OperationFailed => err
# do something
end
Since looking at the first really makes me sick I can even provide the pull request, but would you accept it ?
0.9.5
was introduced 6 months ago in master
branch. Is it going to be released soon ? Any blockers ? There is big warning about incompatible changes and it is hard to code another gems depending on ffi-rzmq
. I would like to use the new API but cannot because 0.9.5
is not released so I cannot make it a dependency of my gem.
send_multiple assumes that it is given more than one part. If only one part is given, then rc is nil when resultcode_ok? is called.
Either fix send_multiple to work with single element arrays, or add a branch to send_strings that delegates to send_string when necessary.
This simple script will block in Ruby 1.9.2 on Mac OS X 10.6.8 (Snow Leopard). I can reliably reproduce the bug by using this script, on three different macs, and reliably fix it by including a tiny time-delay.
The bug is that following a ffi-rzmq socket connect too closely by a subprocess creation will cause the process to hang.
Best with code:
require 'ffi-rzmq'
begin
context = ZMQ::Context.new
socket = context.socket ZMQ::DEALER # or router...
socket.connect "tcp://localhost:5562"
sleep 0.01 # this alleviates any problems.
`date` # busts and causes 100% processor core busy-wait and process hang. Never executes date.
ensure
socket.close if socket
context.terminate if context
end
This is reproducible with: ffi 1.0.0 and 1.0.9; reproducible with ffi-rzmq 0.8.0 and 0.8.2; reproducible with ruby 1.9.2p136 and 1.9.2p290, all on mac 10.6.8. Three different macs. You can replace the use of backticks with any other kind of process / subprocess creation and you will get similar errors.
I cannot produce the error using FreeBSD even with identical versions of everything. I cannot produce the error using Ruby 1.8.
You can also fix the problem by including the delay in the subprocess. For example:
require 'ffi-rzmq'
begin
context = ZMQ::Context.new
socket = context.socket ZMQ::DEALER # or router...
socket.connect "tcp://localhost:5562"
`date; sleep 0.01` # no problem.
ensure
socket.close if socket
context.terminate if context
end
I'm happy to provide any further help / debug info etc. We've successfully used a lot of ZeroMQ in Ruby with ffi-rzmq and written some C extensions, but have now run into a timing problem like this twice. The process does not respond to a TERM but does respond to a KILL (unsurprisingly).
Howdy, http://gist.github.com/484043. My 0mq handler serves the request, then dies horribly. Any ideas? 1.9.2 was working pretty darn well.
rspec spec/poll_spec.rb -l 35
So, a couple weird things here inside Poll#register item[:socket] = 0
should be FFI::Pointer.new(0)
no? This causes FFI errors in all rubies as it expects a pointer.
But that doesn't fix the spec, because later on @raw_to_socket[item[:socket].address] = sock
is called, and you can't call .address on a socket. I don't see how this ever worked, I'm clearly missing something.
Hi chuckremes,
I'm having issues deregistering sockets.
I've created a gist to show a minimalistic reproduce case: https://gist.github.com/2895395
It seems the socket I want to deregister doesn't go away. Am I doing something wrong or is it a bug?
Kind regards,
Tom
I'm going through the Code Connected book, writing out the examples in ruby using this gem.
The Weather Update publisher is considerably slower than the C example, by a lot more than I would have expected. The C example takes roughly 4 seconds consistently. The ruby code takes over 2 minutes / about 30x slower.
Is this to be expected?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.