From: Brian Warner Date: Fri, 18 Apr 2008 07:43:29 +0000 (-0700) Subject: mutable.node: avoid reentrancy problems in Deferred code on twisted2.5, by adding... X-Git-Tag: allmydata-tahoe-1.1.0~216 X-Git-Url: https://git.rkrishnan.org/pf/index.php?a=commitdiff_plain;h=fc7b75e55f371ecc4fe71c2a44ae6df124a3e769;p=tahoe-lafs%2Ftahoe-lafs.git mutable.node: avoid reentrancy problems in Deferred code on twisted2.5, by adding an eventual-send call --- diff --git a/src/allmydata/mutable/node.py b/src/allmydata/mutable/node.py index 0267dcd7..8ca68eb2 100644 --- a/src/allmydata/mutable/node.py +++ b/src/allmydata/mutable/node.py @@ -4,6 +4,8 @@ from twisted.application import service from zope.interface import implements from twisted.internet import defer, reactor +from twisted.python import log +from foolscap.eventual import eventually from allmydata.interfaces import IMutableFileNode, IMutableFileURI from allmydata.util import hashutil from allmydata.util.assertutil import precondition @@ -237,7 +239,15 @@ class MutableFileNode: # MFN instance. d = defer.Deferred() self._serializer.addCallback(lambda ignore: cb(*args, **kwargs)) - self._serializer.addBoth(d.callback) + # we need to put off d.callback until this Deferred is finished being + # processed. Otherwise the caller's subsequent activities (like, + # doing other things with this node) can cause reentrancy problems in + # the Deferred code itself + self._serializer.addBoth(lambda res: eventually(d.callback, res)) + # add a log.err just in case something really weird happens, because + # self._serializer stays around forever, therefore we won't see the + # usual Unhandled Error in Deferred that would give us a hint. + self._serializer.addErrback(log.err) return d #################################