tdb2: fix traversal bug in free list lock_and_alloc()
authorRusty Russell <rusty@rustcorp.com.au>
Fri, 25 Mar 2011 05:39:05 +0000 (16:09 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Fri, 25 Mar 2011 05:39:05 +0000 (16:09 +1030)
commit1444b09cd357c145b6e3fdb1bce3b6ace6862f56
tree2624fa3c044715a79d3c34910188bdec3fb18e07
parent4bde5a87c0df66d2000d972a2a0a9992a9d9396d
tdb2: fix traversal bug in free list lock_and_alloc()

We keep looking even if the current best is exactly right.  This is
really bad, because our smaller free lists hold exactly one size: with
this bug we iterate to the end of the list before hitting the end and
deciding we can use it after all.

Before:
$ ./speed --transaction --no-sync 2000000
Adding 2000000 records:  1179 ns (93594224 bytes)
Finding 2000000 records:  694 ns (93594224 bytes)
Missing 2000000 records:  429 ns (93594224 bytes)
Traversing 2000000 records:  519 ns (93594224 bytes)
Deleting 2000000 records:  896 ns (93594224 bytes)
Re-adding 2000000 records:  1129 ns (93594224 bytes)
Appending 2000000 records:  1713 ns (182801232 bytes)
Churning 2000000 records:  32612 ns (182801232 bytes)

After:
$ ./speed --transaction --no-sync 2000000
Adding 2000000 records:  1195 ns (93594224 bytes)
Finding 2000000 records:  719 ns (93594224 bytes)
Missing 2000000 records:  429 ns (93594224 bytes)
Traversing 2000000 records:  523 ns (93594224 bytes)
Deleting 2000000 records:  901 ns (93594224 bytes)
Re-adding 2000000 records:  1032 ns (93594224 bytes)
Appending 2000000 records:  1711 ns (182801232 bytes)
Churning 2000000 records:  3233 ns (182801232 bytes)
ccan/tdb2/free.c