Rev 260: - take advantage of the new EVENT_FD_AUTOCLOSE flag in http://samba.org/~tridge/ctdb

tridge at samba.org tridge at samba.org
Sat May 5 07:20:00 GMT 2007


------------------------------------------------------------
revno: 260
revision-id: tridge at samba.org-20070505071959-wvf5a3e37mch3vy3
parent: tridge at samba.org-20070505071843-gdt3kgn66sa3xds0
committer: Andrew Tridgell <tridge at samba.org>
branch nick: tridge
timestamp: Sat 2007-05-05 17:19:59 +1000
message:
  - take advantage of the new EVENT_FD_AUTOCLOSE flag
  - use the tdb_chainlock_mark() call to allow us to guarantee forward progress in the ctdb_lockwait code
modified:
  common/ctdb_daemon.c           ctdb_daemon.c-20070409200331-3el1kqgdb9m4ib0g-1
  common/ctdb_io.c               ctdb_io.c-20070409200335-dzfc7f3rra5rcf60-1
  common/ctdb_lockwait.c         ctdb_lockwait.c-20070416214118-n1aeonljj3vpdd9q-1
  common/ctdb_ltdb.c             ctdb_ltdb.c-20061128065342-to93h6eejj5kon81-2
  common/ctdb_traverse.c         ctdb_traverse.c-20070503021550-ztfs5rwx8jfm8qqx-1
=== modified file 'common/ctdb_daemon.c'
--- a/common/ctdb_daemon.c	2007-05-05 04:09:46 +0000
+++ b/common/ctdb_daemon.c	2007-05-05 07:19:59 +0000
@@ -249,8 +249,6 @@
 {
 	ctdb_reqid_remove(client->ctdb, client->client_id);
 	client->ctdb->status.num_clients--;
-	close(client->fd);
-	client->fd = -1;
 	return 0;
 }
 
@@ -678,8 +676,8 @@
 
 
 	ctdb->ev = event_context_init(NULL);
-	fde = event_add_fd(ctdb->ev, ctdb, fd[0], EVENT_FD_READ, ctdb_read_from_parent, &fd[0]);
-	fde = event_add_fd(ctdb->ev, ctdb, ctdb->daemon.sd, EVENT_FD_READ, ctdb_accept_client, ctdb);
+	fde = event_add_fd(ctdb->ev, ctdb, fd[0], EVENT_FD_READ|EVENT_FD_AUTOCLOSE, ctdb_read_from_parent, &fd[0]);
+	fde = event_add_fd(ctdb->ev, ctdb, ctdb->daemon.sd, EVENT_FD_READ|EVENT_FD_AUTOCLOSE, ctdb_accept_client, ctdb);
 	ctdb_main_loop(ctdb);
 
 	return 0;
@@ -720,7 +718,7 @@
 	talloc_set_destructor(domain_socket_name, unlink_destructor);	
 
 	ctdb->ev = event_context_init(NULL);
