Import from SAMBA tdb:
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 29 Jul 2009 23:20:38 +0000 (08:50 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Wed, 29 Jul 2009 23:20:38 +0000 (08:50 +0930)
commit a6cc04a20089e8fbcce138c271961c37ddcd6c34
Author: Andrew Tridgell <tridge@samba.org>
Date:   Mon Jun 1 13:13:07 2009 +1000

    overallocate all records by 25%

    This greatly reduces the fragmentation of databases where records
    tend to grow slowly by a small amount each time. The case where this
    is most seen is the ldb index records. Adding this overallocation
    reduced the size of the resulting database by more than 20x when
    running a test that adds 10k users.

ccan/tdb/freelist.c

index 2f2a4c379b0690399a9f4065b15960e667300bf0..3bc3965141b605ba5ad62f918e156e9deece9aed 100644 (file)
@@ -284,6 +284,9 @@ tdb_off_t tdb_allocate(struct tdb_context *tdb, tdb_len_t length, struct list_st
        if (tdb_lock(tdb, -1, F_WRLCK) == -1)
                return 0;
 
+       /* over-allocate to reduce fragmentation */
+       length *= 1.25;
+
        /* Extra bytes required for tailer */
        length += sizeof(tdb_off_t);
        length = TDB_ALIGN(length, TDB_ALIGNMENT);