Rev 705: avoid write locks during delete checks in traversals in http://samba.org/~tridge/ctdb

tridge at samba.org tridge at samba.org
Fri Jan 4 22:33:40 GMT 2008


------------------------------------------------------------
revno: 705
revision-id:tridge at samba.org-20080104223339-gjw04c0b1z5pg2nl
parent: tridge at samba.org-20080104223229-zke9l0r9nc5mecyy
committer: Andrew Tridgell <tridge at samba.org>
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);
 



More information about the samba-cvs mailing list