From f09e7c444c1d0d08b37cc13d6a2b0e21d584cedb Mon Sep 17 00:00:00 2001 From: Benny Halevy Date: Thu, 27 Jun 2024 16:54:17 +0300 Subject: [PATCH] stall-analyser: gracefully handle empty input Currently, the tools prints an obscure error if the input is empty: ``` Traceback (most recent call last): File "/home/bhalevy/dev/scylla_s3_reloc_server/./seastar//scripts/stall-analyser.py", line 363, in print_stats(tally, tmin) ^^^^ NameError: name 'tmin' is not defined. Did you mean: 'min'? ``` Instead, print a meaningful error and direct the user to run stall-analyser.py --help for usage instructions. Ref https://github.com/scylladb/scylla_s3_reloc_server/pull/103 Signed-off-by: Benny Halevy Closes scylladb/seastar#2305 --- scripts/stall-analyser.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/scripts/stall-analyser.py b/scripts/stall-analyser.py index e801bfea008..5b37d90c5fc 100755 --- a/scripts/stall-analyser.py +++ b/scripts/stall-analyser.py @@ -126,10 +126,16 @@ def __init__(self, resolver: addr2line.BacktraceResolver): # Each node in the tree contains: self.count = 0 self.total = 0 - self.nodes = {} + self.nodes = dict[str, Node]() self.tail = Node('') self.head = Node('') + def empty(self): + return not self.nodes + + def __bool__(self): + return not self.empty() + def process_trace(self, trace: list[str], t: int) -> None: # process each backtrace and insert it to the tree # @@ -341,6 +347,7 @@ def main(): resolver = addr2line.BacktraceResolver(executable=args.executable, concise=not args.full_function_names) graph = Graph(resolver) + tmin = args.minimum or 0 for s in args.file: if comment.search(s): continue @@ -368,11 +375,13 @@ def main(): # ?? ??:0 if address_threshold: trace = list(dropwhile(lambda addr: int(addr, 0) >= address_threshold, trace)) - tmin = args.minimum or 0 if t >= tmin: graph.process_trace(trace, t) try: + if not graph: + print("No input data found. Please run `stall-analyser.py --help` for usage instruction") + sys.exit() print_command_line_options(args) print_stats(tally, tmin) graph.print_graph(args.direction, args.width, args.branch_threshold)