From 157382fae7b4b4c74a6f7ce319c602c269cc7e96 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Wed, 9 Mar 2011 21:46:17 -0800 Subject: [PATCH] AbstractPollTask: log exceptional events Previously, when AbstractPollTask receives a POLLERR or POLLNVAL event, it would silently cancel the task. Now it will generate a message like this: !!! SpawnProcess received strange poll event: 8 The message is displayed via a new _log_poll_exception method, which is overridden by AbstractEbuildProcess to log the message via elog. This might help diagnose reported cases of SIGTERM signals killing ebuild processes for no apparent reason: http://code.google.com/p/chromium-os/issues/detail?id=12968 --- pym/_emerge/AbstractEbuildProcess.py | 5 +++++ pym/_emerge/AbstractPollTask.py | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/pym/_emerge/AbstractEbuildProcess.py b/pym/_emerge/AbstractEbuildProcess.py index 601aafe0e..d7f31be28 100644 --- a/pym/_emerge/AbstractEbuildProcess.py +++ b/pym/_emerge/AbstractEbuildProcess.py @@ -228,6 +228,11 @@ class AbstractEbuildProcess(SpawnProcess): self.scheduler.output(msg, log_path=self.settings.get("PORTAGE_LOG_FILE")) + def _log_poll_exception(self, event): + self._elog("eerror", + ["%s received strange poll event: %s\n" % \ + (self.__class__.__name__, event,)]) + def _set_returncode(self, wait_retval): SpawnProcess._set_returncode(self, wait_retval) diff --git a/pym/_emerge/AbstractPollTask.py b/pym/_emerge/AbstractPollTask.py index 833ee3b4c..6cbf984b9 100644 --- a/pym/_emerge/AbstractPollTask.py +++ b/pym/_emerge/AbstractPollTask.py @@ -1,8 +1,10 @@ -# Copyright 1999-2010 Gentoo Foundation +# Copyright 1999-2011 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 import array +import logging +from portage.util import writemsg_level from _emerge.AsynchronousTask import AsynchronousTask from _emerge.PollConstants import PollConstants class AbstractPollTask(AsynchronousTask): @@ -39,9 +41,16 @@ class AbstractPollTask(AsynchronousTask): def _unregister(self): raise NotImplementedError(self) + def _log_poll_exception(self, event): + writemsg_level( + "!!! %s received strange poll event: %s\n" % \ + (self.__class__.__name__, event,), + level=logging.ERROR, noiselevel=-1) + def _unregister_if_appropriate(self, event): if self._registered: if event & self._exceptional_events: + self._log_poll_exception(event) self._unregister() self.cancel() elif event & PollConstants.POLLHUP: -- 2.26.2