Skip to content

Commit

Permalink
fix server selection after long downtime
Browse files Browse the repository at this point in the history
  • Loading branch information
Fabian Mauchle committed May 17, 2019
1 parent 4e19f7d commit 1c81d55
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 19 deletions.
43 changes: 24 additions & 19 deletions radsecproxy.c
Original file line number Diff line number Diff line change
Expand Up @@ -1335,24 +1335,28 @@ struct clsrvconf *choosesrvconf(struct list *srvconfs) {
struct clsrvconf *server, *best = NULL, *first = NULL;

for (entry = list_first(srvconfs); entry; entry = list_next(entry)) {
server = (struct clsrvconf *)entry->data;
if (!server->servers)
return server;
if (server->servers->state == RSP_SERVER_STATE_FAILING)
server = (struct clsrvconf *)entry->data;
if (!server->servers)
return server;
if (server->servers->state == RSP_SERVER_STATE_FAILING)
continue;
if (!first)
first = server;
if (server->servers->state == RSP_SERVER_STATE_STARTUP || server->servers->state == RSP_SERVER_STATE_RECONNECTING)
continue;
if (!first)
first = server;
if (server->servers->state == RSP_SERVER_STATE_STARTUP || server->servers->state == RSP_SERVER_STATE_RECONNECTING)
continue;
if (!server->servers->lostrqs)
return server;
if (!best) {
best = server;
continue;
}
if (server->servers->lostrqs < best->servers->lostrqs)
best = server;
if (!server->servers->lostrqs)
return server;
if (!best) {
best = server;
continue;
}
if (server->servers->lostrqs < best->servers->lostrqs)
best = server;
}
if (best && best->servers->lostrqs == MAX_LOSTRQS)
for (entry = list_first(srvconfs); entry; entry = list_next(entry))
if (((struct clsrvconf *)entry->data)->servers->lostrqs == MAX_LOSTRQS)
((struct clsrvconf *)entry->data)->servers->lostrqs--;
return best ? best : first;
}

Expand Down Expand Up @@ -1919,7 +1923,7 @@ void *clientwr(void *arg) {
if (conf->statusserver == RSP_STATSRV_ON || conf->statusserver == RSP_STATSRV_MINIMAL) {
if (*rqout->rq->buf == RAD_Status_Server) {
debug(DBG_WARN, "clientwr: no status server response, %s dead?", conf->name);
if (server->lostrqs < 255)
if (server->lostrqs < MAX_LOSTRQS)
server->lostrqs++;
}
} else {
Expand All @@ -1930,7 +1934,7 @@ void *clientwr(void *arg) {
}
} else {
debug(DBG_WARN, "clientwr: no server response, %s dead?", conf->name);
if (server->lostrqs < 255)
if (server->lostrqs < MAX_LOSTRQS)
server->lostrqs++;
}
}
Expand All @@ -1945,7 +1949,8 @@ void *clientwr(void *arg) {
rqout->tries++;
if (!conf->pdef->clientradput(server, rqout->rq->buf)) {
debug(DBG_WARN, "clientwr: could not send request to server %s", conf->name);
server->lostrqs++;
if (server->lostrqs < MAX_LOSTRQS)
server->lostrqs++;
}
pthread_mutex_unlock(rqout->lock);
}
Expand Down
1 change: 1 addition & 0 deletions radsecproxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

/* MAX_REQUESTS must be 256 due to Radius' 8 bit ID field */
#define MAX_REQUESTS 256
#define MAX_LOSTRQS 16
#define REQUEST_RETRY_INTERVAL 5
#define REQUEST_RETRY_COUNT 2
#define DUPLICATE_INTERVAL REQUEST_RETRY_INTERVAL * REQUEST_RETRY_COUNT
Expand Down

0 comments on commit 1c81d55

Please sign in to comment.