So I see ZEO clients here falling over all over the place under current 2.6 with:
2003-07-30T07:01:04 ERROR(200) ZEO uncaptured python exception, closing channel <ZEO.zrpc.asyncRPC connected '' at 0xc57198>
(exceptions.AttributeError:keys [/export/01/zope/dev_ekit/ZServer/medusa/asyncore.py|poll|94] [/export/01/zope/dev_ekit/ZServer/medusa/asyncore.py|handle_read_event|395] [/export/01/zope/dev_ekit/lib/python/ZEO/smac.py|handle_read|172] [/export/01/zope/dev_ekit/lib/python/ZEO/zrpc.py|message_input|282] [/export/01/zope/dev_ekit/lib/python/ZEO/ClientStorage.py|out_of_band_hook|191] [/export/01/zope/dev_ekit/lib/python/ZEO/Invalidator.py|end|126] [/export/01/zope/dev_ekit/lib/python/ZODB/DB.py|invalidate|318])
The relevant code in current 2.6 CVS:
if connection is not None: version=connection._version # Update modified in version cache # XXX must make this work with list or dict to backport to 2.6
for oid in oids.keys():
h=hash(oid)%131 o=self._miv_cache.get(h, None) if o is not None and o[0]==oid: del self._miv_cache[h]
(or http://cvs.zope.org/Zope/lib/python/ZODB/DB.py?annotate=1.43.6.4#316 )
The comment is correct. It _does_ need to work with a list or dict. It doesn't right now. If I'm _really_ _really_ lucky, I can have a ZEO client stay up for nearly half an hour before it hits this problem and falls over. The code was committed 2 months ago, as rev 1.43.6.3 "Backport atomic invalidations code."
This, to me, seems a showstopper for 2.6.2.
Anthony
Anthony Baxter wrote
So I see ZEO clients here falling over all over the place under current 2.6 with:
2003-07-30T07:01:04 ERROR(200) ZEO uncaptured python exception, closing channel <ZEO.zrpc.asyncRPC connected '' at 0xc57198>
(exceptions.AttributeError:keys [/export/01/zope/dev_ekit/ZServer/medusa/asyncore.py|poll|94] [/export/01/zope/dev_ekit/ZServer/medusa/asyncore.py|handle_read_event|395] [/export/01/zope/dev_ekit/lib/python/ZEO/smac.py|handle_read|172] [/export/01/zope/dev_ekit/lib/python/ZEO/zrpc.py|message_input|282] [/export/01/zope/dev_ekit/lib/python/ZEO/ClientStorage.py|out_of_band_hook|191] [/export/01/zope/dev_ekit/lib/python/ZEO/Invalidator.py|end|126] [/export/01/zope/dev_ekit/lib/python/ZODB/DB.py|invalidate|318])
For what it's worth, the following patch "makes it work" for me. RCS file: /export/00/cvsroot/Zope/lib/python/ZODB/DB.py,v retrieving revision 1.1.1.11 diff -u -r1.1.1.11 DB.py --- DB.py 2003/07/24 08:35:40 1.1.1.11 +++ DB.py 2003/07/30 08:57:02 @@ -315,6 +315,8 @@ version=connection._version # Update modified in version cache # XXX must make this work with list or dict to backport to 2.6 + if type(oids) is type(''): + oids = { oids: 1 } for oid in oids.keys(): h=hash(oid)%131 o=self._miv_cache.get(h, None)
Note that despite the comment, it's in fact getting passed a single oid as a string, not a dict or a list. I have no idea if there's _also_ code that might be passing a list, which will still be broken.
I'm not committing this to the CVS yet, because I'm not 100% positive it's the "correct" fix. It certainly _seems_ to be, and I've now got ZEO clients that actually work worth a damn...
Anthony
On Wed, 30 Jul 2003 17:21:51 +1000 Anthony Baxter anthony@interlink.com.au wrote:
So I see ZEO clients here falling over all over the place under current 2.6 with:
2003-07-30T07:01:04 ERROR(200) ZEO uncaptured python exception, closing channel <ZEO.zrpc.asyncRPC connected '' at 0xc57198>
. . [Explanation of problem snipped] .
This, to me, seems a showstopper for 2.6.2.
We've been running a ZEO client / ZEO server setup using Zope 2.6.2b2,3 and 4 and not encountered this problem.
Which ZEO version are you using?
--andy.
Jim and Andrew hit the nail on the head - excessive cleverness with vendor branches here meant that the ZEO directory had ZEO1 installed.
Updating it by hand to ZEO2 hasn't made all good and happy, though - the ZEO/start.py includes import ThreadedAsync.LoopCallback at the top of the file, but the sys.path magic that makes this available is inside the main() function. Moving the import to the line after the sys.path magic fixes this.
I'm now getting a failed import for ZODB.utils.oid_repr, which suggests that I'm going to need to update the ZODB installation here from the one that's in 2.6.2. :-/