[zeromq-dev] Assertion during zmq_recv in 3.x

Michel Pelletier pelletier.michel at gmail.com
Tue Jul 31 04:39:10 CEST 2012


Just a guess from looking at the code, but it seems like reconnection
and routers may not be playing along so well as the new connection
sends the identity as the first message, and the router does not think
it's in a state where it is expecting that.  It seems like router
should expect an identity at any time due to a reconnection, and reset
it's state accordingly.  If true, I'd def call that a bug.

-Michel

On Mon, Jul 30, 2012 at 6:01 PM, Stuart Brandt <stu at compuserve.com> wrote:
> Just a followup that a similar issue appears to exist with ZMQ_ROUTER
> connecting the ZMQ_DEALER. In this case I'm seeing...
>
> Assertion failed: (prefetched_msg.flags () & msg_t::identity) == 0
> (router.cpp:274)
> Aborted
>
> I repro'd this one with two Queue devices connecting back-to-back -- the
> 2nd Queue's front-end Router connecting to the back-end Dealer of the
> first Queue, then killing and restarting the process with the first
> Queue. Is there some sockopt I'm missing that could be contributing to this?
>
> On 7/27/2012 3:23 PM, Stuart Brandt wrote:
>> I get an assertion during a call to zmq_recv on 2 different OSes (OSX
>> 10.7.4 and CentOS 5.8) under two different builds of 3.x (v3.2.0-rc1 and
>> a recent build off latest at github.com/zeromq/libzmq).
>>
>> The assertion is:
>> Assertion failed: (msg_->flags ()&  msg_t::identity) == 0 (router.cpp:220)
>> Aborted
>>
>> The setup involves:
>> 1) the simple message queue broker found at
>> https://github.com/imatix/zguide/blob/master/examples/C/msgqueue.c
>> I modified the #include to look for zmq.h rather than zhelpers.h to get
>> it to compile with ZMQ 3.x
>>
>> 2) a minimal server implementation that connects to the broker and does
>> a zmq_recv. Code is:
>> //
>> //  Demo of assertion in ZMQ 3.x by REP socket connecting to ROUTER socket
>> //  Connects to tcp://localhost:5560
>> //
>> #include<stdio.h>
>> #include<zmq.h>
>>
>> int main (void)
>> {
>>       char buf[80];   // buffer for zmq_recv call
>>       int len;        // len returned by zmq_recv
>>       void *ctx;      // ZMQ context
>>       void *sock;     // ZMQ socket
>>
>>       // init ZMQ context, create a REP socket, and connect to ROUTER
>>       ctx = zmq_ctx_new();
>>       sock = zmq_socket(ctx,ZMQ_REP);
>>       zmq_connect (sock, "tcp://localhost:5560");
>>
>>       // do a basic zmq_recv call...warn if it fails
>>       len = zmq_recv(sock,buf,sizeof(buf),0);
>>       if (len<  0) {
>>           printf("zmq_recv failed - %s\n",zmq_strerror(errno));
>>       }
>>
>>       // Done. Clean up and end
>>       zmq_close (sock);
>>       zmq_term (ctx);
>>       return 0;
>> }
>>
>>
>> Steps to repro are start server, start broker, kill broker (spec.
>> ctrl-C), restart broker. Server aborts with the above assertion.
>>
>> Is there something my code should be doing differently?
>>
>> Thanks....Stuart
>>
>>
>>
>> _______________________________________________
>> zeromq-dev mailing list
>> zeromq-dev at lists.zeromq.org
>> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>
> _______________________________________________
> 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