kanoi 9 years ago
parent
commit
dc6fe33583
  1. 2
      src/ckpool.c
  2. 1
      src/ckpool.h
  3. 30
      src/generator.c
  4. 38
      src/libckpool.c
  5. 5
      src/libckpool.h

2
src/ckpool.c

@ -527,7 +527,7 @@ rewait:
ret = 0; ret = 0;
goto out; goto out;
} }
ret = wait_read_select(cs->fd, eom ? 0 : *timeout); ret = wait_recv_select(cs->fd, eom ? 0 : *timeout);
if (ret < 1) { if (ret < 1) {
if (!ret) { if (!ret) {
if (eom) if (eom)

1
src/ckpool.h

@ -111,6 +111,7 @@ struct server_instance {
char *auth; char *auth;
char *pass; char *pass;
bool notify; bool notify;
bool alive;
connsock_t cs; connsock_t cs;
void *data; // Private data void *data; // Private data

30
src/generator.c

@ -147,6 +147,7 @@ static bool server_alive(ckpool_t *ckp, server_instance_t *si, bool pinging)
/* Has this server already been reconnected? */ /* Has this server already been reconnected? */
if (cs->fd > 0) if (cs->fd > 0)
return true; return true;
si->alive = false;
if (!extract_sockaddr(si->url, &cs->url, &cs->port)) { if (!extract_sockaddr(si->url, &cs->url, &cs->port)) {
LOGWARNING("Failed to extract address from %s", si->url); LOGWARNING("Failed to extract address from %s", si->url);
return ret; return ret;
@ -189,6 +190,7 @@ out:
/* Close and invalidate the file handle */ /* Close and invalidate the file handle */
Close(cs->fd); Close(cs->fd);
} else { } else {
si->alive = true;
LOGNOTICE("Server alive: %s:%s", cs->url, cs->port); LOGNOTICE("Server alive: %s:%s", cs->url, cs->port);
keep_sockalive(cs->fd); keep_sockalive(cs->fd);
} }
@ -207,19 +209,31 @@ retry:
if (!ping_main(ckp)) if (!ping_main(ckp))
goto out; goto out;
/* First find a server that is already flagged alive if possible
* without blocking on server_alive() */
for (i = 0; i < ckp->btcds; i++) { for (i = 0; i < ckp->btcds; i++) {
server_instance_t *si = ckp->servers[i]; server_instance_t *si = ckp->servers[i];
cs = &si->cs;
if (server_alive(ckp, si, false)) { if (si->alive && cs->fd > 0) {
alive = si; alive = si;
break; goto living;
} }
} }
if (!alive) {
LOGWARNING("CRITICAL: No bitcoinds active!"); /* No servers flagged alive, try to connect to them blocking */
sleep(5); for (i = 0; i < ckp->btcds; i++) {
goto retry; server_instance_t *si = ckp->servers[i];
if (server_alive(ckp, si, false)) {
alive = si;
goto living;
}
} }
LOGWARNING("CRITICAL: No bitcoinds active!");
sleep(5);
goto retry;
living:
cs = &alive->cs; cs = &alive->cs;
LOGINFO("Connected to live server %s:%s", cs->url, cs->port); LOGINFO("Connected to live server %s:%s", cs->url, cs->port);
out: out:
@ -276,7 +290,7 @@ retry:
ckmsgq_add(gdata->srvchk, si); ckmsgq_add(gdata->srvchk, si);
do { do {
selret = wait_read_select(us->sockd, 5); selret = wait_recv_select(us->sockd, 5);
if (!selret && !ping_main(ckp)) { if (!selret && !ping_main(ckp)) {
LOGEMERG("Generator failed to ping main process, exiting"); LOGEMERG("Generator failed to ping main process, exiting");
ret = 1; ret = 1;
@ -1618,7 +1632,7 @@ retry:
ckmsgq_add(gdata->srvchk, proxi->si); ckmsgq_add(gdata->srvchk, proxi->si);
do { do {
selret = wait_read_select(us->sockd, 5); selret = wait_recv_select(us->sockd, 5);
if (!selret && !ping_main(ckp)) { if (!selret && !ping_main(ckp)) {
LOGEMERG("Generator failed to ping main process, exiting"); LOGEMERG("Generator failed to ping main process, exiting");
ret = 1; ret = 1;

38
src/libckpool.c

@ -758,17 +758,15 @@ out:
void empty_socket(int fd) void empty_socket(int fd)
{ {
char buf[PAGESIZE];
int ret; int ret;
if (fd < 1) if (fd < 1)
return; return;
do { do {
char buf[PAGESIZE]; ret = recv(fd, buf, PAGESIZE - 1, MSG_DONTWAIT);
ret = wait_read_select(fd, 0);
if (ret > 0) { if (ret > 0) {
ret = recv(fd, buf, PAGESIZE - 1, 0);
buf[ret] = 0; buf[ret] = 0;
LOGDEBUG("Discarding: %s", buf); LOGDEBUG("Discarding: %s", buf);
} }
@ -907,21 +905,39 @@ int wait_close(int sockd, int timeout)
return sfd.revents & (POLLHUP | POLLRDHUP | POLLERR); return sfd.revents & (POLLHUP | POLLRDHUP | POLLERR);
} }
/* Emulate a select read wait for high fds that select doesn't support */ /* Emulate a select read wait for high fds that select doesn't support.
int wait_read_select(int sockd, float timeout) * wait_read_select is for unix sockets and _wait_recv_select for regular
* sockets. */
int _wait_read_select(int *sockd, float timeout)
{ {
struct pollfd sfd; struct pollfd sfd;
int ret = -1; int ret = -1;
if (unlikely(sockd < 0)) if (unlikely(*sockd < 0))
goto out; goto out;
sfd.fd = sockd; sfd.fd = *sockd;
sfd.events = POLLIN | POLLRDHUP; sfd.events = POLLIN | POLLRDHUP;
sfd.revents = 0;
timeout *= 1000; timeout *= 1000;
ret = poll(&sfd, 1, timeout); ret = poll(&sfd, 1, timeout);
if (ret && !(sfd.revents & POLLIN)) if (ret > 0 && sfd.revents & (POLLERR))
ret = -1; _Close(sockd);
out:
return ret;
}
int _wait_recv_select(int *sockd, float timeout)
{
struct pollfd sfd;
int ret = -1;
if (unlikely(*sockd < 0))
goto out;
sfd.fd = *sockd;
sfd.events = POLLIN | POLLRDHUP;
timeout *= 1000;
ret = poll(&sfd, 1, timeout);
if (ret > 0 && sfd.revents & (POLLHUP | POLLRDHUP | POLLERR))
_Close(sockd);
out: out:
return ret; return ret;
} }

5
src/libckpool.h

@ -496,7 +496,10 @@ int _open_unix_server(const char *server_path, const char *file, const char *fun
int _open_unix_client(const char *server_path, const char *file, const char *func, const int line); int _open_unix_client(const char *server_path, const char *file, const char *func, const int line);
#define open_unix_client(server_path) _open_unix_client(server_path, __FILE__, __func__, __LINE__) #define open_unix_client(server_path) _open_unix_client(server_path, __FILE__, __func__, __LINE__)
int wait_close(int sockd, int timeout); int wait_close(int sockd, int timeout);
int wait_read_select(int sockd, float timeout); int _wait_read_select(int *sockd, float timeout);
#define wait_read_select(SOCKD, TIMEOUT) _wait_read_select(&(SOCKD), TIMEOUT)
int _wait_recv_select(int *sockd, float timeout);
#define wait_recv_select(SOCKD, TIMEOUT) _wait_recv_select(&(SOCKD), TIMEOUT)
int read_length(int sockd, void *buf, int len); int read_length(int sockd, void *buf, int len);
char *_recv_unix_msg(int sockd, int timeout1, int timeout2, const char *file, const char *func, const int line); char *_recv_unix_msg(int sockd, int timeout1, int timeout2, const char *file, const char *func, const int line);
#define RECV_UNIX_TIMEOUT1 30 #define RECV_UNIX_TIMEOUT1 30

Loading…
Cancel
Save