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)

Reply via email to