r9773: r11599@blu: tridge | 2005-08-30 11:55:57 +1000
authorAndrew Tridgell <tridge@samba.org>
Tue, 30 Aug 2005 01:51:36 +0000 (01:51 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:34:59 +0000 (13:34 -0500)
 optimise this case a bit more. The total speedup using non-indexed
 ldbtest is now around a factor of 80x. The code is ugly as hell, but
 I think this speed is worth it.

 Of course, if we only ever do indexed searches in ldb then this
 doesn't help, but it seems all too common that we get unindexable
 searches, so the optimisation is worthwhile
(This used to be commit 2e14fb893dd9815cdb2488c630131dc549e5c361)

source4/lib/tdb/common/tdb.c

index 8e8e3ce3b36c941623848a653d569729485e7444..d6861efe134b04e390875cd3205df844738ce049 100644 (file)
@@ -1276,14 +1276,22 @@ static int tdb_next_lock(TDB_CONTEXT *tdb, struct tdb_traverse_lock *tlock,
                   semantics don't change.
 
                   With a non-indexed ldb search this trick gains us a
-                  factor of more than 10 in speed on a linux 2.6.x
-                  system.
+                  factor of around 80 in speed on a linux 2.6.x
+                  system (testing using ldbtest).
                 */
                if (!tlock->off && tlock->hash != 0) {
                        u32 off;
-                       if (ofs_read(tdb, TDB_HASH_TOP(tlock->hash), &off) == 0 &&
-                           off == 0) {
-                               continue;
+                       if (tdb->map_ptr) {
+                               for (;tlock->hash < tdb->header.hash_size;tlock->hash++) {
+                                       if (0 != *(u32 *)(TDB_HASH_TOP(tlock->hash) + (unsigned char *)tdb->map_ptr)) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               if (ofs_read(tdb, TDB_HASH_TOP(tlock->hash), &off) == 0 &&
+                                   off == 0) {
+                                       continue;
+                               }
                        }
                }