diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-02-17 19:23:28 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-02-17 19:23:28 +0100 |
commit | bce9c8f91e00c084aa935bddfc3d29ddee21746f (patch) | |
tree | 8301f04f31e17c28182060446a17fb3bc455357c /container-core | |
parent | 6856c7448dcdae692f60aa65a79ec34c984b0586 (diff) |
Add proper excetion handling ensuring we are tracking pending bytes correctly.
Diffstat (limited to 'container-core')
-rw-r--r-- | container-core/src/main/java/com/yahoo/container/handler/LogHandler.java | 26 | ||||
-rw-r--r-- | container-core/src/main/java/com/yahoo/container/handler/LogReader.java | 2 |
2 files changed, 19 insertions, 9 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/handler/LogHandler.java b/container-core/src/main/java/com/yahoo/container/handler/LogHandler.java index ad03f8405ac..29528f9c23a 100644 --- a/container-core/src/main/java/com/yahoo/container/handler/LogHandler.java +++ b/container-core/src/main/java/com/yahoo/container/handler/LogHandler.java @@ -16,6 +16,7 @@ import java.nio.ByteBuffer; import java.time.Instant; import java.util.Optional; import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; @@ -62,14 +63,12 @@ public class LogHandler extends ThreadedHttpRequestHandler { private static class MaxPendingContentChannelOutputStream extends ContentChannelOutputStream { - private final ContentChannel channel; private final long maxPending; - private AtomicLong sent = new AtomicLong(0); - private AtomicLong acked = new AtomicLong(0); + private final AtomicLong sent = new AtomicLong(0); + private final AtomicLong acked = new AtomicLong(0); public MaxPendingContentChannelOutputStream(ContentChannel endpoint, long maxPending) { super(endpoint); - this.channel = endpoint; this.maxPending = maxPending; } @@ -78,19 +77,24 @@ public class LogHandler extends ThreadedHttpRequestHandler { } private class TrackCompletition implements CompletionHandler { - final long written; + private final long written; + private final AtomicBoolean replied = new AtomicBoolean(false); TrackCompletition(long written) { this.written = written; sent.addAndGet(written); } @Override public void completed() { - acked.addAndGet(written); + if (!replied.getAndSet(true)) { + acked.addAndGet(written); + } } @Override public void failed(Throwable t) { - acked.addAndGet(written); + if (!replied.getAndSet(true)) { + acked.addAndGet(written); + } } } @Override @@ -98,7 +102,13 @@ public class LogHandler extends ThreadedHttpRequestHandler { try { stallWhilePendingAbove(maxPending); } catch (InterruptedException e) {} - send(src, new TrackCompletition(src.remaining())); + CompletionHandler pendingTracker = new TrackCompletition(src.remaining()); + try { + send(src, pendingTracker); + } catch (Throwable throwable) { + pendingTracker.failed(throwable); + throw throwable; + } } private void stallWhilePendingAbove(long pending) throws InterruptedException { diff --git a/container-core/src/main/java/com/yahoo/container/handler/LogReader.java b/container-core/src/main/java/com/yahoo/container/handler/LogReader.java index af83f97fd9b..5b6a87d02df 100644 --- a/container-core/src/main/java/com/yahoo/container/handler/LogReader.java +++ b/container-core/src/main/java/com/yahoo/container/handler/LogReader.java @@ -43,13 +43,13 @@ import static java.nio.charset.StandardCharsets.UTF_8; * @author jonmv */ class LogReader { - static final Pattern logArchivePathPattern = Pattern.compile("(\\d{4})/(\\d{2})/(\\d{2})/(\\d{2})-\\d+(.gz)?"); static final Pattern vespaLogPathPattern = Pattern.compile("vespa\\.log(?:-(\\d{4})-(\\d{2})-(\\d{2})\\.(\\d{2})-(\\d{2})-(\\d{2})(?:.gz)?)?"); private final Path logDirectory; private final Pattern logFilePattern; + LogReader(String logDirectory, String logFilePattern) { this(Paths.get(Defaults.getDefaults().underVespaHome(logDirectory)), Pattern.compile(logFilePattern)); } |