53
53
class RateLimitMaps (object ):
54
54
55
55
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, ...}
57
59
self .known_policies = {}
58
- self .resource_policies = {}
60
+ # resource_2_qos_policies = {res1: qos_id_1, ...}
61
+ self .resource_2_qos_policies = {}
59
62
self .lock_name = lock_name
60
63
61
64
def update_policy (self , policy ):
@@ -78,15 +81,15 @@ def get_resources(self, policy):
78
81
79
82
@lockutils .synchronized (self .lock_name )
80
83
def _get_resources ():
81
- return self .qos_policy_resources [policy .id ]. values ()
84
+ return self .qos_policy_2_resources [policy .id ]
82
85
83
86
return _get_resources ()
84
87
85
88
def get_resource_policy (self , resource ):
86
89
87
90
@lockutils .synchronized (self .lock_name )
88
91
def _get_resource_policy ():
89
- policy_id = self .resource_policies .get (resource )
92
+ policy_id = self .resource_2_qos_policies .get (resource )
90
93
return self .known_policies .get (policy_id )
91
94
92
95
return _get_resource_policy ()
@@ -99,13 +102,13 @@ def set_resource_policy(self, resource, policy):
99
102
100
103
@lockutils .synchronized (self .lock_name )
101
104
def _set_resource_policy ():
102
- policy_id = self .resource_policies .get (resource )
105
+ policy_id = self .resource_2_qos_policies .get (resource )
103
106
old_policy = self .known_policies .get (policy_id )
104
107
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 )
107
110
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 )
109
112
110
113
_set_resource_policy ()
111
114
@@ -117,22 +120,21 @@ def clean_by_resource(self, resource):
117
120
118
121
@lockutils .synchronized (self .lock_name )
119
122
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 )
131
133
132
134
_clean_by_resource ()
133
135
134
136
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 ]
136
138
del self .known_policies [qos_policy_id ]
137
139
138
140
0 commit comments