[zeromq-dev] random crashes on zmq_ctx_term() when there is a monitored socket

Peter Kleiweg pkleiweg at xs4all.nl
Sat Nov 15 22:45:01 CET 2014


My questions remains unanswered: how do I close a monitor?


Peter Kleiweg schreef op de 8e dag van de slachtmaand van het jaar 2014:

> Pieter Hintjens schreef op de 8e dag van de slachtmaand van het jaar 2014:
> 
> > Indeed, this looks like two threads trying to work with the same socket.
> > 
> > Can we reproduce this in C?
> 
> Here is the C version.
> 
> Tested with 0MQ versions 3.2.4 (using zmq_term instead of 
> zmq.ctx_term), 4.0.4, and 4.1.0.
> 
> Crashes in all tested versions, usually with "Assertion failed: 
> pfd.revents & POLLIN (signaler.cpp:193)" (line number for 0MQ 
> version 4.1.0), but sometimes with another message, and on some 
> occasions, it hangs.
> 
> 
> 
>     #include <zmq.h>
>     #include <stdio.h>
> 
>     char
>         buffer[1024];
> 
>     int main ()
>     {
>         void
>             *context,
>             *socket;
>         int
>             i,
>             n;
> 
> 
>         for (n = 0; 1; n++) {
>             printf ("start new context\n");
>             context = zmq_ctx_new ();
>             if (! context) {
>                 printf ("%s\n", zmq_strerror (zmq_errno ()));
>                 return 1;
>             }
> 
>             printf ("start new socket\n");
>             socket = zmq_socket (context, ZMQ_REQ);
>             if (! socket) {
>                 printf ("%s\n", zmq_strerror (zmq_errno ()));
>                 return 1;
>             }
> 
>             sprintf (buffer, "inproc://monitor.rep%i", n);
>             i = zmq_socket_monitor (socket, buffer, ZMQ_EVENT_ALL);
>             if (i < 0) {
>                 printf ("%s\n", zmq_strerror (zmq_errno ()));
>                 return 1;
>             }
> 
>             printf ("start connect\n");
>             i = zmq_connect (socket, "tcp://10.15.144.101:88661");
>             if (i < 0) {
>                 printf ("%s\n", zmq_strerror (zmq_errno ()));
>                 return 1;
>             }
> 
>             printf ("start disconnect\n");
>             i = zmq_disconnect (socket, "tcp://10.15.144.101:88661");
>             if (i < 0) {
>                 printf ("%s\n", zmq_strerror (zmq_errno ()));
>                 return 1;
>             }
> 
>             printf ("start close\n");
>             i = zmq_close (socket);
>             if (i < 0) {
>                 printf ("%s\n", zmq_strerror (zmq_errno ()));
>                 return 1;
>             }
> 
>             printf ("start term\n");
>             i = zmq_ctx_term (context);
>             if (i < 0) {
>                 printf ("%s\n", zmq_strerror (zmq_errno ()));
>                 return 1;
>             }
>             
>         }
> 
>         return 0;
>     }
> 
> 
>  
> 
> > 
> > On Sat, Nov 8, 2014 at 1:41 PM, Peter Kleiweg <pkleiweg at xs4all.nl> wrote:
> > >
> > > Does anyone know of a solution for this?
> > > How do I close a monitor?
> > >
> > >
> > > Peter Kleiweg schreef op de 31e dag van de wijnmaand van het jaar 2014:
> > >
> > >>
> > >> Situation:
> > >>
> > >>   1. create a context
> > >>   2. create socket
> > >>   3. put monitor on socket with zmq_socket_monitor()
> > >>   4. socket: connect to address
> > >>   5. socket: remove connection
> > >>   6. terminate the context
> > >>
> > >> Repeat this often enough, and either the program will hang at
> > >> step 6, or crash with an error at step 6. The errors vary. These
> > >> are the ones I have seen:
> > >>
> > >>      Bad file descriptor (signaler.cpp:269)
> > >>      Assertion failed: pfd.revents & POLLIN (signaler.cpp:226)
> > >>      Invalid argument (mutex.hpp:99)
> > >>      Resource temporarily unavailable (signaler.cpp:269)
> > >>      Segmentation fault
> > >>
> > >> The problem disappears if you have a thread (or goroutine)
> > >> actually reading the messages from the monitor, and if you
> > >> insert a sleep (0.1 seconds) between steps 5 and 6 as well.
> > >>
> > >> Problem observed with ZeroMQ 3.2, 4.0 and 4.1, on linux/amd64,
> > >> using the Go interfaces zmq3 and zmq4.
> > >>
> > >> Please see details and code examples here:
> > >>
> > >>      https://github.com/pebbe/zmq4/issues/28
> > >>
> > >> My guess of what is going on is this: The monitor is running in
> > >> its own thread, while zmq_ctx_term() tries to close the
> > >> monitoring socket in the main thread. Thus, the socket would be
> > >> used in two threads at once, and since sockets aren't
> > >> thread-safe, a crash follows.
> > >>
> > >>
> > >>
> > >
> > >
> > >
> > > --
> > > Peter Kleiweg
> > > http://pkleiweg.home.xs4all.nl/
> > > _______________________________________________
> > > 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
> > 
> 
> 
> 
> 



-- 
Peter Kleiweg
http://pkleiweg.home.xs4all.nl/



More information about the zeromq-dev mailing list