[New-bugs-announce] [issue1183] race in SocketServer.ForkingMixIn.collect_children

David Ripton report at bugs.python.org
Thu Sep 20 21:35:42 CEST 2007

New submission from David Ripton:

CentOS Linux 5, Python 2.4.3  (but code appears unchanged in 2.5 and
trunk, so I don't believe this bug has already been fixed)

We have an xmlrpc server that subclasses DocXMLRPCServer.DocXMLRPCServer
and SocketServer.ForkingMixIn.  Under load, it sometimes crashes with an
error in SocketServer.ForkingMixIn.collect_children

The bug is that collect_children calls os.waitpid with pid 0, so it
waits for any child.  But then it assumes that the pid found was in the
list self.active_children, and attempts to remove it from that list
without a try block.  However, another call to collect_children could
have already removed it, so we get "ValueError: list.remove(x): x not in

The fix is just adding a try/except block around the attempt to remove
pid from self.active children.

diff -u SocketServer.py /tmp/SocketServer.py
--- SocketServer.py     2007-08-27 10:52:24.000000000 -0400
+++ /tmp/SocketServer.py        2007-09-20 15:34:00.000000000 -0400
@@ -421,7 +421,10 @@
             except os.error:
                 pid = None
             if not pid: break
-            self.active_children.remove(pid)
+            try:
+                self.active_children.remove(pid)
+            except ValueError:
+                pass

     def process_request(self, request, client_address):
         """Fork a new subprocess to process the request."""

components: Library (Lib)
messages: 56065
nosy: dripton
severity: normal
status: open
title: race in SocketServer.ForkingMixIn.collect_children
type: crash
versions: Python 2.4

Tracker <report at bugs.python.org>

More information about the New-bugs-announce mailing list