Opened 18 years ago
Closed 18 years ago
#95 closed defect (fixed)
foolscap.test.test_logging.IncidentGatherer.test_emit sometimes fails badly
| Reported by: | Brian Warner | Owned by: | |
|---|---|---|---|
| Priority: | major | Milestone: | 0.3.1 |
| Component: | unknown | Version: | 0.3.0 |
| Keywords: | Cc: |
Description
trial -r poll foolscap.test.test_logging.IncidentGatherer.test_emit sometimes hangs for a long time (two minutes) and then fails with an error about "maximum recursion depth exceeded". I believe this is happening in the error-handling path, specifically in Twisted as it attempts to display whatever unhandled error was in the logs:
[ERROR]: foolscap.test.test_logging.IncidentGatherer.test_emit
Traceback (most recent call last):
File "/usr/lib/python2.5/site-packages/twisted/internet/defer.py", line 289, in _continue
self.unpause()
File "/usr/lib/python2.5/site-packages/twisted/internet/defer.py", line 285, in unpause
self._runCallbacks()
File "/usr/lib/python2.5/site-packages/twisted/internet/defer.py", line 344, in _runCallbacks
self.result = failure.Failure()
File "/usr/lib/python2.5/site-packages/twisted/python/failure.py", line 265, in __init__
parentCs = reflect.allYourBase(self.type)
File "/usr/lib/python2.5/site-packages/twisted/python/reflect.py", line 542, in allYourBase
accumulateBases(classObj, l, baseClass)
File "/usr/lib/python2.5/site-packages/twisted/python/reflect.py", line 550, in accumulateBases
accumulateBases(base, l, baseClass)
File "/usr/lib/python2.5/site-packages/twisted/python/reflect.py", line 550, in accumulateBases
accumulateBases(base, l, baseClass)
File "/usr/lib/python2.5/site-packages/twisted/python/reflect.py", line 550, in accumulateBases
accumulateBases(base, l, baseClass)
File "/usr/lib/python2.5/site-packages/twisted/python/reflect.py", line 550, in accumulateBases
accumulateBases(base, l, baseClass)
exceptions.RuntimeError: maximum recursion depth exceeded
I spent a couple of frustrated hours looking at this and wasn't able to figure it out. It seems like any error that occurs during certain tests will trigger this, which is really annoying as it doesn't make it easy to find out what the real error is.
Change History (2)
comment:1 Changed 18 years ago by
comment:2 Changed 18 years ago by
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
[6af9acdb1976ed87edae71e5e4ba196c9054cd4f] fixes this, by copying the improved task.LoopingCall-based PollMixin from tahoe.

Hm, I think this has to do with the way
foolscap.test.common.PollMixinuses a series of chained Deferreds. I can make the failure occur more frequently by speeding up the poll() call (polling once every 1ms), and less frequently by slowing it down (polling once every 100ms). The default poll() time is once every 10ms.With faster polling, the number of Deferreds that are chained up by the time the condition is met is larger, and if it crosses some threshold (about 600, it seems) then we get a recursion-depth-exceeded error, which tends to erase all the useful information about its cause.
The solution will be to rewrite poll() to not use this chained-Deferreds pattern.