[
https://issues.apache.org/jira/browse/THRIFT-4507?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16388018#comment-16388018
]
Jeremy Spiegel commented on THRIFT-4507:
----------------------------------------
I haven't determined what the right fix is yet. I was able to address the
problem in my project by forcing TNamedPipeServer to use the normal
TNamedPipeImpl instead of TWaitableNamedPipeImpl. I don't need
TWaitableNamedPipeImpl since I don't use a select-like loop.
> 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
> Priority: Major
>
> 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)