mirror of
https://github.com/openvswitch/ovs
synced 2025-09-02 15:25:22 +00:00
hmap: Improve debug log message when reporting unusually large buckets.
I was seeing a lot of these messages, including a lot of them suppressed by rate-limiting, and I wondered whether any really big messages were being suppressed. By reporting the largest bucket, instead of just every large bucket, it becomes more likely that the truly too-large buckets get reported. (The problem I saw was a false alarm.) Acked-by: Han Zhou <hzhou8@ebay.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
This commit is contained in:
29
lib/hmap.c
29
lib/hmap.c
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2008, 2009, 2010, 2012, 2013, 2015 Nicira, Inc.
|
* Copyright (c) 2008, 2009, 2010, 2012, 2013, 2015, 2019 Nicira, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -103,6 +103,9 @@ resize(struct hmap *hmap, size_t new_mask, const char *where)
|
|||||||
tmp.buckets[i] = NULL;
|
tmp.buckets[i] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
int n_big_buckets = 0;
|
||||||
|
int biggest_count = 0;
|
||||||
|
int n_biggest_buckets = 0;
|
||||||
for (i = 0; i <= hmap->mask; i++) {
|
for (i = 0; i <= hmap->mask; i++) {
|
||||||
struct hmap_node *node, *next;
|
struct hmap_node *node, *next;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
@@ -112,14 +115,30 @@ resize(struct hmap *hmap, size_t new_mask, const char *where)
|
|||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
if (count > 5) {
|
if (count > 5) {
|
||||||
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(10, 10);
|
n_big_buckets++;
|
||||||
COVERAGE_INC(hmap_pathological);
|
if (count > biggest_count) {
|
||||||
VLOG_DBG_RL(&rl, "%s: %d nodes in bucket (%"PRIuSIZE" nodes, %"PRIuSIZE" buckets)",
|
biggest_count = count;
|
||||||
where, count, hmap->n, hmap->mask + 1);
|
n_biggest_buckets = 1;
|
||||||
|
} else if (count == biggest_count) {
|
||||||
|
n_biggest_buckets++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hmap_swap(hmap, &tmp);
|
hmap_swap(hmap, &tmp);
|
||||||
hmap_destroy(&tmp);
|
hmap_destroy(&tmp);
|
||||||
|
|
||||||
|
if (n_big_buckets) {
|
||||||
|
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(10, 10);
|
||||||
|
COVERAGE_INC(hmap_pathological);
|
||||||
|
VLOG_DBG_RL(&rl, "%s: %d bucket%s with 6+ nodes, "
|
||||||
|
"including %d bucket%s with %d nodes "
|
||||||
|
"(%"PRIuSIZE" nodes total across %"PRIuSIZE" buckets)",
|
||||||
|
where,
|
||||||
|
n_big_buckets, n_big_buckets > 1 ? "s" : "",
|
||||||
|
n_biggest_buckets, n_biggest_buckets > 1 ? "s" : "",
|
||||||
|
biggest_count,
|
||||||
|
hmap->n, hmap->mask + 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
|
Reference in New Issue
Block a user