tdbtool: Use tdb_wipe_all in "erase" command
authorVolker Lendecke <vl@samba.org>
Tue, 10 Apr 2018 14:58:46 +0000 (16:58 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 10 Apr 2018 23:06:39 +0000 (01:06 +0200)
This is a lot quicker on large, fragmented databases. tdb_delete can
leave the freelist in a fragmented mess.

Also, it's a lot more robust: I've got a 4GB tdb file that was affected
by the problem fixed with c7211882a79. These databases have large space
at the end that is not part of any record or freelist
entry. tdb_wipe_all converts this space into a freelist entry. One
downside is that with those broken databases (which should not happen
after c7211882a79) have unallocated blocks in their file range after
this operation.

I think the speed advantage outweighs this disadvantage.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
lib/tdb/tools/tdbtool.c

index d8bacdb61b8d31658530d8d4a5e9f85ebbf356b0..3e9d154ae404b8440263f51a36f04fff4799332b 100644 (file)
@@ -647,12 +647,6 @@ static char *tdb_getline(const char *prompt)
        return p?thisline:NULL;
 }
 
-static int do_delete_fn(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf,
-                     void *state)
-{
-    return tdb_delete(the_tdb, key);
-}
-
 static void first_record(TDB_CONTEXT *the_tdb, TDB_DATA *pkey)
 {
        TDB_DATA dbuf;
@@ -758,7 +752,7 @@ static int do_command(void)
                        return 0;
                case CMD_ERASE:
                        bIterate = 0;
-                       tdb_traverse(tdb, do_delete_fn, NULL);
+                       tdb_wipe_all(tdb);
                        return 0;
                case CMD_DUMP:
                        bIterate = 0;