Use system.multicall to accelerate batch API calls
authorClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Sun, 25 Sep 2011 20:26:12 +0000 (22:26 +0200)
committerClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Sun, 25 Sep 2011 20:26:12 +0000 (22:26 +0200)
src/nepi/testbeds/planetlab/node.py
src/nepi/testbeds/planetlab/plcapi.py

index c6ef6aa..ed8ddbd 100644 (file)
@@ -352,9 +352,14 @@ class Node(object):
     def fetch_node_info(self):
         orig_attrs = {}
         
-        info = self._api.GetNodes(self._node_id)[0]
+        self._api.StartMulticall()
+        info = self._api.GetNodes(self._node_id)
+        tags = self._api.GetNodeTags(node_id=self._node_id, fields=('tagname','value'))
+        info, tags = self._api.FinishMulticall()
+        info = info[0]
+        
         tags = dict( (t['tagname'],t['value'])
-                     for t in self._api.GetNodeTags(node_id=self._node_id, fields=('tagname','value')) )
+                     for t in tags )
 
         orig_attrs['min_num_external_ifaces'] = self.min_num_external_ifaces
         orig_attrs['max_num_external_ifaces'] = self.max_num_external_ifaces
index 20466b9..4e6b89d 100644 (file)
@@ -87,6 +87,8 @@ class PLCAPI(object):
             urlpattern % {'hostname':hostname},
             allow_none = True)
         
+        self._multi = False
+        
     def test(self):
         import warnings
         
@@ -277,3 +279,17 @@ class PLCAPI(object):
         return _retry(self.api.UpdateSlice)(self.auth, sliceIdOrName, kw)
         
 
+    def StartMulticall(self):
+        if not self._multi:
+            self._api = self.api
+            self.api = xmlrpclib.MultiCall(self._api)
+            self._multi = True
+    
+    def FinishMulticall(self):
+        if self._multi:
+            rv = self.api()
+            self.api = self._api
+            self._multi = False
+            return rv
+        else:
+            return []