Browse Source

tdb2: Move min size constant out where summary.c can see it.

Rusty Russell 15 years ago
parent
commit
8a462e5a66
2 changed files with 20 additions and 11 deletions
  1. 16 11
      ccan/tdb2/free.c
  2. 4 0
      ccan/tdb2/private.h

+ 16 - 11
ccan/tdb2/free.c

@@ -21,10 +21,6 @@
 #include <assert.h>
 #include <assert.h>
 #include <limits.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)
 static unsigned fls64(uint64_t val)
 {
 {
 #if HAVE_BUILTIN_CLZL
 #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;
 	unsigned int bucket;
 
 
 	/* We can't have records smaller than this. */
 	/* 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 {
 	} else {
 		/* After that we go power of 2. */
 		/* 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:
 again:
 	b_off = bucket_off(zone_off, bucket);
 	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. */
 	/* Lock this bucket. */
 	if (tdb_lock_free_bucket(tdb, b_off, TDB_LOCK_WAIT) == -1) {
 	if (tdb_lock_free_bucket(tdb, b_off, TDB_LOCK_WAIT) == -1) {
 		return TDB_OFF_ERR;
 		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;
 	tdb_off_t start_zone = tdb->zone_off, off;
 	bool wrapped = false;
 	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) {
 	while (!wrapped || tdb->zone_off != start_zone) {
 		tdb_off_t b;
 		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)
 	if (tdb->map_size != old_size)
 		goto success;
 		goto success;
 
 
+	/* FIXME: Tailer is a bogus optimization, remove it. */
 	/* zone bits tailer char is protected by EXPAND lock. */
 	/* zone bits tailer char is protected by EXPAND lock. */
 	if (tdb->methods->read(tdb, old_size - 1, &zone_bits, 1) == -1)
 	if (tdb->methods->read(tdb, old_size - 1, &zone_bits, 1) == -1)
 		goto fail;
 		goto fail;
@@ -593,6 +597,7 @@ static int tdb_expand(struct tdb_context *tdb, tdb_len_t size)
 	zhdr.zone_bits = zone_bits;
 	zhdr.zone_bits = zone_bits;
 	num_buckets = BUCKETS_FOR_ZONE(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)
 	if (tdb->methods->expand_file(tdb, 1ULL << zone_bits) == -1)
 		goto fail;
 		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. */
 	/* Overallocate if this is coming from an enlarging store. */
 	if (growing)
 	if (growing)

+ 4 - 0
ccan/tdb2/private.h

@@ -113,6 +113,10 @@ typedef uint64_t tdb_off_t;
 #define TDB_OFF_MASK \
 #define TDB_OFF_MASK \
 	(((1ULL << (64 - TDB_OFF_UPPER_STEAL)) - 1) - TDB_OFF_HASH_GROUP_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). */
 /* We ensure buckets up to size 1 << (zone_bits - TDB_COMFORT_FACTOR_BITS). */
 /* FIXME: test this matches size_to_bucket! */
 /* FIXME: test this matches size_to_bucket! */
 #define BUCKETS_FOR_ZONE(zone_bits) ((zone_bits) + 2 - TDB_COMFORT_FACTOR_BITS)
 #define BUCKETS_FOR_ZONE(zone_bits) ((zone_bits) + 2 - TDB_COMFORT_FACTOR_BITS)