------------------------------------------------------------ revno: 260 revision-id: [EMAIL PROTECTED] parent: [EMAIL PROTECTED] committer: Andrew Tridgell <[EMAIL PROTECTED]> 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;