If the dp cache request misses, retry but only a couple of times so we
don't overload the system and only if we're not running on an externally
provided cache.

Signed-off-by: Adrian Moreno <amore...@redhat.com>
---
 utilities/usdt-scripts/usdt_lib.py | 50 ++++++++++++++++++++----------
 1 file changed, 34 insertions(+), 16 deletions(-)

diff --git a/utilities/usdt-scripts/usdt_lib.py 
b/utilities/usdt-scripts/usdt_lib.py
index d8659102f..335b586e8 100644
--- a/utilities/usdt-scripts/usdt_lib.py
+++ b/utilities/usdt-scripts/usdt_lib.py
@@ -19,43 +19,60 @@ import subprocess
 class DpPortMapping:
     """Class used to retrieve and cache datapath port numbers to port names."""
 
+    MAX_REQUESTS = 2
+
     def __init__(self):
         self.cache_map = None
+        self.n_requests = 0
 
     def get_map(self):
         """Get the cache map."""
-        if not self.cache_map:
-            self._get_mapping()
+        self._get_mapping()
 
         return self.cache_map
 
     def set_map(self, cache_map):
         """Override the internal cache map."""
         self.cache_map = cache_map
+        self.n_requests = self.MAX_REQUESTS
 
-    def get_port_name(self, dp, port_no):
-        """Get the port name from a port number."""
-        if self.cache_map is None:
-            self._get_mapping()
+    def _retry(self, func):
+        self._get_mapping()
 
-        if not self.cache_map.get(dp):
-            return None
+        result = func(self.cache_map)
 
-        for name, num in self.cache_map[dp].items():
-            if num == port_no:
-                return name
+        if not result:
+            self._get_mapping(refresh=True)
+            return func(self.cache_map)
 
-        return None
+        return result
+
+    def get_port_name(self, dp, port_no):
+        """Get the port name from a port number."""
+        def _get_port_name(cache_map):
+            if not cache_map.get(dp):
+                return None
+            for name, num in cache_map[dp].items():
+                if num == port_no:
+                    return name
+
+        return self._retry(_get_port_name)
 
     def get_port_number(self, dp, port):
         """Get the port number from a port name."""
-        if self.cache_map is None:
-            self._get_mapping()
+        def _get_port_number(cache_map):
+            return cache_map.get(dp, {}).get(port, None)
 
-        return self.cache_map.get(dp, {}).get(port, None)
+        return self._retry(_get_port_number)
 
-    def _get_mapping(self):
+    def _get_mapping(self, refresh=False):
         """Get the datapath port mapping from the running OVS."""
+        if self.n_requests >= self.MAX_REQUESTS \
+           or (self.cache_map and not refresh):
+            return
+
+        self.n_requests += 1
+
         try:
             output = subprocess.check_output(
                 ["ovs-appctl", "dpctl/show"], encoding="utf8"
@@ -82,3 +99,4 @@ class DpPortMapping:
                     self.cache_map[current_dp] = {
                         match.group(2): int(match.group(1))
                     }
+
-- 
2.48.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to