Reported-at: https://issues.redhat.com/browse/FDP-715
On 10/21/24 2:12 PM, Rosemarie O'Riorden wrote: > ovn-controller crashed when connected to an empty local db, forcing the user > to > initialize a local db before starting the controller daemon. With this fix, > the > controller will no longer crash in this case, but instead keep running and > wait > until the database is initialized to do anything else. > > Signed-off-by: Rosemarie O'Riorden <[email protected]> > --- > controller/chassis.c | 3 +++ > controller/ovn-controller.c | 19 ++++++++++--------- > tests/ovn-controller.at | 23 +++++++++++++++++++++++ > 3 files changed, 36 insertions(+), 9 deletions(-) > > diff --git a/controller/chassis.c b/controller/chassis.c > index 2991a0af3..b2eefd58a 100644 > --- a/controller/chassis.c > +++ b/controller/chassis.c > @@ -1016,6 +1016,9 @@ store_chassis_index_if_needed( > { > const struct ovsrec_open_vswitch *cfg = > ovsrec_open_vswitch_table_first(ovs_table); > + if (!cfg) { > + return; > + } > const char *chassis_id = get_ovs_chassis_id(ovs_table); > > char *idx_key = xasprintf(CHASSIS_IDX_PREFIX "%s", chassis_id); > diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c > index c48667887..4c3c79337 100644 > --- a/controller/ovn-controller.c > +++ b/controller/ovn-controller.c > @@ -5434,6 +5434,8 @@ main(int argc, char *argv[]) > ovsrec_open_vswitch_table_get(ovs_idl_loop.idl); > const struct ovsrec_bridge *br_int = NULL; > const struct ovsrec_datapath *br_int_dp = NULL; > + const struct ovsrec_open_vswitch *cfg = > + ovsrec_open_vswitch_table_first(ovs_table); > process_br_int(ovs_idl_txn, bridge_table, ovs_table, &br_int, > ovsrec_server_has_datapath_table(ovs_idl_loop.idl) > ? &br_int_dp > @@ -5446,13 +5448,13 @@ main(int argc, char *argv[]) > > /* Enable ACL matching for double tagged traffic. */ > if (ovs_idl_txn) { > - const struct ovsrec_open_vswitch *cfg = > - ovsrec_open_vswitch_table_first(ovs_table); > - int vlan_limit = smap_get_int( > - &cfg->other_config, "vlan-limit", -1); > - if (vlan_limit != 0) { > - ovsrec_open_vswitch_update_other_config_setkey( > - cfg, "vlan-limit", "0"); > + if (cfg) { > + int vlan_limit = smap_get_int( > + &cfg->other_config, "vlan-limit", -1); > + if (vlan_limit != 0) { > + ovsrec_open_vswitch_update_other_config_setkey( > + cfg, "vlan-limit", "0"); > + } > } > } > > @@ -5463,7 +5465,7 @@ main(int argc, char *argv[]) > } > > if (ovsdb_idl_has_ever_connected(ovnsb_idl_loop.idl) && > - northd_version_match) { > + northd_version_match && cfg) { > > /* Unconditionally remove all deleted lflows from the lflow > * cache. > @@ -5877,7 +5879,6 @@ loop_done: > = ovsrec_bridge_table_get(ovs_idl_loop.idl); > const struct ovsrec_open_vswitch_table *ovs_table > = ovsrec_open_vswitch_table_get(ovs_idl_loop.idl); > - > const struct sbrec_port_binding_table *port_binding_table > = sbrec_port_binding_table_get(ovnsb_idl_loop.idl); > > diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at > index a2e451880..0ef3d4582 100644 > --- a/tests/ovn-controller.at > +++ b/tests/ovn-controller.at > @@ -3419,3 +3419,26 @@ AT_CHECK([test $(grep -c "HANDLER_MESSAGE" > hv1/ovn-controller.log) -ge 1]) > > OVN_CLEANUP([hv1]) > AT_CLEANUP > + > +AT_SETUP([ovn-controller - Start controller with empty db]) > +AT_KEYWORDS([ovn]) > + > +check ovsdb-tool create conf.db $ovs_srcdir/vswitchd/vswitch.ovsschema > +start_daemon ovsdb-server --remote=punix:db.sock > +start_daemon ovn-controller unix:db.sock > + > +AT_CHECK([ovsdb-client --bare dump unix:db.sock Open_vSwitch Open_vSwitch], > [], [Open_vSwitch table > +]) > +check ovs-vsctl --no-wait init > +AT_CHECK([ovs-vsctl show| tail -n +2], [], [ Bridge br-int > + fail_mode: secure > + datapath_type: system > + Port br-int > + Interface br-int > + type: internal > +]) > + > +# Gracefully terminate daemons > +OVS_APP_EXIT_AND_WAIT([ovn-controller]) > +OVS_APP_EXIT_AND_WAIT([ovsdb-server]) > +AT_CLEANUP -- Rosemarie O'Riorden [email protected] _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
