summaryrefslogtreecommitdiff
path: root/ctdb/server/ctdb_freeze.c
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronniesahlberg@gmail.com>2009-11-26 12:08:35 +1100
committerRonnie Sahlberg <ronniesahlberg@gmail.com>2009-11-26 12:08:35 +1100
commite17fa0fdeea34446feb4ce1cbad681a8ffbd6dd8 (patch)
treebdab854d7ea108f2b4664288223b7794eafe3e68 /ctdb/server/ctdb_freeze.c
parent926261aafca13bc64f7744c8b051138cabc8b8e2 (diff)
downloadsamba-e17fa0fdeea34446feb4ce1cbad681a8ffbd6dd8.tar.gz
change the lock wait child handling to use a pipe isntead of a socketpair
remove a stray alarm(30) that caused databases to be unlocked after 30 seconds. (This used to be ctdb commit 12b187f971d857353403393a9850503e0e558672)
Diffstat (limited to 'ctdb/server/ctdb_freeze.c')
-rw-r--r--ctdb/server/ctdb_freeze.c34
1 files changed, 16 insertions, 18 deletions
diff --git a/ctdb/server/ctdb_freeze.c b/ctdb/server/ctdb_freeze.c
index 36d033d49ba..0a0ac92de58 100644
--- a/ctdb/server/ctdb_freeze.c
+++ b/ctdb/server/ctdb_freeze.c
@@ -177,8 +177,7 @@ static struct ctdb_freeze_handle *ctdb_freeze_lock(struct ctdb_context *ctdb, ui
h->ctdb = ctdb;
h->priority = priority;
- /* use socketpair() instead of pipe() so we have bi-directional fds */
- if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd) != 0) {
+ if (pipe(fd) == -1) {
DEBUG(DEBUG_ERR,("Failed to create pipe for ctdb_freeze_lock\n"));
talloc_free(h);
return NULL;
@@ -193,40 +192,39 @@ static struct ctdb_freeze_handle *ctdb_freeze_lock(struct ctdb_context *ctdb, ui
if (h->child == 0) {
int ret;
- int count = 0;
+
/* in the child */
close(fd[0]);
+
ret = ctdb_lock_all_databases(ctdb, priority);
if (ret != 0) {
_exit(0);
}
- alarm(30);
-
- while (count++ < 30) {
- ret = write(fd[1], &ret, sizeof(ret));
- if (ret == sizeof(ret)) {
- break;
- }
+ ret = write(fd[1], &ret, sizeof(ret));
+ if (ret != sizeof(ret)) {
DEBUG(DEBUG_ERR, (__location__ " Failed to write to socket from freeze child. ret:%d errno:%u\n", ret, errno));
- sleep (1);
- }
- if (count >= 30) {
- DEBUG(DEBUG_ERR, (__location__ " Failed to write to socket from freeze child. Aborting freeze child\n"));
- _exit(0);
+ _exit(1);
}
- /* the read here means we will die if the parent exits */
- read(fd[1], &ret, sizeof(ret));
- _exit(0);
+ while (1) {
+ sleep(1);
+ if (kill(ctdb->ctdbd_pid, 0) != 0) {
+ DEBUG(DEBUG_ERR,("Parent died. Exiting lock wait child\n"));
+
+ _exit(0);
+ }
+ }
}
talloc_set_destructor(h, ctdb_freeze_handle_destructor);
close(fd[1]);
+ set_close_on_exec(fd[0]);
h->fd = fd[0];
+
fde = event_add_fd(ctdb->ev, h, h->fd, EVENT_FD_READ|EVENT_FD_AUTOCLOSE,
ctdb_freeze_lock_handler, h);
if (fde == NULL) {