fix: make BaseBootstrapper.bootstrap() idempotent#106
Merged
Conversation
teardown() already short-circuits when is_bootstrapped is False, but bootstrap() previously didn't guard the symmetric case: calling bootstrapper.bootstrap() twice would re-invoke every instrument's bootstrap, causing user-visible side effects (e.g. mounting the FastMCP access-log middleware twice would double every access record; re-registering a Prometheus /metrics route raises). Add the symmetric guard at the top of bootstrap(): when is_bootstrapped, return the prepared application without re-running the instruments. Adds test_bootstrap_is_idempotent next to the existing test_teardown_is_idempotent in test_free_bootstrap.py. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests.
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
BaseBootstrapper.teardown()short-circuits whenis_bootstrappedis False, butbootstrap()had no symmetric guard. Callingbootstrapper.bootstrap()twice would re-invoke every instrument'sbootstrap, with user-visible side effects:/metricsroute viaapplication.custom_route(...)raises._TeardownProviderregistered twice on FastMCP.Add the symmetric guard at the top of
bootstrap(): when already bootstrapped, return the prepared application without re-running the instruments.Test plan
just test— full suite (149 tests, +1 new) passesjust lint— cleantest_bootstrap_is_idempotentmirrors the shape of the existingtest_teardown_is_idempotent— wires twoMagicMock()instruments onto the bootstrapper, callsbootstrap()twice, asserts each instrument'sbootstrapwas called exactly once andis_bootstrappedis TrueFlagged as a follow-up during review of #105 (FastMCP bootstrapper) — the MCP access middleware made the double-mount symptom user-visible.
🤖 Generated with Claude Code