svn commit: samba r21045 - in branches/SAMBA_4_0/source/cluster/ctdb: . common include

tridge at samba.org tridge at samba.org
Mon Jan 29 11:31:24 GMT 2007


Author: tridge
Date: 2007-01-29 11:31:24 +0000 (Mon, 29 Jan 2007)
New Revision: 21045

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

Log:

every call in brlock_ctdb ended up neededing a 32 bit status code, so
rather than allocating a reply_data field each time, I have changed
the ctdb_call API to include a status code. That greatly simplifies
use of the API.

Modified:
   branches/SAMBA_4_0/source/cluster/ctdb/brlock_ctdb.c
   branches/SAMBA_4_0/source/cluster/ctdb/common/ctdb_call.c
   branches/SAMBA_4_0/source/cluster/ctdb/include/ctdb.h
   branches/SAMBA_4_0/source/cluster/ctdb/include/ctdb_private.h


Changeset:
Modified: branches/SAMBA_4_0/source/cluster/ctdb/brlock_ctdb.c
===================================================================
--- branches/SAMBA_4_0/source/cluster/ctdb/brlock_ctdb.c	2007-01-29 11:15:15 UTC (rev 21044)
+++ branches/SAMBA_4_0/source/cluster/ctdb/brlock_ctdb.c	2007-01-29 11:31:24 UTC (rev 21045)
@@ -360,18 +360,8 @@
 	}
 
 reply:
-	call->reply_data = talloc(call, TDB_DATA);
-	if (call->reply_data == NULL) {
-		return CTDB_ERR_NOMEM;
-	}
+	call->status = NT_STATUS_V(status);
 
-	call->reply_data->dptr = talloc_size(call, sizeof(NTSTATUS));
-	call->reply_data->dsize = sizeof(NTSTATUS);
-	if (call->reply_data->dptr == NULL) {
-		return CTDB_ERR_NOMEM;
-	}
-	*(NTSTATUS *)call->reply_data->dptr = status;
-
 	return 0;
 }
 
@@ -392,7 +382,6 @@
 {
 	struct ctdb_lock_req req;
 	struct ctdb_call call;
-	NTSTATUS status;
 	int ret;
 
 	call.call_id = FUNC_BRL_LOCK;
@@ -416,10 +405,7 @@
 		return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	}
 
-	status = *(NTSTATUS *)call.reply_data.dptr;
-	talloc_free(call.reply_data.dptr);
-
-	return status;
+	return NT_STATUS(call.status);
 }
 
 #if ENABLE_NOTIFIES
@@ -560,18 +546,8 @@
 		status = NT_STATUS_RANGE_NOT_LOCKED;
 	}
 
-	call->reply_data = talloc(call, TDB_DATA);
-	if (call->reply_data == NULL) {
-		return CTDB_ERR_NOMEM;
-	}
+	call->status = NT_STATUS_V(status);
 
-	call->reply_data->dptr = talloc_size(call, sizeof(NTSTATUS));
-	call->reply_data->dsize = sizeof(NTSTATUS);
-	if (call->reply_data->dptr == NULL) {
-		return CTDB_ERR_NOMEM;
-	}
-	*(NTSTATUS *)call->reply_data->dptr = status;
-
 	return 0;
 }
 
@@ -586,7 +562,6 @@
 {
 	struct ctdb_call call;
 	struct ctdb_unlock_req req;
-	NTSTATUS status;
 	int ret;
 
 	call.call_id = FUNC_BRL_UNLOCK;
@@ -609,10 +584,7 @@
 		return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	}
 
-	status = *(NTSTATUS *)call.reply_data.dptr;
-	talloc_free(call.reply_data.dptr);
-
-	return status;
+	return NT_STATUS(call.status);
 }
 
 
@@ -669,18 +641,8 @@
 		status = NT_STATUS_RANGE_NOT_LOCKED;
 	}
 
-	call->reply_data = talloc(call, TDB_DATA);
-	if (call->reply_data == NULL) {
-		return CTDB_ERR_NOMEM;
-	}
+	call->status = NT_STATUS_V(status);
 
