Skip to content

Commit

Permalink
[links] kill redundant latency in link status and move it to stats
Browse files Browse the repository at this point in the history
this is an ABI breakage. Soname change was already done a while back for master

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
  • Loading branch information
fabbione committed Feb 3, 2020
1 parent cc12097 commit 7fe3b00
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 @@ -246,7 +246,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;

if (transport_link_set_config(knet_h, link, transport) < 0) {
Expand Down
2 changes: 1 addition & 1 deletion libknet/threads_heartbeat.c
Expand Up @@ -177,7 +177,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 @@ -632,18 +632,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 @@ -657,21 +657,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 7fe3b00

Please sign in to comment.