Jeremy Spiegel created THRIFT-4507: -------------------------------------- Summary: TWaitableNamedPipeImpl::read race condition can cause hang in ~TWaitableNamedPipeImpl Key: THRIFT-4507 URL: https://issues.apache.org/jira/browse/THRIFT-4507 Project: Thrift Issue Type: Bug Components: C++ - Library Affects Versions: 0.11.0 Reporter: Jeremy Spiegel
If the other side of the pipe disconnects in between a call to endAsyncRead and beginAsyncRead, then the beginAsyncRead will throw, but ~TWaitableNamedPipeImpl will hang inside GetOverlappedResult. Here is some test code that reproduces the issue: {code} std::promise<void> serverStarted, clientStarted, serverReadStarted, clientDestroyed; std::thread serverThread([&] { auto server = boost::make_shared<apache::thrift::transport::TPipeServer>("pipe-test", 64 * 1024, 1); server->listen(); serverStarted.set_value(); auto serverConnection = server->accept(); clientStarted.get_future().wait(); uint8_t buf[1024]; serverConnection->read(buf, 1); serverReadStarted.set_value(); clientDestroyed.get_future().wait(); try { serverConnection->read(buf, 1023); } catch (const apache::thrift::transport::TTransportException&) { } }); serverStarted.get_future().wait(); { auto client = boost::make_shared<apache::thrift::transport::TPipe>("pipe-test"); client->open(); uint8_t buf[1024]{}; client->write(buf, 1024); clientStarted.set_value(); serverReadStarted.get_future().wait(); } clientDestroyed.set_value(); serverThread.join(); {code} -- This message was sent by Atlassian JIRA (v7.6.3#76005)