[ZODB-Dev] Recovering Corrupt Database part2

Jeremy Hylton jeremy@zope.com (Jeremy Hylton)
Mon, 4 Nov 2002 12:53:04 -0500


>>>>> "TZ" == tomasz  <tomasz@pucky.ods.org> writes:

  TZ> This is a follow up email that was sent out a week ago by my
  TZ> partner Cody Smith. it can be found at.

  TZ> http://lists.zope.org/pipermail/zodb-dev/2002-October/003476.html

  TZ> After multiple suggestions to upgrade to Zope-2.6 from
  TZ> Zope-2.3.2 we did so. We retrieved our backups and ran them
  TZ> through the fsrecover script with a "-p" and without it.

  TZ> When the script runs it throws multiple Version lock error.

The error is because of a Zope/ZODB version.  Zope is complaining that
it can't modify an object, because it is modified in a version.  Once
an object has been modified in a version, it can't be modified by
non-version users until the version is aborted or committed.

> ZODB.POSException.VersionLockError: 
> ("'\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x83'", 'content_cntrl')

This error shows the oid of the object that is locked and the name of
the version.  Does the name 'content_cntrl' sound familiar to you?
It was picked by a user of the site :-).

You may want to ask on zope-dev what else you can do.  It sounds like
the right thing to do is to abort the particular version, but I'm not
sure how to do that from Zope or how to get Zope to start while this
object is locked.

Maybe you could open the database and try this:

>>> db = ZODB.DB(fs)
>>> db.abortVersion('content_cntrl')
>>> get_transaction().commit()
>>> db.close()

I also wonder if you should worry about the drop in database size.  It
might be interesting to run fsrefs.py over the new database and see if
you've lost any objects.

Jeremy