-	call->reply_data->dptr = talloc_size(call, sizeof(NTSTATUS));
-	call->reply_data->dsize = sizeof(NTSTATUS);
-	if (call->reply_data->dptr == NULL) {
-		return CTDB_ERR_NOMEM;
-	}
-	*(NTSTATUS *)call->reply_data->dptr = status;
-
 	return 0;
 }
 
@@ -690,7 +652,6 @@
 {
 	struct ctdb_call call;
 	struct ctdb_remove_pending_req req;
-	NTSTATUS status;
 	int ret;
 
 	call.call_id = FUNC_BRL_REMOVE_PENDING;
@@ -709,10 +670,7 @@
 		return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	}
 
-	status = *(NTSTATUS *)call.reply_data.dptr;
-	talloc_free(call.reply_data.dptr);
-
-	return status;
+	return NT_STATUS(call.status);
 }
 
 
@@ -760,18 +718,8 @@
 		}
 	}
 	
-	call->reply_data = talloc(call, TDB_DATA);
-	if (call->reply_data == NULL) {
-		return CTDB_ERR_NOMEM;
-	}
+	call->status = NT_STATUS_V(status);
 
-	call->reply_data->dptr = talloc_size(call, sizeof(NTSTATUS));
-	call->reply_data->dsize = sizeof(NTSTATUS);
-	if (call->reply_data->dptr == NULL) {
-		return CTDB_ERR_NOMEM;
-	}
-	*(NTSTATUS *)call->reply_data->dptr = status;
-
 	return 0;
 }
 
@@ -786,7 +734,6 @@
 {
 	struct ctdb_call call;
 	struct ctdb_locktest_req req;
-	NTSTATUS status;
 	int ret;
 
 	call.call_id = FUNC_BRL_LOCKTEST;
@@ -810,10 +757,7 @@
 		return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	}
 
-	status = *(NTSTATUS *)call.reply_data.dptr;
-	talloc_free(call.reply_data.dptr);
-
-	return status;
+	return NT_STATUS(call.status);
 }
 
 
@@ -874,18 +818,8 @@
 		memcpy(call->new_data->dptr, locks, count*sizeof(struct lock_struct));
 	}
 
-	call->reply_data = talloc(call, TDB_DATA);
-	if (call->reply_data == NULL) {
-		return CTDB_ERR_NOMEM;
-	}
+	call->status = NT_STATUS_V(status);
 
-	call->reply_data->dptr = talloc_size(call, sizeof(NTSTATUS));
-	call->reply_data->dsize = sizeof(NTSTATUS);
-	if (call->reply_data->dptr == NULL) {
-		return CTDB_ERR_NOMEM;
-	}
-	*(NTSTATUS *)call->reply_data->dptr = status;
-
 	return 0;
 }
 
@@ -897,7 +831,6 @@
 {
 	struct ctdb_call call;
 	struct ctdb_close_req req;
-	NTSTATUS status;
 	int ret;
 
 	call.call_id = FUNC_BRL_CLOSE;
@@ -917,10 +850,7 @@
 		return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	}
 
-	status = *(NTSTATUS *)call.reply_data.dptr;
-	talloc_free(call.reply_data.dptr);
-
-	return status;
+	return NT_STATUS(call.status);
 }
 
 

Modified: branches/SAMBA_4_0/source/cluster/ctdb/common/ctdb_call.c
===================================================================
--- branches/SAMBA_4_0/source/cluster/ctdb/common/ctdb_call.c	2007-01-29 11:15:15 UTC (rev 21044)
+++ branches/SAMBA_4_0/source/cluster/ctdb/common/ctdb_call.c	2007-01-29 11:31:24 UTC (rev 21045)
@@ -61,6 +61,7 @@
 	CTDB_NO_MEMORY(ctdb, c->record_data.dptr);
 	c->new_data = NULL;
 	c->reply_data = NULL;
+	c->status = 0;
 
 	for (fn=ctdb->calls;fn;fn=fn->next) {
 		if (fn->id == call->call_id) break;
@@ -101,6 +102,7 @@
 		call->reply_data.dptr = NULL;
 		call->reply_data.dsize = 0;
 	}
