void conn_alive (ConnCacheEntry *e) { struct in_addr a; const char *s; a.s_addr = e->host; s = ports_num2name (e->port); if (s != NULL) arla_warnx (ADEBWARN, "Server %s/%s up again", inet_ntoa(a), s); else arla_warnx (ADEBWARN, "Server %s/%d up again", inet_ntoa(a), e->port); e->flags.alivep = TRUE; if (e->parent != NULL) e->parent->flags.alivep = TRUE; }
void conn_dead (ConnCacheEntry *e) { struct in_addr a; char buf[10]; const char *port; assert (e->probe != NULL); e->flags.alivep = FALSE; if (e->parent != NULL) { e = e->parent; e->flags.alivep = FALSE; } add_to_probe_list (e, 0); a.s_addr = e->host; port = ports_num2name (e->port); if (port == NULL) { snprintf(buf, sizeof(buf), "%d", e->port); port = buf; } arla_warnx (ADEBWARN, "Lost connection to %s/%s in cell %s", inet_ntoa(a), port, cell_num2name (e->cell)); }
static void sigint (int foo) { arla_warnx (ADEBMISC, "fatal signal received"); store_state (); delete_pid_file (); exit (0); }
void conn_probe (ConnCacheEntry *e) { ++e->refcount; { struct in_addr a; a.s_addr = e->host; if (e->probe == NULL) arla_warnx(ADEBWARN, "conn_probe: probe function is NULL, " "host: %s cell: %d port: %d", inet_ntoa(a), e->cell, e->port); } if (e->probe && ((*(e->probe))(e->connection) == 0)) { if (!e->flags.alivep) conn_alive (e); } else { if (e->flags.alivep) conn_dead (e); } conn_free (e); }
void conn_init (unsigned nentries) { arla_warnx (ADEBCONN, "initconncache"); connhtab = hashtabnew (CONNCACHESIZE, conncmp, connhash); if (connhtab == NULL) arla_errx (1, ADEBERROR, "conn_init: hashtabnew failed"); connfreelist = listnew (); if (connfreelist == NULL) arla_errx (1, ADEBERROR, "conn_init: listnew failed"); connprobelist = listnew (); if (connprobelist == NULL) arla_errx (1, ADEBERROR, "conn_init: listnew failed"); nconnections = 0; if (LWP_CreateProcess (pinger, PINGER_STACKSIZE, 1, NULL, "pinger", &pinger_pid)) arla_errx (1, ADEBERROR, "conn: cannot create pinger thread"); create_new_connections (nentries); }
static void pinger (char *arg) { for (;;) { struct timeval tv; Listitem *item; ConnCacheEntry *e; struct in_addr addr; const char *port_str; arla_warnx(ADEBCONN, "running pinger"); while (listemptyp (connprobelist)) LWP_WaitProcess (connprobelist); item = listhead (connprobelist); e = (ConnCacheEntry *)listdata (item); assert (e->probe_le == item); gettimeofday (&tv, NULL); if (tv.tv_sec < e->probe_next) { unsigned long t = e->probe_next - tv.tv_sec; arla_warnx(ADEBCONN, "pinger: sleeping %lu second(s)", t); IOMGR_Sleep (t); continue; } listdel (connprobelist, item); e->probe_le = NULL; if (e->flags.alivep) continue; addr.s_addr = e->host; port_str = ports_num2name (e->port); if (port_str != NULL) arla_warnx (ADEBCONN, "pinger: probing %s/%s", inet_ntoa(addr), port_str); else arla_warnx (ADEBCONN, "pinger: probing %s/%d", inet_ntoa(addr), e->port); ++e->refcount; if (e->probe == NULL) arla_warnx(ADEBWARN, "pinger: probe function is NULL, " "host: %s cell: %d port: %d", inet_ntoa(addr), e->cell, e->port); if (connected_mode == DISCONNECTED) { arla_warnx(ADEBCONN, "pinger: ignoring host in disconnected mode"); } else if (e->probe && ((*(e->probe))(e->connection) == 0)) { conn_alive (e); } else { re_probe (e); } conn_free (e); } }