@@ -312,14 +312,9 @@ update_ct_zones(struct sset *lports, struct hmap *patched_datapaths,
}
static void
-commit_ct_zones(struct controller_ctx *ctx,
- const struct ovsrec_bridge *br_int,
+commit_ct_zones(const struct ovsrec_bridge *br_int,
struct shash *pending_ct_zones)
{
- if (!ctx->ovs_idl_txn) {
- return;
- }
-
struct smap new_ids;
smap_clone(&new_ids, &br_int->external_ids);
@@ -543,24 +538,26 @@ main(int argc, char *argv[])
pinctrl_run(&ctx, &lports, br_int, chassis_id, &local_datapaths);
update_ct_zones(&all_lports, &patched_datapaths, &ct_zones,
ct_zone_bitmap, &pending_ct_zones);
- commit_ct_zones(&ctx, br_int, &pending_ct_zones);
-
- struct hmap flow_table = HMAP_INITIALIZER(&flow_table);
- lflow_run(&ctx, &lports, &mcgroups, &local_datapaths,
- &patched_datapaths, &group_table, &ct_zones,
- &flow_table);
-
- physical_run(&ctx, mff_ovn_geneve,
- br_int, chassis_id, &ct_zones, &flow_table,
- &local_datapaths, &patched_datapaths);
-
- ofctrl_put(&flow_table, &pending_ct_zones,
- get_nb_cfg(ctx.ovnsb_idl));
- hmap_destroy(&flow_table);
- if (ctx.ovnsb_idl_txn) {
- int64_t cur_cfg = ofctrl_get_cur_cfg();
- if (cur_cfg && cur_cfg != chassis->nb_cfg) {
- sbrec_chassis_set_nb_cfg(chassis, cur_cfg);
+ if (ctx.ovs_idl_txn) {
+ commit_ct_zones(br_int, &pending_ct_zones);
+
+ struct hmap flow_table = HMAP_INITIALIZER(&flow_table);
+ lflow_run(&ctx, &lports, &mcgroups, &local_datapaths,
+ &patched_datapaths, &group_table, &ct_zones,
+ &flow_table);
+
+ physical_run(&ctx, mff_ovn_geneve,
+ br_int, chassis_id, &ct_zones, &flow_table,
+ &local_datapaths, &patched_datapaths);
+
+ ofctrl_put(&flow_table, &pending_ct_zones,
+ get_nb_cfg(ctx.ovnsb_idl));
+ hmap_destroy(&flow_table);
+ if (ctx.ovnsb_idl_txn) {
+ int64_t cur_cfg = ofctrl_get_cur_cfg();
+ if (cur_cfg && cur_cfg != chassis->nb_cfg) {
+ sbrec_chassis_set_nb_cfg(chassis, cur_cfg);
+ }
}
}
mcgroup_index_destroy(&mcgroups);
ovs_idl_txn is checked before various routines (like patch_run) execute. However, flow calculation and installation does not also check this variable, which can lead to oscillations as described in [1]. [1] http://openvswitch.org/pipermail/dev/2016-October/080247.html Signed-off-by: Ryan Moats <rmoats@us.ibm.com> --- Note: This patch also applies to the 2.6 branch ovn/controller/ovn-controller.c | 45 +++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 24 deletions(-)