[zeromq-dev] missing events ZMQ_FD / ZMQ_EVENTS
Gerhard Lipp
gelipp at googlemail.com
Wed Apr 25 17:08:33 CEST 2012
i figured out to boil down an example, which shows this bug.
it consists of three files:
1) x.lua doing the XREP XREQ stuff, must be started once
2) rep.lua implementing a simple echo replier, must be started once
3) req.lua making the request to rep.lua through x.lua. must be
started TWICE to produce the error. THIS PROCESS LOCKS. uncommenting
the ev.WRITE is a bad workaround to this issue.
-----------
-- x.lua:
------------
local zmq = require'zmq'
local ev = require'ev'
local c = zmq.init(1)
local xreq = c:socket(zmq.XREQ)
xreq:bind('tcp://127.0.0.1:13333')
local xrep = c:socket(zmq.XREP)
xrep:bind('tcp://127.0.0.1:13334')
local forward_io =
function(src,dst)
return ev.IO.new(
function(loop,io)
while true do
local events = src:getopt(zmq.EVENTS)
if events == zmq.POLLIN or events == (zmq.POLLIN +
zmq.POLLOUT) then
local more
repeat
local data = src:recv()
local more = src:getopt(zmq.RCVMORE) > 0
dst:send(data,more and zmq.SNDMORE or 0)
until not more
else
break
end
end
end,
src:getopt(zmq.FD),
ev.READ -- + ev.WRITE -- "fixes" the problem
)
end
local xrep_io = forward_io(xrep,xreq)
local xreq_io = forward_io(xreq,xrep)
xreq_io:start(ev.Loop.default)
xrep_io:start(ev.Loop.default)
ev.Loop.default:loop()
---------
-- req.lua
----------
local zmq = require'zmq'
local c = zmq.init(1)
local req = c:socket(zmq.REQ)
req:connect('tcp://127.0.0.1:13334')
while true do
local r = tostring(math.random(1,10000000))
req:send(r)
local x = req:recv()
print(x,r)
assert(x==r)
end
---------
-- rep.lua
------------
local zmq = require'zmq'
local c = zmq.init(1)
local rep = c:socket(zmq.REP)
rep:connect('tcp://127.0.0.1:13333')
while true do
local x = rep:recv()
rep:send(x)
end
On Mon, Apr 23, 2012 at 2:53 PM, Gerhard Lipp <gelipp at googlemail.com> wrote:
> Hello,
>
> I can observe the same behavior as stated here
> (http://lists.zeromq.org/pipermail/zeromq-dev/2011-November/014615.html).
> What I observe is also a XREP/XREQ (ROUTER/DEALER) prob, where the
> XREQ is waiting forever to receive a message (which has been
> definitely sent). When I poll (timer based) the ZMQ_EVENTs, the XREQ
> is readable as expected. I am using libev (select based) for doing IO
> and I am aware of the edge-based trigger behaviour (I am
> reading/forwarding messages until ZMQ_EVENTs does not include the
> ZMQ_POLLIN bit any more).
>
> What is the status of this issue?
> Unfortunately my setup is a bit complicated to share, but i would like
> to help as much as possible.
>
> Regards,
> Gerhard
>
> A libev workaround is to use both EV_READ and EV_WRITE bits, though
> this adds a lot of unnecessary wake ups / callbacks etc.
More information about the zeromq-dev
mailing list