Browse Source

tdb2: copy tdb1's changed expansion logic.

TDB2 uses the same expansion logic as TDB1, which got factored out
recently.  So update TDB2 to match.
Rusty Russell 14 years ago
parent
commit
c438ec17d7
3 changed files with 40 additions and 27 deletions
  1. 31 24
      ccan/tdb2/free.c
  2. 3 0
      ccan/tdb2/private.h
  3. 6 3
      ccan/tdb2/transaction.c

+ 31 - 24
ccan/tdb2/free.c

@@ -876,10 +876,38 @@ enum TDB_ERROR set_header(struct tdb_context *tdb,
 	return TDB_SUCCESS;
 	return TDB_SUCCESS;
 }
 }
 
 
+/* You need 'size', this tells you how much you should expand by. */
+tdb_off_t tdb_expand_adjust(tdb_off_t map_size, tdb_off_t size)
+{
+	tdb_off_t new_size, top_size;
+
+	/* limit size in order to avoid using up huge amounts of memory for
+	 * in memory tdbs if an oddball huge record creeps in */
+	if (size > 100 * 1024) {
+		top_size = map_size + size * 2;
+	} else {
+		top_size = map_size + size * 100;
+	}
+
+	/* always make room for at least top_size more records, and at
+	   least 25% more space. if the DB is smaller than 100MiB,
+	   otherwise grow it by 10% only. */
+	if (map_size > 100 * 1024 * 1024) {
+		new_size = map_size * 1.10;
+	} else {
+		new_size = map_size * 1.25;
+	}
+
+	/* Round the database up to a multiple of the page size */
+	if (new_size < top_size)
+		new_size = top_size;
+	return new_size - map_size;
+}
+
 /* Expand the database. */
 /* Expand the database. */
 static enum TDB_ERROR tdb_expand(struct tdb_context *tdb, tdb_len_t size)
 static enum TDB_ERROR tdb_expand(struct tdb_context *tdb, tdb_len_t size)
 {
 {
-	uint64_t old_size, rec_size, map_size;
+	uint64_t old_size;
 	tdb_len_t wanted;
 	tdb_len_t wanted;
 	enum TDB_ERROR ecode;
 	enum TDB_ERROR ecode;
 
 
@@ -904,29 +932,8 @@ static enum TDB_ERROR tdb_expand(struct tdb_context *tdb, tdb_len_t size)
 		return TDB_SUCCESS;
 		return TDB_SUCCESS;
 	}
 	}
 
 
-	/* limit size in order to avoid using up huge amounts of memory for
-	 * in memory tdbs if an oddball huge record creeps in */
-	if (size > 100 * 1024) {
-		rec_size = size * 2;
-	} else {
-		rec_size = size * 100;
-	}
-
-	/* always make room for at least rec_size more records, and at
-	   least 25% more space. if the DB is smaller than 100MiB,
-	   otherwise grow it by 10% only. */
-	if (old_size > 100 * 1024 * 1024) {
-		map_size = old_size / 10;
-	} else {
-		map_size = old_size / 4;
-	}
-
-	if (map_size > rec_size) {
-		wanted = map_size;
-	} else {
-		wanted = rec_size;
-	}
-
+	/* Overallocate. */
+	wanted = tdb_expand_adjust(old_size, size);
 	/* We need room for the record header too. */
 	/* We need room for the record header too. */
 	wanted = adjust_size(0, sizeof(struct tdb_used_record) + wanted);
 	wanted = adjust_size(0, sizeof(struct tdb_used_record) + wanted);
 
 

+ 3 - 0
ccan/tdb2/private.h

@@ -425,6 +425,9 @@ tdb_off_t bucket_off(tdb_off_t ftable_off, unsigned bucket);
 /* Used by tdb_summary */
 /* Used by tdb_summary */
 tdb_off_t dead_space(struct tdb_context *tdb, tdb_off_t off);
 tdb_off_t dead_space(struct tdb_context *tdb, tdb_off_t off);
 
 
+/* Adjust expansion, used by create_recovery_area */
+tdb_off_t tdb_expand_adjust(tdb_off_t map_size, tdb_off_t size);
+
 /* io.c: */
 /* io.c: */
 /* Initialize tdb->methods. */
 /* Initialize tdb->methods. */
 void tdb_io_init(struct tdb_context *tdb);
 void tdb_io_init(struct tdb_context *tdb);

+ 6 - 3
ccan/tdb2/transaction.c

@@ -836,10 +836,13 @@ static tdb_off_t create_recovery_area(struct tdb_context *tdb,
 
 
 	/* round up to a multiple of page size. Overallocate, since each
 	/* round up to a multiple of page size. Overallocate, since each
 	 * such allocation forces us to expand the file. */
 	 * such allocation forces us to expand the file. */
-	rec->max_len
-		= (((sizeof(*rec) + rec_length + rec_length / 2)
-		    + PAGESIZE-1) & ~(PAGESIZE-1))
+	rec->max_len = tdb_expand_adjust(tdb->file->map_size, rec_length);
+
+	/* Round up to a page. */
+	rec->max_len = ((sizeof(*rec) + rec->max_len + PAGESIZE-1)
+			& ~(PAGESIZE-1))
 		- sizeof(*rec);
 		- sizeof(*rec);
+
 	off = tdb->file->map_size;
 	off = tdb->file->map_size;
 
 
 	/* Restore ->map_size before calling underlying expand_file.
 	/* Restore ->map_size before calling underlying expand_file.