mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-04-29 15:29:49 +00:00
mutable.node: avoid reentrancy problems in Deferred code on twisted2.5, by adding an eventual-send call
This commit is contained in:
parent
dbde3d5632
commit
fc7b75e55f
@ -4,6 +4,8 @@ from twisted.application import service
|
|||||||
|
|
||||||
from zope.interface import implements
|
from zope.interface import implements
|
||||||
from twisted.internet import defer, reactor
|
from twisted.internet import defer, reactor
|
||||||
|
from twisted.python import log
|
||||||
|
from foolscap.eventual import eventually
|
||||||
from allmydata.interfaces import IMutableFileNode, IMutableFileURI
|
from allmydata.interfaces import IMutableFileNode, IMutableFileURI
|
||||||
from allmydata.util import hashutil
|
from allmydata.util import hashutil
|
||||||
from allmydata.util.assertutil import precondition
|
from allmydata.util.assertutil import precondition
|
||||||
@ -237,7 +239,15 @@ class MutableFileNode:
|
|||||||
# MFN instance.
|
# MFN instance.
|
||||||
d = defer.Deferred()
|
d = defer.Deferred()
|
||||||
self._serializer.addCallback(lambda ignore: cb(*args, **kwargs))
|
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
|
return d
|
||||||
|
|
||||||
#################################
|
#################################
|
||||||
|
Loading…
x
Reference in New Issue
Block a user