perplexes / m2r

Mongrel2 Connection Adapter - Ruby Encrusted Steel-Reinforced Fist
MIT License
90 stars 11 forks source link

Prevent race condition when finished working #35

Open paneq opened 12 years ago

paneq commented 12 years ago

Use ZMQ3 disconnect / unbind API whenever possible to avoid situation like this in Python mongrel2 adapter:

def shutdown(self,timeout=None):
        """Shut down the connection.

        This indicates that no more requests should be received by the
        handler, but it is willing to process any that have already been
        transmitted.  Use it for graceful termination of handlers.

        After shutdown, you may only call recv() with timeout=0.

        For the standard PULL socket, a clean shutdown is not possible
        as zmq has no API for it.  What we do is quickly ready anything
        that's pending for delivery then close the socket.  This leaves
        a slight race condition that a request will be pushed to us and
        then lost.
        """
        msg = self._recv(timeout=0)
        while msg is not None:
            self.recv_buffer.append(msg)
            msg = self._recv(timeout=0)
        self.send_sock.close()
        super(Connection,self).shutdown(timeout)
paneq commented 12 years ago

https://github.com/chuckremes/ffi-rzmq/issues/57

paneq commented 12 years ago

This was fixed in ffi-rzmq and we can start working on it.