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