Skip to content

Commit

Permalink
Inject helper resources only once (open-telemetry#4573)
Browse files Browse the repository at this point in the history
* Inject helper resouces only once

* use resources instread of resource
  • Loading branch information
laurit authored and RashmiRam committed May 23, 2022
1 parent ea9b64d commit 3b148b8
Showing 1 changed file with 30 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ public String toString() {

private final Cache<ClassLoader, Boolean> injectedClassLoaders =
Cache.builder().setWeakKeys().build();
private final Cache<ClassLoader, Boolean> resourcesInjectedClassLoaders =
Cache.builder().setWeakKeys().build();

private final List<WeakReference<Object>> helperModules = new CopyOnWriteArrayList<>();

Expand Down Expand Up @@ -147,38 +149,48 @@ public DynamicType.Builder<?> transform(
ClassLoader classLoader,
JavaModule module) {
if (!helperClassNames.isEmpty()) {
classLoader = injectHelperClasses(typeDescription, classLoader, module);
injectHelperClasses(typeDescription, classLoader, module);
}

if (helpersSource != null && !helperResources.isEmpty()) {
for (HelperResource helperResource : helperResources) {
URL resource = helpersSource.getResource(helperResource.getAgentPath());
if (resource == null) {
logger.debug(
"Helper resource {} requested but not found.", helperResource.getAgentPath());
continue;
}

logger.debug(
"Injecting resource onto classloader {} -> {}",
classLoader,
helperResource.getApplicationPath());
HelperResources.register(classLoader, helperResource.getApplicationPath(), resource);
}
if (classLoader != null && helpersSource != null && !helperResources.isEmpty()) {
injectHelperResources(classLoader);
}

return builder;
}

private ClassLoader injectHelperClasses(
private void injectHelperResources(ClassLoader classLoader) {
resourcesInjectedClassLoaders.computeIfAbsent(
classLoader,
cl -> {
for (HelperResource helperResource : helperResources) {
URL resource = helpersSource.getResource(helperResource.getAgentPath());
if (resource == null) {
logger.debug(
"Helper resource {} requested but not found.", helperResource.getAgentPath());
continue;
}

logger.debug(
"Injecting resource onto classloader {} -> {}",
classLoader,
helperResource.getApplicationPath());
HelperResources.register(classLoader, helperResource.getApplicationPath(), resource);
}

return true;
});
}

private void injectHelperClasses(
TypeDescription typeDescription, ClassLoader classLoader, JavaModule module) {
if (classLoader == null) {
classLoader = BOOTSTRAP_CLASSLOADER_PLACEHOLDER;
}
if (classLoader == BOOTSTRAP_CLASSLOADER_PLACEHOLDER && instrumentation == null) {
logger.error(
"Cannot inject helpers into bootstrap classloader without an instance of Instrumentation. Programmer error!");
return classLoader;
return;
}

injectedClassLoaders.computeIfAbsent(
Expand Down Expand Up @@ -217,7 +229,6 @@ private ClassLoader injectHelperClasses(
});

ensureModuleCanReadHelperModules(module);
return classLoader;
}

private Map<String, Class<?>> injectBootstrapClassLoader(Map<String, byte[]> classnameToBytes)
Expand Down

0 comments on commit 3b148b8

Please sign in to comment.