bnet_fsend(bs, OK_msg); /* send response */
break;
case BNET_HEARTBEAT:
+ /* Dmsg0(000, "Got heartbeat.\n"); */
+ break;
case BNET_HB_RESPONSE:
break;
case BNET_STATUS:
- /* *****FIXME***** Implement */
+ /* *****FIXME***** Implement more completely */
bnet_fsend(bs, "Status OK\n");
bnet_sig(bs, BNET_EOD);
break;
default:
- Emsg1(M_WARNING, 0, _("bget_msg: unknown signal %d\n"), bs->msglen);
+ Emsg1(M_WARNING, 0, _("bget_msg: unknown bnet signal %d\n"), bs->msglen);
return n;
}
continue;
static int save_file(FF_PKT *ff_pkt, void *pkt);
+#define HB_TIME (20*60)
+/*
+ * Listen on the SD socket for heartbeat signals.
+ * Send heartbeats to the Director every HB_TIME
+ * seconds.
+ */
static void *heartbeat_thread(void *arg)
{
int32_t n;
JCR *jcr = (JCR *)arg;
BSOCK *sd, *dir;
+ time_t last_heartbeat = time(NULL);
+ time_t now;
- jcr->heartbeat_id = pthread_self();
+ pthread_detach(pthread_self());
/* Get our own local copy */
sd = dup_bsock(jcr->store_bsock);
*/
for ( ; !is_bnet_stop(sd); ) {
n = bnet_wait_data_intr(sd, 60);
- if (n != 1) {
- continue;
- }
- n = bnet_recv(sd);
- if (n == BNET_SIGNAL && sd->msglen == BNET_HEARTBEAT) {
+ now = time(NULL);
+ if (now-last_heartbeat >= HB_TIME) {
bnet_sig(dir, BNET_HEARTBEAT);
+ last_heartbeat = now;
+ }
+ if (n == 1) { /* input waiting */
+ bnet_recv(sd); /* read it -- probably heartbeat */
}
}
bnet_close(sd);
/* Startup the heartbeat thread -- see above */
static void start_heartbeat_monitor(JCR *jcr)
{
- pthread_t hbtid;
jcr->duped_sd = NULL;
- pthread_create(&hbtid, NULL, heartbeat_thread, (void *)jcr);
+ pthread_create(&jcr->heartbeat_id, NULL, heartbeat_thread, (void *)jcr);
}
/* Terminate the heartbeat thread */
static void stop_heartbeat_monitor(JCR *jcr)
{
- pthread_t hbtid = jcr->heartbeat_id;
-
while (jcr->duped_sd == NULL) {
- bmicrosleep(0, 500); /* avoid race */
+ bmicrosleep(0, 50); /* avoid race */
}
jcr->duped_sd->timed_out = 1; /* set timed_out to terminate read */
jcr->duped_sd->terminated = 1; /* set to terminate read */
while (jcr->duped_sd) {
- pthread_kill(hbtid, TIMEOUT_SIGNAL); /* make heartbeat thread go away */
+ pthread_kill(jcr->heartbeat_id, TIMEOUT_SIGNAL); /* make heartbeat thread go away */
bmicrosleep(0, 20);
}
- pthread_join(hbtid, NULL); /* wait for him to clean up */
}
/*
static char OK_update[] = "1000 OK UpdateMedia\n";
/* Forward referenced functions */
-static int device_wait(JCR *jcr, DEVICE *dev, int wait_sec);
+static int wait_for_sysop(JCR *jcr, DEVICE *dev, int wait_sec);
/*
* Send current JobStatus to Director
jcr->JobStatus = jstat;
dir_send_job_status(jcr);
- stat = device_wait(jcr, dev, wait_sec);
+ stat = wait_for_sysop(jcr, dev, wait_sec);
if (stat == ETIMEDOUT) {
wait_sec *= 2; /* double wait time */
jcr->JobStatus = JS_WaitMount;
dir_send_job_status(jcr);
- stat = device_wait(jcr, dev, wait_sec); /* wait on device */
+ stat = wait_for_sysop(jcr, dev, wait_sec); /* wait on device */
if (stat == ETIMEDOUT) {
wait_sec *= 2; /* double wait time */
return 1;
}
-#define HB_TIME 20*60 /* send a heatbeat once every 20 minutes while waiting */
+#define HB_TIME (20*60) /* send a heatbeat once every 20 minutes while waiting */
-static int device_wait(JCR *jcr, DEVICE *dev, int wait_sec)
+static int wait_for_sysop(JCR *jcr, DEVICE *dev, int wait_sec)
{
struct timeval tv;
struct timezone tz;
/* */
-#define VERSION "1.30a"
+#define VERSION "1.31"
#define VSTRING "1"
-#define BDATE "03 May 2003"
-#define LSMDATE "03May03"
+#define BDATE "04 May 2003"
+#define LSMDATE "04May03"
/* Debug flags */
#define DEBUG 1