Out official bug tracker is at https://twistedmatrix.com/trac/newticket — if you could file it there it would be great. (Github login required.)
Thanks! > On Dec 16, 2020, at 2:21 AM, Jasper Phillips <jasperisja...@gmail.com> wrote: > > > > >> On Fri, Dec 11, 2020 at 6:08 AM Jean-Paul Calderone >> <exar...@twistedmatrix.com> wrote: >>> On Fri, Dec 11, 2020 at 8:19 AM Jasper Phillips <jasperisja...@gmail.com> >>> wrote: >> >>> I'm using perspective broker to transfer objects in a networked game, which >>> I'm having trouble unjellying -- the remote versions wind up with dangling >>> twisted.persisted.crefutil._Dereference instances, so don't match the >>> original objects. >>> >>> I'm seeing this for objects that have circular references to each other. >>> I've refactored things to mostly avoid circular references and sidestep >>> this, but have one remaining case where I find circular references mean >>> clearer code that I'm reluctant to refactor. >>> >>> Is there some trick I'm missing to avoid _Dereferences? >> >> No, it's supposed to Just Work™ so you've found a bug in some part of the >> implementation. If you can produce a minimal reproducing example then it >> may be worth a bug report. But after that, I'd suggest investigating HTTP >> or AMP as a replacement for PB. > > Here's a test case demonstrating the bug: > > import sys > from twisted.persisted.crefutil import _Dereference > from twisted.spread import pb, jelly > > class RemoteCopyable( pb.Copyable, pb.RemoteCopy ): pass > jelly.globalSecurity.allowInstancesOf( RemoteCopyable ) > pb.setCopierForClassTree( sys.modules[__name__], pb.Copyable ) > > if __name__ == '__main__': > # circular object ref > cell = RemoteCopyable() > cell.link = RemoteCopyable() > cell.link.cell = cell > > # Mimic sending across network > broker = pb.Broker() > serializedCell = broker.serialize( cell ) > remoteCell = broker.unserialize( serializedCell ) > > print( _Dereference is type(remoteCell.link.cell) ) > > This bug stems from twisted.spread.flavors.RemoteCopy.setCopyableState(), > which works fine for Python 2! But the UTF fix for Python 3 broke circular > references. It looks like this: > > def setCopyableState(self, state): > if _PY3: > state = {x.decode('utf8') if isinstance(x, bytes) > else x:y for x,y in state.items()} > self.__dict__ = state > > Here is a simple tweak that fixes the problem: > > def setCopyableState(self, state): > if _PY3: > for x, y in list(state.items()): > if isinstance(x, bytes): > del state[x] > state[x.decode('utf8')] = y > self.__dict__ = state > > > Basically the reference unwinding that takes place in > twisted.spread.jelly._Unjellier._unjelly_reference()'s call to > ref.resolveDependants() relies upon setCopyableStates()'s passed in state > being used directly, such that all matching references' __dict__ point to the > same object. > > Hope this helps clarify. Is there some more formal location than this list > that you'd like a bug report filed? > _______________________________________________ > Twisted-Python mailing list > Twisted-Python@twistedmatrix.com > https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python