Skip to content

Commit 8272bd4

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "[L3][QoS] L3 agent QoS extension to handle duplicated FIPs" into stable/yoga
2 parents ffb438e + 3eb6aa2 commit 8272bd4

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)