Rev 685: merge tdb from ctdbd in http://samba.org/~tridge/3_0-ctdb

tridge at samba.org tridge at samba.org
Wed Jan 9 22:46:00 GMT 2008


------------------------------------------------------------
revno: 685
revision-id:tridge at samba.org-20080109224502-aj8ydjwefl6ycby3
parent: tridge at samba.org-20080108215329-dqml9el7jr69u975
committer: Andrew Tridgell <tridge at samba.org>
branch nick: s3-ctdb-tridge
timestamp: Thu 2008-01-10 09:45:02 +1100
message:
  merge tdb from ctdbd
modified:
  source/lib/tdb/common/freelist.c freelist.c-20070416112700-wu1jh7in2kvfbr2w-16
=== modified file 'source/lib/tdb/common/freelist.c'
--- a/source/lib/tdb/common/freelist.c	2008-01-08 21:52:16 +0000
+++ b/source/lib/tdb/common/freelist.c	2008-01-09 22:45:02 +0000
@@ -280,6 +280,7 @@
 		tdb_off_t rec_ptr, last_ptr;
 		tdb_len_t rec_len;
 	} bestfit;
+	float multiplier = 1.0;
 
 	if (tdb_lock(tdb, -1, F_WRLCK) == -1)
 		return 0;
@@ -314,13 +315,27 @@
 				bestfit.rec_len = rec->rec_len;
 				bestfit.rec_ptr = rec_ptr;
 				bestfit.last_ptr = last_ptr;
-				break;
 			}
 		}
 
 		/* move to the next record */
 		last_ptr = rec_ptr;
 		rec_ptr = rec->next;
+
+		/* if we've found a record that is big enough, then
+		   stop searching if its also not too big. The
+		   definition of 'too big' changes as we scan
+		   through */
+		if (bestfit.rec_len > 0 &&
+		    bestfit.rec_len < length * multiplier) {
+			break;
+		}
+		
+		/* this multiplier means we only extremely rarely
+		   search more than 50 or so records. At 50 records we
+		   accept records up to 11 times larger than what we
+		   want */
+		multiplier *= 1.05;
 	}
 
 	if (bestfit.rec_ptr != 0) {
@@ -357,9 +372,8 @@
 	}
 
 	ptr = FREELIST_TOP;
-	while (ptr != 0 && tdb_ofs_read(tdb, ptr, &ptr) == 0) {
+	while (tdb_ofs_read(tdb, ptr, &ptr) == 0 && ptr != 0) {
 		count++;
-		
 	}
 
 	tdb_unlock(tdb, -1, F_RDLCK);



More information about the samba-cvs mailing list