I have recently upgraded from ZODB 3.2 to 3.5.1. After doing this I notice that ZEO throws exceptions on commiting a transaction for certain types of Persistent classes.

Here is the traceback.

File "/usr/lib/python2.4/site-packages/transaction/_transaction.py", line 389, in commit
    self._saveCommitishError() # This raises!
File "/usr/lib/python2.4/site-packages/transaction/_transaction.py", line 387, in commit
    self._commitResources()
File "/usr/lib/python2.4/site-packages/transaction/_transaction.py", line 440, in _commitResources
    rm.tpc_finish(self)
File "/usr/lib/python2.4/site-packages/ZODB/Connection.py", line 679, in tpc_finish
    self._storage.tpc_finish(transaction, callback)
File "/usr/lib/python2.4/site-packages/ZEO/ClientStorage.py", line 974, in tpc_finish
    self._update_cache(tid)
File "/usr/lib/python2.4/site-packages/ZEO/ClientStorage.py", line 999, in _update_cache
    self._cache.invalidate(oid, version, tid)
File "/usr/lib/python2.4/site-packages/ZEO/cache.py", line 367, in invalidate
    assert tid is not None and cur_tid < tid
AssertionError

I narrowed it down to the problem occuring when I set instance variables in __getstate__ (called on commit) on a newly created persistent instance.

This only happens when I am using ZEO (ClientStorage) and not when using ZODB (FileStorage).

The reason I have chosen to override __getstate__ is to update the Persistent instance with the current username (which I store on the transaction when I open the connection) and a timestamp so that the instance knows when it was modified last and which user did it.

The new beforeCommitHook seems to be suited for this kind of work, but it doesn't give access to the changed objects in the transaction.
_______________________________________________
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zodb-dev

Reply via email to