[ZODB-Dev] RelStorage, history-free, pack causes POSKeyError with BTreeFolder2

Shane Hathaway shane at hathawaymix.org
Fri Jan 28 19:40:55 EST 2011


On 01/28/2011 05:34 AM, Chris Withers wrote:
> bin/generate --zap --folder_depth 3
>
> Leave it running for a minute or two, and then in another do:
>
> bin/zodbpack pack.conf

Thanks to this test, I found a serious flaw in the history-free variant 
of packing.  Currently, the history-free and history-preserving variants 
share the fill_object_refs() method, which assumes that it's possible to 
enumerate the references from all objects in a specific transaction. 
However, that assumption is only correct in the history-preserving 
variant.  In history-free storages, object states disappear every time 
they are replaced by a newer version, causing fill_object_refs() to 
think the replaced objects have no references.  That mistake leads to 
garbage collection of too many objects.

I'm surprised that existing tests did not reveal this.  Until I release 
a fix, I recommend not packing history-free databases.

Shane


More information about the ZODB-Dev mailing list