summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZak Whittington <zwhitt.vmware@gmail.com>2018-10-25 11:09:09 -0700
committerBen Pfaff <blp@ovn.org>2018-10-25 20:48:13 -0700
commit5760d3e36b7032415963f0aae4737fb55748907b (patch)
tree016645366a42880821bbcdf927a5fd24795ef8be
parent18a62383c3d1f4d0d720a02eff83ad03fce481ab (diff)
downloadopenvswitch-5760d3e36b7032415963f0aae4737fb55748907b.tar.gz
bridge.c: prevent controller connects while flow-restore-wait
When force-reload-kmod is used, it shows an error when reinstalling tlvs during "Restoring saved flows" step: OFPT_ERROR (xid=0x4): NXTTMFC_ALREADY_MAPPED This is caused by a race condition between the restore script, which calls ofctl, and the connected controllers both adding back the same TLVs. The restore script already sets flow-restore-wait to true while doing flow restoration, and sets it back to false after it is done, and this patch utilizes that fact to prevent the TLV race. It does this by preventing vswitchd from connecting to controllers in the controller table while it is in a flow-restore-wait state. With this patch, when bridge_configure_remotes() calls bridge_get_controllers(), it first checks if flow-restore-wait has been set, and if so, it ignores any controllers in the controller database and sets n_controllers to 0. This solution does preserve the management service controller which is added via bridge_ofproto_controller_for_mgmt() after checking whether we should call bridge_get_controllers() (and thus n_controllers is properly set to 1, etc) VMware-BZ: 2195377 Signed-off-by: Zak Whittington <zwhitt.vmware@gmail.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
-rw-r--r--vswitchd/bridge.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index 18c16fb83..d9103c7fb 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -3561,7 +3561,8 @@ bridge_configure_remotes(struct bridge *br,
ofproto_set_extra_in_band_remotes(br->ofproto, managers, n_managers);
}
- n_controllers = bridge_get_controllers(br, &controllers);
+ n_controllers = (ofproto_get_flow_restore_wait() ? 0
+ : bridge_get_controllers(br, &controllers));
ocs = xmalloc((n_controllers + 1) * sizeof *ocs);
n_ocs = 0;