tdb2: tdb_expand on empty database now tested.
[ccan] / ccan / tdb2 / check.c
index f005a48de317ee80890e7b0d187948c49e8c46be..ca5479b56d06fbf9650982a6c7b34325b11dc62e 100644 (file)
@@ -86,8 +86,8 @@ static bool check_header(struct tdb_context *tdb)
 static int off_cmp(const tdb_off_t *a, const tdb_off_t *b)
 {
        /* Can overflow an int. */
-       return a > b ? 1
-               : a < b ? -1
+       return *a > *b ? 1
+               : *a < *b ? -1
                : 0;
 }
 
@@ -187,7 +187,8 @@ static bool check_hash_list(struct tdb_context *tdb,
                num_nonzero++;
        }
 
-       if (num_found != num_used) {
+       /* free table and hash table are two of the used blocks. */
+       if (num_found != num_used - 2) {
                tdb->log(tdb, TDB_DEBUG_ERROR, tdb->log_priv,
                         "tdb_check: Not all entries are in hash\n");
                return false;
@@ -322,11 +323,10 @@ int tdb_check(struct tdb_context *tdb,
        size_t num_free = 0, num_used = 0;
        bool hash_found = false, free_found = false;
 
+       /* This always ensures the header is uptodate. */
        if (tdb_allrecord_lock(tdb, F_RDLCK, TDB_LOCK_WAIT, false) != 0)
                return -1;
 
-       update_header(tdb);
-
        if (!check_header(tdb))
                goto fail;
 
@@ -403,9 +403,9 @@ int tdb_check(struct tdb_context *tdb,
                goto fail;
 
        tdb_allrecord_unlock(tdb, F_RDLCK);
-       return true;
+       return 0;
 
 fail:
        tdb_allrecord_unlock(tdb, F_RDLCK);
-       return false;
+       return -1;
 }