thrift-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Tim Wilson-Brown (JIRA)" <j...@apache.org>
Subject [jira] Updated: (THRIFT-748) C++ TSocket default linger setting breaks forked parent process
Date Thu, 01 Apr 2010 11:00:27 GMT

     [ https://issues.apache.org/jira/browse/THRIFT-748?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Tim Wilson-Brown updated THRIFT-748:
------------------------------------

    Attachment: thrift_linger_example.cpp

Linger Issue Test Code

> C++ TSocket default linger setting breaks forked parent process
> ---------------------------------------------------------------
>
>                 Key: THRIFT-748
>                 URL: https://issues.apache.org/jira/browse/THRIFT-748
>             Project: Thrift
>          Issue Type: Bug
>          Components: Library (C++)
>    Affects Versions: 0.2, 0.3
>         Environment: Cygwin 1.7.1 on Windows XP SP3, Thrift 0.2.0 & r760184 &
Trunk
>            Reporter: Tim Wilson-Brown
>            Priority: Trivial
>         Attachments: thrift_linger_example.cpp
>
>   Original Estimate: 72h
>  Remaining Estimate: 72h
>
> If a Thrift C++ Client opens a TSocket, writes some data, then calls fork(), the child
process can terminate the parent processes' connection by deleting its copy of the parent
TSocket.
> In particular,
> the default setting of lingerOn_ = 1 causes a RST to be sent in close(socket_) in TSocket->close()

> Discussion:
> This design choice makes it really difficult to program a Thrift client that forks other
clients in C++, as the first process to call TSocket->close() terminates all copies of
the connection. The processes all have to call TSocket->setLinger(0,0) before deleting
the TSocket, closing the TSocket, or exiting. (This workaround only succeeds with the suggested
fix in [#THRIFT-747] ).
> However, the design choice also prevents deadlock/slowdown issues where a forked process
holds open a copy of the parent's Thrift connections. It also makes close non-blocking, which
is ideal in a destructor.
> Options:
> Do we want to change the default? What is linger useful for?
> TODO:
>   * Confirm issue on Linux - see attached test code
>   * Decide if a code change is needed
>   * Document workaround after resolution of [#THRIFT-747] - call TSocket->setLinger(0,0)
if forking

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message