From: Tony Mack Date: Fri, 16 Jul 2010 21:46:08 +0000 (+0000) Subject: use sfa.util.threadmanager in get_rspec() to contact aggregates in parallel instead... X-Git-Tag: sfa-1.0-0~145 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=ba74616e45a118bcea9caec14500b3bbd9f6ea99;p=sfa.git use sfa.util.threadmanager in get_rspec() to contact aggregates in parallel instead of sequentially --- diff --git a/sfa/managers/slice_manager_pl.py b/sfa/managers/slice_manager_pl.py index 1606eb37..225b3977 100644 --- a/sfa/managers/slice_manager_pl.py +++ b/sfa/managers/slice_manager_pl.py @@ -18,6 +18,7 @@ from sfa.util.record import SfaRecord from sfa.util.policy import Policy from sfa.util.prefixTree import prefixTree from sfa.util.sfaticket import * +from sfa.util.threadmanager import ThreadManager from sfa.util.debug import log import sfa.plc.peers as peers @@ -217,36 +218,35 @@ def get_rspec(api, xrn=None, origin_hrn=None): hrn, type = urn_to_hrn(xrn) rspec = None aggs = api.aggregates - cred = api.getCredential() + cred = api.getCredential() + threads = ThreadManager() for agg in aggs: if agg not in [api.auth.client_cred.get_gid_caller().get_hrn()]: - try: # get the rspec from the aggregate - agg_rspec = aggs[agg].get_resources(cred, xrn, origin_hrn) - except: - # XX print out to some error log - print >> log, "Error getting resources at aggregate %s" % agg - traceback.print_exc(log) - print >> log, "%s" % (traceback.format_exc()) - continue - - try: - tree = etree.parse(StringIO(agg_rspec)) - except etree.XMLSyntaxError: - message = agg + ": " + str(sys.exc_info()[1]) - raise InvalidRSpec(message) + #agg_rspec = aggs[agg].get_resources(cred, xrn, origin_hrn) + threads.run(aggs[agg].get_resources, cred, xrn, origin_hrn) + + results = threads.get_results() + # combine the rspecs into a single rspec + for agg_rspec in results: + try: + tree = etree.parse(StringIO(agg_rspec)) + except etree.XMLSyntaxError: + message = agg + ": " + str(sys.exc_info()[1]) + raise InvalidRSpec(message) - root = tree.getroot() - if root.get("type") in ["SFA"]: - if rspec == None: - rspec = root - else: - for network in root.iterfind("./network"): - rspec.append(deepcopy(network)) - for request in root.iterfind("./request"): - rspec.append(deepcopy(request)) + root = tree.getroot() + if root.get("type") in ["SFA"]: + if rspec == None: + rspec = root + else: + for network in root.iterfind("./network"): + rspec.append(deepcopy(network)) + for request in root.iterfind("./request"): + rspec.append(deepcopy(request)) rspec = etree.tostring(rspec, xml_declaration=True, pretty_print=True) + # cache the result if api.cache and not xrn: api.cache.add('nodes', rspec)