* Returns BSOCK * pointer on success
*
*/
-static BSOCK *bnet_open(JCR * jcr, const char *name, char *host, char *service,
- int port, int *fatal)
+static BSOCK *bnet_open(JCR *jcr, const char *name, char *host, char *service,
+ int port, utime_t heart_beat, int *fatal)
{
int sockfd = -1;
dlist *addr_list;
Qmsg1(jcr, M_WARNING, 0, _("Cannot set SO_KEEPALIVE on socket: %s\n"),
be.strerror());
}
+#if defined(TCP_KEEPIDLE)
+ if (heart_beat) {
+ int opt = heart_beat
+ if (setsockopt(sockfd, IPPROTO_IP, TCP_KEEPIDLE, (sockopt_val_t)&opt, sizeof(opt)) < 0) {
+ berrno be;
+ Qmsg1(jcr, M_WARNING, 0, _("Cannot set SO_KEEPIDLE on socket: %s\n"),
+ be.strerror());
+ }
+ }
+#endif
+
/* connect to server */
if (connect(sockfd, ipaddr->get_sockaddr(), ipaddr->get_sockaddr_len()) < 0) {
save_errno = errno;
* Try to connect to host for max_retry_time at retry_time intervals.
*/
BSOCK *bnet_connect(JCR * jcr, int retry_interval, utime_t max_retry_time,
+ utime_t heart_beat,
const char *name, char *host, char *service, int port,
int verbose)
{
int fatal = 0;
time_t begin_time = time(NULL);
time_t now;
+ btimer_t *tid = NULL;
- for (i = 0; (bsock = bnet_open(jcr, name, host, service, port, &fatal)) == NULL;
+ /* Try to trap out of OS call when time expires */
+ tid = start_thread_timer(pthread_self(), (uint32_t)max_retry_time);
+
+ for (i = 0; (bsock = bnet_open(jcr, name, host, service, port, heart_beat, &fatal)) == NULL;
i -= retry_interval) {
berrno be;
if (fatal || (jcr && job_canceled(jcr))) {
- return NULL;
+ bsock = NULL;
+ goto bail_out;
}
Dmsg4(100, "Unable to connect to %s on %s:%d. ERR=%s\n",
name, host, port, be.strerror());
if (begin_time + max_retry_time <= now) {
Qmsg4(jcr, M_FATAL, 0, _("Unable to connect to %s on %s:%d. ERR=%s\n"),
name, host, port, be.strerror());
- return NULL;
+ bsock = NULL;
+ goto bail_out;
}
}
+
+bail_out:
+ if (tid) {
+ stop_thread_timer(tid);
+ }
return bsock;
}
bs->msg = realloc_pool_memory(bs->msg, maxlen + maxlen / 2);
}
return bs->send();
-// return bnet_send(bs);
}
-int bnet_get_peer(BSOCK *bs, char *buf, socklen_t buflen) {
+int bnet_get_peer(BSOCK *bs, char *buf, socklen_t buflen)
+{
#if !defined(HAVE_WIN32)
if (bs->peer_addr.sin_family == 0) {
socklen_t salen = sizeof(bs->peer_addr);
uint32_t dbuf_size, start_size;
#if defined(IP_TOS) && defined(IPTOS_THROUGHPUT)
int opt;
-
opt = IPTOS_THROUGHPUT;
- setsockopt(bs->fd, IPPROTO_IP, IP_TOS, (sockopt_val_t) & opt, sizeof(opt));
+ setsockopt(bs->fd, IPPROTO_IP, IP_TOS, (sockopt_val_t)&opt, sizeof(opt));
#endif
if (size != 0) {