From d1b94b890eaf1fdb5f3206b6c8b7a54af92e280b Mon Sep 17 00:00:00 2001 From: Pierre De Rop Date: Tue, 28 Jun 2022 11:34:11 +0200 Subject: [PATCH] Ensure active connections is decremented (#2335) This PR is an improvement for #2237. When the AbstractHttpServerMetricsHandler.write method is getting an exception thrown by recordWrite, then the recordInactiveConnection is never called. So, this is too bad because the long adder for the active connection is then never decremented by the missed call to recordInactiveConnection, resulting in leaving the number of active connections to an inconsistent value. Fixes #2187 --- .../AbstractHttpServerMetricsHandler.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/reactor-netty-http/src/main/java/reactor/netty/http/server/AbstractHttpServerMetricsHandler.java b/reactor-netty-http/src/main/java/reactor/netty/http/server/AbstractHttpServerMetricsHandler.java index 316f0dd033..43a328de1b 100644 --- a/reactor-netty-http/src/main/java/reactor/netty/http/server/AbstractHttpServerMetricsHandler.java +++ b/reactor-netty-http/src/main/java/reactor/netty/http/server/AbstractHttpServerMetricsHandler.java @@ -112,24 +112,30 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) if (msg instanceof LastHttpContent) { promise.addListener(future -> { - try { - ChannelOperations channelOps = ChannelOperations.get(ctx.channel()); - if (channelOps instanceof HttpServerOperations) { - HttpServerOperations ops = (HttpServerOperations) channelOps; + ChannelOperations channelOps = ChannelOperations.get(ctx.channel()); + if (channelOps instanceof HttpServerOperations) { + HttpServerOperations ops = (HttpServerOperations) channelOps; + try { recordWrite(ops, uriTagValue == null ? ops.path : uriTagValue.apply(ops.path), ops.method().name(), ops.status().codeAsText().toString()); - if (!ops.isHttp2() && ops.hostAddress() != null) { - // This metric is not applicable for HTTP/2 - // ops.hostAddress() == null when request decoding failed, in this case - // we do not report active connection, so we do not report inactive connection + } + catch (RuntimeException e) { + log.warn("Exception caught while recording metrics.", e); + // Allow request-response exchange to continue, unaffected by metrics problem + } + if (!ops.isHttp2() && ops.hostAddress() != null) { + // This metric is not applicable for HTTP/2 + // ops.hostAddress() == null when request decoding failed, in this case + // we do not report active connection, so we do not report inactive connection + try { recordInactiveConnection(ops); } + catch (RuntimeException e) { + log.warn("Exception caught while recording metrics.", e); + // Allow request-response exchange to continue, unaffected by metrics problem + } } } - catch (RuntimeException e) { - log.warn("Exception caught while recording metrics.", e); - // Allow request-response exchange to continue, unaffected by metrics problem - } dataSent = 0; });