Skip to content

Commit c9f31da

Browse files
committed
Reduce unsafe usages
1 parent a6c0489 commit c9f31da

File tree

19 files changed

+194
-58
lines changed

19 files changed

+194
-58
lines changed

instrumentation/executors/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/executors/ThreadPoolExecutorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
import io.opentelemetry.api.baggage.Baggage;
1212
import io.opentelemetry.context.Scope;
13-
import io.opentelemetry.javaagent.bootstrap.VirtualFieldInstalledMarker;
13+
import io.opentelemetry.javaagent.bootstrap.field.VirtualFieldInstalledMarker;
1414
import java.util.concurrent.CountDownLatch;
1515
import java.util.concurrent.FutureTask;
1616
import java.util.concurrent.LinkedBlockingQueue;

instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
1818

1919
import io.opentelemetry.javaagent.bootstrap.InjectedClassHelper;
20+
import io.opentelemetry.javaagent.bootstrap.InjectedClassHelper.HelperClassLoader;
2021
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
2122
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
23+
import java.lang.invoke.MethodHandles;
2224
import net.bytebuddy.asm.Advice;
2325
import net.bytebuddy.asm.Advice.AssignReturned;
2426
import net.bytebuddy.description.method.MethodDescription;
@@ -59,8 +61,12 @@ public static class LoadClassAdvice {
5961

6062
@Advice.OnMethodEnter(skipOn = Advice.OnNonDefaultValue.class)
6163
public static Class<?> onEnter(
62-
@Advice.This ClassLoader classLoader, @Advice.Argument(0) String name) {
63-
return InjectedClassHelper.loadHelperClass(classLoader, name);
64+
@Advice.This ClassLoader classLoader, @Advice.Argument(0) String name) throws Throwable {
65+
HelperClassLoader helperClassLoader =
66+
InjectedClassHelper.getHelperClassLoader(classLoader, name);
67+
return helperClassLoader != null
68+
? helperClassLoader.loadHelperClass(MethodHandles.lookup())
69+
: null;
6470
}
6571

6672
@AssignReturned.ToReturned

instrumentation/internal/internal-lambda/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/internal/lambda/LambdaInstrumentationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import static org.assertj.core.api.Assertions.assertThat;
99

10-
import io.opentelemetry.javaagent.bootstrap.VirtualFieldInstalledMarker;
10+
import io.opentelemetry.javaagent.bootstrap.field.VirtualFieldInstalledMarker;
1111
import org.junit.jupiter.api.Test;
1212

1313
class LambdaInstrumentationTest {

instrumentation/internal/internal-reflection/javaagent-integration-tests/src/test/java/ReflectionTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
import instrumentation.TestHelperClass;
99
import io.opentelemetry.javaagent.bootstrap.InstrumentationProxy;
10-
import io.opentelemetry.javaagent.bootstrap.VirtualFieldAccessorMarker;
11-
import io.opentelemetry.javaagent.bootstrap.VirtualFieldInstalledMarker;
10+
import io.opentelemetry.javaagent.bootstrap.field.VirtualFieldAccessorMarker;
11+
import io.opentelemetry.javaagent.bootstrap.field.VirtualFieldInstalledMarker;
1212
import java.io.ObjectStreamClass;
1313
import java.io.Serializable;
1414
import java.lang.reflect.Field;

instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionHelper.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
package io.opentelemetry.javaagent.instrumentation.internal.reflection;
77

88
import io.opentelemetry.javaagent.bootstrap.InstrumentationProxy;
9-
import io.opentelemetry.javaagent.bootstrap.VirtualFieldAccessorMarker;
10-
import io.opentelemetry.javaagent.bootstrap.VirtualFieldDetector;
11-
import io.opentelemetry.javaagent.bootstrap.VirtualFieldInstalledMarker;
9+
import io.opentelemetry.javaagent.bootstrap.field.VirtualFieldAccessorMarker;
10+
import io.opentelemetry.javaagent.bootstrap.field.VirtualFieldDetector;
11+
import io.opentelemetry.javaagent.bootstrap.field.VirtualFieldInstalledMarker;
1212
import java.lang.reflect.Field;
1313
import java.lang.reflect.Method;
1414
import java.util.ArrayList;

javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/InjectedClassHelper.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.javaagent.bootstrap;
77

8+
import java.lang.invoke.MethodHandles;
89
import java.util.function.BiFunction;
910
import java.util.function.BiPredicate;
1011
import java.util.function.Function;
@@ -37,21 +38,25 @@ public static boolean isHelperClass(ClassLoader classLoader, String className) {
3738
return helperClassDetector.test(classLoader, className);
3839
}
3940

40-
private static volatile BiFunction<ClassLoader, String, Class<?>> helperClassLoader;
41+
private static volatile BiFunction<ClassLoader, String, HelperClassLoader> helperClassLoader;
4142

4243
public static void internalSetHelperClassLoader(
43-
BiFunction<ClassLoader, String, Class<?>> helperClassLoader) {
44+
BiFunction<ClassLoader, String, HelperClassLoader> helperClassLoader) {
4445
if (InjectedClassHelper.helperClassLoader != null) {
4546
// Only possible by misuse of this API, just ignore.
4647
return;
4748
}
4849
InjectedClassHelper.helperClassLoader = helperClassLoader;
4950
}
5051

51-
public static Class<?> loadHelperClass(ClassLoader classLoader, String className) {
52+
public static HelperClassLoader getHelperClassLoader(ClassLoader classLoader, String className) {
5253
if (helperClassLoader == null) {
5354
return null;
5455
}
5556
return helperClassLoader.apply(classLoader, className);
5657
}
58+
59+
public interface HelperClassLoader {
60+
Class<?> loadHelperClass(MethodHandles.Lookup lookup) throws Throwable;
61+
}
5762
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.javaagent.bootstrap;
6+
package io.opentelemetry.javaagent.bootstrap.field;
77

88
/** A marker interface implemented by virtual field accessor classes. */
99
public interface VirtualFieldAccessorMarker {}
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.javaagent.bootstrap;
6+
package io.opentelemetry.javaagent.bootstrap.field;
77

88
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
9+
import java.lang.invoke.MethodHandles;
910
import java.util.Collection;
1011

1112
/** Helper class for detecting whether given class has virtual fields. */
@@ -48,4 +49,8 @@ public static boolean hasVirtualField(Class<?> clazz, String virtualFieldInterfa
4849
public static void markVirtualFields(Class<?> clazz, Collection<String> virtualFieldClassName) {
4950
classesWithVirtualFields.put(clazz, virtualFieldClassName);
5051
}
52+
53+
public static MethodHandles.Lookup lookup() {
54+
return MethodHandles.lookup();
55+
}
5156
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.javaagent.bootstrap;
6+
package io.opentelemetry.javaagent.bootstrap.field;
77

88
/**
99
* A marker interface that signifies that virtual fields have been installed into the class that

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,16 @@ private static void installBytebuddyAgent(
131131
// https://bugs.openjdk.org/browse/JDK-8164165
132132
ThreadLocalRandom.current();
133133

134+
// AgentBuilder.Default constructor triggers sun.misc.Unsafe::objectFieldOffset called warning
135+
// AgentBuilder$Default.<init>
136+
// -> NexusAccessor.<clinit>
137+
// -> ClassInjector$UsingReflection.<clinit>
138+
// -> ClassInjector$UsingUnsafe.<clinit>
139+
// -> WARNING: sun.misc.Unsafe::objectFieldOffset called by
140+
// net.bytebuddy.dynamic.loading.ClassInjector$UsingUnsafe$Dispatcher$CreationAction
141+
// we don't use byte-buddy nexus so we disable it and later restore the original value for the
142+
// system property
143+
String originalNexusDisabled = System.setProperty("net.bytebuddy.nexus.disabled", "true");
134144
AgentBuilder agentBuilder =
135145
new AgentBuilder.Default(
136146
// default method graph compiler inspects the class hierarchy, we don't need it, so
@@ -147,6 +157,13 @@ private static void installBytebuddyAgent(
147157
.with(AgentTooling.poolStrategy())
148158
.with(AgentTooling.transformListener())
149159
.with(AgentTooling.locationStrategy());
160+
// restore the original value for the nexus disabled property
161+
if (originalNexusDisabled != null) {
162+
System.setProperty("net.bytebuddy.nexus.disabled", originalNexusDisabled);
163+
} else {
164+
System.clearProperty("net.bytebuddy.nexus.disabled");
165+
}
166+
150167
if (JavaModule.isSupported()) {
151168
agentBuilder = agentBuilder.with(new ExposeAgentBootstrapListener(inst));
152169
}

0 commit comments

Comments
 (0)