You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
🪞 9757 - Avoid pending queue wedge if tracer flare is generated multiple times (#9840)
* Avoid pending queue wedge if tracer flare is generated multiple times
In DumpDrain, the collectTraces method replaces the 'data' field
with an empty ArrayList, but at the same time, it does not also
reset the 'index' field. If another dump is performed later, this
leads the get method reaching the 'return null' statement, and
as the comment states, this can (and does) break the queue.
This change does a few things:
- Resets the index in collectTraces when the data field is replaced
(and marks the index field as volatile). This should prevent the
above situation from happening.
- In case the situation still happens, a stand-in CommandElement
is returned to avoid returning null. A warning message is also logged.
- The existing "testing tracer flare dump with multiple traces"
test case is expanded to exercise problem.
Here is an example stack trace when the hang happens:
"dd-trace-monitor" #38 daemon prio=5 os_prio=31 tid=0x0000000110e6e000 nid=0x7617 runnable [0x0000000171032000]
java.lang.Thread.State: RUNNABLE
at org.jctools.queues.MpscBlockingConsumerArrayQueue.spinWaitForElement(MpscBlockingConsumerArrayQueue.java:634)
at org.jctools.queues.MpscBlockingConsumerArrayQueue.parkUntilNext(MpscBlockingConsumerArrayQueue.java:566)
at org.jctools.queues.MpscBlockingConsumerArrayQueue.take(MpscBlockingConsumerArrayQueue.java:482)
at datadog.trace.core.PendingTraceBuffer$DelayingPendingTraceBuffer$Worker.run(PendingTraceBuffer.java:317)
at java.lang.Thread.run(Thread.java:750)
* Use SEND_TELEMETRY for DumpDrain's index out of bounds warning log
---------
Co-authored-by: DJ Gregor <[email protected]>
(entries["pending_traces.txt"] asString).startsWith('[{"service":"fakeService","name":"fakeOperation","resource":"fakeResource","trace_id":1,"span_id":1,"parent_id":0') // Rest of dump is timestamp specific
pendingTraceText1.startsWith('[{"service":"fakeService","name":"fakeOperation","resource":"fakeResource","trace_id":1,"span_id":1,"parent_id":0') // Rest of dump is timestamp specific
0 commit comments