Skip to content

Commit 1317224

Browse files
authored
Add 1 minute fail-safe in case the class used to trigger resuming of (#8399)
remote components was already unintentionally loaded during premain. (in such cases we may not receive a class-load callback from byte-buddy)
1 parent bab17ef commit 1317224

File tree

1 file changed

+11
-2
lines changed
  • dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap

1 file changed

+11
-2
lines changed

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java

+11-2
Original file line numberDiff line numberDiff line change
@@ -329,8 +329,6 @@ public void run() {
329329
if (appUsingCustomJMXBuilder) {
330330
log.debug("Custom JMX builder detected. Delaying JMXFetch initialization.");
331331
registerMBeanServerBuilderCallback(new StartJmxCallback(jmxStartDelay));
332-
// one minute fail-safe in case nothing touches JMX and callback isn't triggered
333-
scheduleJmxStart(60 + jmxStartDelay);
334332
} else if (appUsingCustomLogManager) {
335333
log.debug("Custom logger detected. Delaying JMXFetch initialization.");
336334
registerLogManagerCallback(new StartJmxCallback(jmxStartDelay));
@@ -437,6 +435,8 @@ public static void startDatadogTracer(InitializationTelemetry initTelemetry) thr
437435
}
438436

439437
private static void registerLogManagerCallback(final ClassLoadCallBack callback) {
438+
// one minute fail-safe in case the class was unintentionally loaded during premain
439+
AgentTaskScheduler.INSTANCE.schedule(callback, 1, TimeUnit.MINUTES);
440440
try {
441441
final Class<?> agentInstallerClass = AGENT_CLASSLOADER.loadClass(AGENT_INSTALLER_CLASS_NAME);
442442
final Method registerCallbackMethod =
@@ -448,6 +448,8 @@ private static void registerLogManagerCallback(final ClassLoadCallBack callback)
448448
}
449449

450450
private static void registerMBeanServerBuilderCallback(final ClassLoadCallBack callback) {
451+
// one minute fail-safe in case the class was unintentionally loaded during premain
452+
AgentTaskScheduler.INSTANCE.schedule(callback, 1, TimeUnit.MINUTES);
451453
try {
452454
final Class<?> agentInstallerClass = AGENT_CLASSLOADER.loadClass(AGENT_INSTALLER_CLASS_NAME);
453455
final Method registerCallbackMethod =
@@ -459,8 +461,14 @@ private static void registerMBeanServerBuilderCallback(final ClassLoadCallBack c
459461
}
460462

461463
protected abstract static class ClassLoadCallBack implements Runnable {
464+
private final AtomicBoolean starting = new AtomicBoolean();
465+
462466
@Override
463467
public void run() {
468+
if (starting.getAndSet(true)) {
469+
return; // someone has already called us
470+
}
471+
464472
/*
465473
* This callback is called from within bytecode transformer. This can be a problem if callback tries
466474
* to load classes being transformed. To avoid this we start a thread here that calls the callback.
@@ -558,6 +566,7 @@ public void execute() {
558566
}
559567

560568
private void resumeRemoteComponents() {
569+
log.debug("Resuming remote components.");
561570
try {
562571
// remote components were paused for custom log-manager/jmx-builder
563572
// add small delay before resuming remote I/O to help stabilization

0 commit comments

Comments
 (0)