diff options
author | Ole Troan <ot@cisco.com> | 2018-09-18 11:06:33 +0200 |
---|---|---|
committer | Ole Troan <ot@cisco.com> | 2018-09-18 11:06:33 +0200 |
commit | b4603a70cbc00daa8cbce159f513af205b634aa9 (patch) | |
tree | 41bf9b9a550aba787b36c75a8f478d162a33fa65 /src/vpp-api/python | |
parent | 45d5c87d86d8ac5268e08f743eb032f5a66a82f8 (diff) |
STATS: Optimistic concurrency handling in Python library.
Change-Id: I2135f3e77206fd171636a1e0b07c373c0bf093e4
Signed-off-by: Ole Troan <ot@cisco.com>
Diffstat (limited to 'src/vpp-api/python')
-rw-r--r-- | src/vpp-api/python/vpp_papi/vpp_stats.py | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/src/vpp-api/python/vpp_papi/vpp_stats.py b/src/vpp-api/python/vpp_papi/vpp_stats.py index ecd734bbf7d..456312bdc5b 100644 --- a/src/vpp-api/python/vpp_papi/vpp_stats.py +++ b/src/vpp-api/python/vpp_papi/vpp_stats.py @@ -127,6 +127,9 @@ class VPPStats: def dump(self, counters): stats = {} rv = self.api.stat_segment_dump(counters) + # Raise exception and retry + if rv == ffi.NULL: + raise IOError() rv_len = self.api.stat_segment_vec_len(rv) for i in range(rv_len): n = ffi.string(rv[i].name).decode() @@ -135,16 +138,33 @@ class VPPStats: return stats def get_counter(self, name): - dir = self.ls(name) - return self.dump(dir).values()[0] + retries = 0 + while True: + try: + dir = self.ls(name) + return self.dump(dir).values()[0] + except: + if retries > 10: + return None + retries += 1 + pass def disconnect(self): self.api.stat_segment_disconnect() def set_errors(self): '''Return all errors counters > 0''' - error_names = self.ls(['/err/']) - error_counters = self.dump(error_names) + retries = 0 + while True: + try: + error_names = self.ls(['/err/']) + error_counters = self.dump(error_names) + break + except: + if retries > 10: + return None + retries += 1 + pass return {k: error_counters[k] for k in error_counters.keys() if error_counters[k]} |