[Profiler] Fix start_profile permanently no-op after max_iterations auto-stop (#51839)

Signed-off-by: Elvir Crncevic <elvircrn@gmail.com>
This commit is contained in:
Elvir Crnčević
2026-08-25 08:13:29 -04:00
committed by GitHub
parent d9fbe526c0
commit afc91fa0d2
2 changed files with 34 additions and 4 deletions
+28
View File
@@ -112,6 +112,34 @@ def test_max_iterations(default_profiler_config):
# Should have stopped now
assert profiler._running is False
assert profiler.stop_call_count == 1
# And fully reset, not just paused -- a later start_profile must not be a
# permanent no-op just because max_iterations already fired once.
assert profiler._active is False
assert profiler._active_iteration_count == 0
assert profiler._profiling_for_iters == 0
def test_restart_after_max_iterations(default_profiler_config):
"""A start_profile after an auto-stop must actually restart, not be
silently ignored (regression test: auto-stop used to leave _active
True forever, so start() always bailed out early)."""
default_profiler_config.max_iterations = 2
profiler = ConcreteWorkerProfiler(default_profiler_config)
profiler.start()
profiler.step()
profiler.step()
profiler.step() # exceeds max, auto-stops
assert profiler._running is False
assert profiler.start_call_count == 1
profiler.start()
assert profiler._active is True
assert profiler._running is True
assert profiler.start_call_count == 2
profiler.step()
assert profiler._running is True
def test_delayed_start_and_max_iters(default_profiler_config):
+6 -4
View File
@@ -120,11 +120,13 @@ class WorkerProfiler(ABC):
and self._running
and self._profiling_for_iters > self._max_iters
):
# Automatically stop the profiler after max iters
# will be marked as not running, but leave as active so that stop
# can clean up properly
# Automatically stop the profiler after max iters. Go through the
# public stop() (not _call_stop() directly) so _active and the
# iteration counters reset too -- otherwise a later start_profile
# is silently ignored forever, since start() bails out early
# whenever _active is still True.
logger.info_once("Max profiling iterations reached. Stopping profiler...")
self._call_stop()
self.stop()
return
def _profiler_step(self) -> bool: