From bf92026527a11667670cfe1f04c8308333f4982c Mon Sep 17 00:00:00 2001 From: Soren Hansen Date: Thu, 6 Aug 2015 20:09:37 +0200 Subject: [PATCH 1/2] Avoid terminating connections prematurely While sending very large messages (far beyond what fits in a the tcp buffer, so it takes multiple sendto system calls for it to finish), zmq_close will close the connection regardless of ZMQ_LINGER. In case no engine is attached, a pipe->check_read() is needed to look for the delimiter in the pipe and ultimately trigger the pipe termination. However, if there *is* an engine attached, the check_read() looks ahead and finds the delimiter and terminates the connection even though the engine might actually still be in the middle of sending a message. This happens because while the io_thread is still busy sending the data, the pipe can get terminated and the io thread ends up being terminated. --- src/session_base.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/session_base.cpp b/src/session_base.cpp index 86bfd8ff..e8f90764 100644 --- a/src/session_base.cpp +++ b/src/session_base.cpp @@ -454,7 +454,8 @@ void zmq::session_base_t::process_term (int linger_) // TODO: Should this go into pipe_t::terminate ? // In case there's no engine and there's only delimiter in the // pipe it wouldn't be ever read. Thus we check for it explicitly. - pipe->check_read (); + if (!engine) + pipe->check_read (); } if (zap_pipe != NULL) From cf0dcd237926affc7cb154143f7e0170ffd5fb3d Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Wed, 30 Mar 2016 17:05:21 +0100 Subject: [PATCH 2/2] Problem: NEWS not up to date with bug fixes Solution: mention closing issue #1877 --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 37b3ef35..7576ba07 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,8 @@ * Fixed #1850 - detection issues with tweetnacl/libsodium. +* Fixed #1877 - Avoid terminating connections prematurely + 0MQ version 4.1.4 stable, released on 2015/12/18 ================================================