From ba74616e45a118bcea9caec14500b3bbd9f6ea99 Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Fri, 16 Jul 2010 21:46:08 +0000 Subject: [PATCH] use sfa.util.threadmanager in get_rspec() to contact aggregates in parallel instead of sequentially --- sfa/managers/slice_manager_pl.py | 48 ++++++++++++++++---------------- 1 file changed, 24 insertions(+), 24 deletions(-) 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) -- 2.47.0