+	call->status = c->status;
 
 	talloc_free(c);
 
@@ -333,12 +335,15 @@
 	r->hdr.destnode  = hdr->srcnode;
 	r->hdr.srcnode   = hdr->destnode;
 	r->hdr.reqid     = hdr->reqid;
+	r->status        = call.status;
 	r->datalen       = call.reply_data.dsize;
-	memcpy(&r->data[0], call.reply_data.dptr, call.reply_data.dsize);
+	if (call.reply_data.dsize) {
+		memcpy(&r->data[0], call.reply_data.dptr, call.reply_data.dsize);
+		talloc_free(call.reply_data.dptr);
+	}
 
 	ctdb_queue_packet(ctdb, &r->hdr);
 
-	talloc_free(call.reply_data.dptr);
 	talloc_free(r);
 }
 
@@ -368,16 +373,14 @@
 {
 	struct ctdb_reply_call *c = (struct ctdb_reply_call *)hdr;
 	struct ctdb_call_state *state;
-	TDB_DATA reply_data;
 
 	state = idr_find(ctdb->idr, hdr->reqid);
 	if (state == NULL) return;
 
-	reply_data.dptr = c->data;
-	reply_data.dsize = c->datalen;
+	state->call.reply_data.dptr = c->data;
+	state->call.reply_data.dsize = c->datalen;
+	state->call.status = c->status;
 
-	state->call.reply_data = reply_data;
-
 	talloc_steal(state, c);
 
 	state->state = CTDB_CALL_DONE;
@@ -594,10 +597,16 @@
 		talloc_free(state);
 		return -1;
 	}
-	call->reply_data.dptr = talloc_memdup(state->node->ctdb,
-					      state->call.reply_data.dptr,
-					      state->call.reply_data.dsize);
-	call->reply_data.dsize = state->call.reply_data.dsize;
+	if (state->call.reply_data.dsize) {
+		call->reply_data.dptr = talloc_memdup(state->node->ctdb,
+						      state->call.reply_data.dptr,
+						      state->call.reply_data.dsize);
+		call->reply_data.dsize = state->call.reply_data.dsize;
+	} else {
+		call->reply_data.dptr = NULL;
+		call->reply_data.dsize = 0;
+	}
+	call->status = state->call.status;
 	talloc_free(state);
 	return 0;
 }

Modified: branches/SAMBA_4_0/source/cluster/ctdb/include/ctdb.h
===================================================================
--- branches/SAMBA_4_0/source/cluster/ctdb/include/ctdb.h	2007-01-29 11:15:15 UTC (rev 21044)
+++ branches/SAMBA_4_0/source/cluster/ctdb/include/ctdb.h	2007-01-29 11:31:24 UTC (rev 21045)
@@ -26,6 +26,7 @@
 	TDB_DATA key;
 	TDB_DATA call_data;
 	TDB_DATA reply_data;
+	uint32_t status;
 };
 
 /*
@@ -37,6 +38,7 @@
 	TDB_DATA *new_data;    /* optionally updated record data */
 	TDB_DATA *call_data;   /* optionally passed from caller */
 	TDB_DATA *reply_data;  /* optionally returned by function */
+	uint32_t status;       /* optional reply status - defaults to zero */
 };
 
 #define CTDB_ERR_INVALID 1

Modified: branches/SAMBA_4_0/source/cluster/ctdb/include/ctdb_private.h
===================================================================
--- branches/SAMBA_4_0/source/cluster/ctdb/include/ctdb_private.h	2007-01-29 11:15:15 UTC (rev 21044)
+++ branches/SAMBA_4_0/source/cluster/ctdb/include/ctdb_private.h	2007-01-29 11:31:24 UTC (rev 21045)
@@ -162,6 +162,7 @@
 
 struct ctdb_reply_call {
 	struct ctdb_req_header hdr;
+	uint32_t status;
 	uint32_t datalen;
 	uint8_t  data[1];
 };



More information about the samba-cvs mailing list