diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DispatchingDisruptor.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DispatchingDisruptor.java index bbbbdc957fa..91c8cee2f38 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DispatchingDisruptor.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DispatchingDisruptor.java @@ -3,6 +3,7 @@ import com.lmax.disruptor.BlockingWaitStrategy; import com.lmax.disruptor.EventFactory; import com.lmax.disruptor.EventHandler; +import com.lmax.disruptor.InsufficientCapacityException; import com.lmax.disruptor.dsl.Disruptor; import com.lmax.disruptor.dsl.ProducerType; import datadog.common.exec.DaemonThreadFactory; @@ -46,7 +47,25 @@ public void close() { } long beginTransaction() { - return disruptor.getRingBuffer().next(); + long backoffMillis = 1; + long nextLogTime = 0; + while (true) { + try { + return disruptor.getRingBuffer().tryNext(); + } catch (InsufficientCapacityException insufficientCapacity) { + long now = System.currentTimeMillis(); + backoffMillis = Math.min(backoffMillis * 2, 1000); + if (now > nextLogTime) { // log every 20 seconds + log.debug("no buffer available, sleeping for {}ms", backoffMillis); + nextLogTime = now + 20_000; + } + try { + Thread.sleep(backoffMillis); + } catch (InterruptedException interrupted) { + Thread.currentThread().interrupt(); + } + } + } } TraceBuffer getTraceBuffer(long sequence) {