[ZODB-Dev] ReadConflictErrors with ZODB3.10.1 and Relstorage 1.4.1
Jürgen Herrmann
Juergen.Herrmann at XLhost.de
Wed Jan 26 07:29:59 EST 2011
i everybody!
About a week ago i migrated our FileStorages to Relstorage instances.
We have 5 databases, 4 of them mounted via ZodbMountPoints in a plain
zope 2.13 installation.
Since the migration i experience sporadic ReadConflictErrors (they
occur about 1-4 hours after restarting the zope daemon).
These ReadConflictErrors are not resolved by the ZPlublisher retries,
instead all of them finally hit the SiteErrorLog after 3 retries.
Here's a traceback of such an exception (the final one):
2011-01-26T12:55:59 ERROR Zope.SiteErrorLog 1296042959.440.268001912558
https://new.xlhost.de:456/InstanceEditor/index_html
Traceback (innermost last):
Module Zope2.App.startup, line 197, in __call__
Module ZPublisher.Publish, line 134, in publish
Module Zope2.App.startup, line 301, in commit
Module transaction._manager, line 95, in commit
Module transaction._transaction, line 329, in commit
Module transaction._transaction, line 443, in _commitResources
Module ZODB.Connection, line 599, in commit
ReadConflictError: database read conflict error (oid 0xfd19b5, serial
this
txn started with 0x038bd509f31cdf33 2011-01-25 10:49:56.979558, serial
currently co mmitted 0x038bdad75eed2344 2011-01-26 11:35:22.248356)
Please note that actually with plain ZODB 3.10.1 it's Connection.py
line 570, but i added some logging code there for debugging purposes.
It took me ages to find the cause for that problem and i think i found
it by now, but not what causes this. The cause for the
ReadConflictErrors
is that the connection object has the oid 0xfd19b5 in it's _readCurrent
dict and never throws it out. the concerned transaction above i'm
pretty
sure never read that object with oid 0xfd19b5, so either it's wrongly
added to _readCurrent or (much more likely imho) it never gets removed
from _readCurrent though it should.
if i execute the following code in the debugger, the readconflicts
concerning that oid are gone (please note that this happens in a new
request, so i'm operating on the reused Connection object. _readCurrent
is obviously reused and not cleared at transaction boundaries, is that
expected?):
from ZODB.utils import p64, u64
del object._p_jar._readCurrent[p64(0xfd19b5)]
import transaction; transaction.commit()
I'm sorry I cannot give you a minimal example to reproduce this error.
That's also what makes it so difficult to debug, it's not reproduceable
or at least i don't know how to provoke those errors yet.
Does anybody have a clue what's going on here, any pointers in which
direction to look next?`
Best regards,
Jürgen
--
>> XLhost.de ® - Webspace von supersmall bis eXtra Large <<
XLhost.de GmbH
Jürgen Herrmann, Geschäftsführer
Boelckestrasse 21, 93051 Regensburg, Germany
Geschäftsführer: Jürgen Herrmann
Registriert unter: HRB9918
Umsatzsteuer-Identifikationsnummer: DE245931218
Fon: +49 (0)800 XLHOSTDE [0800 95467833]
Fax: +49 (0)800 95467830
Web: http://www.XLhost.de
More information about the ZODB-Dev
mailing list