------------------------------------------------------------ revno: 705 revision-id:[EMAIL PROTECTED] parent: [EMAIL PROTECTED] committer: Andrew Tridgell <[EMAIL PROTECTED]> branch nick: tridge.kantana timestamp: Sat 2008-01-05 09:33:39 +1100 message: avoid write locks during delete checks in traversals modified: lib/tdb/common/tdb.c tdb.c-20070220022425-m1wibgjq7n5hahs6-9 lib/tdb/common/tdb_private.h tdb_private.h-20070220022425-m1wibgjq7n5hahs6-10 lib/tdb/common/traverse.c traverse.c-20070220022425-m1wibgjq7n5hahs6-12 === modified file 'lib/tdb/common/tdb.c' --- a/lib/tdb/common/tdb.c 2007-07-10 05:32:27 +0000 +++ b/lib/tdb/common/tdb.c 2008-01-04 22:33:39 +0000 @@ -243,7 +243,8 @@ if (tdb->read_only || tdb->traverse_read) return -1; - if (tdb_write_lock_record(tdb, rec_ptr) == -1) { + if (tdb->traverse_write != 0 || + tdb_write_lock_record(tdb, rec_ptr) == -1) { /* Someone traversing here: mark it as dead */ rec->magic = TDB_DEAD_MAGIC; return tdb_rec_write(tdb, rec_ptr, rec);
=== modified file 'lib/tdb/common/tdb_private.h' --- a/lib/tdb/common/tdb_private.h 2007-07-10 05:32:27 +0000 +++ b/lib/tdb/common/tdb_private.h 2008-01-04 22:33:39 +0000 @@ -151,6 +151,7 @@ tdb_len_t map_size; /* how much space has been mapped */ int read_only; /* opened read-only */ int traverse_read; /* read-only traversal */ + int traverse_write; /* read-write traversal */ struct tdb_lock_type global_lock; int num_lockrecs; struct tdb_lock_type *lockrecs; /* only real locks, all with count>0 */ === modified file 'lib/tdb/common/traverse.c' --- a/lib/tdb/common/traverse.c 2007-07-10 05:32:27 +0000 +++ b/lib/tdb/common/traverse.c 2008-01-04 22:33:39 +0000 @@ -238,7 +238,9 @@ return -1; } + tdb->traverse_write++; ret = tdb_traverse_internal(tdb, fn, private_data, &tl); + tdb->traverse_write--; tdb_transaction_unlock(tdb);