mirrorlist: Use a thread-local copy of the tree to prevent changing the global one

This makes sure that the global version does not get changed while processing
a request, keeping the hostnet check working across requests.

Signed-off-by: Patrick Uiterwijk <puiterwijk@redhat.com>
This commit is contained in:
Patrick Uiterwijk 2015-10-20 01:59:51 +00:00
parent ed1aa2476b
commit 738e67c90c

View file

@ -6,6 +6,7 @@
# standard library modules in alphabetical order # standard library modules in alphabetical order
from collections import defaultdict from collections import defaultdict
import copy
import datetime import datetime
import getopt import getopt
import logging import logging
@ -234,11 +235,12 @@ def tree_lookup(tree, ip, field, maxResults=None):
# and we'll get a new copy of the tree from our parent the next time it # and we'll get a new copy of the tree from our parent the next time it
# fork()s. # fork()s.
# returns a list of tuples (prefix, data) # returns a list of tuples (prefix, data)
ltree = copy.deepcopy(tree)
result = [] result = []
len_data = 0 len_data = 0
if ip is None: if ip is None:
return result return result
node = tree.search_best(ip.strNormal()) node = ltree.search_best(ip.strNormal())
while node is not None: while node is not None:
prefix = node.prefix prefix = node.prefix
if type(node.data[field]) == list: if type(node.data[field]) == list:
@ -248,8 +250,8 @@ def tree_lookup(tree, ip, field, maxResults=None):
t = (prefix, node.data[field],) t = (prefix, node.data[field],)
result.append(t) result.append(t)
if maxResults is None or len_data < maxResults: if maxResults is None or len_data < maxResults:
tree.delete(prefix) ltree.delete(prefix)
node = tree.search_best(ip.strNormal()) node = ltree.search_best(ip.strNormal())
else: else:
break break
return result return result