Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Log missing bridge per localnet port just once
Having some localnet ports missing a bridge device on a particular
chassis is a supported configuration (e.g. used to implement "routed
provider networks" for OpenStack) and should not flood logs with
duplicate messages.

Signed-off-by: Ihar Hrachyshka <ihrachys@redhat.com>
Acked-by: Dumitru Ceara <dceara@redhat.com>
Acked-by: Numan Siddique <numans@ovn.org>
Signed-off-by: Numan Siddique <numans@ovn.org>
  • Loading branch information
booxter authored and numansiddique committed May 20, 2020
1 parent ba40eff commit 939f863
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 4 deletions.
2 changes: 2 additions & 0 deletions controller/ovn-controller.c
Expand Up @@ -1760,6 +1760,7 @@ main(int argc, char *argv[])

daemonize_complete();

patch_init();
pinctrl_init();
lflow_init();

Expand Down Expand Up @@ -2271,6 +2272,7 @@ main(int argc, char *argv[])
lflow_destroy();
ofctrl_destroy();
pinctrl_destroy();
patch_destroy();

ovsdb_idl_loop_destroy(&ovs_idl_loop);
ovsdb_idl_loop_destroy(&ovnsb_idl_loop);
Expand Down
36 changes: 32 additions & 4 deletions controller/patch.c
Expand Up @@ -24,9 +24,25 @@
#include "openvswitch/hmap.h"
#include "openvswitch/vlog.h"
#include "ovn-controller.h"
#include "sset.h"

VLOG_DEFINE_THIS_MODULE(patch);

/* Contains list of physical bridges that were missing. */
static struct sset missed_bridges;

void
patch_init(void)
{
sset_init(&missed_bridges);
}

void
patch_destroy(void)
{
sset_destroy(&missed_bridges);
}

static char *
patch_port_name(const char *src, const char *dst)
{
Expand Down Expand Up @@ -223,20 +239,32 @@ add_bridge_mappings(struct ovsdb_idl_txn *ovs_idl_txn,
binding->type, binding->logical_port);
continue;
}
char *msg_key = xasprintf("%s;%s", binding->logical_port, network);
struct ovsrec_bridge *br_ln = shash_find_data(&bridge_mappings, network);
if (!br_ln) {
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
if (!is_localnet) {
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
VLOG_ERR_RL(&rl, "bridge not found for %s port '%s' "
"with network name '%s'",
binding->type, binding->logical_port, network);
} else {
VLOG_INFO_RL(&rl, "bridge not found for localnet port '%s' "
"with network name '%s'; skipping",
binding->logical_port, network);
/* Since having localnet ports that are not mapped on some
* chassis is a supported configuration used to implement
* multisegment switches with fabric L3 routing between
* segments, log the following message once per run but don't
* unnecessarily pollute the log file. */
if (!sset_contains(&missed_bridges, msg_key)) {
VLOG_INFO("bridge not found for localnet port '%s' with "
"network name '%s'; skipping",
binding->logical_port, network);
sset_add(&missed_bridges, msg_key);
}
}
free(msg_key);
continue;
}
sset_find_and_delete(&missed_bridges, msg_key);
free(msg_key);

char *name1 = patch_port_name(br_int->name, binding->logical_port);
char *name2 = patch_port_name(binding->logical_port, br_int->name);
Expand Down
2 changes: 2 additions & 0 deletions controller/patch.h
Expand Up @@ -43,5 +43,7 @@ void patch_run(struct ovsdb_idl_txn *ovs_idl_txn,
const struct ovsrec_bridge *br_int,
const struct sbrec_chassis *,
const struct hmap *local_datapaths);
void patch_init(void);
void patch_destroy(void);

#endif /* controller/patch.h */

0 comments on commit 939f863

Please sign in to comment.