Re: [ZODB-Dev] TypeError: ('object.__new__(SyncedLanguages) is not safe, use Persistence.Persistent.__new__()', ...
Le 31/12/10 04:08, Marius Gedminas a écrit : > On Fri, Dec 31, 2010 at 02:02:36AM +0100, Godefroid Chapelle wrote: >> I have been fighting all day to understand a bug with the unregistration >> of a utility from a local site. >> >> After unregistration, some instance is left in the _subscribers list of >> the utilities AdapterRegistry in my local site. > > Sounds like https://bugs.launchpad.net/zope.component/+bug/551049 > >> This avoids me to remove the code as it does leave a broken object. >> >> I have come to the conclusion that the code that first registered the >> utility is the culprit : the utility itself is not persistent. >> >> It seems that the utility instance is unserialized at least two times >> during unregistration, which leads (if I understand well) to two >> different objects in memory. >> >> This breaks the unsubscription algorithm that is based on object identity. > > Actually, half of it is based on identity, and half on equality; when > these disagree, you end up with inconsistent state. Yup > Your example is a good argument for making both halves use equality > rather than identity. > >> I naively tried to introduce the Persistent base class into the utility >> calss. When I try to access the utility instance again, I get the error >> mentioned in the subject of this mail : >> >> TypeError: ('object.__new__(SyncedLanguages) is not safe, use >> Persistence.Persistent.__new__()',> 0x1004297d0>, (> 'Products.LinguaPlone.vocabulary.SyncedLanguages'>,, None)) >> >> If I understand well, the a posteriori introduction of Persistent cannot >> happen alone. >> >> Can anyone tell me what I should do add to the class I try to make it >> actually persistent ? > > I think a more fruitful approach would be to fix the zope.component bug > and then unregister the utility in the normal way. Marius, did you already try to fix zope.component ? Is it because it is hard that you accepted the Won't fix ? Or because of lack of time ? > Alternatively, you could hack up a __new__ method to always return the > same instance, so you can unregister it cleanly before removing the > code. This will not work if you have more than one instance in the DB. Could that __new__ method insert Persistent as a base class if not present ? > Fixing up _subscribers directly is also a possible workaround, if you're > feeling brave. > > Marius Gedminas Thanks for your help. -- Godefroid Chapelle (aka __gotcha) http://bubblenet.be ___ For more information about ZODB, see the ZODB Wiki: http://www.zope.org/Wikis/ZODB/ ZODB-Dev mailing list - ZODB-Dev@zope.org https://mail.zope.org/mailman/listinfo/zodb-dev
Re: [ZODB-Dev] TypeError: ('object.__new__(SyncedLanguages) is not safe, use Persistence.Persistent.__new__()', ...
On Fri, Dec 31, 2010 at 02:02:36AM +0100, Godefroid Chapelle wrote: > I have been fighting all day to understand a bug with the unregistration > of a utility from a local site. > > After unregistration, some instance is left in the _subscribers list of > the utilities AdapterRegistry in my local site. Sounds like https://bugs.launchpad.net/zope.component/+bug/551049 > This avoids me to remove the code as it does leave a broken object. > > I have come to the conclusion that the code that first registered the > utility is the culprit : the utility itself is not persistent. > > It seems that the utility instance is unserialized at least two times > during unregistration, which leads (if I understand well) to two > different objects in memory. > > This breaks the unsubscription algorithm that is based on object identity. Actually, half of it is based on identity, and half on equality; when these disagree, you end up with inconsistent state. Your example is a good argument for making both halves use equality rather than identity. > I naively tried to introduce the Persistent base class into the utility > calss. When I try to access the utility instance again, I get the error > mentioned in the subject of this mail : > > TypeError: ('object.__new__(SyncedLanguages) is not safe, use > Persistence.Persistent.__new__()', 0x1004297d0>, ( 'Products.LinguaPlone.vocabulary.SyncedLanguages'>, , None)) > > If I understand well, the a posteriori introduction of Persistent cannot > happen alone. > > Can anyone tell me what I should do add to the class I try to make it > actually persistent ? I think a more fruitful approach would be to fix the zope.component bug and then unregister the utility in the normal way. Alternatively, you could hack up a __new__ method to always return the same instance, so you can unregister it cleanly before removing the code. This will not work if you have more than one instance in the DB. Fixing up _subscribers directly is also a possible workaround, if you're feeling brave. Marius Gedminas -- /* Intel provided a special instruction to clear the TS bit for people too cool * to use write_cr0() to do it. This "clts" instruction is faster, because all * the vowels have been optimized out. */ -- lguest source code signature.asc Description: Digital signature ___ For more information about ZODB, see the ZODB Wiki: http://www.zope.org/Wikis/ZODB/ ZODB-Dev mailing list - ZODB-Dev@zope.org https://mail.zope.org/mailman/listinfo/zodb-dev
Re: [ZODB-Dev] TypeError: ('object.__new__(SyncedLanguages) is not safe, use Persistence.Persistent.__new__()', ...
Le 31/12/10 02:02, Godefroid Chapelle a écrit : > Hi, > > I have been fighting all day to understand a bug with the unregistration > of a utility from a local site. > > After unregistration, some instance is left in the _subscribers list of > the utilities AdapterRegistry in my local site. > > This avoids me to remove the code as it does leave a broken object. > > I have come to the conclusion that the code that first registered the > utility is the culprit : the utility itself is not persistent. > > It seems that the utility instance is unserialized at least two times > during unregistration, which leads (if I understand well) to two > different objects in memory. > > This breaks the unsubscription algorithm that is based on object identity. > > I naively tried to introduce the Persistent base class into the utility > calss. When I try to access the utility instance again, I get the error > mentioned in the subject of this mail : > > TypeError: ('object.__new__(SyncedLanguages) is not safe, use > Persistence.Persistent.__new__()', 0x1004297d0>, ( 'Products.LinguaPlone.vocabulary.SyncedLanguages'>,, None)) > > If I understand well, the a posteriori introduction of Persistent cannot > happen alone. > > Can anyone tell me what I should do add to the class I try to make it > actually persistent ? Let's try to make an understandable question : Can anyone tell me what I should add to the class to make it actually persistent, while making the old instances unserializable ? > > PS: It is late here, I hope I have not told too many silly things -- Godefroid Chapelle (aka __gotcha) http://bubblenet.be ___ For more information about ZODB, see the ZODB Wiki: http://www.zope.org/Wikis/ZODB/ ZODB-Dev mailing list - ZODB-Dev@zope.org https://mail.zope.org/mailman/listinfo/zodb-dev
[ZODB-Dev] TypeError: ('object.__new__(SyncedLanguages) is not safe, use Persistence.Persistent.__new__()', ...
Hi, I have been fighting all day to understand a bug with the unregistration of a utility from a local site. After unregistration, some instance is left in the _subscribers list of the utilities AdapterRegistry in my local site. This avoids me to remove the code as it does leave a broken object. I have come to the conclusion that the code that first registered the utility is the culprit : the utility itself is not persistent. It seems that the utility instance is unserialized at least two times during unregistration, which leads (if I understand well) to two different objects in memory. This breaks the unsubscription algorithm that is based on object identity. I naively tried to introduce the Persistent base class into the utility calss. When I try to access the utility instance again, I get the error mentioned in the subject of this mail : TypeError: ('object.__new__(SyncedLanguages) is not safe, use Persistence.Persistent.__new__()', , (, , None)) If I understand well, the a posteriori introduction of Persistent cannot happen alone. Can anyone tell me what I should do add to the class I try to make it actually persistent ? PS: It is late here, I hope I have not told too many silly things -- Godefroid Chapelle (aka __gotcha) http://bubblenet.be ___ For more information about ZODB, see the ZODB Wiki: http://www.zope.org/Wikis/ZODB/ ZODB-Dev mailing list - ZODB-Dev@zope.org https://mail.zope.org/mailman/listinfo/zodb-dev