-	fde = event_add_fd(ctdb->ev, ctdb, ctdb->daemon.sd, EVENT_FD_READ, 
+	fde = event_add_fd(ctdb->ev, ctdb, ctdb->daemon.sd, EVENT_FD_READ|EVENT_FD_AUTOCLOSE, 
 			   ctdb_accept_client, ctdb);
 	ctdb_main_loop(ctdb);
 

=== modified file 'common/ctdb_io.c'
--- a/common/ctdb_io.c	2007-05-03 02:16:03 +0000
+++ b/common/ctdb_io.c	2007-05-05 07:19:59 +0000
@@ -273,7 +273,7 @@
 	queue->fde = NULL;
 
 	if (fd != -1) {
-		queue->fde = event_add_fd(queue->ctdb->ev, queue, fd, EVENT_FD_READ, 
+		queue->fde = event_add_fd(queue->ctdb->ev, queue, fd, EVENT_FD_READ|EVENT_FD_AUTOCLOSE, 
 					  queue_io_handler, queue);
 		if (queue->fde == NULL) {
 			return -1;

=== modified file 'common/ctdb_lockwait.c'
--- a/common/ctdb_lockwait.c	2007-04-23 21:33:37 +0000
+++ b/common/ctdb_lockwait.c	2007-05-05 07:19:59 +0000
@@ -29,11 +29,13 @@
 
 struct lockwait_handle {
 	struct ctdb_context *ctdb;
+	struct ctdb_db_context *ctdb_db;
 	struct fd_event *fde;
 	int fd[2];
 	pid_t child;
 	void *private_data;
 	void (*callback)(void *);
+	TDB_DATA key;
 	struct timeval start_time;
 };
 
@@ -45,19 +47,30 @@
 	void (*callback)(void *) = h->callback;
 	void *p = h->private_data;
 	pid_t child = h->child;
+	TDB_DATA key = h->key;
+	struct tdb_context *tdb = h->ctdb_db->ltdb->tdb;
+	TALLOC_CTX *tmp_ctx = talloc_new(ev);
+
+	talloc_free(fde);
+
+	key.dptr = talloc_memdup(tmp_ctx, key.dptr, key.dsize);
+
 	talloc_set_destructor(h, NULL);
-	close(h->fd[0]);
 	ctdb_latency(&h->ctdb->status.max_lockwait_latency, h->start_time);
 	h->ctdb->status.pending_lockwait_calls--;
-	talloc_free(h);	
+
+	tdb_chainlock_mark(tdb, key);
 	callback(p);
+	tdb_chainlock_unmark(tdb, key);
+
+	kill(child, SIGKILL);
 	waitpid(child, NULL, 0);
+	talloc_free(tmp_ctx);
 }
 
 static int lockwait_destructor(struct lockwait_handle *h)
 {
 	h->ctdb->status.pending_lockwait_calls--;
-	close(h->fd[0]);
 	kill(h->child, SIGKILL);
 	waitpid(h->child, NULL, 0);
 	return 0;
@@ -84,7 +97,7 @@
 	ctdb_db->ctdb->status.lockwait_calls++;
 	ctdb_db->ctdb->status.pending_lockwait_calls++;
 
-	if (!(result = talloc_zero(ctdb_db, struct lockwait_handle))) {
+	if (!(result = talloc_zero(private_data, struct lockwait_handle))) {
 		ctdb_db->ctdb->status.pending_lockwait_calls--;
 		return NULL;
 	}
@@ -110,13 +123,15 @@
 	result->callback = callback;
 	result->private_data = private_data;
 	result->ctdb = ctdb_db->ctdb;
+	result->ctdb_db = ctdb_db;
+	result->key = key;
 
 	if (result->child == 0) {
+		char c = 0;
 		close(result->fd[0]);
-		/*
-		 * Do we need a tdb_reopen here?
-		 */
 		tdb_chainlock(ctdb_db->ltdb->tdb, key);
+		write(result->fd[1], &c, 1);
+		pause();
 		_exit(0);
 	}
 
@@ -124,7 +139,7 @@
 	talloc_set_destructor(result, lockwait_destructor);
 
 	result->fde = event_add_fd(ctdb_db->ctdb->ev, result, result->fd[0],
-				   EVENT_FD_READ, lockwait_handler,
+				   EVENT_FD_READ|EVENT_FD_AUTOCLOSE, lockwait_handler,
 				   (void *)result);
 	if (result->fde == NULL) {
 		talloc_free(result);

=== modified file 'common/ctdb_ltdb.c'
--- a/common/ctdb_ltdb.c	2007-05-04 12:18:00 +0000
+++ b/common/ctdb_ltdb.c	2007-05-05 07:19:59 +0000
@@ -193,7 +193,6 @@
 {
 	struct lock_fetch_state *state = talloc_get_type(p, struct lock_fetch_state);
 	state->recv_pkt(state->recv_context, (uint8_t *)state->hdr, state->hdr->length);
-	talloc_free(state);
 	DEBUG(2,(__location__ " PACKET REQUEUED\n"));
 }
 
@@ -252,7 +251,7 @@
 		return 0;
 	}
 
-	state = talloc(ctdb_db, struct lock_fetch_state);
+	state = talloc(hdr, struct lock_fetch_state);
 	state->ctdb = ctdb_db->ctdb;
 	state->hdr = hdr;
 	state->recv_pkt = recv_pkt;

=== modified file 'common/ctdb_traverse.c'
--- a/common/ctdb_traverse.c	2007-05-04 01:41:29 +0000
+++ b/common/ctdb_traverse.c	2007-05-05 07:19:59 +0000
@@ -74,7 +74,6 @@
  */
 static int traverse_local_destructor(struct ctdb_traverse_local_handle *h)
 {
-	close(h->fd[0]);
 	kill(h->child, SIGKILL);
 	waitpid(h->child, NULL, 0);
 	return 0;



More information about the samba-cvs mailing list