Skip to content

Commit

Permalink
ic: call ovn_db_run() only when all DBs are connected
Browse files Browse the repository at this point in the history
Prior to this commit ovn_db_run() function in ovn-ic
was called right after daemon's lock was acquired in SB DB.

Inside ovn_db_run() there is a search for availability zone
in NB DB. If AZ was not found, ovn_db_run returned. So, it was
an implicit requirement for connected NB DB.

But in case, where NB DB was connected and ICNB DB was not,
we could run in situation where in ts_run() logical switches
from NB DB were collected and transit switches from ICNB DB
were not due to not synced ICNB DB. This lead to deletion of
transit logical switches from NB DB.

A normal restart of only one ovn-ic daemon in AZ, could damage
the logical topology: it removed LS (transit), its LSPs.
After ovn-ic is connected to ICNB, it creates logical switch
in NB DB back, but its LSPs are lost and need manual re-addition.

This commit adds explicit requirement for all DBs to be
connected:

- NB DB
- SB DB
- ICNB DB
- ICSB DB

Only when this condition is met, we can safely run ovn-ic sync
logic.

Signed-off-by: Vladislav Odintsov <odivlad@gmail.com>
Signed-off-by: Han Zhou <hzhou@ovn.org>
  • Loading branch information
odivlad authored and hzhou8 committed Sep 7, 2021
1 parent 83296a4 commit 1cb5e11
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion ic/ovn-ic.c
Expand Up @@ -1752,7 +1752,11 @@ main(int argc, char *argv[])
state.had_lock = false;
}

if (ovsdb_idl_has_lock(ovnsb_idl_loop.idl)) {
if (ovsdb_idl_has_lock(ovnsb_idl_loop.idl) &&
ovsdb_idl_has_ever_connected(ctx.ovnnb_idl) &&
ovsdb_idl_has_ever_connected(ctx.ovnsb_idl) &&
ovsdb_idl_has_ever_connected(ctx.ovninb_idl) &&
ovsdb_idl_has_ever_connected(ctx.ovnisb_idl)) {
ovn_db_run(&ctx);
}

Expand Down

0 comments on commit 1cb5e11

Please sign in to comment.