From be429f0910385b1c3b753549027d101377fa1afd Mon Sep 17 00:00:00 2001 From: Lachlan Roberts Date: Thu, 6 Aug 2020 20:38:02 +1000 Subject: [PATCH 01/17] Issue #5122 - add specialized Connection.Listener for WebSocket ConnectionStatistics Signed-off-by: Lachlan Roberts --- jetty-websocket/jetty-websocket-tests/pom.xml | 6 ++ .../websocket/tests/WebSocketStatsTest.java | 58 ++++++++----------- .../util/WebSocketConnectionStatistics.java | 40 +++++++++++++ 3 files changed, 69 insertions(+), 35 deletions(-) create mode 100644 jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/WebSocketConnectionStatistics.java diff --git a/jetty-websocket/jetty-websocket-tests/pom.xml b/jetty-websocket/jetty-websocket-tests/pom.xml index c27e463eb4b..d9fbabf13a6 100644 --- a/jetty-websocket/jetty-websocket-tests/pom.xml +++ b/jetty-websocket/jetty-websocket-tests/pom.xml @@ -66,5 +66,11 @@ jetty-test-helper test + + org.eclipse.jetty + jetty-jmx + ${project.version} + test + diff --git a/jetty-websocket/jetty-websocket-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java b/jetty-websocket/jetty-websocket-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java index f096535dcbe..01a4c5f8dc5 100644 --- a/jetty-websocket/jetty-websocket-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java +++ b/jetty-websocket/jetty-websocket-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java @@ -18,6 +18,7 @@ package org.eclipse.jetty.websocket.tests; +import java.lang.management.ManagementFactory; import java.net.URI; import java.nio.ByteBuffer; import java.util.concurrent.CountDownLatch; @@ -28,7 +29,7 @@ import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.Connection; import org.eclipse.jetty.io.ConnectionStatistics; import org.eclipse.jetty.io.MappedByteBufferPool; -import org.eclipse.jetty.server.HttpConnection; +import org.eclipse.jetty.jmx.MBeanContainer; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.servlet.ServletContextHandler; @@ -41,8 +42,9 @@ import org.eclipse.jetty.websocket.common.Generator; import org.eclipse.jetty.websocket.common.WebSocketFrame; import org.eclipse.jetty.websocket.common.frames.TextFrame; import org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection; -import org.eclipse.jetty.websocket.servlet.WebSocketServlet; -import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory; +import org.eclipse.jetty.websocket.common.util.WebSocketConnectionStatistics; +import org.eclipse.jetty.websocket.server.NativeWebSocketServletContainerInitializer; +import org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -53,36 +55,23 @@ import static org.junit.jupiter.api.Assertions.assertTrue; public class WebSocketStatsTest { - public static class MyWebSocketServlet extends WebSocketServlet - { - @Override - public void configure(WebSocketServletFactory factory) - { - factory.setCreator((req, resp) -> new EchoSocket()); - } - } - + private final CountDownLatch wsConnectionClosed = new CountDownLatch(1); private Server server; private ServerConnector connector; private WebSocketClient client; private ConnectionStatistics statistics; - private CountDownLatch wsUpgradeComplete = new CountDownLatch(1); - private CountDownLatch wsConnectionClosed = new CountDownLatch(1); @BeforeEach public void start() throws Exception { - statistics = new ConnectionStatistics() + statistics = new WebSocketConnectionStatistics() { @Override public void onClosed(Connection connection) { super.onClosed(connection); - if (connection instanceof AbstractWebSocketConnection) wsConnectionClosed.countDown(); - else if (connection instanceof HttpConnection) - wsUpgradeComplete.countDown(); } }; @@ -93,11 +82,17 @@ public class WebSocketStatsTest ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); contextHandler.setContextPath("/"); - contextHandler.addServlet(MyWebSocketServlet.class, "/testPath"); + NativeWebSocketServletContainerInitializer.configure(contextHandler, (context, container) -> + container.addMapping("/", EchoSocket.class)); + WebSocketUpgradeFilter.configure(contextHandler); server.setHandler(contextHandler); client = new WebSocketClient(); + // Setup JMX. + MBeanContainer mbeanContainer = new MBeanContainer(ManagementFactory.getPlatformMBeanServer()); + server.addBean(mbeanContainer); + server.start(); client.start(); } @@ -105,8 +100,8 @@ public class WebSocketStatsTest @AfterEach public void stop() throws Exception { - client.stop(); server.stop(); + client.stop(); } long getFrameByteSize(WebSocketFrame frame) @@ -122,22 +117,15 @@ public class WebSocketStatsTest @Test public void echoStatsTest() throws Exception { - URI uri = URI.create("ws://localhost:" + connector.getLocalPort() + "/testPath"); + URI uri = URI.create("ws://localhost:" + connector.getLocalPort() + "/"); EventSocket socket = new EventSocket(); Future connect = client.connect(socket, uri); - final long numMessages = 10000; + final long numMessages = 1; final String msgText = "hello world"; - - long upgradeSentBytes; - long upgradeReceivedBytes; - try (Session session = connect.get(5, TimeUnit.SECONDS)) { - wsUpgradeComplete.await(5, TimeUnit.SECONDS); - upgradeSentBytes = statistics.getSentBytes(); - upgradeReceivedBytes = statistics.getReceivedBytes(); - + assertThat(statistics.getConnections(), is(1L)); for (int i = 0; i < numMessages; i++) { session.getRemote().sendString(msgText); @@ -150,18 +138,18 @@ public class WebSocketStatsTest assertThat(statistics.getConnectionsMax(), is(1L)); assertThat(statistics.getConnections(), is(0L)); - assertThat(statistics.getSentMessages(), is(numMessages + 2L)); - assertThat(statistics.getReceivedMessages(), is(numMessages + 2L)); + // Sent and received all of the echo messages + 1 for the close frame. + assertThat(statistics.getSentMessages(), is(numMessages + 1L)); + assertThat(statistics.getReceivedMessages(), is(numMessages + 1L)); WebSocketFrame textFrame = new TextFrame().setPayload(msgText); WebSocketFrame closeFrame = new CloseInfo(socket.closeCode, socket.closeReason).asFrame(); - final long textFrameSize = getFrameByteSize(textFrame); final long closeFrameSize = getFrameByteSize(closeFrame); final int maskSize = 4; // We use 4 byte mask for client frames - final long expectedSent = upgradeSentBytes + numMessages * textFrameSize + closeFrameSize; - final long expectedReceived = upgradeReceivedBytes + numMessages * (textFrameSize + maskSize) + closeFrameSize + maskSize; + final long expectedSent = numMessages * textFrameSize + closeFrameSize; + final long expectedReceived = numMessages * (textFrameSize + maskSize) + (closeFrameSize + maskSize); assertThat("stats.sendBytes", statistics.getSentBytes(), is(expectedSent)); assertThat("stats.receivedBytes", statistics.getReceivedBytes(), is(expectedReceived)); diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/WebSocketConnectionStatistics.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/WebSocketConnectionStatistics.java new file mode 100644 index 00000000000..c42edba546e --- /dev/null +++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/WebSocketConnectionStatistics.java @@ -0,0 +1,40 @@ +// +// ======================================================================== +// Copyright (c) 1995-2020 Mort Bay Consulting Pty Ltd and others. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.websocket.common.util; + +import org.eclipse.jetty.io.Connection; +import org.eclipse.jetty.io.ConnectionStatistics; +import org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection; + +public class WebSocketConnectionStatistics extends ConnectionStatistics +{ + @Override + public void onOpened(Connection connection) + { + if (connection instanceof AbstractWebSocketConnection) + super.onOpened(connection); + } + + @Override + public void onClosed(Connection connection) + { + if (connection instanceof AbstractWebSocketConnection) + super.onClosed(connection); + } +} From 8a3ff775d5bc285e066e5638623970496f32022d Mon Sep 17 00:00:00 2001 From: Lachlan Roberts Date: Thu, 6 Aug 2020 20:45:06 +1000 Subject: [PATCH 02/17] Issue #5122 - make number of active WS Sessions a managed attribute on SessionTracker Signed-off-by: Lachlan Roberts --- .../websocket/jsr356/JsrSessionTracker.java | 17 ++++++++++++++++- .../jetty/websocket/common/SessionTracker.java | 7 +++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSessionTracker.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSessionTracker.java index 6af4830c59b..303e77c8c90 100644 --- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSessionTracker.java +++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSessionTracker.java @@ -18,16 +18,19 @@ package org.eclipse.jetty.websocket.jsr356; +import java.io.IOException; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import javax.websocket.Session; +import org.eclipse.jetty.util.annotation.ManagedAttribute; import org.eclipse.jetty.util.component.AbstractLifeCycle; +import org.eclipse.jetty.util.component.Dumpable; import org.eclipse.jetty.util.component.LifeCycle; -public class JsrSessionTracker extends AbstractLifeCycle implements JsrSessionListener +public class JsrSessionTracker extends AbstractLifeCycle implements JsrSessionListener, Dumpable { private final Set sessions = Collections.newSetFromMap(new ConcurrentHashMap<>()); @@ -57,4 +60,16 @@ public class JsrSessionTracker extends AbstractLifeCycle implements JsrSessionLi } super.doStop(); } + + @ManagedAttribute("Total number of active WebSocket Sessions") + public int getNumSessions() + { + return sessions.size(); + } + + @Override + public void dump(Appendable out, String indent) throws IOException + { + Dumpable.dumpObjects(out, indent, this, sessions); + } } diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/SessionTracker.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/SessionTracker.java index 635f1a9d2ce..c75f1b103d6 100644 --- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/SessionTracker.java +++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/SessionTracker.java @@ -24,6 +24,7 @@ import java.util.HashSet; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.eclipse.jetty.util.annotation.ManagedAttribute; import org.eclipse.jetty.util.component.AbstractLifeCycle; import org.eclipse.jetty.util.component.Dumpable; import org.eclipse.jetty.util.component.LifeCycle; @@ -61,6 +62,12 @@ public class SessionTracker extends AbstractLifeCycle implements WebSocketSessio super.doStop(); } + @ManagedAttribute("Total number of active WebSocket Sessions") + public int getNumSessions() + { + return sessions.size(); + } + @Override public void dump(Appendable out, String indent) throws IOException { From de1077c375cfac68dad8f1c53eddb573009ec39e Mon Sep 17 00:00:00 2001 From: Lachlan Roberts Date: Thu, 13 Aug 2020 22:04:56 +1000 Subject: [PATCH 03/17] Fix WebSocketServerExamplesTest to work with surefire update Signed-off-by: Lachlan Roberts --- jetty-websocket/websocket-javax-server/pom.xml | 2 +- .../tests}/server/examples/GetHttpSessionConfigurator.java | 2 +- .../javax/tests}/server/examples/GetHttpSessionSocket.java | 2 +- .../javax/tests}/server/examples/MyAuthedConfigurator.java | 2 +- .../javax/tests}/server/examples/MyAuthedSocket.java | 2 +- .../javax/tests}/server/examples/StreamingEchoSocket.java | 2 +- .../tests}/server/examples/WebSocketServerExamplesTest.java | 2 +- .../src/test/resources/jetty-websocket-httpclient.xml | 0 .../java/org/eclipse/jetty/websocket/util/InvokerUtils.java | 6 ++++++ pom.xml | 2 +- 10 files changed, 14 insertions(+), 8 deletions(-) rename jetty-websocket/{websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax => websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests}/server/examples/GetHttpSessionConfigurator.java (95%) rename jetty-websocket/{websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax => websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests}/server/examples/GetHttpSessionSocket.java (96%) rename jetty-websocket/{websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax => websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests}/server/examples/MyAuthedConfigurator.java (96%) rename jetty-websocket/{websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax => websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests}/server/examples/MyAuthedSocket.java (94%) rename jetty-websocket/{websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax => websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests}/server/examples/StreamingEchoSocket.java (95%) rename jetty-websocket/{websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax => websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests}/server/examples/WebSocketServerExamplesTest.java (99%) rename jetty-websocket/{websocket-javax-server => websocket-javax-tests}/src/test/resources/jetty-websocket-httpclient.xml (100%) diff --git a/jetty-websocket/websocket-javax-server/pom.xml b/jetty-websocket/websocket-javax-server/pom.xml index e543c2dc12c..a0251b8779c 100644 --- a/jetty-websocket/websocket-javax-server/pom.xml +++ b/jetty-websocket/websocket-javax-server/pom.xml @@ -51,7 +51,7 @@ maven-surefire-plugin - @{argLine} ${jetty.surefire.argLine} --add-exports org.eclipse.jetty.websocket.javax.server/org.eclipse.jetty.websocket.javax.server.examples=org.eclipse.jetty.websocket.javax.common --add-reads org.eclipse.jetty.websocket.javax.server=org.eclipse.jetty.security --add-reads org.eclipse.jetty.websocket.javax.common=org.eclipse.jetty.websocket.javax.server + @{argLine} ${jetty.surefire.argLine} --add-reads org.eclipse.jetty.websocket.javax.server=org.eclipse.jetty.security --add-reads org.eclipse.jetty.websocket.javax.common=org.eclipse.jetty.websocket.javax.server diff --git a/jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/GetHttpSessionConfigurator.java b/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/GetHttpSessionConfigurator.java similarity index 95% rename from jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/GetHttpSessionConfigurator.java rename to jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/GetHttpSessionConfigurator.java index 80890503983..2f732934afe 100644 --- a/jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/GetHttpSessionConfigurator.java +++ b/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/GetHttpSessionConfigurator.java @@ -16,7 +16,7 @@ // ======================================================================== // -package org.eclipse.jetty.websocket.javax.server.examples; +package org.eclipse.jetty.websocket.javax.tests.server.examples; import javax.servlet.http.HttpSession; import javax.websocket.HandshakeResponse; diff --git a/jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/GetHttpSessionSocket.java b/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/GetHttpSessionSocket.java similarity index 96% rename from jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/GetHttpSessionSocket.java rename to jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/GetHttpSessionSocket.java index 15daea9f5cd..56327b63174 100644 --- a/jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/GetHttpSessionSocket.java +++ b/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/GetHttpSessionSocket.java @@ -16,7 +16,7 @@ // ======================================================================== // -package org.eclipse.jetty.websocket.javax.server.examples; +package org.eclipse.jetty.websocket.javax.tests.server.examples; import java.io.IOException; import javax.servlet.http.HttpSession; diff --git a/jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/MyAuthedConfigurator.java b/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/MyAuthedConfigurator.java similarity index 96% rename from jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/MyAuthedConfigurator.java rename to jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/MyAuthedConfigurator.java index d633f2f26be..47b9f7e3d39 100644 --- a/jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/MyAuthedConfigurator.java +++ b/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/MyAuthedConfigurator.java @@ -16,7 +16,7 @@ // ======================================================================== // -package org.eclipse.jetty.websocket.javax.server.examples; +package org.eclipse.jetty.websocket.javax.tests.server.examples; import java.security.Principal; import javax.websocket.HandshakeResponse; diff --git a/jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/MyAuthedSocket.java b/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/MyAuthedSocket.java similarity index 94% rename from jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/MyAuthedSocket.java rename to jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/MyAuthedSocket.java index a2b6396d19e..cf3b8f10266 100644 --- a/jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/MyAuthedSocket.java +++ b/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/MyAuthedSocket.java @@ -16,7 +16,7 @@ // ======================================================================== // -package org.eclipse.jetty.websocket.javax.server.examples; +package org.eclipse.jetty.websocket.javax.tests.server.examples; import javax.websocket.OnMessage; import javax.websocket.server.ServerEndpoint; diff --git a/jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/StreamingEchoSocket.java b/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/StreamingEchoSocket.java similarity index 95% rename from jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/StreamingEchoSocket.java rename to jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/StreamingEchoSocket.java index d5d86e451ec..4631a2a74cc 100644 --- a/jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/StreamingEchoSocket.java +++ b/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/StreamingEchoSocket.java @@ -16,7 +16,7 @@ // ======================================================================== // -package org.eclipse.jetty.websocket.javax.server.examples; +package org.eclipse.jetty.websocket.javax.tests.server.examples; import java.io.IOException; import java.io.Reader; diff --git a/jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/WebSocketServerExamplesTest.java b/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/WebSocketServerExamplesTest.java similarity index 99% rename from jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/WebSocketServerExamplesTest.java rename to jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/WebSocketServerExamplesTest.java index 22c96ca9772..0bdb21ba5e4 100644 --- a/jetty-websocket/websocket-javax-server/src/test/java/org/eclipse/jetty/websocket/javax/server/examples/WebSocketServerExamplesTest.java +++ b/jetty-websocket/websocket-javax-tests/src/test/java/org/eclipse/jetty/websocket/javax/tests/server/examples/WebSocketServerExamplesTest.java @@ -16,7 +16,7 @@ // ======================================================================== // -package org.eclipse.jetty.websocket.javax.server.examples; +package org.eclipse.jetty.websocket.javax.tests.server.examples; import java.net.URI; import java.util.concurrent.ArrayBlockingQueue; diff --git a/jetty-websocket/websocket-javax-server/src/test/resources/jetty-websocket-httpclient.xml b/jetty-websocket/websocket-javax-tests/src/test/resources/jetty-websocket-httpclient.xml similarity index 100% rename from jetty-websocket/websocket-javax-server/src/test/resources/jetty-websocket-httpclient.xml rename to jetty-websocket/websocket-javax-tests/src/test/resources/jetty-websocket-httpclient.xml diff --git a/jetty-websocket/websocket-util/src/main/java/org/eclipse/jetty/websocket/util/InvokerUtils.java b/jetty-websocket/websocket-util/src/main/java/org/eclipse/jetty/websocket/util/InvokerUtils.java index c09827cc608..8a3bc181b80 100644 --- a/jetty-websocket/websocket-util/src/main/java/org/eclipse/jetty/websocket/util/InvokerUtils.java +++ b/jetty-websocket/websocket-util/src/main/java/org/eclipse/jetty/websocket/util/InvokerUtils.java @@ -26,6 +26,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class InvokerUtils { public static class Arg @@ -135,6 +138,7 @@ public class InvokerUtils } public static final ParamIdentifier PARAM_IDENTITY = new ParamIdentity(); + private static final Logger LOG = LoggerFactory.getLogger(InvokerUtils.class); /** * Bind optional arguments to provided method handle @@ -425,6 +429,8 @@ public class InvokerUtils { if (!throwOnFailure) { + if (LOG.isDebugEnabled()) + LOG.debug("Unable to obtain MethodHandle for " + method, e); return null; } diff --git a/pom.xml b/pom.xml index 57a5c04740f..619a2f271fa 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ -Dfile.encoding=UTF-8 -Duser.language=en -Duser.region=US -showversion -Xmx2g -Xms2g -Xlog:gc:stderr:time,level,tags - 3.0.0-M4 + 3.0.0-M5 3.8.1 3.1.1 3.1.0 From bffd6a2c0ff4aa72e3dbbd845ec3ed522bff7f35 Mon Sep 17 00:00:00 2001 From: Oleg Mozzhechkov Date: Thu, 13 Aug 2020 16:34:06 +0300 Subject: [PATCH 04/17] #5150 - Infinite connection timeout support in ManagedSelector Signed-off-by: Oleg Mozzhechkov --- .../main/java/org/eclipse/jetty/io/ManagedSelector.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java index 960ccc66717..e57d74e002b 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java @@ -888,7 +888,11 @@ public class ManagedSelector extends ContainerLifeCycle implements Dumpable { this.channel = channel; this.attachment = attachment; - this.timeout = ManagedSelector.this._selectorManager.getScheduler().schedule(this, ManagedSelector.this._selectorManager.getConnectTimeout(), TimeUnit.MILLISECONDS); + final long timeout = ManagedSelector.this._selectorManager.getConnectTimeout(); + if (timeout > 0) + this.timeout = ManagedSelector.this._selectorManager.getScheduler().schedule(this, timeout, TimeUnit.MILLISECONDS); + else + this.timeout = null; } @Override @@ -919,7 +923,8 @@ public class ManagedSelector extends ContainerLifeCycle implements Dumpable { if (failed.compareAndSet(false, true)) { - timeout.cancel(); + if (timeout != null) + timeout.cancel(); IO.close(channel); ManagedSelector.this._selectorManager.connectionFailed(channel, failure, attachment); } From 51d078004155a134149e28679385ebe95abbd20b Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Thu, 13 Aug 2020 18:23:26 +0200 Subject: [PATCH 05/17] Issue #5104 - AbstractProxyServlet include incorrect protocol version in Via header when accessed over H2. Fixed HttpFields.computeField() removal loop. Signed-off-by: Simone Bordet --- .../src/main/java/org/eclipse/jetty/http/HttpFields.java | 2 +- .../test/java/org/eclipse/jetty/http/HttpFieldsTest.java | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java index e436ded5d34..7836badc60b 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java @@ -218,7 +218,7 @@ public class HttpFields implements Iterable } // Remember and remove additional fields found.add(f); - remove(i); + remove(i--); } } diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldsTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldsTest.java index 2e1978d125e..c9fe4adcb90 100644 --- a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldsTest.java +++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldsTest.java @@ -885,11 +885,12 @@ public class HttpFieldsTest header.add(new HttpField("After", "value")); assertThat(header.stream().map(HttpField::toString).collect(Collectors.toList()), contains("Before: value", "Test: one", "After: value")); - header.add(new HttpField("Test", "extra")); - assertThat(header.stream().map(HttpField::toString).collect(Collectors.toList()), contains("Before: value", "Test: one", "After: value", "Test: extra")); + header.add(new HttpField("Test", "two")); + header.add(new HttpField("Test", "three")); + assertThat(header.stream().map(HttpField::toString).collect(Collectors.toList()), contains("Before: value", "Test: one", "After: value", "Test: two", "Test: three")); header.computeField("Test", (n, f) -> new HttpField("TEST", "count=" + f.size())); - assertThat(header.stream().map(HttpField::toString).collect(Collectors.toList()), contains("Before: value", "TEST: count=2", "After: value")); + assertThat(header.stream().map(HttpField::toString).collect(Collectors.toList()), contains("Before: value", "TEST: count=3", "After: value")); header.computeField("TEST", (n, f) -> null); assertThat(header.stream().map(HttpField::toString).collect(Collectors.toList()), contains("Before: value", "After: value")); From edbc1930b9715e690d4597e240ae042561f0b03d Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Thu, 13 Aug 2020 19:39:27 +0200 Subject: [PATCH 06/17] Issue #4809 - Set a max number of requests per connection. Added test case for idle connections not used for any request. Signed-off-by: Simone Bordet --- .../jetty/client/ConnectionPoolTest.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/ConnectionPoolTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/ConnectionPoolTest.java index b040c134df1..56d13899941 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/ConnectionPoolTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/ConnectionPoolTest.java @@ -387,6 +387,38 @@ public class ConnectionPoolTest assertEquals(0, connectionPool.getConnectionCount()); } + @ParameterizedTest + @MethodSource("pools") + public void testIdleTimeoutNoRequests(ConnectionPoolFactory factory) throws Exception + { + startServer(new EmptyServerHandler()); + startClient(destination -> + { + try + { + ConnectionPool connectionPool = factory.factory.newConnectionPool(destination); + connectionPool.preCreateConnections(1).get(); + return connectionPool; + } + catch (Exception x) + { + throw new RuntimeException(x); + } + }); + long idleTimeout = 1000; + client.setIdleTimeout(idleTimeout); + + // Trigger the creation of a destination, that will create the connection pool. + HttpDestination destination = client.resolveDestination(new Origin("http", "localhost", connector.getLocalPort())); + AbstractConnectionPool connectionPool = (AbstractConnectionPool)destination.getConnectionPool(); + assertEquals(1, connectionPool.getConnectionCount()); + + // Wait for the pre-created connections to idle timeout. + Thread.sleep(idleTimeout + idleTimeout / 2); + + assertEquals(0, connectionPool.getConnectionCount()); + } + private static class ConnectionPoolFactory { private final String name; From 32fe19a5e090c0ee46e112fc2a48a9bf48c3d529 Mon Sep 17 00:00:00 2001 From: Oleg Mozzhechkov Date: Thu, 13 Aug 2020 21:15:30 +0300 Subject: [PATCH 07/17] #5150 - Code style fix and connect timeout docs update Signed-off-by: Oleg Mozzhechkov --- .../src/main/java/org/eclipse/jetty/client/HttpClient.java | 4 ++-- .../src/main/java/org/eclipse/jetty/io/ManagedSelector.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java index 7a5903a46ee..942bf7a683e 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java @@ -690,7 +690,7 @@ public class HttpClient extends ContainerLifeCycle } /** - * @return the max time, in milliseconds, a connection can take to connect to destinations + * @return the max time, in milliseconds, a connection can take to connect to destinations. Zero value means infinite timeout. */ @ManagedAttribute("The timeout, in milliseconds, for connect() operations") public long getConnectTimeout() @@ -699,7 +699,7 @@ public class HttpClient extends ContainerLifeCycle } /** - * @param connectTimeout the max time, in milliseconds, a connection can take to connect to destinations + * @param connectTimeout the max time, in milliseconds, a connection can take to connect to destinations. Zero value means infinite timeout. * @see java.net.Socket#connect(SocketAddress, int) */ public void setConnectTimeout(long connectTimeout) diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java index e57d74e002b..9ba92720b73 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java @@ -888,7 +888,7 @@ public class ManagedSelector extends ContainerLifeCycle implements Dumpable { this.channel = channel; this.attachment = attachment; - final long timeout = ManagedSelector.this._selectorManager.getConnectTimeout(); + long timeout = ManagedSelector.this._selectorManager.getConnectTimeout(); if (timeout > 0) this.timeout = ManagedSelector.this._selectorManager.getScheduler().schedule(this, timeout, TimeUnit.MILLISECONDS); else From 1663a6d7af9d85390fef6deb6d15cd7bce30263e Mon Sep 17 00:00:00 2001 From: Lachlan Roberts Date: Fri, 14 Aug 2020 15:19:06 +1000 Subject: [PATCH 08/17] Issue #5125 - Generalise WebSocketConnectionStatistics into IncludeExcludeConnectionStatistics Signed-off-by: Lachlan Roberts --- .../IncludeExcludeConnectionStatistics.java | 114 ++++++++++++++++++ .../websocket/tests/WebSocketStatsTest.java | 12 +- .../util/WebSocketConnectionStatistics.java | 40 ------ 3 files changed, 121 insertions(+), 45 deletions(-) create mode 100644 jetty-io/src/main/java/org/eclipse/jetty/io/IncludeExcludeConnectionStatistics.java delete mode 100644 jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/WebSocketConnectionStatistics.java diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/IncludeExcludeConnectionStatistics.java b/jetty-io/src/main/java/org/eclipse/jetty/io/IncludeExcludeConnectionStatistics.java new file mode 100644 index 00000000000..69c51178cb7 --- /dev/null +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/IncludeExcludeConnectionStatistics.java @@ -0,0 +1,114 @@ +// +// ======================================================================== +// Copyright (c) 1995-2020 Mort Bay Consulting Pty Ltd and others. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.io; + +import java.util.AbstractSet; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.function.Predicate; + +import org.eclipse.jetty.util.IncludeExcludeSet; + +public class IncludeExcludeConnectionStatistics extends ConnectionStatistics +{ + private final IncludeExcludeSet, Connection> _set = new IncludeExcludeSet<>(ConnectionSet.class); + + public void include(String className) throws ClassNotFoundException + { + _set.include(connectionForName(className)); + } + + public void include(Class clazz) + { + _set.include(clazz); + } + + public void exclude(String className) throws ClassNotFoundException + { + _set.exclude(connectionForName(className)); + } + + public void exclude(Class clazz) + { + _set.exclude(clazz); + } + + private Class connectionForName(String className) throws ClassNotFoundException + { + Class aClass = Class.forName(className); + if (!Connection.class.isAssignableFrom(aClass)) + throw new IllegalArgumentException("Class is not a Connection"); + + @SuppressWarnings("unchecked") + Class connectionClass = (Class)aClass; + return connectionClass; + } + + @Override + public void onOpened(Connection connection) + { + if (Boolean.TRUE.equals(_set.isIncludedAndNotExcluded(connection))) + super.onOpened(connection); + } + + @Override + public void onClosed(Connection connection) + { + if (Boolean.TRUE.equals(_set.isIncludedAndNotExcluded(connection))) + super.onClosed(connection); + } + + public static class ConnectionSet extends AbstractSet> implements Predicate + { + private final Set> set = new HashSet<>(); + + @Override + public boolean add(Class aClass) + { + return set.add(aClass); + } + + @Override + public boolean remove(Object o) + { + return set.remove(o); + } + + @Override + public Iterator> iterator() + { + return set.iterator(); + } + + @Override + public int size() + { + return set.size(); + } + + @Override + public boolean test(Connection connection) + { + if (connection == null) + return false; + return set.stream().anyMatch(c -> c.isAssignableFrom(connection.getClass())); + } + } +} diff --git a/jetty-websocket/jetty-websocket-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java b/jetty-websocket/jetty-websocket-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java index 01a4c5f8dc5..e8c96b36f32 100644 --- a/jetty-websocket/jetty-websocket-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java +++ b/jetty-websocket/jetty-websocket-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java @@ -27,7 +27,7 @@ import java.util.concurrent.TimeUnit; import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.Connection; -import org.eclipse.jetty.io.ConnectionStatistics; +import org.eclipse.jetty.io.IncludeExcludeConnectionStatistics; import org.eclipse.jetty.io.MappedByteBufferPool; import org.eclipse.jetty.jmx.MBeanContainer; import org.eclipse.jetty.server.Server; @@ -42,7 +42,6 @@ import org.eclipse.jetty.websocket.common.Generator; import org.eclipse.jetty.websocket.common.WebSocketFrame; import org.eclipse.jetty.websocket.common.frames.TextFrame; import org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection; -import org.eclipse.jetty.websocket.common.util.WebSocketConnectionStatistics; import org.eclipse.jetty.websocket.server.NativeWebSocketServletContainerInitializer; import org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter; import org.junit.jupiter.api.AfterEach; @@ -59,17 +58,19 @@ public class WebSocketStatsTest private Server server; private ServerConnector connector; private WebSocketClient client; - private ConnectionStatistics statistics; + private IncludeExcludeConnectionStatistics statistics; @BeforeEach public void start() throws Exception { - statistics = new WebSocketConnectionStatistics() + statistics = new IncludeExcludeConnectionStatistics(); + statistics.include(AbstractWebSocketConnection.class); + + Connection.Listener.Adapter wsCloseListener = new Connection.Listener.Adapter() { @Override public void onClosed(Connection connection) { - super.onClosed(connection); if (connection instanceof AbstractWebSocketConnection) wsConnectionClosed.countDown(); } @@ -78,6 +79,7 @@ public class WebSocketStatsTest server = new Server(); connector = new ServerConnector(server); connector.addBean(statistics); + connector.addBean(wsCloseListener); server.addConnector(connector); ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/WebSocketConnectionStatistics.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/WebSocketConnectionStatistics.java deleted file mode 100644 index c42edba546e..00000000000 --- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/WebSocketConnectionStatistics.java +++ /dev/null @@ -1,40 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2020 Mort Bay Consulting Pty Ltd and others. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.eclipse.jetty.websocket.common.util; - -import org.eclipse.jetty.io.Connection; -import org.eclipse.jetty.io.ConnectionStatistics; -import org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection; - -public class WebSocketConnectionStatistics extends ConnectionStatistics -{ - @Override - public void onOpened(Connection connection) - { - if (connection instanceof AbstractWebSocketConnection) - super.onOpened(connection); - } - - @Override - public void onClosed(Connection connection) - { - if (connection instanceof AbstractWebSocketConnection) - super.onClosed(connection); - } -} From 2d9fcf20ea6ce4bb989783a0261b9b691eb4897f Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Sat, 15 Aug 2020 10:32:01 +1000 Subject: [PATCH 09/17] upgrade some maven plugins version (#5143) Signed-off-by: olivier lamy --- pom.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 7ae1f7183f7..ee4c1e21248 100644 --- a/pom.xml +++ b/pom.xml @@ -46,13 +46,13 @@ 3.0.0-M5 3.8.1 - 3.1.1 - 3.1.0 - 3.0.1 - 3.3.0 + 3.1.2 + 3.2.0 + 3.2.1 + 3.3.1 3.5.2 - 2.5.2 - 2.8.2 + 3.0.0-M1 + 3.0.0-M1 false From 74a16382ab51f3598b9d8b65362eb1b408ef5d4c Mon Sep 17 00:00:00 2001 From: sullis Date: Fri, 14 Aug 2020 18:17:24 -0700 Subject: [PATCH 10/17] enable Dependabot v2 (#5077) Signed-off-by: Sean C. Sullivan --- .github/dependabot.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..b76b8957033 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: "maven" + directory: "/" + schedule: + interval: "daily" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" From c37d902ef7fe9b0095ff775b1885abec3e4a4999 Mon Sep 17 00:00:00 2001 From: Lachlan Roberts Date: Tue, 18 Aug 2020 10:18:44 +1000 Subject: [PATCH 11/17] remove tri-state logic from IncludeExcludeConnectionStatistics Signed-off-by: Lachlan Roberts --- .../eclipse/jetty/io/IncludeExcludeConnectionStatistics.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/IncludeExcludeConnectionStatistics.java b/jetty-io/src/main/java/org/eclipse/jetty/io/IncludeExcludeConnectionStatistics.java index 69c51178cb7..364a48726cf 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/IncludeExcludeConnectionStatistics.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/IncludeExcludeConnectionStatistics.java @@ -64,14 +64,14 @@ public class IncludeExcludeConnectionStatistics extends ConnectionStatistics @Override public void onOpened(Connection connection) { - if (Boolean.TRUE.equals(_set.isIncludedAndNotExcluded(connection))) + if (_set.test(connection)) super.onOpened(connection); } @Override public void onClosed(Connection connection) { - if (Boolean.TRUE.equals(_set.isIncludedAndNotExcluded(connection))) + if (_set.test(connection)) super.onClosed(connection); } From 084db1916bee8930158a4e884cf0fd05390220c4 Mon Sep 17 00:00:00 2001 From: olivier lamy Date: Tue, 18 Aug 2020 14:07:05 +0800 Subject: [PATCH 12/17] let do this weekly only Signed-off-by: olivier lamy --- .github/dependabot.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index b76b8957033..e1d1cc748c6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,8 +3,8 @@ updates: - package-ecosystem: "maven" directory: "/" schedule: - interval: "daily" + interval: "weekly" - package-ecosystem: "github-actions" directory: "/" schedule: - interval: "daily" + interval: "weekly" From ff3ebeff543d66c8e2dfcd09d874b211529ce7dd Mon Sep 17 00:00:00 2001 From: olivier lamy Date: Tue, 18 Aug 2020 14:08:28 +0800 Subject: [PATCH 13/17] add dependabot for 9.4.x branch Signed-off-by: olivier lamy --- .github/dependabot.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..e1d1cc748c6 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: "maven" + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" From 0646e4d0b5138fc02cc3af8c04ad4c499c70e0a3 Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Tue, 18 Aug 2020 10:31:36 +0200 Subject: [PATCH 14/17] Fixes #5165 - Wrong messagesIn count for HttpClient. Now incrementing inMessages only when the response is complete. Signed-off-by: Simone Bordet --- .../jetty/client/http/HttpChannelOverHTTP.java | 4 +--- .../jetty/client/http/HttpReceiverOverHTTP.java | 11 ++++++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java index fa358b0d037..3d6904b1488 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java @@ -40,7 +40,6 @@ public class HttpChannelOverHTTP extends HttpChannel private final HttpConnectionOverHTTP connection; private final HttpSenderOverHTTP sender; private final HttpReceiverOverHTTP receiver; - private final LongAdder inMessages = new LongAdder(); private final LongAdder outMessages = new LongAdder(); public HttpChannelOverHTTP(HttpConnectionOverHTTP connection) @@ -129,7 +128,6 @@ public class HttpChannelOverHTTP extends HttpChannel public void receive() { - inMessages.increment(); receiver.receive(); } @@ -185,7 +183,7 @@ public class HttpChannelOverHTTP extends HttpChannel protected long getMessagesIn() { - return inMessages.longValue(); + return receiver.getMessagesIn(); } protected long getMessagesOut() diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java index e5bf9eec51b..b6350461cd2 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java @@ -20,6 +20,7 @@ package org.eclipse.jetty.client.http; import java.io.EOFException; import java.nio.ByteBuffer; +import java.util.concurrent.atomic.LongAdder; import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.HttpExchange; @@ -40,6 +41,7 @@ import org.eclipse.jetty.util.Callback; public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.ResponseHandler { + private final LongAdder inMessages = new LongAdder(); private final HttpParser parser; private RetainableByteBuffer networkBuffer; private boolean shutdown; @@ -333,9 +335,11 @@ public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.Res return false; int status = exchange.getResponse().getStatus(); - if (status != HttpStatus.CONTINUE_100) + { + inMessages.increment(); complete = true; + } return !responseSuccess(exchange); } @@ -376,6 +380,11 @@ public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.Res getHttpConnection().close(failure); } + long getMessagesIn() + { + return inMessages.longValue(); + } + @Override public String toString() { From 7d6f692721785c22d9a685d8b41ddb30fae7f618 Mon Sep 17 00:00:00 2001 From: Lachlan Roberts Date: Wed, 19 Aug 2020 09:32:54 +1000 Subject: [PATCH 15/17] disable autoFragment for WebSocketStatsTest Signed-off-by: Lachlan Roberts --- .../jetty/websocket/tests/WebSocketStatsTest.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/jetty-websocket/websocket-jetty-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java b/jetty-websocket/websocket-jetty-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java index 8dc8182e899..4b6ff1fa303 100644 --- a/jetty-websocket/websocket-jetty-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java +++ b/jetty-websocket/websocket-jetty-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java @@ -42,7 +42,6 @@ import org.eclipse.jetty.websocket.core.internal.WebSocketConnection; import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import static org.hamcrest.MatcherAssert.assertThat; @@ -80,13 +79,17 @@ public class WebSocketStatsTest server.addConnector(connector); ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); + server.setHandler(contextHandler); contextHandler.setContextPath("/"); JettyWebSocketServletContainerInitializer.configure(contextHandler, (context, container) -> - container.addMapping("/", EchoSocket.class)); - server.setHandler(contextHandler); + { + container.setAutoFragment(false); + container.addMapping("/", EchoSocket.class); + }); JettyWebSocketServletContainerInitializer.configure(contextHandler, null); client = new WebSocketClient(); + client.setAutoFragment(false); // Setup JMX. MBeanContainer mbeanContainer = new MBeanContainer(ManagementFactory.getPlatformMBeanServer()); @@ -111,7 +114,6 @@ public class WebSocketStatsTest return headerBuffer.remaining() + frame.getPayloadLength(); } - @Disabled("off by 2 some of the time for large num of messages") @Test public void echoStatsTest() throws Exception { From 37a8e443477d1083b9e195dc7ef09a615dea0653 Mon Sep 17 00:00:00 2001 From: Lachlan Roberts Date: Wed, 19 Aug 2020 08:17:38 +1000 Subject: [PATCH 16/17] fix WebSocketStatsTest numMessages back to 1000 Remove server getConnections check after client open event as the server connection may not be open yet. Signed-off-by: Lachlan Roberts --- .../org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jetty-websocket/jetty-websocket-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java b/jetty-websocket/jetty-websocket-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java index e8c96b36f32..da0741c55b9 100644 --- a/jetty-websocket/jetty-websocket-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java +++ b/jetty-websocket/jetty-websocket-tests/src/test/java/org/eclipse/jetty/websocket/tests/WebSocketStatsTest.java @@ -123,11 +123,10 @@ public class WebSocketStatsTest EventSocket socket = new EventSocket(); Future connect = client.connect(socket, uri); - final long numMessages = 1; + final long numMessages = 1000; final String msgText = "hello world"; try (Session session = connect.get(5, TimeUnit.SECONDS)) { - assertThat(statistics.getConnections(), is(1L)); for (int i = 0; i < numMessages; i++) { session.getRemote().sendString(msgText); From a196f9636a1a31e1f5cee86d15853c73de3306f9 Mon Sep 17 00:00:00 2001 From: olivier lamy Date: Thu, 20 Aug 2020 19:33:44 +0800 Subject: [PATCH 17/17] no need to this in the pom for a jar Signed-off-by: olivier lamy --- jetty-nosql/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/jetty-nosql/pom.xml b/jetty-nosql/pom.xml index af03a0f479c..cb720639c2b 100644 --- a/jetty-nosql/pom.xml +++ b/jetty-nosql/pom.xml @@ -31,7 +31,6 @@ org.mongodb mongo-java-driver 2.13.2 - jar compile