-
Notifications
You must be signed in to change notification settings - Fork 323
Batch re-transformations when there are a high number of inner classes #10289
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -225,6 +225,28 @@ private void recordInstrumentationProgress( | |
| } | ||
|
|
||
| private void retransformClasses(List<Class<?>> classesToBeTransformed) { | ||
| int classCount = classesToBeTransformed.size(); | ||
| if (classCount <= 10) { | ||
| retransformIndividualClasses(classesToBeTransformed); | ||
| } else if (classCount <= 1000) { | ||
| retransformClassesAtOnce(classesToBeTransformed); | ||
| } else { | ||
| throw new IllegalStateException("Too many classes to retransform: " + classCount); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What happens from the users perspective when there are more than 1,000 classes to transform? Is this raised as an instrumentation error?
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yes |
||
| } | ||
| } | ||
|
|
||
| private void retransformClassesAtOnce(List<Class<?>> classesToBeTransformed) { | ||
| LOGGER.debug("Re-transforming classes: {}", classesToBeTransformed); | ||
| try { | ||
| instrumentation.retransformClasses(classesToBeTransformed.toArray(new Class[0])); | ||
| } catch (Exception ex) { | ||
| ExceptionHelper.logException(LOGGER, ex, "Re-transform error:"); | ||
| } catch (Throwable ex) { | ||
| ExceptionHelper.logException(LOGGER, ex, "Re-transform throwable:"); | ||
| } | ||
| } | ||
|
|
||
| private void retransformIndividualClasses(List<Class<?>> classesToBeTransformed) { | ||
| for (Class<?> clazz : classesToBeTransformed) { | ||
| try { | ||
| LOGGER.debug("Re-transforming class: {}", clazz.getTypeName()); | ||
|
|
||
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
208 changes: 208 additions & 0 deletions
208
dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/LargeInnerClasses.java
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,208 @@ | ||
| package com.datadog.debugger.agent; | ||
|
|
||
| public class LargeInnerClasses { | ||
|
|
||
| public static int main(String arg) { | ||
| return 42; // beae1817-f3b0-4ea8-a74f-000000000001 | ||
| } | ||
|
|
||
| static class MyInnerClass00 {} | ||
|
|
||
| static class MyInnerClass01 {} | ||
|
|
||
| static class MyInnerClass02 {} | ||
|
|
||
| static class MyInnerClass03 {} | ||
|
|
||
| static class MyInnerClass04 {} | ||
|
|
||
| static class MyInnerClass05 {} | ||
|
|
||
| static class MyInnerClass06 {} | ||
|
|
||
| static class MyInnerClass07 {} | ||
|
|
||
| static class MyInnerClass08 {} | ||
|
|
||
| static class MyInnerClass09 {} | ||
|
|
||
| static class MyInnerClass10 {} | ||
|
|
||
| static class MyInnerClass11 {} | ||
|
|
||
| static class MyInnerClass12 {} | ||
|
|
||
| static class MyInnerClass13 {} | ||
|
|
||
| static class MyInnerClass14 {} | ||
|
|
||
| static class MyInnerClass15 {} | ||
|
|
||
| static class MyInnerClass16 {} | ||
|
|
||
| static class MyInnerClass17 {} | ||
|
|
||
| static class MyInnerClass18 {} | ||
|
|
||
| static class MyInnerClass19 {} | ||
|
|
||
| static class MyInnerClass20 {} | ||
|
|
||
| static class MyInnerClass21 {} | ||
|
|
||
| static class MyInnerClass22 {} | ||
|
|
||
| static class MyInnerClass23 {} | ||
|
|
||
| static class MyInnerClass24 {} | ||
|
|
||
| static class MyInnerClass25 {} | ||
|
|
||
| static class MyInnerClass26 {} | ||
|
|
||
| static class MyInnerClass27 {} | ||
|
|
||
| static class MyInnerClass28 {} | ||
|
|
||
| static class MyInnerClass29 {} | ||
|
|
||
| static class MyInnerClass30 {} | ||
|
|
||
| static class MyInnerClass31 {} | ||
|
|
||
| static class MyInnerClass32 {} | ||
|
|
||
| static class MyInnerClass33 {} | ||
|
|
||
| static class MyInnerClass34 {} | ||
|
|
||
| static class MyInnerClass35 {} | ||
|
|
||
| static class MyInnerClass36 {} | ||
|
|
||
| static class MyInnerClass37 {} | ||
|
|
||
| static class MyInnerClass38 {} | ||
|
|
||
| static class MyInnerClass39 {} | ||
|
|
||
| static class MyInnerClass40 {} | ||
|
|
||
| static class MyInnerClass41 {} | ||
|
|
||
| static class MyInnerClass42 {} | ||
|
|
||
| static class MyInnerClass43 {} | ||
|
|
||
| static class MyInnerClass44 {} | ||
|
|
||
| static class MyInnerClass45 {} | ||
|
|
||
| static class MyInnerClass46 {} | ||
|
|
||
| static class MyInnerClass47 {} | ||
|
|
||
| static class MyInnerClass48 {} | ||
|
|
||
| static class MyInnerClass49 {} | ||
|
|
||
| static class MyInnerClass50 {} | ||
|
|
||
| static class MyInnerClass51 {} | ||
|
|
||
| static class MyInnerClass52 {} | ||
|
|
||
| static class MyInnerClass53 {} | ||
|
|
||
| static class MyInnerClass54 {} | ||
|
|
||
| static class MyInnerClass55 {} | ||
|
|
||
| static class MyInnerClass56 {} | ||
|
|
||
| static class MyInnerClass57 {} | ||
|
|
||
| static class MyInnerClass58 {} | ||
|
|
||
| static class MyInnerClass59 {} | ||
|
|
||
| static class MyInnerClass60 {} | ||
|
|
||
| static class MyInnerClass61 {} | ||
|
|
||
| static class MyInnerClass62 {} | ||
|
|
||
| static class MyInnerClass63 {} | ||
|
|
||
| static class MyInnerClass64 {} | ||
|
|
||
| static class MyInnerClass65 {} | ||
|
|
||
| static class MyInnerClass66 {} | ||
|
|
||
| static class MyInnerClass67 {} | ||
|
|
||
| static class MyInnerClass68 {} | ||
|
|
||
| static class MyInnerClass69 {} | ||
|
|
||
| static class MyInnerClass70 {} | ||
|
|
||
| static class MyInnerClass71 {} | ||
|
|
||
| static class MyInnerClass72 {} | ||
|
|
||
| static class MyInnerClass73 {} | ||
|
|
||
| static class MyInnerClass74 {} | ||
|
|
||
| static class MyInnerClass75 {} | ||
|
|
||
| static class MyInnerClass76 {} | ||
|
|
||
| static class MyInnerClass77 {} | ||
|
|
||
| static class MyInnerClass78 {} | ||
|
|
||
| static class MyInnerClass79 {} | ||
|
|
||
| static class MyInnerClass80 {} | ||
|
|
||
| static class MyInnerClass81 {} | ||
|
|
||
| static class MyInnerClass82 {} | ||
|
|
||
| static class MyInnerClass83 {} | ||
|
|
||
| static class MyInnerClass84 {} | ||
|
|
||
| static class MyInnerClass85 {} | ||
|
|
||
| static class MyInnerClass86 {} | ||
|
|
||
| static class MyInnerClass87 {} | ||
|
|
||
| static class MyInnerClass88 {} | ||
|
|
||
| static class MyInnerClass89 {} | ||
|
|
||
| static class MyInnerClass90 {} | ||
|
|
||
| static class MyInnerClass91 {} | ||
|
|
||
| static class MyInnerClass92 {} | ||
|
|
||
| static class MyInnerClass93 {} | ||
|
|
||
| static class MyInnerClass94 {} | ||
|
|
||
| static class MyInnerClass95 {} | ||
|
|
||
| static class MyInnerClass96 {} | ||
|
|
||
| static class MyInnerClass97 {} | ||
|
|
||
| static class MyInnerClass98 {} | ||
|
|
||
| static class MyInnerClass99 {} | ||
| } |
Oops, something went wrong.
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why 10? What the benefit here?
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if a retransformation fails it is easier to pinpoint which class is failing that way (individually). here we consider that if we have more than 10 the classes belong to same "family" (here the inner classes).