summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-09-27 01:26:34 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:39:00 -0500
commit251aaafe3a9213118ac3a92def9ab2104c40d12a (patch)
treeb8f366f28924d5a095f37ae99a9e0eaac7217f56
parent691aff270bc2f0bfee0632d426e2f6ba06f69f89 (diff)
downloadsamba-251aaafe3a9213118ac3a92def9ab2104c40d12a.tar.gz
samba-251aaafe3a9213118ac3a92def9ab2104c40d12a.tar.bz2
samba-251aaafe3a9213118ac3a92def9ab2104c40d12a.zip
r10522: finally got the locking working on solaris10. This adds a read lock on
the transaction lock in tdb_traverse_read(). This prevents a pattern of locks which triggers the deadlock detection code in solaris10. I suspect solaris10 is trying to prevent lock starvation by granting locks in the order they were requested, which makes it much easier to produce deadlocks. (This used to be commit 54203aacd138c30826d54c5d9b6cc8d6e9e270f8)
-rw-r--r--source4/lib/tdb/common/traverse.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/source4/lib/tdb/common/traverse.c b/source4/lib/tdb/common/traverse.c
index 9271b75aa8..00fe5be923 100644
--- a/source4/lib/tdb/common/traverse.c
+++ b/source4/lib/tdb/common/traverse.c
@@ -205,9 +205,21 @@ int tdb_traverse_read(struct tdb_context *tdb,
{
struct tdb_traverse_lock tl = { NULL, 0, 0, F_RDLCK };
int ret;
+
+ /* we need to get a read lock on the transaction lock here to
+ cope with the lock ordering semantics of solaris10 */
+ if (tdb->methods->tdb_brlock(tdb, TRANSACTION_LOCK, F_RDLCK, F_SETLKW, 0) == -1) {
+ TDB_LOG((tdb, 0, "tdb_traverse_read: failed to get transaction lock\n"));
+ tdb->ecode = TDB_ERR_LOCK;
+ return -1;
+ }
+
tdb->traverse_read++;
ret = tdb_traverse_internal(tdb, fn, private, &tl);
tdb->traverse_read--;
+
+ tdb->methods->tdb_brlock(tdb, TRANSACTION_LOCK, F_UNLCK, F_SETLKW, 0);
+
return ret;
}