X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Ffiled%2Fheartbeat.c;h=26ca962bc63ae58833e961cf52cc1fd1821d3e9e;hb=83ec69a2a09f1e7f2503b1acaae18cd59ef4d0ba;hp=23f72eca85e9519fd7015d1f991c1a773448b3b5;hpb=7eaf5a674c91b8b1a0d9f9306b9e65b082dd70b1;p=bacula%2Fbacula diff --git a/bacula/src/filed/heartbeat.c b/bacula/src/filed/heartbeat.c index 23f72eca85..26ca962bc6 100644 --- a/bacula/src/filed/heartbeat.c +++ b/bacula/src/filed/heartbeat.c @@ -1,3 +1,30 @@ +/* + Bacula® - The Network Backup Solution + + Copyright (C) 2003-2008 Free Software Foundation Europe e.V. + + The main author of Bacula is Kern Sibbald, with contributions from + many others, a complete list can be found in the file AUTHORS. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version three of the GNU Affero General Public + License as published by the Free Software Foundation and included + in the file LICENSE. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + + Bacula® is a registered trademark of Kern Sibbald. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ /* * Bacula File Daemon heartbeat routines * Listens for heartbeats coming from the SD @@ -8,25 +35,11 @@ * Version $Id$ * */ -/* - Copyright (C) 2003-2005 Kern Sibbald - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - version 2 as amended with additional clauses defined in the - file LICENSE in the main source directory. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - the file LICENSE for additional details. - - */ #include "bacula.h" #include "filed.h" -#define WAIT_INTERVAL 10 +#define WAIT_INTERVAL 5 extern "C" void *sd_heartbeat_thread(void *arg); extern "C" void *dir_heartbeat_thread(void *arg); @@ -49,15 +62,10 @@ extern "C" void *sd_heartbeat_thread(void *arg) /* Get our own local copy */ sd = dup_bsock(jcr->store_bsock); -#ifndef WIN32 - int oflags; - if ((oflags = fcntl(sd->fd, F_GETFL, 0)) != -1) { - fcntl(sd->fd, F_SETFL, oflags|O_NONBLOCK); - } -#endif dir = dup_bsock(jcr->dir_bsock); jcr->hb_bsock = sd; + jcr->hb_started = true; jcr->hb_dir_bsock = dir; /* Hang reading the socket to the SD, and every time we get @@ -78,7 +86,7 @@ extern "C" void *sd_heartbeat_thread(void *arg) break; } if (n == 1) { /* input waiting */ - bnet_recv(sd); /* read it -- probably heartbeat from sd */ + sd->recv(); /* read it -- probably heartbeat from sd */ if (sd->msglen <= 0) { Dmsg1(100, "Got BNET_SIG %d from SD\n", sd->msglen); } else { @@ -87,9 +95,10 @@ extern "C" void *sd_heartbeat_thread(void *arg) } Dmsg2(100, "wait_intr=%d stop=%d\n", n, is_bnet_stop(sd)); } - bnet_close(sd); - bnet_close(dir); + sd->close(); + dir->close(); jcr->hb_bsock = NULL; + jcr->hb_started = false; jcr->hb_dir_bsock = NULL; return NULL; } @@ -104,6 +113,7 @@ void start_heartbeat_monitor(JCR *jcr) */ if (!no_signals) { jcr->hb_bsock = NULL; + jcr->hb_started = false; jcr->hb_dir_bsock = NULL; pthread_create(&jcr->heartbeat_id, NULL, sd_heartbeat_thread, (void *)jcr); } @@ -117,30 +127,29 @@ void stop_heartbeat_monitor(JCR *jcr) return; } /* Wait max 10 secs for heartbeat thread to start */ - while (jcr->hb_bsock == NULL && cnt++ < 200) { + while (!jcr->hb_started && cnt++ < 200) { bmicrosleep(0, 50000); /* wait for start */ } - if (!jcr->hb_bsock) { - } - if (jcr->hb_bsock) { - jcr->hb_bsock->timed_out = 1; /* set timed_out to terminate read */ - jcr->hb_bsock->terminated = 1; /* set to terminate read */ + if (jcr->hb_started) { + jcr->hb_bsock->set_timed_out(); /* set timed_out to terminate read */ + jcr->hb_bsock->set_terminated(); /* set to terminate read */ } if (jcr->hb_dir_bsock) { - jcr->hb_dir_bsock->timed_out = 1; /* set timed_out to terminate read */ - jcr->hb_dir_bsock->terminated = 1; /* set to terminate read */ + jcr->hb_dir_bsock->set_timed_out(); /* set timed_out to terminate read */ + jcr->hb_dir_bsock->set_terminated(); /* set to terminate read */ + } + if (jcr->hb_started) { + Dmsg0(100, "Send kill to heartbeat id\n"); + pthread_kill(jcr->heartbeat_id, TIMEOUT_SIGNAL); /* make heartbeat thread go away */ + bmicrosleep(0, 50000); } - pthread_kill(jcr->heartbeat_id, TIMEOUT_SIGNAL); /* make heartbeat thread go away */ - bmicrosleep(0, 50000); cnt = 0; /* Wait max 100 secs for heartbeat thread to stop */ - while (jcr->hb_bsock && cnt++ < 200) { + while (jcr->hb_started && cnt++ < 200) { pthread_kill(jcr->heartbeat_id, TIMEOUT_SIGNAL); /* make heartbeat thread go away */ bmicrosleep(0, 500000); } - if (jcr->hb_bsock) { - } } /* @@ -160,6 +169,7 @@ extern "C" void *dir_heartbeat_thread(void *arg) dir = dup_bsock(jcr->dir_bsock); jcr->hb_bsock = dir; + jcr->hb_started = true; for ( ; !is_bnet_stop(dir); ) { time_t now, next; @@ -167,13 +177,14 @@ extern "C" void *dir_heartbeat_thread(void *arg) now = time(NULL); next = now - last_heartbeat; if (next >= me->heartbeat_interval) { - bnet_sig(dir, BNET_HEARTBEAT); + dir->signal(BNET_HEARTBEAT); last_heartbeat = now; } bmicrosleep(next, 0); } - bnet_close(dir); + dir->close(); jcr->hb_bsock = NULL; + jcr->hb_started = false; return NULL; } @@ -183,6 +194,7 @@ extern "C" void *dir_heartbeat_thread(void *arg) void start_dir_heartbeat(JCR *jcr) { if (me->heartbeat_interval) { + jcr->dir_bsock->set_locking(); pthread_create(&jcr->heartbeat_id, NULL, dir_heartbeat_thread, (void *)jcr); } }