[ovs-dev] [PATCH ovn] controller: Fix toggling ct zone ids.
Lorenzo Bianconi
lorenzo.bianconi at redhat.com
Sat Feb 13 10:55:18 UTC 2021
> From: Numan Siddique <numans at ovn.org>
>
> ovn-controller maintains a shash of pending ct zone entries
> to flush the ct zone ids and to store/remove the allocated zone id
> in/from the OVS bridge.external_ids. While adding an entry to
> the shash, the function 'add_pending_ct_zone_entry()' doesn't
> check for existing entry for the same key in shash. If suppose
> there are multiple entries for the samestring key, then it results in
> an infinite loop of adding and deleting the key entries in
> OVS bridge.external_ids.
>
> The pending ct zone entries are deleted from the shash when they
> reach the state - CT_ZONE_DB_SENT and when
> ovsdb_idl_loop_commit_and_wait(ovsidl) returns 1. In a highly loaded
> compute node this loop gets triggered when this function doesn't return
> 1 and there are duplicate ct zone entries.
>
> These duplicate entries are mostly observed for logical ports of
> type 'virtual' when this virtual port keeps moving from one chassis
> to another. But this scenario can get triggered for other logical ports
> too.
>
> *********************
> 2021-02-12T17:25:56.974Z|04363|jsonrpc|DBG|unix:/run/openvswitch/db.sock: send request, method="transact", params=["Open_vSwitch",{"mutations":[["external_ids","delete",["set",["ct-zone-313f5395-5170-4c4c-8820-e6288a765d27","ct-zone-efa8530b-93d5-45b3-b16f-edfe1856233c"]]],["external_ids","insert",["map",[["ct-zone-da4a2f90-aef9-4fea-ad6d-aed364fa9988","63"],["ct-zone-7a97e014-a753-473b-a0f3-b2ec6e9f11d6","71"]]]]],"where":[["_uuid","==",["uuid","653e7315-47b3-4c39-a5f9-665aa3dddb9e"]]],"op":"mutate","table":"Bridge"},{"comment":"ovn-controller\novn-controller: modifying OVS tunnels 'e3af60d7-3942-4aa2-84ad-e02dcd3b183d'","op":"comment"}], id=4336
> 2021-02-12T17:25:56.979Z|04364|jsonrpc|DBG|unix:/run/openvswitch/db.sock: received notification, method="update3", params=[["monid","Open_vSwitch"],"00000000-0000-0000-0000-000000000000",{"Bridge":{"653e7315-47b3-4c39-a5f9-665aa3dddb9e":{"modify":{"external_ids":["map",[["ct-zone-313f5395-5170-4c4c-8820-e6288a765d27","71"],["ct-zone-7a97e014-a753-473b-a0f3-b2ec6e9f11d6","71"],["ct-zone-da4a2f90-aef9-4fea-ad6d-aed364fa9988","63"],["ct-zone-efa8530b-93d5-45b3-b16f-edfe1856233c","63"]]]}}}}]
> 2021-02-12T17:25:56.988Z|04365|jsonrpc|DBG|unix:/run/openvswitch/db.sock: received reply, result=[{"count":1},{}], id=4336
> 2021-02-12T17:25:57.006Z|04366|jsonrpc|DBG|unix:/run/openvswitch/db.sock: send request, method="transact", params=["Open_vSwitch",{"mutations":[["external_ids","delete",["set",["ct-zone-da4a2f90-aef9-4fea-ad6d-aed364fa9988","ct-zone-7a97e014-a753-473b-a0f3-b2ec6e9f11d6"]]],["external_ids","insert",["map",[["ct-zone-313f5395-5170-4c4c-8820-e6288a765d27","71"],["ct-zone-efa8530b-93d5-45b3-b16f-edfe1856233c","63"]]]]],"where":[["_uuid","==",["uuid","653e7315-47b3-4c39-a5f9-665aa3dddb9e"]]],"op":"mutate","table":"Bridge"},{"comment":"ovn-controller\novn-controller: modifying OVS tunnels 'e3af60d7-3942-4aa2-84ad-e02dcd3b183d'","op":"comment"}], id=4337
> 2021-02-12T17:25:57.011Z|04367|jsonrpc|DBG|unix:/run/openvswitch/db.sock: received notification, method="update3", params=[["monid","Open_vSwitch"],"00000000-0000-0000-0000-000000000000",{"Bridge":{"653e7315-47b3-4c39-a5f9-665aa3dddb9e":{"modify":{"external_ids":["map",[["ct-zone-313f5395-5170-4c4c-8820-e6288a765d27","71"],["ct-zone-7a97e014-a753-473b-a0f3-b2ec6e9f11d6","71"],["ct-zone-da4a2f90-aef9-4fea-ad6d-aed364fa9988","63"],["ct-zone-efa8530b-93d5-45b3-b16f-edfe1856233c","63"]]]}}}}]
> ...
> ...
> *************************
>
> This patch fixes this issue by using shash_replace() when adding the
> entry to the shash.
>
> Note: I was not able to reproduce the issue with a test setup and
> hence couldn't add test cases.
>
> Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=1903210
> Signed-off-by: Numan Siddique <numans at ovn.org>
Acked-by: Lorenzo Bianconi <lorenzo.bianconi at redhat.com>
> ---
> controller/ovn-controller.c | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
> index 61b809593..4343650fc 100644
> --- a/controller/ovn-controller.c
> +++ b/controller/ovn-controller.c
> @@ -608,7 +608,18 @@ add_pending_ct_zone_entry(struct shash *pending_ct_zones,
> pending->state = state; /* Skip flushing zone. */
> pending->zone = zone;
> pending->add = add;
> - shash_add(pending_ct_zones, name, pending);
> +
> + /* Its important that we add only one entry for the key 'name'.
> + * Replace 'pending' with 'existing' and free up 'existing'.
> + * Otherwise, we may end up in a continuous loop of adding
> + * and deleting the zone entry in the 'external_ids' of
> + * integration bridge.
> + */
> + struct ct_zone_pending_entry *existing =
> + shash_replace(pending_ct_zones, name, pending);
> + if (existing) {
> + free(existing);
> + }
> }
>
> static void
> --
> 2.29.2
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
More information about the dev
mailing list