Attempt to fix bug 5684
authorVolker Lendecke <vl@samba.org>
Tue, 12 Aug 2008 20:31:52 +0000 (22:31 +0200)
committerStefan Metzmacher <metze@samba.org>
Sun, 14 Sep 2008 17:19:45 +0000 (19:19 +0200)
With the ctdb checkin dde9f3f006 tdb optimized out write lock checks for
write-enabled transaction. Sadly, this also removed the possibility to ever
remove dead records left over from tdb_delete calls within a transaction.

Tridge, please check this! Did dde9f3f006 have any reason beyond performance
optimizations?

Thanks,

Volker
(cherry picked from commit 3f884c4ae36f3260e63626bdd4989d9258ae6497)

source/lib/tdb/common/tdb.c

index 767452c9b34b520a51bed6aace888b3f5b2dcd4f..c7cec297f6cd0c5c27d81067b4a84a5224dd36ad 100644 (file)
@@ -243,7 +243,7 @@ int tdb_do_delete(struct tdb_context *tdb, tdb_off_t rec_ptr, struct list_struct
 
        if (tdb->read_only || tdb->traverse_read) return -1;
 
-       if (tdb->traverse_write != 0 || 
+       if (((tdb->traverse_write != 0) && (!TDB_DEAD(rec))) ||
            tdb_write_lock_record(tdb, rec_ptr) == -1) {
                /* Someone traversing here: mark it as dead */
                rec->magic = TDB_DEAD_MAGIC;