Skip to content

Commit

Permalink
Merge pull request #285 from kronosnet/kill-latency
Browse files Browse the repository at this point in the history
[links] kill redundant latency in link status and move it to stats
  • Loading branch information
fabbione committed Mar 1, 2020
2 parents 8ac7c52 + cfd074d commit f8b3f58
Show file tree
Hide file tree
Showing 5 changed files with 12 additions and 26 deletions.
1 change: 0 additions & 1 deletion libknet/internals.h
Expand Up @@ -66,7 +66,6 @@ struct knet_link {
unsigned long long pong_timeout_adj; /* timeout adjusted for latency */
uint8_t pong_timeout_backoff; /* see link.h for definition */
unsigned int latency_max_samples; /* precision */
unsigned int latency_cur_samples;
uint8_t pong_count; /* how many ping/pong to send/receive before link is up */
uint64_t flags;
/* status */
Expand Down
4 changes: 0 additions & 4 deletions libknet/libknet.h
Expand Up @@ -1962,9 +1962,6 @@ int knet_link_get_link_list(knet_handle_t knet_h, knet_node_id_t host_id,
* dynconnected the link has dynamic ip on the other end, and
* we can see the other host is sending pings to us.
*
* latency average latency of this link
* see also knet_link_set/get_timeout.
*
* pong_last if the link is down, this value tells us how long
* ago this link was active. A value of 0 means that the link
* has never been active.
Expand Down Expand Up @@ -2042,7 +2039,6 @@ struct knet_link_status {
uint8_t enabled; /* link is configured and admin enabled for traffic */
uint8_t connected; /* link is connected for data (local view) */
uint8_t dynconnected; /* link has been activated by remote dynip */
unsigned long long latency; /* average latency computed by fix/exp */
struct timespec pong_last;
unsigned int mtu; /* current detected MTU on this link */
unsigned int proto_overhead; /* contains the size of the IP protocol, knet headers and
Expand Down
2 changes: 1 addition & 1 deletion libknet/links.c
Expand Up @@ -261,7 +261,7 @@ int knet_link_set_config(knet_handle_t knet_h, knet_node_id_t host_id, uint8_t l
link->pong_timeout_backoff = KNET_LINK_PONG_TIMEOUT_BACKOFF;
link->pong_timeout_adj = link->pong_timeout * link->pong_timeout_backoff; /* microseconds */
link->latency_max_samples = KNET_LINK_DEFAULT_PING_PRECISION;
link->latency_cur_samples = 0;
link->status.stats.latency_samples = 0;
link->flags = flags;

savederrno = pthread_mutex_init(&link->link_stats_mutex, NULL);
Expand Down
2 changes: 1 addition & 1 deletion libknet/threads_heartbeat.c
Expand Up @@ -190,7 +190,7 @@ static void _adjust_pong_timeouts(knet_handle_t knet_h)
dst_link->pong_timeout_backoff--;
}

dst_link->pong_timeout_adj = (dst_link->pong_timeout * dst_link->pong_timeout_backoff) + (dst_link->status.latency * KNET_LINK_PONG_TIMEOUT_LAT_MUL);
dst_link->pong_timeout_adj = (dst_link->pong_timeout * dst_link->pong_timeout_backoff) + (dst_link->status.stats.latency_ave * KNET_LINK_PONG_TIMEOUT_LAT_MUL);
}
}

Expand Down
29 changes: 10 additions & 19 deletions libknet/threads_rx.c
Expand Up @@ -668,18 +668,18 @@ static void _parse_recv_from_links(knet_handle_t knet_h, int sockfd, const struc
* in words : ('previous mean' * '(count -1)') + 'new value') / 'count'
*/

src_link->latency_cur_samples++;
src_link->status.stats.latency_samples++;

/*
* limit to max_samples (precision)
*/
if (src_link->latency_cur_samples >= src_link->latency_max_samples) {
src_link->latency_cur_samples = src_link->latency_max_samples;
if (src_link->status.stats.latency_samples >= src_link->latency_max_samples) {
src_link->status.stats.latency_samples = src_link->latency_max_samples;
}
src_link->status.latency =
(((src_link->status.latency * (src_link->latency_cur_samples - 1)) + (latency_last / 1000llu)) / src_link->latency_cur_samples);
src_link->status.stats.latency_ave =
(((src_link->status.stats.latency_ave * (src_link->status.stats.latency_samples - 1)) + (latency_last / 1000llu)) / src_link->status.stats.latency_samples);

if (src_link->status.latency < src_link->pong_timeout_adj) {
if (src_link->status.stats.latency_ave < src_link->pong_timeout_adj) {
if (!src_link->status.connected) {
if (src_link->received_pong >= src_link->pong_count) {
log_info(knet_h, KNET_SUB_RX, "host: %u link: %u is up",
Expand All @@ -693,21 +693,12 @@ static void _parse_recv_from_links(knet_handle_t knet_h, int sockfd, const struc
}
}
/* Calculate latency stats */
if (src_link->status.latency > src_link->status.stats.latency_max) {
src_link->status.stats.latency_max = src_link->status.latency;
if (src_link->status.stats.latency_ave > src_link->status.stats.latency_max) {
src_link->status.stats.latency_max = src_link->status.stats.latency_ave;
}
if (src_link->status.latency < src_link->status.stats.latency_min) {
src_link->status.stats.latency_min = src_link->status.latency;
if (src_link->status.stats.latency_ave < src_link->status.stats.latency_min) {
src_link->status.stats.latency_min = src_link->status.stats.latency_ave;
}

/*
* those 2 lines below make all latency average calculations consistent and capped to
* link precision. In future we will kill the one above to keep only this one in
* the stats structure, but for now we leave it around to avoid API/ABI
* breakage as we backport the fixes to stable
*/
src_link->status.stats.latency_ave = src_link->status.latency;
src_link->status.stats.latency_samples = src_link->latency_cur_samples;
}
break;
case KNET_HEADER_TYPE_PMTUD:
Expand Down

0 comments on commit f8b3f58

Please sign in to comment.