From 22e88872820a2f63ebde28d9792724bf9c6de19c Mon Sep 17 00:00:00 2001 From: Nikolay Martynov Date: Fri, 11 Oct 2019 08:10:32 -0400 Subject: [PATCH] Make sure flush cannot happen after disruptor shutdown Otherwise flish event gets stuck in disruptor forever. --- .../datadog/trace/common/writer/DDAgentWriter.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDAgentWriter.java b/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDAgentWriter.java index 5a02cf5c36..d5b022b9e8 100644 --- a/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDAgentWriter.java +++ b/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDAgentWriter.java @@ -61,6 +61,7 @@ public class DDAgentWriter implements Writer { private static final ThreadFactory SCHEDULED_FLUSH_THREAD_FACTORY = new DaemonThreadFactory("dd-trace-writer"); + private final Runnable flushTask = new FlushTask(); private final DDApi api; private final int flushFrequencySeconds; private final Disruptor>> disruptor; @@ -135,9 +136,17 @@ public class DDAgentWriter implements Writer { @Override public void close() { running = false; + // We have to shutdown scheduled executor first to make sure no flush events issued after + // disruptor has been shutdown. + // Otherwise those events will never be processed and flush call will wait forever. + scheduledWriterExecutor.shutdown(); + try { + scheduledWriterExecutor.awaitTermination(flushFrequencySeconds, SECONDS); + } catch (final InterruptedException e) { + log.warn("Waiting for flush executor shutdown interrupted.", e); + } flush(); disruptor.shutdown(); - scheduledWriterExecutor.shutdown(); } /** This method will block until the flush is complete. */ @@ -170,8 +179,6 @@ public class DDAgentWriter implements Writer { } } - private final Runnable flushTask = new FlushTask(); - private class FlushTask implements Runnable { @Override public void run() {