2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-22 09:58:01 +00:00

bridge: Fix log spam about prefixes.

If prefixes are set for the flow table, ovs-vswitchd will print them
out to the log whenever something changes in the database.  Since
normally prefixes will be set for every OpenFlow table, it will print
255 log messages per iteration.  This is very annoying in dynamic
environments like Kubernetes, where database changes can happen
frequently, obscuring and erasing useful logs on log rotation.

These log messages are not very important.  The information can be
looked up in the database and normally the values will not actually
change after initial setup.  Move the log to debug level.

While at it, rate limit the warnings about misconfigured prefixes,
as they may be too much as well.  And make the print out a little
nicer by only printing once if multiple adjacent tables have the
same prefixes configured.  In most cases that will reduce the amount
of logs from 255 lines to 1 per iteration with debug logging enabled.
We're also now logging the default values as well, since it's under
debug and will not actually add that many log lines with the new
collapsed format.  This makes debug logs more accurate/useful.

An additional improvement might be to not print if nothing actually
changed, but that will require either per-table per-bridge tracking
of previous values or changing parts of the ofproto API to tell the
bridge layer if something changed or not.  Doesn't seem necessary
at the moment.

Fixes: 13751fd88c4b ("Classifier: Track address prefixes.")
Acked-by: Eelco Chaudron <echaudro@redhat.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
This commit is contained in:
Ilya Maximets 2024-12-09 21:21:46 +01:00
parent 3b37a6154a
commit 9f0c46b5d4

View File

@ -4122,6 +4122,8 @@ static void
bridge_configure_tables(struct bridge *br)
{
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
char *prev_prefixes = NULL;
int prev_start = 0;
int n_tables;
int i, j;
@ -4183,18 +4185,21 @@ bridge_configure_tables(struct bridge *br)
}
mf = mf_from_name(name);
if (!mf) {
VLOG_WARN("bridge %s: 'prefixes' with unknown field: %s",
br->name, name);
VLOG_WARN_RL(&rl, "bridge %s: "
"'prefixes' with unknown field: %s",
br->name, name);
continue;
}
if (mf->flow_be32ofs < 0 || mf->n_bits % 32) {
VLOG_WARN("bridge %s: 'prefixes' with incompatible field: "
"%s", br->name, name);
VLOG_WARN_RL(&rl, "bridge %s: "
"'prefixes' with incompatible field: %s",
br->name, name);
continue;
}
if (s.n_prefix_fields >= ARRAY_SIZE(s.prefix_fields)) {
VLOG_WARN("bridge %s: 'prefixes' with too many fields, "
"field not used: %s", br->name, name);
VLOG_WARN_RL(&rl, "bridge %s: "
"'prefixes' with too many fields, "
"field not used: %s", br->name, name);
continue;
}
use_default_prefixes = false;
@ -4206,8 +4211,10 @@ bridge_configure_tables(struct bridge *br)
s.n_prefix_fields = ARRAY_SIZE(default_prefix_fields);
memcpy(s.prefix_fields, default_prefix_fields,
sizeof default_prefix_fields);
} else {
}
if (VLOG_IS_DBG_ENABLED()) {
struct ds ds = DS_EMPTY_INITIALIZER;
for (int k = 0; k < s.n_prefix_fields; k++) {
if (k) {
ds_put_char(&ds, ',');
@ -4217,8 +4224,16 @@ bridge_configure_tables(struct bridge *br)
if (s.n_prefix_fields == 0) {
ds_put_cstr(&ds, "none");
}
VLOG_INFO("bridge %s table %d: Prefix lookup with: %s.",
br->name, i, ds_cstr(&ds));
if (!prev_prefixes) {
prev_prefixes = ds_steal_cstr(&ds);
prev_start = i;
} else if (prev_prefixes && strcmp(prev_prefixes, ds_cstr(&ds))) {
VLOG_DBG("bridge %s tables %d-%d: Prefix lookup with: %s.",
br->name, prev_start, i - 1, prev_prefixes);
free(prev_prefixes);
prev_prefixes = ds_steal_cstr(&ds);
prev_start = i;
}
ds_destroy(&ds);
}
@ -4226,6 +4241,11 @@ bridge_configure_tables(struct bridge *br)
free(s.groups);
}
if (prev_prefixes) {
VLOG_DBG("bridge %s tables %d-%d: Prefix lookup with: %s.",
br->name, prev_start, n_tables - 1, prev_prefixes);
free(prev_prefixes);
}
for (; j < br->cfg->n_flow_tables; j++) {
VLOG_WARN_RL(&rl, "bridge %s: ignoring configuration for flow table "
"%"PRId64" not supported by this datapath", br->name,