[ZODB-Dev] AssertionError on multithread ZEO app

Pedro Werneck pedro.werneck at terra.com.br
Tue May 23 19:24:20 EDT 2006


Hi all


I'm writing a multithread app using ZODB/ZEO for persistence. The app
consists in a main app which start the connection with ZEO with
ClientStorage, launch several threads to gather, parse and fill the DB
with data from the network, and, just for testing purposes now, a loop
printing the data in the DB every 5 seconds. Each parser store its data
in a PersistentList in conn.dbroot() and commit the changes.

The problem is... I can't see the committed changes from the main
thread, unless I do a commit there too, which seems strange. Not only
that, but sometimes I get an assertion error on ZEO/cache.py.

This is the first time I'm using ZODB/ZEO for multithreaded app, so
maybe I'm doing something really stupid and did not notice.

Another problem not related to this is the size and how fast the DB
grows. I'm think this is related to undo features, so I would like to
know if it's possible to disable it or something else.

These are the relevant parts of my code. The code for commiting data on
each thread:

###
        for x in xrange(self._commit_attempts):
            try:
                del self.reg_db[:]
                self.reg_db.extend(regs)
                transaction.get().commit()
            except ConflictError, msg:
                self.logger.debug(
                    'ConflictError:%s pause a while and retry'%msg
                    )
                transaction.get().abort()
                time.sleep(0.5)
            else:
                logger.debug('Commited succesfully')
                return

        logger.critical('Commit failed')
###            

The test loop:

###
    while 1:
        for name, regs in dbroot.items():
            logger.debug("DB list for '%s' with %s regs"%(name,
len(regs)))
        time.sleep(5)

        # I only get updates with this commit here
        transaction.get().commit() 

###

This is the traceback for the assertion error (line 86 is the commit
mentioned above):

Traceback (most recent call last):
  File "test_runparsers.py", line 48, in ?
    main()
  File "../../runparsers.py", line 86, in main
    transaction.get().commit()
  File "/usr/lib/python2.4/site-packages/transaction/_transaction.py",
line 380, in commit
    self._saveCommitishError() # This raises!
  File "/usr/lib/python2.4/site-packages/transaction/_transaction.py",
line 378, in commit
    self._commitResources()
  File "/usr/lib/python2.4/site-packages/transaction/_transaction.py",
line 441, 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

And the traceback for the exception ocurred at the server when I get 
the assertion error on the app

Traceback (most recent call last):
  File "/usr/lib/python2.4/site-packages/ZEO/zrpc/connection.py", line
421, in handle_request
    ret = meth(*args)
  File "/usr/lib/python2.4/site-packages/ZEO/StorageServer.py", line
248, in loadEx
    return self.storage.loadEx(oid, version)
  File
"/usr/lib/python2.4/site-packages/ZODB/FileStorage/FileStorage.py", line
523, in loadEx
    pos = self._lookup_pos(oid)
  File
"/usr/lib/python2.4/site-packages/ZODB/FileStorage/FileStorage.py", line
514, in _lookup_pos
    raise POSKeyError(oid)
POSKeyError: 0x00


Thanks for any help

-- 
Pedro Werneck


More information about the ZODB-Dev mailing list