Skip to content

Commit 4568db6

Browse files
authored
Merge pull request DataDog#3848 from DataDog/jpbempel/fix-race-remote-config
Fix race condition between RC and debugger
2 parents aeb3063 + 5a6a5f8 commit 4568db6

5 files changed

Lines changed: 24 additions & 9 deletions

File tree

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

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -378,12 +378,10 @@ public void execute() {
378378
installDatadogTracer(scoClass, sco);
379379
maybeStartAppSec(scoClass, sco);
380380
maybeStartIast(scoClass, sco);
381+
// start debugger before remote config to subscribe to it before starting to poll
382+
maybeStartDebugger(instrumentation, scoClass, sco);
381383
maybeStartRemoteConfig(scoClass, sco);
382384

383-
if (debuggerEnabled) {
384-
startDebuggerAgent(instrumentation, scoClass, sco);
385-
}
386-
387385
if (telemetryEnabled) {
388386
startTelemetry(instrumentation, scoClass, sco);
389387
}
@@ -765,8 +763,19 @@ private static void shutdownProfilingAgent(final boolean sync) {
765763
}
766764
}
767765

766+
private static void maybeStartDebugger(Instrumentation inst, Class<?> scoClass, Object sco) {
767+
if (!debuggerEnabled) {
768+
return;
769+
}
770+
if (!remoteConfigEnabled) {
771+
log.warn("Cannot enable Dynamic Instrumentation because Remote Configuration is not enabled");
772+
return;
773+
}
774+
startDebuggerAgent(inst, scoClass, sco);
775+
}
776+
768777
private static synchronized void startDebuggerAgent(
769-
final Instrumentation inst, Class<?> scoClass, Object sco) {
778+
Instrumentation inst, Class<?> scoClass, Object sco) {
770779
final ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
771780
try {
772781
Thread.currentThread().setContextClassLoader(AGENT_CLASSLOADER);

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerAgent.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ public static synchronized void run(
8787
configurationPoller = (ConfigurationPoller) sco.configurationPoller(config);
8888
if (configurationPoller != null) {
8989
subscribeConfigurationPoller(configurationUpdater);
90-
configurationPoller.start();
9190

9291
try {
9392
/*
@@ -99,6 +98,8 @@ public static synchronized void run(
9998
} catch (final IllegalStateException ex) {
10099
// The JVM is already shutting down.
101100
}
101+
} else {
102+
log.debug("No configuration poller available from SharedCommunicationObjects");
102103
}
103104
}
104105

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerAgentTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.datadog.debugger.util.RemoteConfigHelper;
1414
import datadog.common.container.ContainerInfo;
1515
import datadog.communication.ddagent.SharedCommunicationObjects;
16+
import datadog.remoteconfig.ConfigurationPoller;
1617
import datadog.trace.api.Config;
1718
import java.io.BufferedReader;
1819
import java.io.IOException;
@@ -119,7 +120,11 @@ public void runEnabledWithDatadogAgent() throws InterruptedException, IOExceptio
119120
} catch (IOException e) {
120121
e.printStackTrace();
121122
}
122-
DebuggerAgent.run(inst, new SharedCommunicationObjects());
123+
SharedCommunicationObjects sharedCommunicationObjects = new SharedCommunicationObjects();
124+
DebuggerAgent.run(inst, sharedCommunicationObjects);
125+
ConfigurationPoller configurationPoller =
126+
(ConfigurationPoller) sharedCommunicationObjects.configurationPoller(Config.get());
127+
configurationPoller.start();
123128
RecordedRequest request = datadogAgentServer.takeRequest(5, TimeUnit.SECONDS);
124129
assertNotNull(request);
125130
assertEquals("/info", request.getPath());

dd-java-agent/appsec/src/main/java/com/datadog/appsec/config/AppSecConfigServiceImpl.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ public void init() {
116116
public void maybeInitPoller() {
117117
if (!hasUserConfig && this.configurationPoller != null) {
118118
subscribeConfigurationPoller();
119-
configurationPoller.start();
120119
}
121120
}
122121

dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/DebuggerIntegrationTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ void testDestroy() throws Exception {
111111
new MockResponse()
112112
.setHeadersDelay(REQUEST_WAIT_TIMEOUT * 2, TimeUnit.SECONDS)
113113
.setResponseCode(200));
114-
targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, "2").start();
114+
// wait for 3 snapshots (2 status + 1 snapshot)
115+
targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, "3").start();
115116

116117
RecordedRequest request = retrieveSnapshotRequest();
117118
assertNotNull(request);

0 commit comments

Comments
 (0)