]> git.ozlabs.org Git - ccan/commitdiff
tdb2: Move min size constant out where summary.c can see it.
authorRusty Russell <rusty@rustcorp.com.au>
Sat, 25 Sep 2010 04:29:00 +0000 (13:59 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Sat, 25 Sep 2010 04:29:00 +0000 (13:59 +0930)
ccan/tdb2/free.c
ccan/tdb2/private.h

index 361171902680ece2441e698a3b960df6ddb781de..5284510a07fbdfd3aa5341360c29448e3eb9f183 100644 (file)
 #include <assert.h>
 #include <limits.h>
 
 #include <assert.h>
 #include <limits.h>
 
-/* We have to be able to fit a free record here. */
-#define MIN_DATA_LEN   \
-       (sizeof(struct tdb_free_record) - sizeof(struct tdb_used_record))
-
 static unsigned fls64(uint64_t val)
 {
 #if HAVE_BUILTIN_CLZL
 static unsigned fls64(uint64_t val)
 {
 #if HAVE_BUILTIN_CLZL
@@ -73,15 +69,15 @@ unsigned int size_to_bucket(unsigned int zone_bits, tdb_len_t data_len)
        unsigned int bucket;
 
        /* We can't have records smaller than this. */
        unsigned int bucket;
 
        /* We can't have records smaller than this. */
-       assert(data_len >= MIN_DATA_LEN);
+       assert(data_len >= TDB_MIN_DATA_LEN);
 
        /* Ignoring the header... */
 
        /* Ignoring the header... */
-       if (data_len - MIN_DATA_LEN <= 64) {
-               /* 0 in bucket 0, 8 in bucket 1... 64 in bucket 6. */
-               bucket = (data_len - MIN_DATA_LEN) / 8;
+       if (data_len - TDB_MIN_DATA_LEN <= 64) {
+               /* 0 in bucket 0, 8 in bucket 1... 64 in bucket 8. */
+               bucket = (data_len - TDB_MIN_DATA_LEN) / 8;
        } else {
                /* After that we go power of 2. */
        } else {
                /* After that we go power of 2. */
-               bucket = fls64(data_len - MIN_DATA_LEN) + 2;
+               bucket = fls64(data_len - TDB_MIN_DATA_LEN) + 2;
        }
 
        if (unlikely(bucket > BUCKETS_FOR_ZONE(zone_bits)))
        }
 
        if (unlikely(bucket > BUCKETS_FOR_ZONE(zone_bits)))
@@ -369,6 +365,9 @@ static tdb_off_t lock_and_alloc(struct tdb_context *tdb,
 again:
        b_off = bucket_off(zone_off, bucket);
 
 again:
        b_off = bucket_off(zone_off, bucket);
 
+       /* FIXME: Try non-blocking wait first, to measure contention.
+        * If we're contented, try switching zones, and don't enlarge zone
+        * next time (we want more zones). */
        /* Lock this bucket. */
        if (tdb_lock_free_bucket(tdb, b_off, TDB_LOCK_WAIT) == -1) {
                return TDB_OFF_ERR;
        /* Lock this bucket. */
        if (tdb_lock_free_bucket(tdb, b_off, TDB_LOCK_WAIT) == -1) {
                return TDB_OFF_ERR;
@@ -463,6 +462,10 @@ static tdb_off_t get_free(struct tdb_context *tdb, size_t size,
        tdb_off_t start_zone = tdb->zone_off, off;
        bool wrapped = false;
 
        tdb_off_t start_zone = tdb->zone_off, off;
        bool wrapped = false;
 
+       /* FIXME: If we don't get a hit in the first bucket we want,
+        * try changing zones for next time.  That should help wear
+        * zones evenly, so we don't need to search all of them before
+        * expanding. */
        while (!wrapped || tdb->zone_off != start_zone) {
                tdb_off_t b;
 
        while (!wrapped || tdb->zone_off != start_zone) {
                tdb_off_t b;
 
@@ -567,6 +570,7 @@ static int tdb_expand(struct tdb_context *tdb, tdb_len_t size)
        if (tdb->map_size != old_size)
                goto success;
 
        if (tdb->map_size != old_size)
                goto success;
 
+       /* FIXME: Tailer is a bogus optimization, remove it. */
        /* zone bits tailer char is protected by EXPAND lock. */
        if (tdb->methods->read(tdb, old_size - 1, &zone_bits, 1) == -1)
                goto fail;
        /* zone bits tailer char is protected by EXPAND lock. */
        if (tdb->methods->read(tdb, old_size - 1, &zone_bits, 1) == -1)
                goto fail;
@@ -593,6 +597,7 @@ static int tdb_expand(struct tdb_context *tdb, tdb_len_t size)
        zhdr.zone_bits = zone_bits;
        num_buckets = BUCKETS_FOR_ZONE(zone_bits);
 
        zhdr.zone_bits = zone_bits;
        num_buckets = BUCKETS_FOR_ZONE(zone_bits);
 
+       /* FIXME: I don't think we need to expand to full zone, do we? */
        if (tdb->methods->expand_file(tdb, 1ULL << zone_bits) == -1)
                goto fail;
 
        if (tdb->methods->expand_file(tdb, 1ULL << zone_bits) == -1)
                goto fail;
 
@@ -632,8 +637,8 @@ static tdb_len_t adjust_size(size_t keylen, size_t datalen, bool growing)
 {
        tdb_len_t size = keylen + datalen;
 
 {
        tdb_len_t size = keylen + datalen;
 
-       if (size < MIN_DATA_LEN)
-               size = MIN_DATA_LEN;
+       if (size < TDB_MIN_DATA_LEN)
+               size = TDB_MIN_DATA_LEN;
 
        /* Overallocate if this is coming from an enlarging store. */
        if (growing)
 
        /* Overallocate if this is coming from an enlarging store. */
        if (growing)
index 19d7866d2512275ac1ea752691ea3c0a9cf4e995..c0377363c6ac14a705868f5c74beca86f213ff84 100644 (file)
@@ -113,6 +113,10 @@ typedef uint64_t tdb_off_t;
 #define TDB_OFF_MASK \
        (((1ULL << (64 - TDB_OFF_UPPER_STEAL)) - 1) - TDB_OFF_HASH_GROUP_MASK)
 
 #define TDB_OFF_MASK \
        (((1ULL << (64 - TDB_OFF_UPPER_STEAL)) - 1) - TDB_OFF_HASH_GROUP_MASK)
 
+/* We have to be able to fit a free record here. */
+#define TDB_MIN_DATA_LEN       \
+       (sizeof(struct tdb_free_record) - sizeof(struct tdb_used_record))
+
 /* We ensure buckets up to size 1 << (zone_bits - TDB_COMFORT_FACTOR_BITS). */
 /* FIXME: test this matches size_to_bucket! */
 #define BUCKETS_FOR_ZONE(zone_bits) ((zone_bits) + 2 - TDB_COMFORT_FACTOR_BITS)
 /* We ensure buckets up to size 1 << (zone_bits - TDB_COMFORT_FACTOR_BITS). */
 /* FIXME: test this matches size_to_bucket! */
 #define BUCKETS_FOR_ZONE(zone_bits) ((zone_bits) + 2 - TDB_COMFORT_FACTOR_BITS)