fix(mysql2): prevent onResult callback from being re-wrapped on every packet #7075
+5
−3
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.
What does this PR do?
Fixes a bug in mysql2 instrumentation where
onResultcallback is re-wrapped on everyexecute()call, causing stack overflow with large prepared statement params.The Problem:
In
bindExecuteandwrapExecute, theonResultcallback gets wrapped on every packet. MySQL's prepared statement protocol sends one packet per parameter definition. For queries with 3,366+ params,execute()is called 3,369 times, nesting the callback 3,369 layers deep → Stack Overflow.The Fix:
Add a
_ddWrappedflag to prevent re-wrapping callbacks that have already been wrapped.Motivation
Maximum call stack size exceededaws-sdkinstrumentation on dd-trace 5.80.0 #6985 (aws-sdk infinite recursion fix)Reproduction Repository: https://github.com/myeongseoklee/mysql2-callstack-reproduction
Additional Notes
Evidence:
execute()calls