Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
0.8, 0.9, 0.9.1, 0.9.2, 0.9.3
-
None
-
Ubuntu 14.04, perl forking server, C++ client
Description
In a project I work on, we use a perl thrift server as a mock to simulate something in production. A C++ client connects, makes a call, and disconnects. The perl server is a forking server.
I found that if I do not explicity ignore SIGCHLD, I can accept one connection and process it, but when it disconnects, the subsequent accept call is interrupted by a SIGCHLD and results in a useless handle that can_read says cannot be read. This puts Server.pm into an infinite accept/read/fail loop. The serve() method of the ForkingServer needs to explicitly ignore SIGCHLD to work properly.
I've observed this behavior as far back as thrift-0.8.0 up through 0.9.3.
The workaround is to add the following code before calling serve():
$SIG{CHLD} = 'IGNORE';
Attachments
Issue Links
- breaks
-
THRIFT-4065 Document Perl ForkingServer signal restriction imposed by THRIFT-3848 and remove unnecessary code
- Closed
- links to