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)