----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/50936/ -----------------------------------------------------------
(Updated Aug. 9, 2016, 11:31 p.m.) Review request for mesos, Benjamin Mahler, Joseph Wu, and Vinod Kone. Summary (updated) ----------------- Kept poll socket alive while sending. Bugs: MESOS-5988 https://issues.apache.org/jira/browse/MESOS-5988 Repository: mesos Description ------- Currently, the poll socket implementation doesn't keep the socket alive after `PollSocketImpl.send(data, length)` passes execution off to a continuation. This patch passes a shared pointer of the socket implementation along to the continuation, keeping the socket alive. Diffs ----- 3rdparty/libprocess/src/poll_socket.cpp d14dd1ae210e112b917329803dfb09d98386b966 Diff: https://reviews.apache.org/r/50936/diff/ Testing ------- Ran `make check` on OSX. Also: I was able to expose the poll socket bug with the following test case. It triggers a "Bad file descriptor" error after 100-200 repetitions on my OSX machine. After applying this patch, I can run the test thousands of times with no failures: ``` TEST(HTTPTest, ClosedSocketFailure) { const Try<Socket> server_create = Socket::create(); ASSERT_SOME(server_create); Socket server = server_create.get(); LOG(INFO) << "*** server fd: " << server.get(); Future<size_t> sent; Future<Socket> _socket; string data; for (auto i = 0; i < 26000; i++) { data += "abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz012"; } const char* data_cstr = data.c_str(); { const Try<Socket> client_create = Socket::create(); ASSERT_SOME(client_create); Socket client = client_create.get(); LOG(INFO) << "*** client fd: " << client.get(); const Try<Nothing> listen = server.listen(5); ASSERT_SOME(listen); const Try<Address> server_address = server.address(); ASSERT_SOME(server_address); _socket = server.accept(); const Future<Nothing> connect = client.connect(server_address.get()); // Wait for the server to have accepted the client connection. AWAIT_ASSERT_READY(_socket); Socket socket = _socket.get(); // TODO(jmlvanre): Remove const copy. // Verify that the client also views the connection as established. AWAIT_ASSERT_READY(connect); // Send a message from the client to the server. sent = client.send(data_cstr, data.size()); LOG(INFO) << "*** exiting scope"; } AWAIT_READY(sent); LOG(INFO) << "*** exiting test case"; } ``` Thanks, Greg Mann