Skip to content

Commit af5f9d6

Browse files
authored
gh-115720: Show number of leaks in huntrleaks progress reports (GH-115726)
Instead of showing a dot for each iteration, show: - '.' for zero (on negative) leaks - number of leaks for 1-9 - 'X' if there are more leaks This allows more rapid iteration: when bisecting, I don't need to wait for the final report to see if the test still leaks. Also, show the full result if there are any non-zero entries. This shows negative entries, for the unfortunate cases where a reference is created and cleaned up in different runs. Test *failure* is still determined by the existing heuristic.
1 parent 6087315 commit af5f9d6

File tree

3 files changed

+39
-14
lines changed

3 files changed

+39
-14
lines changed

Lib/test/libregrtest/refleak.py

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,12 @@ def get_pooled_int(value):
8888
rc_before = alloc_before = fd_before = interned_before = 0
8989

9090
if not quiet:
91-
print("beginning", repcount, "repetitions", file=sys.stderr)
92-
print(("1234567890"*(repcount//10 + 1))[:repcount], file=sys.stderr,
93-
flush=True)
91+
print("beginning", repcount, "repetitions. Showing number of leaks "
92+
"(. for 0 or less, X for 10 or more)",
93+
file=sys.stderr)
94+
numbers = ("1234567890"*(repcount//10 + 1))[:repcount]
95+
numbers = numbers[:warmups] + ':' + numbers[warmups:]
96+
print(numbers, file=sys.stderr, flush=True)
9497

9598
results = None
9699
dash_R_cleanup(fs, ps, pic, zdc, abcs)
@@ -116,13 +119,27 @@ def get_pooled_int(value):
116119
rc_after = gettotalrefcount() - interned_after * 2
117120
fd_after = fd_count()
118121

119-
if not quiet:
120-
print('.', end='', file=sys.stderr, flush=True)
121-
122122
rc_deltas[i] = get_pooled_int(rc_after - rc_before)
123123
alloc_deltas[i] = get_pooled_int(alloc_after - alloc_before)
124124
fd_deltas[i] = get_pooled_int(fd_after - fd_before)
125125

126+
if not quiet:
127+
# use max, not sum, so total_leaks is one of the pooled ints
128+
total_leaks = max(rc_deltas[i], alloc_deltas[i], fd_deltas[i])
129+
if total_leaks <= 0:
130+
symbol = '.'
131+
elif total_leaks < 10:
132+
symbol = (
133+
'.', '1', '2', '3', '4', '5', '6', '7', '8', '9',
134+
)[total_leaks]
135+
else:
136+
symbol = 'X'
137+
if i == warmups:
138+
print(' ', end='', file=sys.stderr, flush=True)
139+
print(symbol, end='', file=sys.stderr, flush=True)
140+
del total_leaks
141+
del symbol
142+
126143
alloc_before = alloc_after
127144
rc_before = rc_after
128145
fd_before = fd_after
@@ -158,14 +175,20 @@ def check_fd_deltas(deltas):
158175
]:
159176
# ignore warmup runs
160177
deltas = deltas[warmups:]
161-
if checker(deltas):
178+
failing = checker(deltas)
179+
suspicious = any(deltas)
180+
if failing or suspicious:
162181
msg = '%s leaked %s %s, sum=%s' % (
163182
test_name, deltas, item_name, sum(deltas))
164-
print(msg, file=sys.stderr, flush=True)
165-
with open(filename, "a", encoding="utf-8") as refrep:
166-
print(msg, file=refrep)
167-
refrep.flush()
168-
failed = True
183+
print(msg, end='', file=sys.stderr)
184+
if failing:
185+
print(file=sys.stderr, flush=True)
186+
with open(filename, "a", encoding="utf-8") as refrep:
187+
print(msg, file=refrep)
188+
refrep.flush()
189+
failed = True
190+
else:
191+
print(' (this is fine)', file=sys.stderr, flush=True)
169192
return (failed, results)
170193

171194

Lib/test/test_regrtest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,8 +1171,8 @@ def check_leak(self, code, what, *, run_workers=False):
11711171
stderr=subprocess.STDOUT)
11721172
self.check_executed_tests(output, [test], failed=test, stats=1)
11731173

1174-
line = 'beginning 6 repetitions\n123456\n......\n'
1175-
self.check_line(output, re.escape(line))
1174+
line = r'beginning 6 repetitions. .*\n123:456\n[.0-9X]{3} 111\n'
1175+
self.check_line(output, line)
11761176

11771177
line2 = '%s leaked [1, 1, 1] %s, sum=3\n' % (test, what)
11781178
self.assertIn(line2, output)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Leak tests (``-R``, ``--huntrleaks``) now show a summary of the number of
2+
leaks found in each iteration.

0 commit comments

Comments
 (0)