mirror of
https://github.com/elastic/elasticsearch.git
synced 2025-04-24 15:17:30 -04:00
Limit which classes are retransformed (#118786)
During entitlements initialization the transformer is added to instrumenation after some classes are already loaded. Currently we end up force loading (though not initializing) all classes that want to transform. This commit simplifies the retransform to only apply to classes which we know are already loaded by the jdk, which Instrumentation provides.
This commit is contained in:
parent
4007ff3b44
commit
21bcc314c4
1 changed files with 9 additions and 8 deletions
|
@ -34,6 +34,7 @@ import java.lang.reflect.InvocationTargetException;
|
|||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
@ -72,17 +73,17 @@ public class EntitlementInitialization {
|
|||
|
||||
Instrumenter instrumenter = INSTRUMENTER_FACTORY.newInstrumenter(EntitlementChecker.class, checkMethods);
|
||||
inst.addTransformer(new Transformer(instrumenter, classesToTransform), true);
|
||||
// TODO: should we limit this array somehow?
|
||||
var classesToRetransform = classesToTransform.stream().map(EntitlementInitialization::internalNameToClass).toArray(Class[]::new);
|
||||
inst.retransformClasses(classesToRetransform);
|
||||
inst.retransformClasses(findClassesToRetransform(inst.getAllLoadedClasses(), classesToTransform));
|
||||
}
|
||||
|
||||
private static Class<?> internalNameToClass(String internalName) {
|
||||
try {
|
||||
return Class.forName(internalName.replace('/', '.'), false, ClassLoader.getPlatformClassLoader());
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new RuntimeException(e);
|
||||
private static Class<?>[] findClassesToRetransform(Class<?>[] loadedClasses, Set<String> classesToTransform) {
|
||||
List<Class<?>> retransform = new ArrayList<>();
|
||||
for (Class<?> loadedClass : loadedClasses) {
|
||||
if (classesToTransform.contains(loadedClass.getName().replace(".", "/"))) {
|
||||
retransform.add(loadedClass);
|
||||
}
|
||||
}
|
||||
return retransform.toArray(new Class<?>[0]);
|
||||
}
|
||||
|
||||
private static PolicyManager createPolicyManager() throws IOException {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue