Skip to content

Commit 3eb6aa2

Browse files
committed
[L3][QoS] L3 agent QoS extension to handle duplicated FIPs
The L3 agent QoS extension should be able to handle duplicated floating IP addresses from different registers. Those floating IP addresses can be hosted in different networks and routers but the same compute node and L3 agent. Now, instead of using the IP address as unique identifier, this patch stores the (ID, IP address) tuple. This tuple is unique per floating IP register and holds the IP address, needed by the "tc" library to set the QoS rules. Closes-Bug: #1962465 Change-Id: I3a09718c6e79fd1f37eb75264389c4e5043076a7 (cherry picked from commit 132905d)
1 parent baded9b commit 3eb6aa2

File tree

5 files changed

+231
-127
lines changed

5 files changed

+231
-127
lines changed

neutron/agent/l3/extensions/qos/base.py

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,12 @@
5353
class RateLimitMaps(object):
5454

5555
def __init__(self, lock_name):
56-
self.qos_policy_resources = collections.defaultdict(dict)
56+
# qos_policy_2_resources = {qos_id_1: {res_1, res_2, res_3, ...} }
57+
self.qos_policy_2_resources = collections.defaultdict(set)
58+
# known_policies = {qos_id_1: qos_policy_1, ...}
5759
self.known_policies = {}
58-
self.resource_policies = {}
60+
# resource_2_qos_policies = {res1: qos_id_1, ...}
61+
self.resource_2_qos_policies = {}
5962
self.lock_name = lock_name
6063

6164
def update_policy(self, policy):
@@ -78,15 +81,15 @@ def get_resources(self, policy):
7881

7982
@lockutils.synchronized(self.lock_name)
8083
def _get_resources():
81-
return self.qos_policy_resources[policy.id].values()
84+
return self.qos_policy_2_resources[policy.id]
8285

8386
return _get_resources()
8487

8588
def get_resource_policy(self, resource):
8689

8790
@lockutils.synchronized(self.lock_name)
8891
def _get_resource_policy():
89-
policy_id = self.resource_policies.get(resource)
92+
policy_id = self.resource_2_qos_policies.get(resource)
9093
return self.known_policies.get(policy_id)
9194

9295
return _get_resource_policy()
@@ -99,13 +102,13 @@ def set_resource_policy(self, resource, policy):
99102

100103
@lockutils.synchronized(self.lock_name)
101104
def _set_resource_policy():
102-
policy_id = self.resource_policies.get(resource)
105+
policy_id = self.resource_2_qos_policies.get(resource)
103106
old_policy = self.known_policies.get(policy_id)
104107
self.known_policies[policy.id] = policy
105-
self.resource_policies[resource] = policy.id
106-
self.qos_policy_resources[policy.id][resource] = resource
108+
self.resource_2_qos_policies[resource] = policy.id
109+
self.qos_policy_2_resources[policy.id].add(resource)
107110
if old_policy and old_policy.id != policy.id:
108-
del self.qos_policy_resources[old_policy.id][resource]
111+
self.qos_policy_2_resources[old_policy.id].remove(resource)
109112

110113
_set_resource_policy()
111114

@@ -117,22 +120,21 @@ def clean_by_resource(self, resource):
117120

118121
@lockutils.synchronized(self.lock_name)
119122
def _clean_by_resource():
120-
if resource in self.resource_policies:
121-
del self.resource_policies[resource]
122-
for (qos_policy_id,
123-
res_dict) in self.qos_policy_resources.items():
124-
if resource in res_dict:
125-
del res_dict[resource]
126-
if not res_dict:
127-
self._clean_policy_info(qos_policy_id)
128-
return
129-
LOG.debug("L3 QoS extension did not have "
130-
"information on floating IP %s", resource)
123+
qos_policy_id = self.resource_2_qos_policies.pop(resource, None)
124+
if not qos_policy_id:
125+
LOG.debug("L3 QoS extension did not have "
126+
"information on floating IP %s", resource)
127+
return
128+
129+
resources = self.qos_policy_2_resources[qos_policy_id]
130+
resources.discard(resource)
131+
if not resources:
132+
self._clean_policy_info(qos_policy_id)
131133

132134
_clean_by_resource()
133135

134136
def _clean_policy_info(self, qos_policy_id):
135-
del self.qos_policy_resources[qos_policy_id]
137+
del self.qos_policy_2_resources[qos_policy_id]
136138
del self.known_policies[qos_policy_id]
137139

138140

0 commit comments

Comments
 (0)