Skip to content

Commit

Permalink
Avoid terminating connections prematurely
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
sorenisanerd committed Aug 6, 2015
1 parent 7b2e37d commit abc845d
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/session_base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,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)
Expand Down

0 comments on commit abc845d

Please sign in to comment.