I'm pleased to announce the release of ZODB 3.2.6 beta 1.
You can download a source tarball or Windows installer from:
There are several critical bugfixes in this release, addressing rare
problems in two major areas:
- Thread and asyncore races while ZEO is attempting to make a
connection, leading to connection failure and/or missed messages.
- Rare cases in which FileStorage could reuse oids already assigned,
leading to distinct objects with the same oid (object identifier).
The primary cause was that FileStorage.restore() didn't update
the storage's idea of the largest oid in use, regardless of how
large an oid was passed to it. The first stage of ZRS recovery,
and copyTransactionsFrom(), both rely on the .restore() method,
and so both could create database copies that believed no oids
had yet been assigned. A secondary cause was that a FileStorage's
.index file contains a "maximum oid in the index" record, and the
value in this record was believed even when it was incorrect.
The primary cause was repaired by simple changes to .restore()
and .store(), so that .index files with a bad max-oid record are
no longer created. But there may be such databases already in
existence, so the secondary cause was addressed by larger changes
to ignore the max-oid record in the .index file, extracting the
largest oid directly from the index instead (this is basically a
BTree mapping oids to file offsets, so finding the largest key is
very efficient; the separate max-oid record is really a leftover
from earlier times, before a BTree was used here).
Note that although ZODB 3.2.6 ignores an .index file's max-oid
record, it still writes a max-oid record when it saves an .index
file. This is so older ZODB releases can continue to read .index
files produced by ZODB 3.2.6.
See the news file for details:
ZODB 3.2.6 can be used with Zopes in the 2.7 line, at or after Zope 2.7.3.
Note that ZODB 3.2.6 does not support development on Zope 2.8, Zope X3 or
Zope 3 (they require the ZODB 3.3 line).