Add retries and timeout commands
This commit is contained in:
parent
d674d23b45
commit
fd3702f973
2 changed files with 74 additions and 14 deletions
21
chrony.texi
21
chrony.texi
|
@ -2836,10 +2836,12 @@ interface.
|
||||||
* online command:: Warn that connectivity to a source has been restored
|
* online command:: Warn that connectivity to a source has been restored
|
||||||
* password command:: Provide password needed for most commands
|
* password command:: Provide password needed for most commands
|
||||||
* quit command:: Exit from chronyc
|
* quit command:: Exit from chronyc
|
||||||
|
* retries command:: Set maximum number of retries
|
||||||
* rtcdata command:: Display RTC parameters
|
* rtcdata command:: Display RTC parameters
|
||||||
* settime command:: Provide a manual input of the current time
|
* settime command:: Provide a manual input of the current time
|
||||||
* sources command:: Display information about the current set of sources
|
* sources command:: Display information about the current set of sources
|
||||||
* sourcestats command:: Display the rate & offset estimation performance of sources
|
* sourcestats command:: Display the rate & offset estimation performance of sources
|
||||||
|
* timeout command:: Set initial response timeout
|
||||||
* tracking command:: Display system clock performance
|
* tracking command:: Display system clock performance
|
||||||
* trimrtc command:: Correct the RTC time to the current system time
|
* trimrtc command:: Correct the RTC time to the current system time
|
||||||
* writertc command:: Write the RTC parameters to file.
|
* writertc command:: Write the RTC parameters to file.
|
||||||
|
@ -3604,6 +3606,15 @@ directive}).
|
||||||
The quit command exits from chronyc and returns the user to the shell
|
The quit command exits from chronyc and returns the user to the shell
|
||||||
(same as the exit command).
|
(same as the exit command).
|
||||||
@c }}}
|
@c }}}
|
||||||
|
@c {{{ retries
|
||||||
|
@node retries command
|
||||||
|
@subsubsection retries
|
||||||
|
The @code{retries} command sets the maximum number of retries for
|
||||||
|
@code{chronyc} requests before giving up. The response timeout is controlled
|
||||||
|
by @code{timeout} command (@pxref{timeout command}).
|
||||||
|
|
||||||
|
The default is 2.
|
||||||
|
@c }}}
|
||||||
@c {{{ rtcdata
|
@c {{{ rtcdata
|
||||||
@node rtcdata command
|
@node rtcdata command
|
||||||
@subsubsection rtcdata
|
@subsubsection rtcdata
|
||||||
|
@ -3841,6 +3852,16 @@ This is the estimated sample standard deviation.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
@c }}}
|
@c }}}
|
||||||
|
@c {{{ timeout
|
||||||
|
@node timeout command
|
||||||
|
@subsubsection timeout
|
||||||
|
The @code{timeout} command sets the initial timeout for @code{chronyc} requests
|
||||||
|
in milliseconds. If no response is received from @code{chronyd}, the timeout is
|
||||||
|
doubled and the request is resent. The maximum number of retries is configured
|
||||||
|
with the @code{retries} command (@pxref{retries command}).
|
||||||
|
|
||||||
|
The default is 1000 milliseconds.
|
||||||
|
@c }}}
|
||||||
@c {{{ tracking
|
@c {{{ tracking
|
||||||
@node tracking command
|
@node tracking command
|
||||||
@subsubsection tracking
|
@subsubsection tracking
|
||||||
|
|
67
client.c
67
client.c
|
@ -1179,6 +1179,8 @@ give_help(void)
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("dns -n|+n : Disable/enable resolving IP addresses to hostnames\n");
|
printf("dns -n|+n : Disable/enable resolving IP addresses to hostnames\n");
|
||||||
printf("dns -4|-6|-46 : Resolve hostnames only to IPv4/IPv6/both addresses\n");
|
printf("dns -4|-6|-46 : Resolve hostnames only to IPv4/IPv6/both addresses\n");
|
||||||
|
printf("timeout <milliseconds> : Set initial response timeout\n");
|
||||||
|
printf("retries <n> : Set maximum number of retries\n");
|
||||||
printf("exit|quit : Leave the program\n");
|
printf("exit|quit : Leave the program\n");
|
||||||
printf("help : Generate this help\n");
|
printf("help : Generate this help\n");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
@ -1190,8 +1192,8 @@ static unsigned long sequence = 0;
|
||||||
static unsigned long utoken = 0;
|
static unsigned long utoken = 0;
|
||||||
static unsigned long token = 0;
|
static unsigned long token = 0;
|
||||||
|
|
||||||
#define MAX_ATTEMPTS 3
|
static int max_retries = 2;
|
||||||
|
static int initial_timeout = 1000;
|
||||||
|
|
||||||
/* This is the core protocol module. Complete particular fields in
|
/* This is the core protocol module. Complete particular fields in
|
||||||
the outgoing packet, send it, wait for a response, handle retries,
|
the outgoing packet, send it, wait for a response, handle retries,
|
||||||
|
@ -1210,8 +1212,8 @@ submit_request(CMD_Request *request, CMD_Reply *reply, int *reply_auth_ok)
|
||||||
int read_length;
|
int read_length;
|
||||||
int expected_length;
|
int expected_length;
|
||||||
int command_length;
|
int command_length;
|
||||||
struct timeval timeout;
|
struct timeval tv;
|
||||||
int timeout_seconds;
|
int timeout;
|
||||||
int n_attempts;
|
int n_attempts;
|
||||||
fd_set rdfd, wrfd, exfd;
|
fd_set rdfd, wrfd, exfd;
|
||||||
|
|
||||||
|
@ -1225,8 +1227,7 @@ submit_request(CMD_Request *request, CMD_Reply *reply, int *reply_auth_ok)
|
||||||
request->utoken = htonl(utoken);
|
request->utoken = htonl(utoken);
|
||||||
request->token = htonl(token);
|
request->token = htonl(token);
|
||||||
|
|
||||||
timeout_seconds = 1;
|
timeout = initial_timeout;
|
||||||
|
|
||||||
|
|
||||||
n_attempts = 0;
|
n_attempts = 0;
|
||||||
|
|
||||||
|
@ -1262,17 +1263,17 @@ submit_request(CMD_Request *request, CMD_Reply *reply, int *reply_auth_ok)
|
||||||
/* Increment this for next time */
|
/* Increment this for next time */
|
||||||
++ request->attempt;
|
++ request->attempt;
|
||||||
|
|
||||||
timeout.tv_sec = timeout_seconds;
|
tv.tv_sec = timeout / 1000;
|
||||||
timeout.tv_usec = 0;
|
tv.tv_usec = timeout % 1000 * 1000;
|
||||||
|
timeout *= 2;
|
||||||
|
|
||||||
timeout_seconds *= 2;
|
|
||||||
FD_ZERO(&rdfd);
|
FD_ZERO(&rdfd);
|
||||||
FD_ZERO(&wrfd);
|
FD_ZERO(&wrfd);
|
||||||
FD_ZERO(&exfd);
|
FD_ZERO(&exfd);
|
||||||
|
|
||||||
FD_SET(sock_fd, &rdfd);
|
FD_SET(sock_fd, &rdfd);
|
||||||
|
|
||||||
select_status = select(sock_fd + 1, &rdfd, &wrfd, &exfd, &timeout);
|
select_status = select(sock_fd + 1, &rdfd, &wrfd, &exfd, &tv);
|
||||||
|
|
||||||
if (select_status < 0) {
|
if (select_status < 0) {
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -1281,7 +1282,7 @@ submit_request(CMD_Request *request, CMD_Reply *reply, int *reply_auth_ok)
|
||||||
} else if (select_status == 0) {
|
} else if (select_status == 0) {
|
||||||
/* Timeout must have elapsed, try a resend? */
|
/* Timeout must have elapsed, try a resend? */
|
||||||
n_attempts ++;
|
n_attempts ++;
|
||||||
if (n_attempts == MAX_ATTEMPTS) {
|
if (n_attempts > max_retries) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1304,7 +1305,7 @@ submit_request(CMD_Request *request, CMD_Reply *reply, int *reply_auth_ok)
|
||||||
going to a dead port - but only if the daemon machine is
|
going to a dead port - but only if the daemon machine is
|
||||||
running Linux (Solaris doesn't return anything) */
|
running Linux (Solaris doesn't return anything) */
|
||||||
n_attempts++;
|
n_attempts++;
|
||||||
if (n_attempts == MAX_ATTEMPTS) {
|
if (n_attempts > max_retries) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1333,7 +1334,7 @@ submit_request(CMD_Request *request, CMD_Reply *reply, int *reply_auth_ok)
|
||||||
|
|
||||||
if (bad_length || bad_sender || bad_sequence) {
|
if (bad_length || bad_sender || bad_sequence) {
|
||||||
n_attempts++;
|
n_attempts++;
|
||||||
if (n_attempts == MAX_ATTEMPTS) {
|
if (n_attempts > max_retries) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
|
@ -1349,7 +1350,7 @@ submit_request(CMD_Request *request, CMD_Reply *reply, int *reply_auth_ok)
|
||||||
|
|
||||||
if (bad_header) {
|
if (bad_header) {
|
||||||
n_attempts++;
|
n_attempts++;
|
||||||
if (n_attempts == MAX_ATTEMPTS) {
|
if (n_attempts > max_retries) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
|
@ -2331,6 +2332,38 @@ process_cmd_dns(const char *line)
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
|
static int
|
||||||
|
process_cmd_timeout(const char *line)
|
||||||
|
{
|
||||||
|
int timeout;
|
||||||
|
|
||||||
|
timeout = atoi(line);
|
||||||
|
if (timeout < 100) {
|
||||||
|
fprintf(stderr, "Timeout %d is too short\n", timeout);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
initial_timeout = timeout;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ================================================== */
|
||||||
|
|
||||||
|
static int
|
||||||
|
process_cmd_retries(const char *line)
|
||||||
|
{
|
||||||
|
int retries;
|
||||||
|
|
||||||
|
retries = atoi(line);
|
||||||
|
if (retries < 0) {
|
||||||
|
fprintf(stderr, "Invalid maximum number of retries\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
max_retries = retries;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ================================================== */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
process_line(char *line, int *quit)
|
process_line(char *line, int *quit)
|
||||||
{
|
{
|
||||||
|
@ -2449,6 +2482,12 @@ process_line(char *line, int *quit)
|
||||||
} else if (!strncmp(p, "dns ", 4)) {
|
} else if (!strncmp(p, "dns ", 4)) {
|
||||||
ret = process_cmd_dns(p+4);
|
ret = process_cmd_dns(p+4);
|
||||||
do_normal_submit = 0;
|
do_normal_submit = 0;
|
||||||
|
} else if (!strncmp(p, "timeout", 7)) {
|
||||||
|
ret = process_cmd_timeout(p+7);
|
||||||
|
do_normal_submit = 0;
|
||||||
|
} else if (!strncmp(p, "retries", 7)) {
|
||||||
|
ret = process_cmd_retries(p+7);
|
||||||
|
do_normal_submit = 0;
|
||||||
} else if (!strncmp(p, "help", 4)) {
|
} else if (!strncmp(p, "help", 4)) {
|
||||||
do_normal_submit = 0;
|
do_normal_submit = 0;
|
||||||
give_help();
|
give_help();
|
||||||
|
|
Loading…
Reference in a new issue