[
https://issues.apache.org/jira/browse/THRIFT-3848?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15850122#comment-15850122
]
James E. King, III commented on THRIFT-3848:
--------------------------------------------
It's funny, but a project I work on changed to relies on SIGCHLD with recent
code changes, and uses the ForkingServer, and this fix broke that behavior.
Sadly, without this change the thrift server implementation goes into a loop
and consumes a lot of CPU.
> As an implementer of a perl socket server, I do not want to have to remember
> to ignore SIGCHLD for it to work properly
> ----------------------------------------------------------------------------------------------------------------------
>
> Key: THRIFT-3848
> URL: https://issues.apache.org/jira/browse/THRIFT-3848
> Project: Thrift
> Issue Type: Bug
> Components: Perl - Library
> Affects Versions: 0.8, 0.9, 0.9.1, 0.9.2, 0.9.3
> Environment: Ubuntu 14.04, perl forking server, C++ client
> Reporter: James E. King, III
> Assignee: James E. King, III
> Fix For: 0.10.0
>
>
> 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():
> {code}$SIG{CHLD} = 'IGNORE';{code}
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)