[jira] [Commented] (THRIFT-4507) TWaitableNamedPipeImpl::read race condition can cause hang in ~TWaitableNamedPipeImpl
[ https://issues.apache.org/jira/browse/THRIFT-4507?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=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 serverStarted, clientStarted, serverReadStarted, > clientDestroyed; > std::thread serverThread([&] { > auto server = > boost::make_shared("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("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)
[jira] [Commented] (THRIFT-4507) TWaitableNamedPipeImpl::read race condition can cause hang in ~TWaitableNamedPipeImpl
[ https://issues.apache.org/jira/browse/THRIFT-4507?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16387817#comment-16387817 ] James E. King, III commented on THRIFT-4507: Thanks for reporting this with a working example. If you are able, submitting a PR with a unit test exposing the issue and a fix for the issue would be even better. > 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 serverStarted, clientStarted, serverReadStarted, > clientDestroyed; > std::thread serverThread([&] { > auto server = > boost::make_shared("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("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)