[zeromq-dev] missing events ZMQ_FD / ZMQ_EVENTS
Martin Hurton
hurtonm at gmail.com
Thu Apr 26 10:45:44 CEST 2012
Thanks Gerhard, could you please create an issue in Jira? And please
attach those Lua programs too. Thanks.
- mh
On Wed, Apr 25, 2012 at 5:08 PM, Gerhard Lipp <gelipp at googlemail.com> wrote:
> 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.
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org
> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
More information about the zeromq-dev
mailing list