From e66d99f3486c0d6b9e5dd05baaa98a75145bd6eb Mon Sep 17 00:00:00 2001 From: Gregory Thiemonge Date: Thu, 5 Oct 2023 11:13:57 -0400 Subject: [PATCH] Fix race condition in cascade delete update_vip was called multiple times concurrently when cascade deleting a load balancer with many listeners, it may trigger a race condition when fetching, computing and updating the SGs. Calling update_vip for each listener is not necessary, it's now called only once, that fixes the race condition and optimize the delete flow. Closes-Bug: #2038529 Change-Id: I4a6e4830d0e916b1af1a11dd10097980a57d97ea Signed-off-by: Gregory Thiemonge (cherry picked from commit 5c802aad949e4abd878f326c53123ddf8a299be0) --- .../controller/worker/v2/flows/listener_flows.py | 3 --- .../worker/v2/flows/load_balancer_flows.py | 13 ++++++++++--- ...nditions-in-cascade-delete-1e100213445a17ec.yaml | 7 +++++++ 3 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 releasenotes/notes/fix-potential-race-conditions-in-cascade-delete-1e100213445a17ec.yaml diff --git a/octavia/controller/worker/v2/flows/listener_flows.py b/octavia/controller/worker/v2/flows/listener_flows.py index a25904e090..08198bfd4e 100644 --- a/octavia/controller/worker/v2/flows/listener_flows.py +++ b/octavia/controller/worker/v2/flows/listener_flows.py @@ -113,9 +113,6 @@ class ListenerFlows(object): delete_listener_flow = linear_flow.Flow( constants.DELETE_LISTENER_FLOW + '-' + listener_id) # Should cascade delete all L7 policies - delete_listener_flow.add(network_tasks.UpdateVIPForDelete( - name='delete_update_vip_' + listener_id, - requires=constants.LOADBALANCER_ID)) delete_listener_flow.add(database_tasks.DeleteListenerInDB( name='delete_listener_in_db_' + listener_id, requires=constants.LISTENER, diff --git a/octavia/controller/worker/v2/flows/load_balancer_flows.py b/octavia/controller/worker/v2/flows/load_balancer_flows.py index eecd5d31cb..5d604ac5ba 100644 --- a/octavia/controller/worker/v2/flows/load_balancer_flows.py +++ b/octavia/controller/worker/v2/flows/load_balancer_flows.py @@ -292,12 +292,19 @@ class LoadBalancerFlows(object): :param listeners: A list of listener dicts :return: The flow for the deletion """ - listeners_delete_flow = unordered_flow.Flow('listeners_delete_flow') + delete_listeners_flow = linear_flow.Flow('delete_listeners_flow') + delete_listeners_flow.add(network_tasks.UpdateVIPForDelete( + name='delete_update_vip', + requires=constants.LOADBALANCER_ID)) + + delete_internal_flow = unordered_flow.Flow('delete_listeners_flows') for listener in listeners: - listeners_delete_flow.add( + delete_internal_flow.add( self.listener_flows.get_delete_listener_internal_flow( listener, flavor_dict=flavor_dict)) - return listeners_delete_flow + + delete_listeners_flow.add(delete_internal_flow) + return delete_listeners_flow def get_delete_load_balancer_flow(self, lb): """Creates a flow to delete a load balancer. diff --git a/releasenotes/notes/fix-potential-race-conditions-in-cascade-delete-1e100213445a17ec.yaml b/releasenotes/notes/fix-potential-race-conditions-in-cascade-delete-1e100213445a17ec.yaml new file mode 100644 index 0000000000..c331511da2 --- /dev/null +++ b/releasenotes/notes/fix-potential-race-conditions-in-cascade-delete-1e100213445a17ec.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fix a potential race condition during the cascade deletion of load + balancers. When deleting a load balancer with multiple listeners, the + security groups of the VIP port may have been updated many times + concurrently, creating a race condition.