svn commit: samba r20946 - in branches/SAMBA_4_0/source/cluster/ctdb: .

tridge at samba.org tridge at samba.org
Mon Jan 22 11:45:49 GMT 2007


Author: tridge
Date: 2007-01-22 11:45:48 +0000 (Mon, 22 Jan 2007)
New Revision: 20946

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=20946

Log:

fixed another couple of bugs in the brlock ctdb backend. It now
survives very long random locktest runs.

Modified:
   branches/SAMBA_4_0/source/cluster/ctdb/brlock_ctdb.c


Changeset:
Modified: branches/SAMBA_4_0/source/cluster/ctdb/brlock_ctdb.c
===================================================================
--- branches/SAMBA_4_0/source/cluster/ctdb/brlock_ctdb.c	2007-01-22 09:35:26 UTC (rev 20945)
+++ branches/SAMBA_4_0/source/cluster/ctdb/brlock_ctdb.c	2007-01-22 11:45:48 UTC (rev 20946)
@@ -81,6 +81,23 @@
 	struct lock_struct last_lock;
 };
 
+#if 0
+static void show_locks(const char *op, struct lock_struct *locks, int count)
+{
+	int i;
+	DEBUG(0,("OP: %s\n", op));
+	for (i=0;i<count;i++) {
+		DEBUG(0,("%2d: %4d %4d %d.%d.%d %p %p\n",
+			 i, (int)locks[i].start, (int)locks[i].size, 
+			 locks[i].context.server.node,
+			 locks[i].context.server.id,
+			 locks[i].context.smbpid,
+			 locks[i].context.ctx,
+			 locks[i].ntvfs));
+	}
+}
+#endif
+
 /*
   Open up the brlock.tdb database. Close it down using
   talloc_free(). We need the messaging_ctx to allow for
@@ -472,7 +489,7 @@
 	struct ctdb_unlock_req *req = (struct ctdb_unlock_req *)call->call_data->dptr;
 	TDB_DATA dbuf;
 	int count, i;
-	struct lock_struct *locks;
+	struct lock_struct *locks, *lock;
 	struct lock_context context;
 	NTSTATUS status = NT_STATUS_OK;
 
@@ -487,38 +504,53 @@
 	count = dbuf.dsize / sizeof(*locks);
 
 	for (i=0; i<count; i++) {
-		struct lock_struct *lock = &locks[i];
-		
+		lock = &locks[i];
 		if (brl_ctdb_same_context(&lock->context, &context) &&
 		    lock->ntvfs == req->ntvfs &&
 		    lock->start == req->start &&
 		    lock->size == req->size &&
+		    lock->lock_type == WRITE_LOCK) {
+			break;
+		}
+	}
+	if (i < count) goto found;
+
+	for (i=0; i<count; i++) {
+		lock = &locks[i];
+		if (brl_ctdb_same_context(&lock->context, &context) &&
+		    lock->ntvfs == req->ntvfs &&
+		    lock->start == req->start &&
+		    lock->size == req->size &&
 		    lock->lock_type < PENDING_READ_LOCK) {
+			break;
+		}
+	}
+
+found:
+	if (i < count) {
 #if ENABLE_NOTIFIES
-			struct lock_struct removed_lock = *lock;
+		struct lock_struct removed_lock = *lock;
 #endif
 
-			call->new_data = talloc(call, TDB_DATA);
-			if (call->new_data == NULL) {
-				return CTDB_ERR_NOMEM;
-			}
-
-			call->new_data->dptr = talloc_size(call, dbuf.dsize - sizeof(lock));
-			if (call->new_data->dptr == NULL) {
-				return CTDB_ERR_NOMEM;
-			}
-			call->new_data->dsize = dbuf.dsize - sizeof(lock);
-
-			memcpy(call->new_data->dptr, locks, i*sizeof(lock));
-			memcpy(call->new_data->dptr+i*sizeof(lock), locks+i+1,
-			       (count-(i+1))*sizeof(lock));
-			
-			if (count > 1) {
+		call->new_data = talloc(call, TDB_DATA);
+		if (call->new_data == NULL) {
+			return CTDB_ERR_NOMEM;
+		}
+		
+		call->new_data->dptr = talloc_size(call, dbuf.dsize - sizeof(*lock));
+		if (call->new_data->dptr == NULL) {
+			return CTDB_ERR_NOMEM;
+		}
+		call->new_data->dsize = dbuf.dsize - sizeof(*lock);
+		
+		memcpy(call->new_data->dptr, locks, i*sizeof(*lock));
+		memcpy(call->new_data->dptr+i*sizeof(*lock), locks+i+1,
+		       (count-(i+1))*sizeof(*lock));
+		
+		if (count > 1) {
 #if ENABLE_NOTIFIES
-				brl_ctdb_notify_unlock(req->brl, locks, count, &removed_lock);
+			brl_ctdb_notify_unlock(req->brl, locks, count, &removed_lock);
 #endif
-			}
-			break;
 		}
 	}
 
@@ -618,15 +650,15 @@
 				return CTDB_ERR_NOMEM;
 			}
 
-			call->new_data->dptr = talloc_size(call, dbuf.dsize - sizeof(lock));
+			call->new_data->dptr = talloc_size(call, dbuf.dsize - sizeof(*lock));
 			if (call->new_data->dptr == NULL) {
 				return CTDB_ERR_NOMEM;
 			}
-			call->new_data->dsize = dbuf.dsize - sizeof(lock);
+			call->new_data->dsize = dbuf.dsize - sizeof(*lock);
 
-			memcpy(call->new_data->dptr, locks, i*sizeof(lock));
-			memcpy(call->new_data->dptr+i*sizeof(lock), locks+i+1,
-			       (count-(i+1))*sizeof(lock));
+			memcpy(call->new_data->dptr, locks, i*sizeof(*lock));
+			memcpy(call->new_data->dptr+i*sizeof(*lock), locks+i+1,
+			       (count-(i+1))*sizeof(*lock));
 			break;
 		}
 	}



More information about the samba-cvs mailing list