From bee564c7d942447f02e8d87a2ea5fe30e651a59c Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Thu, 25 Feb 2016 10:28:00 -0700 Subject: [PATCH 01/15] Updating to version 9.3.8.RC0 --- VERSION.txt | 43 ++++++++++++++++++- aggregates/jetty-all-compact3/pom.xml | 2 +- aggregates/jetty-all/pom.xml | 2 +- apache-jsp/pom.xml | 2 +- apache-jstl/pom.xml | 2 +- examples/async-rest/async-rest-jar/pom.xml | 2 +- examples/async-rest/async-rest-webapp/pom.xml | 2 +- examples/async-rest/pom.xml | 2 +- examples/embedded/pom.xml | 2 +- examples/pom.xml | 2 +- jetty-alpn/jetty-alpn-client/pom.xml | 2 +- jetty-alpn/jetty-alpn-server/pom.xml | 2 +- jetty-alpn/pom.xml | 2 +- jetty-annotations/pom.xml | 2 +- jetty-ant/pom.xml | 2 +- jetty-cdi/cdi-core/pom.xml | 2 +- jetty-cdi/cdi-full-servlet/pom.xml | 2 +- jetty-cdi/cdi-servlet/pom.xml | 2 +- jetty-cdi/cdi-websocket/pom.xml | 2 +- jetty-cdi/pom.xml | 2 +- jetty-cdi/test-cdi-webapp/pom.xml | 2 +- jetty-client/pom.xml | 2 +- jetty-continuation/pom.xml | 2 +- jetty-deploy/pom.xml | 2 +- jetty-distribution/pom.xml | 2 +- jetty-fcgi/fcgi-client/pom.xml | 2 +- jetty-fcgi/fcgi-server/pom.xml | 2 +- jetty-fcgi/pom.xml | 2 +- .../jetty-gcloud-session-manager/pom.xml | 2 +- jetty-gcloud/pom.xml | 2 +- jetty-http-spi/pom.xml | 2 +- jetty-http/pom.xml | 2 +- jetty-http2/http2-alpn-tests/pom.xml | 2 +- jetty-http2/http2-client/pom.xml | 2 +- jetty-http2/http2-common/pom.xml | 2 +- jetty-http2/http2-hpack/pom.xml | 2 +- .../http2-http-client-transport/pom.xml | 2 +- jetty-http2/http2-server/pom.xml | 2 +- jetty-http2/pom.xml | 2 +- jetty-infinispan/pom.xml | 2 +- jetty-io/pom.xml | 2 +- jetty-jaas/pom.xml | 2 +- jetty-jaspi/pom.xml | 2 +- jetty-jmx/pom.xml | 2 +- jetty-jndi/pom.xml | 2 +- jetty-jspc-maven-plugin/pom.xml | 2 +- jetty-maven-plugin/pom.xml | 2 +- jetty-monitor/pom.xml | 2 +- jetty-nosql/pom.xml | 2 +- jetty-osgi/jetty-osgi-alpn/pom.xml | 2 +- jetty-osgi/jetty-osgi-boot-jsp/pom.xml | 2 +- jetty-osgi/jetty-osgi-boot-warurl/pom.xml | 2 +- jetty-osgi/jetty-osgi-boot/pom.xml | 2 +- jetty-osgi/jetty-osgi-httpservice/pom.xml | 2 +- jetty-osgi/pom.xml | 2 +- jetty-osgi/test-jetty-osgi-context/pom.xml | 2 +- jetty-osgi/test-jetty-osgi-webapp/pom.xml | 2 +- jetty-osgi/test-jetty-osgi/pom.xml | 2 +- jetty-plus/pom.xml | 2 +- jetty-proxy/pom.xml | 2 +- jetty-quickstart/pom.xml | 2 +- jetty-rewrite/pom.xml | 2 +- jetty-runner/pom.xml | 2 +- jetty-security/pom.xml | 2 +- jetty-server/pom.xml | 2 +- jetty-servlet/pom.xml | 2 +- jetty-servlets/pom.xml | 2 +- jetty-spring/pom.xml | 2 +- jetty-start/pom.xml | 2 +- jetty-util-ajax/pom.xml | 2 +- jetty-util/pom.xml | 2 +- jetty-webapp/pom.xml | 2 +- .../javax-websocket-client-impl/pom.xml | 2 +- .../javax-websocket-server-impl/pom.xml | 2 +- jetty-websocket/pom.xml | 2 +- jetty-websocket/websocket-api/pom.xml | 2 +- jetty-websocket/websocket-client/pom.xml | 2 +- jetty-websocket/websocket-common/pom.xml | 2 +- jetty-websocket/websocket-server/pom.xml | 2 +- jetty-websocket/websocket-servlet/pom.xml | 2 +- jetty-xml/pom.xml | 2 +- pom.xml | 2 +- tests/pom.xml | 2 +- tests/test-continuation/pom.xml | 2 +- tests/test-http-client-transport/pom.xml | 2 +- tests/test-integration/pom.xml | 2 +- tests/test-jmx/jmx-webapp-it/pom.xml | 2 +- tests/test-jmx/jmx-webapp/pom.xml | 2 +- tests/test-jmx/pom.xml | 2 +- tests/test-loginservice/pom.xml | 2 +- tests/test-quickstart/pom.xml | 2 +- tests/test-sessions/pom.xml | 2 +- .../test-gcloud-sessions/pom.xml | 2 +- .../test-sessions/test-hash-sessions/pom.xml | 2 +- .../test-infinispan-sessions/pom.xml | 2 +- .../test-sessions/test-jdbc-sessions/pom.xml | 2 +- .../test-mongodb-sessions/pom.xml | 2 +- .../test-sessions-common/pom.xml | 2 +- tests/test-webapps/pom.xml | 2 +- tests/test-webapps/test-jaas-webapp/pom.xml | 2 +- tests/test-webapps/test-jetty-webapp/pom.xml | 2 +- tests/test-webapps/test-jndi-webapp/pom.xml | 2 +- .../test-webapps/test-mock-resources/pom.xml | 2 +- tests/test-webapps/test-proxy-webapp/pom.xml | 2 +- tests/test-webapps/test-servlet-spec/pom.xml | 2 +- .../test-container-initializer/pom.xml | 2 +- .../test-spec-webapp/pom.xml | 2 +- .../test-web-fragment/pom.xml | 2 +- .../test-webapps/test-webapp-rfc2616/pom.xml | 2 +- 109 files changed, 150 insertions(+), 109 deletions(-) diff --git a/VERSION.txt b/VERSION.txt index 252d0a85a45..3ca261fae51 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1,4 +1,45 @@ -jetty-9.3.8-SNAPSHOT +jetty-9.3.8.RC0 - 25 February 2016 + + 81 Exception not always thrown in Jetty to application when upload part is + too big + + 82 Request.getPart() that results in Exception still allows other parts to + be fetched + + 251 Removing SSLEngine.beginHandshake() calls + + 285 PathContentProvider - Use of Direct buffers without pooling + + 298 qtp threads spin-locked in MBeanContainer.beanAdded + + 342 Reintroducing Response parameter to logExtended + + 344 init script does not properly display status of a non running service + + 346 HttpParser RFC2616 Compliance mode + + 347 Avoid sending request using a connection that is idle timing out + + 352 Integrate session idling for MongoSessionManager + + 354 Spin loop in case of exception thrown during accept() + + 355 Improve close behaviour + + 478918 Change javax.servlet.error,forward,include literals to + RequestDispatcher constants + + 484446 InputStreamResponseListener's InputStream uses default read (3) and + blocks early on never-ending response. + + 485306 HttpParser (HttpURI) mistaking basic auth password as a port number + + 485469 permessage-deflate extension causes protocol error in Firefox/Chrome + + 486394 Restore MultiPartFilter behavior with regards to temp file access + + 486497 NPE in MappedLoginService + + 486511 Server.getURI() returns wrong scheme on SSL/HTTPS + + 486530 Handler added to WebAppContext prevents ServletContext initialization + + 486589 HttpRequest has a wrong HTTP Version in HTTP/2. + + 486604 Add debug logging of ErrorPageErrorHandler logic + + 486674 Quickstart path attribute normalization should be based on longest + path match + + 486829 Cancel stream error after a failed request with the HTTP/2.0 client. + + 486877 Google Chrome flagging 'obsolete cipher suite' in Jetty and will soon + issue broken padlock + + 486930 Selector does not correctly handle rejected execution exception + + 487158 Switched SCM URIs to github + + 487197 Deflater/Inflater memory leak with WebSocket permessage-deflate + extension + + 487198 ContextScopeListener should be called on context start and stop + + 487277 Introduce http-forwarded module for X-Forwarded support + + 487354 Aborted request or response does not send RST_STREAM frame. + + 487511 Jetty HTTP won't work on turkish systems. + + 487714 Avoid NPE in close race for async write + + 487750 HTTP/2 push must not be recursive. jetty-9.3.7.v20160115 - 15 January 2016 + 471171 Support SYNC_FLUSH in GzipHandler diff --git a/aggregates/jetty-all-compact3/pom.xml b/aggregates/jetty-all-compact3/pom.xml index 1af2650c12c..4592018cfb6 100644 --- a/aggregates/jetty-all-compact3/pom.xml +++ b/aggregates/jetty-all-compact3/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 ../../pom.xml 4.0.0 diff --git a/aggregates/jetty-all/pom.xml b/aggregates/jetty-all/pom.xml index 1c938a11937..1e429c9d677 100644 --- a/aggregates/jetty-all/pom.xml +++ b/aggregates/jetty-all/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 ../../pom.xml 4.0.0 diff --git a/apache-jsp/pom.xml b/apache-jsp/pom.xml index bd7e796b0e1..0cfebf02fd8 100644 --- a/apache-jsp/pom.xml +++ b/apache-jsp/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 apache-jsp diff --git a/apache-jstl/pom.xml b/apache-jstl/pom.xml index 8813af16170..1d0fcbd62e4 100644 --- a/apache-jstl/pom.xml +++ b/apache-jstl/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 apache-jstl diff --git a/examples/async-rest/async-rest-jar/pom.xml b/examples/async-rest/async-rest-jar/pom.xml index 72bf17a6b93..d3bd17bb306 100644 --- a/examples/async-rest/async-rest-jar/pom.xml +++ b/examples/async-rest/async-rest-jar/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty example-async-rest - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 org.eclipse.jetty.example-async-rest diff --git a/examples/async-rest/async-rest-webapp/pom.xml b/examples/async-rest/async-rest-webapp/pom.xml index 863dc9a4125..53cedb57d67 100644 --- a/examples/async-rest/async-rest-webapp/pom.xml +++ b/examples/async-rest/async-rest-webapp/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty example-async-rest - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 org.eclipse.jetty.example-async-rest diff --git a/examples/async-rest/pom.xml b/examples/async-rest/pom.xml index 1daa80af335..e52c574ffd4 100644 --- a/examples/async-rest/pom.xml +++ b/examples/async-rest/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.examples examples-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 ../pom.xml 4.0.0 diff --git a/examples/embedded/pom.xml b/examples/embedded/pom.xml index cc74e1984ae..2ed4223ccbb 100644 --- a/examples/embedded/pom.xml +++ b/examples/embedded/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.examples examples-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 ../pom.xml 4.0.0 diff --git a/examples/pom.xml b/examples/pom.xml index f7d58882b79..c1a1997f9cf 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 ../pom.xml org.eclipse.jetty.examples diff --git a/jetty-alpn/jetty-alpn-client/pom.xml b/jetty-alpn/jetty-alpn-client/pom.xml index 79193a0592a..5826638ead4 100644 --- a/jetty-alpn/jetty-alpn-client/pom.xml +++ b/jetty-alpn/jetty-alpn-client/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-alpn-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-alpn-client diff --git a/jetty-alpn/jetty-alpn-server/pom.xml b/jetty-alpn/jetty-alpn-server/pom.xml index 250efcbe417..741e53ec94a 100644 --- a/jetty-alpn/jetty-alpn-server/pom.xml +++ b/jetty-alpn/jetty-alpn-server/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-alpn-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-alpn-server diff --git a/jetty-alpn/pom.xml b/jetty-alpn/pom.xml index d54ab79572e..327a98c2533 100644 --- a/jetty-alpn/pom.xml +++ b/jetty-alpn/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-alpn-parent diff --git a/jetty-annotations/pom.xml b/jetty-annotations/pom.xml index c57d6bc91b6..0ddddc7c124 100644 --- a/jetty-annotations/pom.xml +++ b/jetty-annotations/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-annotations diff --git a/jetty-ant/pom.xml b/jetty-ant/pom.xml index 5576f54202b..e763d409512 100644 --- a/jetty-ant/pom.xml +++ b/jetty-ant/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-ant diff --git a/jetty-cdi/cdi-core/pom.xml b/jetty-cdi/cdi-core/pom.xml index cd16e027de2..e3d10c90ffe 100644 --- a/jetty-cdi/cdi-core/pom.xml +++ b/jetty-cdi/cdi-core/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.cdi jetty-cdi-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 cdi-core diff --git a/jetty-cdi/cdi-full-servlet/pom.xml b/jetty-cdi/cdi-full-servlet/pom.xml index fead44876ee..e4571d58952 100644 --- a/jetty-cdi/cdi-full-servlet/pom.xml +++ b/jetty-cdi/cdi-full-servlet/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.cdi jetty-cdi-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 cdi-full-servlet diff --git a/jetty-cdi/cdi-servlet/pom.xml b/jetty-cdi/cdi-servlet/pom.xml index 1b05b0d21c5..415788cebd6 100644 --- a/jetty-cdi/cdi-servlet/pom.xml +++ b/jetty-cdi/cdi-servlet/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.cdi jetty-cdi-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 cdi-servlet diff --git a/jetty-cdi/cdi-websocket/pom.xml b/jetty-cdi/cdi-websocket/pom.xml index fd8bfc68ca5..aaaf08e5b71 100644 --- a/jetty-cdi/cdi-websocket/pom.xml +++ b/jetty-cdi/cdi-websocket/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.cdi jetty-cdi-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 cdi-websocket diff --git a/jetty-cdi/pom.xml b/jetty-cdi/pom.xml index eab873b017b..fa8afa40f00 100644 --- a/jetty-cdi/pom.xml +++ b/jetty-cdi/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 org.eclipse.jetty.cdi diff --git a/jetty-cdi/test-cdi-webapp/pom.xml b/jetty-cdi/test-cdi-webapp/pom.xml index 51cd8f19c82..16e0c4663df 100644 --- a/jetty-cdi/test-cdi-webapp/pom.xml +++ b/jetty-cdi/test-cdi-webapp/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jetty.cdi jetty-cdi-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 test-cdi-webapp diff --git a/jetty-client/pom.xml b/jetty-client/pom.xml index f2d2613dc86..769aa8f775f 100644 --- a/jetty-client/pom.xml +++ b/jetty-client/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-continuation/pom.xml b/jetty-continuation/pom.xml index 55860f3dcd8..17b84d82983 100644 --- a/jetty-continuation/pom.xml +++ b/jetty-continuation/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-continuation diff --git a/jetty-deploy/pom.xml b/jetty-deploy/pom.xml index 42c66755628..d033bab224b 100644 --- a/jetty-deploy/pom.xml +++ b/jetty-deploy/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-deploy diff --git a/jetty-distribution/pom.xml b/jetty-distribution/pom.xml index 49770cc5e8e..c6f1760908a 100644 --- a/jetty-distribution/pom.xml +++ b/jetty-distribution/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 jetty-distribution Jetty :: Distribution Assemblies diff --git a/jetty-fcgi/fcgi-client/pom.xml b/jetty-fcgi/fcgi-client/pom.xml index 79b4c0b9638..a5ee170f67a 100644 --- a/jetty-fcgi/fcgi-client/pom.xml +++ b/jetty-fcgi/fcgi-client/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.fcgi fcgi-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-fcgi/fcgi-server/pom.xml b/jetty-fcgi/fcgi-server/pom.xml index b3d1b95ccb5..04cc588bdf3 100644 --- a/jetty-fcgi/fcgi-server/pom.xml +++ b/jetty-fcgi/fcgi-server/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.fcgi fcgi-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-fcgi/pom.xml b/jetty-fcgi/pom.xml index e8b1511a91e..44094e4f0c9 100644 --- a/jetty-fcgi/pom.xml +++ b/jetty-fcgi/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-gcloud/jetty-gcloud-session-manager/pom.xml b/jetty-gcloud/jetty-gcloud-session-manager/pom.xml index 120c85ce1fa..5cb7aa815af 100644 --- a/jetty-gcloud/jetty-gcloud-session-manager/pom.xml +++ b/jetty-gcloud/jetty-gcloud-session-manager/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.gcloud gcloud-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-gcloud/pom.xml b/jetty-gcloud/pom.xml index 770332851ea..4d6f4573a1d 100644 --- a/jetty-gcloud/pom.xml +++ b/jetty-gcloud/pom.xml @@ -3,7 +3,7 @@ jetty-project org.eclipse.jetty - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-http-spi/pom.xml b/jetty-http-spi/pom.xml index f280ccbefbc..6f70472cc64 100644 --- a/jetty-http-spi/pom.xml +++ b/jetty-http-spi/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-http-spi diff --git a/jetty-http/pom.xml b/jetty-http/pom.xml index 4551cfae92e..44f251fd76e 100644 --- a/jetty-http/pom.xml +++ b/jetty-http/pom.xml @@ -3,7 +3,7 @@ jetty-project org.eclipse.jetty - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-http diff --git a/jetty-http2/http2-alpn-tests/pom.xml b/jetty-http2/http2-alpn-tests/pom.xml index b7e8af46add..7cc1e4eb96f 100644 --- a/jetty-http2/http2-alpn-tests/pom.xml +++ b/jetty-http2/http2-alpn-tests/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.http2 http2-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-http2/http2-client/pom.xml b/jetty-http2/http2-client/pom.xml index 9520bea6420..6a5799f07b1 100644 --- a/jetty-http2/http2-client/pom.xml +++ b/jetty-http2/http2-client/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.http2 http2-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-http2/http2-common/pom.xml b/jetty-http2/http2-common/pom.xml index ff849ac0998..608106131ad 100644 --- a/jetty-http2/http2-common/pom.xml +++ b/jetty-http2/http2-common/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.http2 http2-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-http2/http2-hpack/pom.xml b/jetty-http2/http2-hpack/pom.xml index 703caac476f..a60dfbd65fa 100644 --- a/jetty-http2/http2-hpack/pom.xml +++ b/jetty-http2/http2-hpack/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.http2 http2-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-http2/http2-http-client-transport/pom.xml b/jetty-http2/http2-http-client-transport/pom.xml index d2c783ba08c..14b4f2ef3d8 100644 --- a/jetty-http2/http2-http-client-transport/pom.xml +++ b/jetty-http2/http2-http-client-transport/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.http2 http2-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-http2/http2-server/pom.xml b/jetty-http2/http2-server/pom.xml index 69e90ec24de..dcc6ae1ca9c 100644 --- a/jetty-http2/http2-server/pom.xml +++ b/jetty-http2/http2-server/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.http2 http2-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-http2/pom.xml b/jetty-http2/pom.xml index 71c050c5fe8..37d88814803 100644 --- a/jetty-http2/pom.xml +++ b/jetty-http2/pom.xml @@ -3,7 +3,7 @@ jetty-project org.eclipse.jetty - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-infinispan/pom.xml b/jetty-infinispan/pom.xml index 28d8249e407..788550f032e 100644 --- a/jetty-infinispan/pom.xml +++ b/jetty-infinispan/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-infinispan diff --git a/jetty-io/pom.xml b/jetty-io/pom.xml index a8c86346edc..a8eb1af84c3 100644 --- a/jetty-io/pom.xml +++ b/jetty-io/pom.xml @@ -2,7 +2,7 @@ jetty-project org.eclipse.jetty - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-io diff --git a/jetty-jaas/pom.xml b/jetty-jaas/pom.xml index 5b579a02368..10ad7fb12bc 100644 --- a/jetty-jaas/pom.xml +++ b/jetty-jaas/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-jaas diff --git a/jetty-jaspi/pom.xml b/jetty-jaspi/pom.xml index 7a2bb5e94e1..174ae197293 100644 --- a/jetty-jaspi/pom.xml +++ b/jetty-jaspi/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-jaspi diff --git a/jetty-jmx/pom.xml b/jetty-jmx/pom.xml index 5b736beff4f..1d51f6402e7 100644 --- a/jetty-jmx/pom.xml +++ b/jetty-jmx/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-jmx diff --git a/jetty-jndi/pom.xml b/jetty-jndi/pom.xml index 2d4855dfae1..1b0afc33602 100644 --- a/jetty-jndi/pom.xml +++ b/jetty-jndi/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-jndi diff --git a/jetty-jspc-maven-plugin/pom.xml b/jetty-jspc-maven-plugin/pom.xml index ee7a6acef4c..d8e8a7d3538 100644 --- a/jetty-jspc-maven-plugin/pom.xml +++ b/jetty-jspc-maven-plugin/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-jspc-maven-plugin diff --git a/jetty-maven-plugin/pom.xml b/jetty-maven-plugin/pom.xml index 5bf2bfcea7e..bc80c3049ca 100644 --- a/jetty-maven-plugin/pom.xml +++ b/jetty-maven-plugin/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-maven-plugin diff --git a/jetty-monitor/pom.xml b/jetty-monitor/pom.xml index f45c120919c..af8ba599700 100644 --- a/jetty-monitor/pom.xml +++ b/jetty-monitor/pom.xml @@ -19,7 +19,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-monitor diff --git a/jetty-nosql/pom.xml b/jetty-nosql/pom.xml index 3375415fe1d..f8ca1842d8a 100644 --- a/jetty-nosql/pom.xml +++ b/jetty-nosql/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-nosql diff --git a/jetty-osgi/jetty-osgi-alpn/pom.xml b/jetty-osgi/jetty-osgi-alpn/pom.xml index d5afb8cc387..793a63c9bf8 100644 --- a/jetty-osgi/jetty-osgi-alpn/pom.xml +++ b/jetty-osgi/jetty-osgi-alpn/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-osgi-alpn diff --git a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml index 345ca53d1df..ddede53af44 100644 --- a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml +++ b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-osgi-boot-jsp diff --git a/jetty-osgi/jetty-osgi-boot-warurl/pom.xml b/jetty-osgi/jetty-osgi-boot-warurl/pom.xml index 91866499c79..1522b987dc1 100644 --- a/jetty-osgi/jetty-osgi-boot-warurl/pom.xml +++ b/jetty-osgi/jetty-osgi-boot-warurl/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 ../pom.xml 4.0.0 diff --git a/jetty-osgi/jetty-osgi-boot/pom.xml b/jetty-osgi/jetty-osgi-boot/pom.xml index 029bf4334dd..214fa88b305 100644 --- a/jetty-osgi/jetty-osgi-boot/pom.xml +++ b/jetty-osgi/jetty-osgi-boot/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-osgi-boot diff --git a/jetty-osgi/jetty-osgi-httpservice/pom.xml b/jetty-osgi/jetty-osgi-httpservice/pom.xml index b2d3aa3063d..539bfb0cad1 100644 --- a/jetty-osgi/jetty-osgi-httpservice/pom.xml +++ b/jetty-osgi/jetty-osgi-httpservice/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-httpservice diff --git a/jetty-osgi/pom.xml b/jetty-osgi/pom.xml index 495703d5a05..ca1ee86ea09 100644 --- a/jetty-osgi/pom.xml +++ b/jetty-osgi/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 org.eclipse.jetty.osgi jetty-osgi-project diff --git a/jetty-osgi/test-jetty-osgi-context/pom.xml b/jetty-osgi/test-jetty-osgi-context/pom.xml index b2208fffd19..3d0fa22124d 100644 --- a/jetty-osgi/test-jetty-osgi-context/pom.xml +++ b/jetty-osgi/test-jetty-osgi-context/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 test-jetty-osgi-context diff --git a/jetty-osgi/test-jetty-osgi-webapp/pom.xml b/jetty-osgi/test-jetty-osgi-webapp/pom.xml index 779ee5a3712..d14d8ba9deb 100644 --- a/jetty-osgi/test-jetty-osgi-webapp/pom.xml +++ b/jetty-osgi/test-jetty-osgi-webapp/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 ../pom.xml 4.0.0 diff --git a/jetty-osgi/test-jetty-osgi/pom.xml b/jetty-osgi/test-jetty-osgi/pom.xml index 8673fa03a2b..51b80d0b1d5 100644 --- a/jetty-osgi/test-jetty-osgi/pom.xml +++ b/jetty-osgi/test-jetty-osgi/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 ../pom.xml 4.0.0 diff --git a/jetty-plus/pom.xml b/jetty-plus/pom.xml index fd6fadeec1f..d7136c3269c 100644 --- a/jetty-plus/pom.xml +++ b/jetty-plus/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-plus diff --git a/jetty-proxy/pom.xml b/jetty-proxy/pom.xml index e113669967d..88d44d0b558 100644 --- a/jetty-proxy/pom.xml +++ b/jetty-proxy/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-proxy diff --git a/jetty-quickstart/pom.xml b/jetty-quickstart/pom.xml index 59ff13dbe7b..3b659a36b55 100644 --- a/jetty-quickstart/pom.xml +++ b/jetty-quickstart/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 org.eclipse.jetty diff --git a/jetty-rewrite/pom.xml b/jetty-rewrite/pom.xml index 5d0c18b756d..8bdfc866fd4 100644 --- a/jetty-rewrite/pom.xml +++ b/jetty-rewrite/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-rewrite diff --git a/jetty-runner/pom.xml b/jetty-runner/pom.xml index 8b8846bcc85..11c264f4ce0 100644 --- a/jetty-runner/pom.xml +++ b/jetty-runner/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-runner diff --git a/jetty-security/pom.xml b/jetty-security/pom.xml index 28a58ad5c97..6685bccf822 100644 --- a/jetty-security/pom.xml +++ b/jetty-security/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-security diff --git a/jetty-server/pom.xml b/jetty-server/pom.xml index d6d52e701d1..b6385cff85a 100644 --- a/jetty-server/pom.xml +++ b/jetty-server/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-server diff --git a/jetty-servlet/pom.xml b/jetty-servlet/pom.xml index 180517b8f7e..224beebb61a 100644 --- a/jetty-servlet/pom.xml +++ b/jetty-servlet/pom.xml @@ -3,7 +3,7 @@ jetty-project org.eclipse.jetty - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-servlet diff --git a/jetty-servlets/pom.xml b/jetty-servlets/pom.xml index 34f6410d7c3..fbd5ad51506 100644 --- a/jetty-servlets/pom.xml +++ b/jetty-servlets/pom.xml @@ -3,7 +3,7 @@ jetty-project org.eclipse.jetty - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-servlets diff --git a/jetty-spring/pom.xml b/jetty-spring/pom.xml index 19a9ffe6a94..90d7827035a 100644 --- a/jetty-spring/pom.xml +++ b/jetty-spring/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-spring diff --git a/jetty-start/pom.xml b/jetty-start/pom.xml index 240f52b481d..4882b6c330a 100644 --- a/jetty-start/pom.xml +++ b/jetty-start/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-start diff --git a/jetty-util-ajax/pom.xml b/jetty-util-ajax/pom.xml index bd0e74bb9c4..a56ba465c68 100644 --- a/jetty-util-ajax/pom.xml +++ b/jetty-util-ajax/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-util-ajax diff --git a/jetty-util/pom.xml b/jetty-util/pom.xml index 94dc2134298..71eb2603cf4 100644 --- a/jetty-util/pom.xml +++ b/jetty-util/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-util diff --git a/jetty-webapp/pom.xml b/jetty-webapp/pom.xml index 504bbfa2fe7..b485c8a8aaf 100644 --- a/jetty-webapp/pom.xml +++ b/jetty-webapp/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-webapp diff --git a/jetty-websocket/javax-websocket-client-impl/pom.xml b/jetty-websocket/javax-websocket-client-impl/pom.xml index e1d0b49ed23..f2e36e2e91e 100644 --- a/jetty-websocket/javax-websocket-client-impl/pom.xml +++ b/jetty-websocket/javax-websocket-client-impl/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.websocket websocket-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-websocket/javax-websocket-server-impl/pom.xml b/jetty-websocket/javax-websocket-server-impl/pom.xml index 0d5f697b995..63728e8aef6 100644 --- a/jetty-websocket/javax-websocket-server-impl/pom.xml +++ b/jetty-websocket/javax-websocket-server-impl/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.websocket websocket-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-websocket/pom.xml b/jetty-websocket/pom.xml index 92f98b394e2..b7b48777f5c 100644 --- a/jetty-websocket/pom.xml +++ b/jetty-websocket/pom.xml @@ -3,7 +3,7 @@ jetty-project org.eclipse.jetty - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-websocket/websocket-api/pom.xml b/jetty-websocket/websocket-api/pom.xml index e6aef3dd990..2b0d87522f0 100644 --- a/jetty-websocket/websocket-api/pom.xml +++ b/jetty-websocket/websocket-api/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.websocket websocket-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-websocket/websocket-client/pom.xml b/jetty-websocket/websocket-client/pom.xml index f3b3ec5e1ac..c71df2d9806 100644 --- a/jetty-websocket/websocket-client/pom.xml +++ b/jetty-websocket/websocket-client/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.websocket websocket-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-websocket/websocket-common/pom.xml b/jetty-websocket/websocket-common/pom.xml index 8cbaebd097b..ac6f0b24e2c 100644 --- a/jetty-websocket/websocket-common/pom.xml +++ b/jetty-websocket/websocket-common/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.websocket websocket-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-websocket/websocket-server/pom.xml b/jetty-websocket/websocket-server/pom.xml index 66efe54b4aa..66dc506c1a7 100644 --- a/jetty-websocket/websocket-server/pom.xml +++ b/jetty-websocket/websocket-server/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.websocket websocket-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-websocket/websocket-servlet/pom.xml b/jetty-websocket/websocket-servlet/pom.xml index a1317a79739..9bacf5dad33 100644 --- a/jetty-websocket/websocket-servlet/pom.xml +++ b/jetty-websocket/websocket-servlet/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.websocket websocket-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/jetty-xml/pom.xml b/jetty-xml/pom.xml index 939ae306f4a..17ecdcbf700 100644 --- a/jetty-xml/pom.xml +++ b/jetty-xml/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jetty-xml diff --git a/pom.xml b/pom.xml index 6d8e037cd2d..bc46720de4a 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 25 jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 Jetty :: Project http://www.eclipse.org/jetty pom diff --git a/tests/pom.xml b/tests/pom.xml index 62d4e5d3c76..1db2e881ce4 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty jetty-project - 9.3.8-SNAPSHOT + 9.3.8.RC0 ../pom.xml org.eclipse.jetty.tests diff --git a/tests/test-continuation/pom.xml b/tests/test-continuation/pom.xml index b818d49e72a..5656a07f351 100644 --- a/tests/test-continuation/pom.xml +++ b/tests/test-continuation/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 ../pom.xml 4.0.0 diff --git a/tests/test-http-client-transport/pom.xml b/tests/test-http-client-transport/pom.xml index dfa33d013ab..9eb1db984e8 100644 --- a/tests/test-http-client-transport/pom.xml +++ b/tests/test-http-client-transport/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 diff --git a/tests/test-integration/pom.xml b/tests/test-integration/pom.xml index 47812321c4f..597fc80b45d 100644 --- a/tests/test-integration/pom.xml +++ b/tests/test-integration/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 test-integration diff --git a/tests/test-jmx/jmx-webapp-it/pom.xml b/tests/test-jmx/jmx-webapp-it/pom.xml index 58a6f650baf..88abccdebaf 100644 --- a/tests/test-jmx/jmx-webapp-it/pom.xml +++ b/tests/test-jmx/jmx-webapp-it/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jetty.tests test-jmx-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 jmx-webapp-it diff --git a/tests/test-jmx/jmx-webapp/pom.xml b/tests/test-jmx/jmx-webapp/pom.xml index e7e30d95e62..987cffb5a62 100644 --- a/tests/test-jmx/jmx-webapp/pom.xml +++ b/tests/test-jmx/jmx-webapp/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-jmx-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 jmx-webapp war diff --git a/tests/test-jmx/pom.xml b/tests/test-jmx/pom.xml index 27a406afc2a..9248d472171 100644 --- a/tests/test-jmx/pom.xml +++ b/tests/test-jmx/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 4.0.0 test-jmx-parent diff --git a/tests/test-loginservice/pom.xml b/tests/test-loginservice/pom.xml index b4323401eee..0e0343d134a 100644 --- a/tests/test-loginservice/pom.xml +++ b/tests/test-loginservice/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 test-loginservice Jetty Tests :: Login Service diff --git a/tests/test-quickstart/pom.xml b/tests/test-quickstart/pom.xml index 5283a46dcb6..d6682f6a10d 100644 --- a/tests/test-quickstart/pom.xml +++ b/tests/test-quickstart/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 ../pom.xml 4.0.0 diff --git a/tests/test-sessions/pom.xml b/tests/test-sessions/pom.xml index 88f20732671..e3b3348d328 100644 --- a/tests/test-sessions/pom.xml +++ b/tests/test-sessions/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 test-sessions-parent Jetty Tests :: Sessions :: Parent diff --git a/tests/test-sessions/test-gcloud-sessions/pom.xml b/tests/test-sessions/test-gcloud-sessions/pom.xml index 3ba8d5cb96e..e7808549e49 100644 --- a/tests/test-sessions/test-gcloud-sessions/pom.xml +++ b/tests/test-sessions/test-gcloud-sessions/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-sessions-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 test-gcloud-sessions Jetty Tests :: Sessions :: GCloud diff --git a/tests/test-sessions/test-hash-sessions/pom.xml b/tests/test-sessions/test-hash-sessions/pom.xml index cd1b9845553..3192b547e8a 100644 --- a/tests/test-sessions/test-hash-sessions/pom.xml +++ b/tests/test-sessions/test-hash-sessions/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-sessions-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 test-hash-sessions Jetty Tests :: Sessions :: Hash diff --git a/tests/test-sessions/test-infinispan-sessions/pom.xml b/tests/test-sessions/test-infinispan-sessions/pom.xml index 76c9ecc593b..82b0f971e8c 100644 --- a/tests/test-sessions/test-infinispan-sessions/pom.xml +++ b/tests/test-sessions/test-infinispan-sessions/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-sessions-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 test-infinispan-sessions Jetty Tests :: Sessions :: Infinispan diff --git a/tests/test-sessions/test-jdbc-sessions/pom.xml b/tests/test-sessions/test-jdbc-sessions/pom.xml index 639e36b8788..d04cede69d8 100644 --- a/tests/test-sessions/test-jdbc-sessions/pom.xml +++ b/tests/test-sessions/test-jdbc-sessions/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-sessions-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 test-jdbc-sessions Jetty Tests :: Sessions :: JDBC diff --git a/tests/test-sessions/test-mongodb-sessions/pom.xml b/tests/test-sessions/test-mongodb-sessions/pom.xml index 1e35fdf94af..78aba072659 100644 --- a/tests/test-sessions/test-mongodb-sessions/pom.xml +++ b/tests/test-sessions/test-mongodb-sessions/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-sessions-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 test-mongodb-sessions Jetty Tests :: Sessions :: Mongo diff --git a/tests/test-sessions/test-sessions-common/pom.xml b/tests/test-sessions/test-sessions-common/pom.xml index f909f67690e..96f7ab4b1ef 100644 --- a/tests/test-sessions/test-sessions-common/pom.xml +++ b/tests/test-sessions/test-sessions-common/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-sessions-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 test-sessions-common Jetty Tests :: Sessions :: Common diff --git a/tests/test-webapps/pom.xml b/tests/test-webapps/pom.xml index 90bda2a00d0..190e863b96f 100644 --- a/tests/test-webapps/pom.xml +++ b/tests/test-webapps/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 ../pom.xml test-webapps-parent diff --git a/tests/test-webapps/test-jaas-webapp/pom.xml b/tests/test-webapps/test-jaas-webapp/pom.xml index 843b89f8177..ea6e0b4d138 100644 --- a/tests/test-webapps/test-jaas-webapp/pom.xml +++ b/tests/test-webapps/test-jaas-webapp/pom.xml @@ -4,7 +4,7 @@ org.eclipse.jetty.tests test-webapps-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 test-jaas-webapp Jetty Tests :: WebApp :: JAAS diff --git a/tests/test-webapps/test-jetty-webapp/pom.xml b/tests/test-webapps/test-jetty-webapp/pom.xml index 4568dbcd62b..3f6e19f14c5 100644 --- a/tests/test-webapps/test-jetty-webapp/pom.xml +++ b/tests/test-webapps/test-jetty-webapp/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jetty.tests test-webapps-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 ../pom.xml 4.0.0 diff --git a/tests/test-webapps/test-jndi-webapp/pom.xml b/tests/test-webapps/test-jndi-webapp/pom.xml index a75983a0b1d..4fad43d6c94 100644 --- a/tests/test-webapps/test-jndi-webapp/pom.xml +++ b/tests/test-webapps/test-jndi-webapp/pom.xml @@ -4,7 +4,7 @@ org.eclipse.jetty.tests test-webapps-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 test-jndi-webapp Jetty Tests :: WebApp :: JNDI diff --git a/tests/test-webapps/test-mock-resources/pom.xml b/tests/test-webapps/test-mock-resources/pom.xml index fdd2036196b..baf8edb17c5 100644 --- a/tests/test-webapps/test-mock-resources/pom.xml +++ b/tests/test-webapps/test-mock-resources/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.tests test-webapps-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 Jetty Tests :: WebApp :: Mock Resources test-mock-resources diff --git a/tests/test-webapps/test-proxy-webapp/pom.xml b/tests/test-webapps/test-proxy-webapp/pom.xml index e26ac325fea..fe53385c766 100644 --- a/tests/test-webapps/test-proxy-webapp/pom.xml +++ b/tests/test-webapps/test-proxy-webapp/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jetty.tests test-webapps-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 ../pom.xml 4.0.0 diff --git a/tests/test-webapps/test-servlet-spec/pom.xml b/tests/test-webapps/test-servlet-spec/pom.xml index 373365cc7f8..a3e6318655b 100644 --- a/tests/test-webapps/test-servlet-spec/pom.xml +++ b/tests/test-webapps/test-servlet-spec/pom.xml @@ -4,7 +4,7 @@ org.eclipse.jetty.tests test-webapps-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 test-servlet-spec-parent Jetty Tests :: Spec Test WebApp :: Parent diff --git a/tests/test-webapps/test-servlet-spec/test-container-initializer/pom.xml b/tests/test-webapps/test-servlet-spec/test-container-initializer/pom.xml index 27f6d728205..c4aa064527b 100644 --- a/tests/test-webapps/test-servlet-spec/test-container-initializer/pom.xml +++ b/tests/test-webapps/test-servlet-spec/test-container-initializer/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.tests test-servlet-spec-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 test-container-initializer jar diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml b/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml index 22df2ea7b92..415c97fe61b 100644 --- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml +++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml @@ -4,7 +4,7 @@ org.eclipse.jetty.tests test-servlet-spec-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 Jetty Tests :: Webapps :: Spec Webapp test-spec-webapp diff --git a/tests/test-webapps/test-servlet-spec/test-web-fragment/pom.xml b/tests/test-webapps/test-servlet-spec/test-web-fragment/pom.xml index fc42d6984ed..aff6453acfd 100644 --- a/tests/test-webapps/test-servlet-spec/test-web-fragment/pom.xml +++ b/tests/test-webapps/test-servlet-spec/test-web-fragment/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.tests test-servlet-spec-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 Jetty Tests :: WebApp :: Servlet Spec :: Fragment Jar org.eclipse.jetty.tests diff --git a/tests/test-webapps/test-webapp-rfc2616/pom.xml b/tests/test-webapps/test-webapp-rfc2616/pom.xml index 09b94c0c142..3374b9ae981 100644 --- a/tests/test-webapps/test-webapp-rfc2616/pom.xml +++ b/tests/test-webapps/test-webapp-rfc2616/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-webapps-parent - 9.3.8-SNAPSHOT + 9.3.8.RC0 test-webapp-rfc2616 Jetty Tests :: WebApp :: RFC2616 From 9111aeb6900a0b90a08e130d809710d922051d8b Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Thu, 25 Feb 2016 11:06:14 -0700 Subject: [PATCH 02/15] Updating to version 9.3.8-SNAPSHOT --- VERSION.txt | 2 ++ aggregates/jetty-all-compact3/pom.xml | 2 +- aggregates/jetty-all/pom.xml | 2 +- apache-jsp/pom.xml | 2 +- apache-jstl/pom.xml | 2 +- examples/async-rest/async-rest-jar/pom.xml | 2 +- examples/async-rest/async-rest-webapp/pom.xml | 2 +- examples/async-rest/pom.xml | 2 +- examples/embedded/pom.xml | 2 +- examples/pom.xml | 2 +- jetty-alpn/jetty-alpn-client/pom.xml | 2 +- jetty-alpn/jetty-alpn-server/pom.xml | 2 +- jetty-alpn/pom.xml | 2 +- jetty-annotations/pom.xml | 2 +- jetty-ant/pom.xml | 2 +- jetty-cdi/cdi-core/pom.xml | 2 +- jetty-cdi/cdi-full-servlet/pom.xml | 2 +- jetty-cdi/cdi-servlet/pom.xml | 2 +- jetty-cdi/cdi-websocket/pom.xml | 2 +- jetty-cdi/pom.xml | 2 +- jetty-cdi/test-cdi-webapp/pom.xml | 2 +- jetty-client/pom.xml | 2 +- jetty-continuation/pom.xml | 2 +- jetty-deploy/pom.xml | 2 +- jetty-distribution/pom.xml | 2 +- jetty-fcgi/fcgi-client/pom.xml | 2 +- jetty-fcgi/fcgi-server/pom.xml | 2 +- jetty-fcgi/pom.xml | 2 +- jetty-gcloud/jetty-gcloud-session-manager/pom.xml | 2 +- jetty-gcloud/pom.xml | 2 +- jetty-http-spi/pom.xml | 2 +- jetty-http/pom.xml | 2 +- jetty-http2/http2-alpn-tests/pom.xml | 2 +- jetty-http2/http2-client/pom.xml | 2 +- jetty-http2/http2-common/pom.xml | 2 +- jetty-http2/http2-hpack/pom.xml | 2 +- jetty-http2/http2-http-client-transport/pom.xml | 2 +- jetty-http2/http2-server/pom.xml | 2 +- jetty-http2/pom.xml | 2 +- jetty-infinispan/pom.xml | 2 +- jetty-io/pom.xml | 2 +- jetty-jaas/pom.xml | 2 +- jetty-jaspi/pom.xml | 2 +- jetty-jmx/pom.xml | 2 +- jetty-jndi/pom.xml | 2 +- jetty-jspc-maven-plugin/pom.xml | 2 +- jetty-maven-plugin/pom.xml | 2 +- jetty-monitor/pom.xml | 2 +- jetty-nosql/pom.xml | 2 +- jetty-osgi/jetty-osgi-alpn/pom.xml | 2 +- jetty-osgi/jetty-osgi-boot-jsp/pom.xml | 2 +- jetty-osgi/jetty-osgi-boot-warurl/pom.xml | 2 +- jetty-osgi/jetty-osgi-boot/pom.xml | 2 +- jetty-osgi/jetty-osgi-httpservice/pom.xml | 2 +- jetty-osgi/pom.xml | 2 +- jetty-osgi/test-jetty-osgi-context/pom.xml | 2 +- jetty-osgi/test-jetty-osgi-webapp/pom.xml | 2 +- jetty-osgi/test-jetty-osgi/pom.xml | 2 +- jetty-plus/pom.xml | 2 +- jetty-proxy/pom.xml | 2 +- jetty-quickstart/pom.xml | 2 +- jetty-rewrite/pom.xml | 2 +- jetty-runner/pom.xml | 2 +- jetty-security/pom.xml | 2 +- jetty-server/pom.xml | 2 +- jetty-servlet/pom.xml | 2 +- jetty-servlets/pom.xml | 2 +- jetty-spring/pom.xml | 2 +- jetty-start/pom.xml | 2 +- jetty-util-ajax/pom.xml | 2 +- jetty-util/pom.xml | 2 +- jetty-webapp/pom.xml | 2 +- jetty-websocket/javax-websocket-client-impl/pom.xml | 2 +- jetty-websocket/javax-websocket-server-impl/pom.xml | 2 +- jetty-websocket/pom.xml | 2 +- jetty-websocket/websocket-api/pom.xml | 2 +- jetty-websocket/websocket-client/pom.xml | 2 +- jetty-websocket/websocket-common/pom.xml | 2 +- jetty-websocket/websocket-server/pom.xml | 2 +- jetty-websocket/websocket-servlet/pom.xml | 2 +- jetty-xml/pom.xml | 2 +- pom.xml | 2 +- tests/pom.xml | 2 +- tests/test-continuation/pom.xml | 2 +- tests/test-http-client-transport/pom.xml | 2 +- tests/test-integration/pom.xml | 2 +- tests/test-jmx/jmx-webapp-it/pom.xml | 2 +- tests/test-jmx/jmx-webapp/pom.xml | 2 +- tests/test-jmx/pom.xml | 2 +- tests/test-loginservice/pom.xml | 2 +- tests/test-quickstart/pom.xml | 2 +- tests/test-sessions/pom.xml | 2 +- tests/test-sessions/test-gcloud-sessions/pom.xml | 2 +- tests/test-sessions/test-hash-sessions/pom.xml | 2 +- tests/test-sessions/test-infinispan-sessions/pom.xml | 2 +- tests/test-sessions/test-jdbc-sessions/pom.xml | 2 +- tests/test-sessions/test-mongodb-sessions/pom.xml | 2 +- tests/test-sessions/test-sessions-common/pom.xml | 2 +- tests/test-webapps/pom.xml | 2 +- tests/test-webapps/test-jaas-webapp/pom.xml | 2 +- tests/test-webapps/test-jetty-webapp/pom.xml | 2 +- tests/test-webapps/test-jndi-webapp/pom.xml | 2 +- tests/test-webapps/test-mock-resources/pom.xml | 2 +- tests/test-webapps/test-proxy-webapp/pom.xml | 2 +- tests/test-webapps/test-servlet-spec/pom.xml | 2 +- .../test-servlet-spec/test-container-initializer/pom.xml | 2 +- tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml | 2 +- tests/test-webapps/test-servlet-spec/test-web-fragment/pom.xml | 2 +- tests/test-webapps/test-webapp-rfc2616/pom.xml | 2 +- 109 files changed, 110 insertions(+), 108 deletions(-) diff --git a/VERSION.txt b/VERSION.txt index 3ca261fae51..e9e9a00295f 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1,3 +1,5 @@ +jetty-9.3.8-SNAPSHOT + jetty-9.3.8.RC0 - 25 February 2016 + 81 Exception not always thrown in Jetty to application when upload part is too big diff --git a/aggregates/jetty-all-compact3/pom.xml b/aggregates/jetty-all-compact3/pom.xml index 4592018cfb6..1af2650c12c 100644 --- a/aggregates/jetty-all-compact3/pom.xml +++ b/aggregates/jetty-all-compact3/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/aggregates/jetty-all/pom.xml b/aggregates/jetty-all/pom.xml index 1e429c9d677..1c938a11937 100644 --- a/aggregates/jetty-all/pom.xml +++ b/aggregates/jetty-all/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/apache-jsp/pom.xml b/apache-jsp/pom.xml index 0cfebf02fd8..bd7e796b0e1 100644 --- a/apache-jsp/pom.xml +++ b/apache-jsp/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 apache-jsp diff --git a/apache-jstl/pom.xml b/apache-jstl/pom.xml index 1d0fcbd62e4..8813af16170 100644 --- a/apache-jstl/pom.xml +++ b/apache-jstl/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 apache-jstl diff --git a/examples/async-rest/async-rest-jar/pom.xml b/examples/async-rest/async-rest-jar/pom.xml index d3bd17bb306..72bf17a6b93 100644 --- a/examples/async-rest/async-rest-jar/pom.xml +++ b/examples/async-rest/async-rest-jar/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty example-async-rest - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 org.eclipse.jetty.example-async-rest diff --git a/examples/async-rest/async-rest-webapp/pom.xml b/examples/async-rest/async-rest-webapp/pom.xml index 53cedb57d67..863dc9a4125 100644 --- a/examples/async-rest/async-rest-webapp/pom.xml +++ b/examples/async-rest/async-rest-webapp/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty example-async-rest - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 org.eclipse.jetty.example-async-rest diff --git a/examples/async-rest/pom.xml b/examples/async-rest/pom.xml index e52c574ffd4..1daa80af335 100644 --- a/examples/async-rest/pom.xml +++ b/examples/async-rest/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.examples examples-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT ../pom.xml 4.0.0 diff --git a/examples/embedded/pom.xml b/examples/embedded/pom.xml index 2ed4223ccbb..cc74e1984ae 100644 --- a/examples/embedded/pom.xml +++ b/examples/embedded/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.examples examples-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT ../pom.xml 4.0.0 diff --git a/examples/pom.xml b/examples/pom.xml index c1a1997f9cf..f7d58882b79 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT ../pom.xml org.eclipse.jetty.examples diff --git a/jetty-alpn/jetty-alpn-client/pom.xml b/jetty-alpn/jetty-alpn-client/pom.xml index 5826638ead4..79193a0592a 100644 --- a/jetty-alpn/jetty-alpn-client/pom.xml +++ b/jetty-alpn/jetty-alpn-client/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-alpn-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-alpn-client diff --git a/jetty-alpn/jetty-alpn-server/pom.xml b/jetty-alpn/jetty-alpn-server/pom.xml index 741e53ec94a..250efcbe417 100644 --- a/jetty-alpn/jetty-alpn-server/pom.xml +++ b/jetty-alpn/jetty-alpn-server/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-alpn-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-alpn-server diff --git a/jetty-alpn/pom.xml b/jetty-alpn/pom.xml index 327a98c2533..d54ab79572e 100644 --- a/jetty-alpn/pom.xml +++ b/jetty-alpn/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-alpn-parent diff --git a/jetty-annotations/pom.xml b/jetty-annotations/pom.xml index 0ddddc7c124..c57d6bc91b6 100644 --- a/jetty-annotations/pom.xml +++ b/jetty-annotations/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-annotations diff --git a/jetty-ant/pom.xml b/jetty-ant/pom.xml index e763d409512..5576f54202b 100644 --- a/jetty-ant/pom.xml +++ b/jetty-ant/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-ant diff --git a/jetty-cdi/cdi-core/pom.xml b/jetty-cdi/cdi-core/pom.xml index e3d10c90ffe..cd16e027de2 100644 --- a/jetty-cdi/cdi-core/pom.xml +++ b/jetty-cdi/cdi-core/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.cdi jetty-cdi-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 cdi-core diff --git a/jetty-cdi/cdi-full-servlet/pom.xml b/jetty-cdi/cdi-full-servlet/pom.xml index e4571d58952..fead44876ee 100644 --- a/jetty-cdi/cdi-full-servlet/pom.xml +++ b/jetty-cdi/cdi-full-servlet/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.cdi jetty-cdi-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 cdi-full-servlet diff --git a/jetty-cdi/cdi-servlet/pom.xml b/jetty-cdi/cdi-servlet/pom.xml index 415788cebd6..1b05b0d21c5 100644 --- a/jetty-cdi/cdi-servlet/pom.xml +++ b/jetty-cdi/cdi-servlet/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.cdi jetty-cdi-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 cdi-servlet diff --git a/jetty-cdi/cdi-websocket/pom.xml b/jetty-cdi/cdi-websocket/pom.xml index aaaf08e5b71..fd8bfc68ca5 100644 --- a/jetty-cdi/cdi-websocket/pom.xml +++ b/jetty-cdi/cdi-websocket/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.cdi jetty-cdi-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 cdi-websocket diff --git a/jetty-cdi/pom.xml b/jetty-cdi/pom.xml index fa8afa40f00..eab873b017b 100644 --- a/jetty-cdi/pom.xml +++ b/jetty-cdi/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 org.eclipse.jetty.cdi diff --git a/jetty-cdi/test-cdi-webapp/pom.xml b/jetty-cdi/test-cdi-webapp/pom.xml index 16e0c4663df..51cd8f19c82 100644 --- a/jetty-cdi/test-cdi-webapp/pom.xml +++ b/jetty-cdi/test-cdi-webapp/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jetty.cdi jetty-cdi-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 test-cdi-webapp diff --git a/jetty-client/pom.xml b/jetty-client/pom.xml index 769aa8f775f..f2d2613dc86 100644 --- a/jetty-client/pom.xml +++ b/jetty-client/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-continuation/pom.xml b/jetty-continuation/pom.xml index 17b84d82983..55860f3dcd8 100644 --- a/jetty-continuation/pom.xml +++ b/jetty-continuation/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-continuation diff --git a/jetty-deploy/pom.xml b/jetty-deploy/pom.xml index d033bab224b..42c66755628 100644 --- a/jetty-deploy/pom.xml +++ b/jetty-deploy/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-deploy diff --git a/jetty-distribution/pom.xml b/jetty-distribution/pom.xml index c6f1760908a..49770cc5e8e 100644 --- a/jetty-distribution/pom.xml +++ b/jetty-distribution/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT jetty-distribution Jetty :: Distribution Assemblies diff --git a/jetty-fcgi/fcgi-client/pom.xml b/jetty-fcgi/fcgi-client/pom.xml index a5ee170f67a..79b4c0b9638 100644 --- a/jetty-fcgi/fcgi-client/pom.xml +++ b/jetty-fcgi/fcgi-client/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.fcgi fcgi-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-fcgi/fcgi-server/pom.xml b/jetty-fcgi/fcgi-server/pom.xml index 04cc588bdf3..b3d1b95ccb5 100644 --- a/jetty-fcgi/fcgi-server/pom.xml +++ b/jetty-fcgi/fcgi-server/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.fcgi fcgi-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-fcgi/pom.xml b/jetty-fcgi/pom.xml index 44094e4f0c9..e8b1511a91e 100644 --- a/jetty-fcgi/pom.xml +++ b/jetty-fcgi/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-gcloud/jetty-gcloud-session-manager/pom.xml b/jetty-gcloud/jetty-gcloud-session-manager/pom.xml index 5cb7aa815af..120c85ce1fa 100644 --- a/jetty-gcloud/jetty-gcloud-session-manager/pom.xml +++ b/jetty-gcloud/jetty-gcloud-session-manager/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.gcloud gcloud-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-gcloud/pom.xml b/jetty-gcloud/pom.xml index 4d6f4573a1d..770332851ea 100644 --- a/jetty-gcloud/pom.xml +++ b/jetty-gcloud/pom.xml @@ -3,7 +3,7 @@ jetty-project org.eclipse.jetty - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-http-spi/pom.xml b/jetty-http-spi/pom.xml index 6f70472cc64..f280ccbefbc 100644 --- a/jetty-http-spi/pom.xml +++ b/jetty-http-spi/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-http-spi diff --git a/jetty-http/pom.xml b/jetty-http/pom.xml index 44f251fd76e..4551cfae92e 100644 --- a/jetty-http/pom.xml +++ b/jetty-http/pom.xml @@ -3,7 +3,7 @@ jetty-project org.eclipse.jetty - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-http diff --git a/jetty-http2/http2-alpn-tests/pom.xml b/jetty-http2/http2-alpn-tests/pom.xml index 7cc1e4eb96f..b7e8af46add 100644 --- a/jetty-http2/http2-alpn-tests/pom.xml +++ b/jetty-http2/http2-alpn-tests/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.http2 http2-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-http2/http2-client/pom.xml b/jetty-http2/http2-client/pom.xml index 6a5799f07b1..9520bea6420 100644 --- a/jetty-http2/http2-client/pom.xml +++ b/jetty-http2/http2-client/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.http2 http2-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-http2/http2-common/pom.xml b/jetty-http2/http2-common/pom.xml index 608106131ad..ff849ac0998 100644 --- a/jetty-http2/http2-common/pom.xml +++ b/jetty-http2/http2-common/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.http2 http2-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-http2/http2-hpack/pom.xml b/jetty-http2/http2-hpack/pom.xml index a60dfbd65fa..703caac476f 100644 --- a/jetty-http2/http2-hpack/pom.xml +++ b/jetty-http2/http2-hpack/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.http2 http2-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-http2/http2-http-client-transport/pom.xml b/jetty-http2/http2-http-client-transport/pom.xml index 14b4f2ef3d8..d2c783ba08c 100644 --- a/jetty-http2/http2-http-client-transport/pom.xml +++ b/jetty-http2/http2-http-client-transport/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.http2 http2-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-http2/http2-server/pom.xml b/jetty-http2/http2-server/pom.xml index dcc6ae1ca9c..69e90ec24de 100644 --- a/jetty-http2/http2-server/pom.xml +++ b/jetty-http2/http2-server/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.http2 http2-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-http2/pom.xml b/jetty-http2/pom.xml index 37d88814803..71c050c5fe8 100644 --- a/jetty-http2/pom.xml +++ b/jetty-http2/pom.xml @@ -3,7 +3,7 @@ jetty-project org.eclipse.jetty - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-infinispan/pom.xml b/jetty-infinispan/pom.xml index 788550f032e..28d8249e407 100644 --- a/jetty-infinispan/pom.xml +++ b/jetty-infinispan/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-infinispan diff --git a/jetty-io/pom.xml b/jetty-io/pom.xml index a8eb1af84c3..a8c86346edc 100644 --- a/jetty-io/pom.xml +++ b/jetty-io/pom.xml @@ -2,7 +2,7 @@ jetty-project org.eclipse.jetty - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-io diff --git a/jetty-jaas/pom.xml b/jetty-jaas/pom.xml index 10ad7fb12bc..5b579a02368 100644 --- a/jetty-jaas/pom.xml +++ b/jetty-jaas/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-jaas diff --git a/jetty-jaspi/pom.xml b/jetty-jaspi/pom.xml index 174ae197293..7a2bb5e94e1 100644 --- a/jetty-jaspi/pom.xml +++ b/jetty-jaspi/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-jaspi diff --git a/jetty-jmx/pom.xml b/jetty-jmx/pom.xml index 1d51f6402e7..5b736beff4f 100644 --- a/jetty-jmx/pom.xml +++ b/jetty-jmx/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-jmx diff --git a/jetty-jndi/pom.xml b/jetty-jndi/pom.xml index 1b0afc33602..2d4855dfae1 100644 --- a/jetty-jndi/pom.xml +++ b/jetty-jndi/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-jndi diff --git a/jetty-jspc-maven-plugin/pom.xml b/jetty-jspc-maven-plugin/pom.xml index d8e8a7d3538..ee7a6acef4c 100644 --- a/jetty-jspc-maven-plugin/pom.xml +++ b/jetty-jspc-maven-plugin/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-jspc-maven-plugin diff --git a/jetty-maven-plugin/pom.xml b/jetty-maven-plugin/pom.xml index bc80c3049ca..5bf2bfcea7e 100644 --- a/jetty-maven-plugin/pom.xml +++ b/jetty-maven-plugin/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-maven-plugin diff --git a/jetty-monitor/pom.xml b/jetty-monitor/pom.xml index af8ba599700..f45c120919c 100644 --- a/jetty-monitor/pom.xml +++ b/jetty-monitor/pom.xml @@ -19,7 +19,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-monitor diff --git a/jetty-nosql/pom.xml b/jetty-nosql/pom.xml index f8ca1842d8a..3375415fe1d 100644 --- a/jetty-nosql/pom.xml +++ b/jetty-nosql/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-nosql diff --git a/jetty-osgi/jetty-osgi-alpn/pom.xml b/jetty-osgi/jetty-osgi-alpn/pom.xml index 793a63c9bf8..d5afb8cc387 100644 --- a/jetty-osgi/jetty-osgi-alpn/pom.xml +++ b/jetty-osgi/jetty-osgi-alpn/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-osgi-alpn diff --git a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml index ddede53af44..345ca53d1df 100644 --- a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml +++ b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-osgi-boot-jsp diff --git a/jetty-osgi/jetty-osgi-boot-warurl/pom.xml b/jetty-osgi/jetty-osgi-boot-warurl/pom.xml index 1522b987dc1..91866499c79 100644 --- a/jetty-osgi/jetty-osgi-boot-warurl/pom.xml +++ b/jetty-osgi/jetty-osgi-boot-warurl/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT ../pom.xml 4.0.0 diff --git a/jetty-osgi/jetty-osgi-boot/pom.xml b/jetty-osgi/jetty-osgi-boot/pom.xml index 214fa88b305..029bf4334dd 100644 --- a/jetty-osgi/jetty-osgi-boot/pom.xml +++ b/jetty-osgi/jetty-osgi-boot/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-osgi-boot diff --git a/jetty-osgi/jetty-osgi-httpservice/pom.xml b/jetty-osgi/jetty-osgi-httpservice/pom.xml index 539bfb0cad1..b2d3aa3063d 100644 --- a/jetty-osgi/jetty-osgi-httpservice/pom.xml +++ b/jetty-osgi/jetty-osgi-httpservice/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-httpservice diff --git a/jetty-osgi/pom.xml b/jetty-osgi/pom.xml index ca1ee86ea09..495703d5a05 100644 --- a/jetty-osgi/pom.xml +++ b/jetty-osgi/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT org.eclipse.jetty.osgi jetty-osgi-project diff --git a/jetty-osgi/test-jetty-osgi-context/pom.xml b/jetty-osgi/test-jetty-osgi-context/pom.xml index 3d0fa22124d..b2208fffd19 100644 --- a/jetty-osgi/test-jetty-osgi-context/pom.xml +++ b/jetty-osgi/test-jetty-osgi-context/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 test-jetty-osgi-context diff --git a/jetty-osgi/test-jetty-osgi-webapp/pom.xml b/jetty-osgi/test-jetty-osgi-webapp/pom.xml index d14d8ba9deb..779ee5a3712 100644 --- a/jetty-osgi/test-jetty-osgi-webapp/pom.xml +++ b/jetty-osgi/test-jetty-osgi-webapp/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT ../pom.xml 4.0.0 diff --git a/jetty-osgi/test-jetty-osgi/pom.xml b/jetty-osgi/test-jetty-osgi/pom.xml index 51b80d0b1d5..8673fa03a2b 100644 --- a/jetty-osgi/test-jetty-osgi/pom.xml +++ b/jetty-osgi/test-jetty-osgi/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.osgi jetty-osgi-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT ../pom.xml 4.0.0 diff --git a/jetty-plus/pom.xml b/jetty-plus/pom.xml index d7136c3269c..fd6fadeec1f 100644 --- a/jetty-plus/pom.xml +++ b/jetty-plus/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-plus diff --git a/jetty-proxy/pom.xml b/jetty-proxy/pom.xml index 88d44d0b558..e113669967d 100644 --- a/jetty-proxy/pom.xml +++ b/jetty-proxy/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-proxy diff --git a/jetty-quickstart/pom.xml b/jetty-quickstart/pom.xml index 3b659a36b55..59ff13dbe7b 100644 --- a/jetty-quickstart/pom.xml +++ b/jetty-quickstart/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 org.eclipse.jetty diff --git a/jetty-rewrite/pom.xml b/jetty-rewrite/pom.xml index 8bdfc866fd4..5d0c18b756d 100644 --- a/jetty-rewrite/pom.xml +++ b/jetty-rewrite/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-rewrite diff --git a/jetty-runner/pom.xml b/jetty-runner/pom.xml index 11c264f4ce0..8b8846bcc85 100644 --- a/jetty-runner/pom.xml +++ b/jetty-runner/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-runner diff --git a/jetty-security/pom.xml b/jetty-security/pom.xml index 6685bccf822..28a58ad5c97 100644 --- a/jetty-security/pom.xml +++ b/jetty-security/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-security diff --git a/jetty-server/pom.xml b/jetty-server/pom.xml index b6385cff85a..d6d52e701d1 100644 --- a/jetty-server/pom.xml +++ b/jetty-server/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-server diff --git a/jetty-servlet/pom.xml b/jetty-servlet/pom.xml index 224beebb61a..180517b8f7e 100644 --- a/jetty-servlet/pom.xml +++ b/jetty-servlet/pom.xml @@ -3,7 +3,7 @@ jetty-project org.eclipse.jetty - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-servlet diff --git a/jetty-servlets/pom.xml b/jetty-servlets/pom.xml index fbd5ad51506..34f6410d7c3 100644 --- a/jetty-servlets/pom.xml +++ b/jetty-servlets/pom.xml @@ -3,7 +3,7 @@ jetty-project org.eclipse.jetty - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-servlets diff --git a/jetty-spring/pom.xml b/jetty-spring/pom.xml index 90d7827035a..19a9ffe6a94 100644 --- a/jetty-spring/pom.xml +++ b/jetty-spring/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-spring diff --git a/jetty-start/pom.xml b/jetty-start/pom.xml index 4882b6c330a..240f52b481d 100644 --- a/jetty-start/pom.xml +++ b/jetty-start/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-start diff --git a/jetty-util-ajax/pom.xml b/jetty-util-ajax/pom.xml index a56ba465c68..bd0e74bb9c4 100644 --- a/jetty-util-ajax/pom.xml +++ b/jetty-util-ajax/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-util-ajax diff --git a/jetty-util/pom.xml b/jetty-util/pom.xml index 71eb2603cf4..94dc2134298 100644 --- a/jetty-util/pom.xml +++ b/jetty-util/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-util diff --git a/jetty-webapp/pom.xml b/jetty-webapp/pom.xml index b485c8a8aaf..504bbfa2fe7 100644 --- a/jetty-webapp/pom.xml +++ b/jetty-webapp/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-webapp diff --git a/jetty-websocket/javax-websocket-client-impl/pom.xml b/jetty-websocket/javax-websocket-client-impl/pom.xml index f2e36e2e91e..e1d0b49ed23 100644 --- a/jetty-websocket/javax-websocket-client-impl/pom.xml +++ b/jetty-websocket/javax-websocket-client-impl/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.websocket websocket-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-websocket/javax-websocket-server-impl/pom.xml b/jetty-websocket/javax-websocket-server-impl/pom.xml index 63728e8aef6..0d5f697b995 100644 --- a/jetty-websocket/javax-websocket-server-impl/pom.xml +++ b/jetty-websocket/javax-websocket-server-impl/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.websocket websocket-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-websocket/pom.xml b/jetty-websocket/pom.xml index b7b48777f5c..92f98b394e2 100644 --- a/jetty-websocket/pom.xml +++ b/jetty-websocket/pom.xml @@ -3,7 +3,7 @@ jetty-project org.eclipse.jetty - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-websocket/websocket-api/pom.xml b/jetty-websocket/websocket-api/pom.xml index 2b0d87522f0..e6aef3dd990 100644 --- a/jetty-websocket/websocket-api/pom.xml +++ b/jetty-websocket/websocket-api/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.websocket websocket-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-websocket/websocket-client/pom.xml b/jetty-websocket/websocket-client/pom.xml index c71df2d9806..f3b3ec5e1ac 100644 --- a/jetty-websocket/websocket-client/pom.xml +++ b/jetty-websocket/websocket-client/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.websocket websocket-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-websocket/websocket-common/pom.xml b/jetty-websocket/websocket-common/pom.xml index ac6f0b24e2c..8cbaebd097b 100644 --- a/jetty-websocket/websocket-common/pom.xml +++ b/jetty-websocket/websocket-common/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.websocket websocket-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-websocket/websocket-server/pom.xml b/jetty-websocket/websocket-server/pom.xml index 66dc506c1a7..66efe54b4aa 100644 --- a/jetty-websocket/websocket-server/pom.xml +++ b/jetty-websocket/websocket-server/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.websocket websocket-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-websocket/websocket-servlet/pom.xml b/jetty-websocket/websocket-servlet/pom.xml index 9bacf5dad33..a1317a79739 100644 --- a/jetty-websocket/websocket-servlet/pom.xml +++ b/jetty-websocket/websocket-servlet/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.websocket websocket-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/jetty-xml/pom.xml b/jetty-xml/pom.xml index 17ecdcbf700..939ae306f4a 100644 --- a/jetty-xml/pom.xml +++ b/jetty-xml/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jetty-xml diff --git a/pom.xml b/pom.xml index bc46720de4a..6d8e037cd2d 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 25 jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT Jetty :: Project http://www.eclipse.org/jetty pom diff --git a/tests/pom.xml b/tests/pom.xml index 1db2e881ce4..62d4e5d3c76 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty jetty-project - 9.3.8.RC0 + 9.3.8-SNAPSHOT ../pom.xml org.eclipse.jetty.tests diff --git a/tests/test-continuation/pom.xml b/tests/test-continuation/pom.xml index 5656a07f351..b818d49e72a 100644 --- a/tests/test-continuation/pom.xml +++ b/tests/test-continuation/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT ../pom.xml 4.0.0 diff --git a/tests/test-http-client-transport/pom.xml b/tests/test-http-client-transport/pom.xml index 9eb1db984e8..dfa33d013ab 100644 --- a/tests/test-http-client-transport/pom.xml +++ b/tests/test-http-client-transport/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 diff --git a/tests/test-integration/pom.xml b/tests/test-integration/pom.xml index 597fc80b45d..47812321c4f 100644 --- a/tests/test-integration/pom.xml +++ b/tests/test-integration/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 test-integration diff --git a/tests/test-jmx/jmx-webapp-it/pom.xml b/tests/test-jmx/jmx-webapp-it/pom.xml index 88abccdebaf..58a6f650baf 100644 --- a/tests/test-jmx/jmx-webapp-it/pom.xml +++ b/tests/test-jmx/jmx-webapp-it/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jetty.tests test-jmx-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 jmx-webapp-it diff --git a/tests/test-jmx/jmx-webapp/pom.xml b/tests/test-jmx/jmx-webapp/pom.xml index 987cffb5a62..e7e30d95e62 100644 --- a/tests/test-jmx/jmx-webapp/pom.xml +++ b/tests/test-jmx/jmx-webapp/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-jmx-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT jmx-webapp war diff --git a/tests/test-jmx/pom.xml b/tests/test-jmx/pom.xml index 9248d472171..27a406afc2a 100644 --- a/tests/test-jmx/pom.xml +++ b/tests/test-jmx/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT 4.0.0 test-jmx-parent diff --git a/tests/test-loginservice/pom.xml b/tests/test-loginservice/pom.xml index 0e0343d134a..b4323401eee 100644 --- a/tests/test-loginservice/pom.xml +++ b/tests/test-loginservice/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT test-loginservice Jetty Tests :: Login Service diff --git a/tests/test-quickstart/pom.xml b/tests/test-quickstart/pom.xml index d6682f6a10d..5283a46dcb6 100644 --- a/tests/test-quickstart/pom.xml +++ b/tests/test-quickstart/pom.xml @@ -2,7 +2,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT ../pom.xml 4.0.0 diff --git a/tests/test-sessions/pom.xml b/tests/test-sessions/pom.xml index e3b3348d328..88f20732671 100644 --- a/tests/test-sessions/pom.xml +++ b/tests/test-sessions/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT test-sessions-parent Jetty Tests :: Sessions :: Parent diff --git a/tests/test-sessions/test-gcloud-sessions/pom.xml b/tests/test-sessions/test-gcloud-sessions/pom.xml index e7808549e49..3ba8d5cb96e 100644 --- a/tests/test-sessions/test-gcloud-sessions/pom.xml +++ b/tests/test-sessions/test-gcloud-sessions/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-sessions-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT test-gcloud-sessions Jetty Tests :: Sessions :: GCloud diff --git a/tests/test-sessions/test-hash-sessions/pom.xml b/tests/test-sessions/test-hash-sessions/pom.xml index 3192b547e8a..cd1b9845553 100644 --- a/tests/test-sessions/test-hash-sessions/pom.xml +++ b/tests/test-sessions/test-hash-sessions/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-sessions-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT test-hash-sessions Jetty Tests :: Sessions :: Hash diff --git a/tests/test-sessions/test-infinispan-sessions/pom.xml b/tests/test-sessions/test-infinispan-sessions/pom.xml index 82b0f971e8c..76c9ecc593b 100644 --- a/tests/test-sessions/test-infinispan-sessions/pom.xml +++ b/tests/test-sessions/test-infinispan-sessions/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-sessions-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT test-infinispan-sessions Jetty Tests :: Sessions :: Infinispan diff --git a/tests/test-sessions/test-jdbc-sessions/pom.xml b/tests/test-sessions/test-jdbc-sessions/pom.xml index d04cede69d8..639e36b8788 100644 --- a/tests/test-sessions/test-jdbc-sessions/pom.xml +++ b/tests/test-sessions/test-jdbc-sessions/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-sessions-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT test-jdbc-sessions Jetty Tests :: Sessions :: JDBC diff --git a/tests/test-sessions/test-mongodb-sessions/pom.xml b/tests/test-sessions/test-mongodb-sessions/pom.xml index 78aba072659..1e35fdf94af 100644 --- a/tests/test-sessions/test-mongodb-sessions/pom.xml +++ b/tests/test-sessions/test-mongodb-sessions/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-sessions-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT test-mongodb-sessions Jetty Tests :: Sessions :: Mongo diff --git a/tests/test-sessions/test-sessions-common/pom.xml b/tests/test-sessions/test-sessions-common/pom.xml index 96f7ab4b1ef..f909f67690e 100644 --- a/tests/test-sessions/test-sessions-common/pom.xml +++ b/tests/test-sessions/test-sessions-common/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-sessions-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT test-sessions-common Jetty Tests :: Sessions :: Common diff --git a/tests/test-webapps/pom.xml b/tests/test-webapps/pom.xml index 190e863b96f..90bda2a00d0 100644 --- a/tests/test-webapps/pom.xml +++ b/tests/test-webapps/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests tests-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT ../pom.xml test-webapps-parent diff --git a/tests/test-webapps/test-jaas-webapp/pom.xml b/tests/test-webapps/test-jaas-webapp/pom.xml index ea6e0b4d138..843b89f8177 100644 --- a/tests/test-webapps/test-jaas-webapp/pom.xml +++ b/tests/test-webapps/test-jaas-webapp/pom.xml @@ -4,7 +4,7 @@ org.eclipse.jetty.tests test-webapps-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT test-jaas-webapp Jetty Tests :: WebApp :: JAAS diff --git a/tests/test-webapps/test-jetty-webapp/pom.xml b/tests/test-webapps/test-jetty-webapp/pom.xml index 3f6e19f14c5..4568dbcd62b 100644 --- a/tests/test-webapps/test-jetty-webapp/pom.xml +++ b/tests/test-webapps/test-jetty-webapp/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jetty.tests test-webapps-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT ../pom.xml 4.0.0 diff --git a/tests/test-webapps/test-jndi-webapp/pom.xml b/tests/test-webapps/test-jndi-webapp/pom.xml index 4fad43d6c94..a75983a0b1d 100644 --- a/tests/test-webapps/test-jndi-webapp/pom.xml +++ b/tests/test-webapps/test-jndi-webapp/pom.xml @@ -4,7 +4,7 @@ org.eclipse.jetty.tests test-webapps-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT test-jndi-webapp Jetty Tests :: WebApp :: JNDI diff --git a/tests/test-webapps/test-mock-resources/pom.xml b/tests/test-webapps/test-mock-resources/pom.xml index baf8edb17c5..fdd2036196b 100644 --- a/tests/test-webapps/test-mock-resources/pom.xml +++ b/tests/test-webapps/test-mock-resources/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.tests test-webapps-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT Jetty Tests :: WebApp :: Mock Resources test-mock-resources diff --git a/tests/test-webapps/test-proxy-webapp/pom.xml b/tests/test-webapps/test-proxy-webapp/pom.xml index fe53385c766..e26ac325fea 100644 --- a/tests/test-webapps/test-proxy-webapp/pom.xml +++ b/tests/test-webapps/test-proxy-webapp/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jetty.tests test-webapps-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT ../pom.xml 4.0.0 diff --git a/tests/test-webapps/test-servlet-spec/pom.xml b/tests/test-webapps/test-servlet-spec/pom.xml index a3e6318655b..373365cc7f8 100644 --- a/tests/test-webapps/test-servlet-spec/pom.xml +++ b/tests/test-webapps/test-servlet-spec/pom.xml @@ -4,7 +4,7 @@ org.eclipse.jetty.tests test-webapps-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT test-servlet-spec-parent Jetty Tests :: Spec Test WebApp :: Parent diff --git a/tests/test-webapps/test-servlet-spec/test-container-initializer/pom.xml b/tests/test-webapps/test-servlet-spec/test-container-initializer/pom.xml index c4aa064527b..27f6d728205 100644 --- a/tests/test-webapps/test-servlet-spec/test-container-initializer/pom.xml +++ b/tests/test-webapps/test-servlet-spec/test-container-initializer/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.tests test-servlet-spec-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT test-container-initializer jar diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml b/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml index 415c97fe61b..22df2ea7b92 100644 --- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml +++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml @@ -4,7 +4,7 @@ org.eclipse.jetty.tests test-servlet-spec-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT Jetty Tests :: Webapps :: Spec Webapp test-spec-webapp diff --git a/tests/test-webapps/test-servlet-spec/test-web-fragment/pom.xml b/tests/test-webapps/test-servlet-spec/test-web-fragment/pom.xml index aff6453acfd..fc42d6984ed 100644 --- a/tests/test-webapps/test-servlet-spec/test-web-fragment/pom.xml +++ b/tests/test-webapps/test-servlet-spec/test-web-fragment/pom.xml @@ -3,7 +3,7 @@ org.eclipse.jetty.tests test-servlet-spec-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT Jetty Tests :: WebApp :: Servlet Spec :: Fragment Jar org.eclipse.jetty.tests diff --git a/tests/test-webapps/test-webapp-rfc2616/pom.xml b/tests/test-webapps/test-webapp-rfc2616/pom.xml index 3374b9ae981..09b94c0c142 100644 --- a/tests/test-webapps/test-webapp-rfc2616/pom.xml +++ b/tests/test-webapps/test-webapp-rfc2616/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jetty.tests test-webapps-parent - 9.3.8.RC0 + 9.3.8-SNAPSHOT test-webapp-rfc2616 Jetty Tests :: WebApp :: RFC2616 From 65b11654c5635a0da71add52bb9e2f374ef451b1 Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Mon, 29 Feb 2016 11:56:49 +0100 Subject: [PATCH 03/15] Improved logging. --- .../http2/server/HttpTransportOverHTTP2.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpTransportOverHTTP2.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpTransportOverHTTP2.java index d12425210dc..162023d6b3a 100644 --- a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpTransportOverHTTP2.java +++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpTransportOverHTTP2.java @@ -106,7 +106,7 @@ public class HttpTransportOverHTTP2 implements HttpTransport public void succeeded() { if (LOG.isDebugEnabled()) - LOG.debug("HTTP2 Response #{} committed", stream.getId()); + LOG.debug("HTTP2 Response #{}/{} committed", stream.getId(), Integer.toHexString(stream.getSession().hashCode())); send(content, lastContent, callback); } @@ -114,7 +114,7 @@ public class HttpTransportOverHTTP2 implements HttpTransport public void failed(Throwable x) { if (LOG.isDebugEnabled()) - LOG.debug("HTTP2 Response #" + stream.getId() + " failed to commit", x); + LOG.debug("HTTP2 Response #" + stream.getId() + "/" + Integer.toHexString(stream.getSession().hashCode()) + " failed to commit", x); callback.failed(x); } }); @@ -159,7 +159,7 @@ public class HttpTransportOverHTTP2 implements HttpTransport } if (LOG.isDebugEnabled()) - LOG.debug("HTTP/2 Push {}",request); + LOG.debug("HTTP/2 Push {}", request); stream.push(new PushPromiseFrame(stream.getId(), 0, request), new Promise() { @@ -182,8 +182,9 @@ public class HttpTransportOverHTTP2 implements HttpTransport { if (LOG.isDebugEnabled()) { - LOG.debug("HTTP2 Response #{}:{}{} {}{}{}", - stream.getId(), System.lineSeparator(), HttpVersion.HTTP_2, info.getStatus(), + LOG.debug("HTTP2 Response #{}/{}:{}{} {}{}{}", + stream.getId(), Integer.toHexString(stream.getSession().hashCode()), + System.lineSeparator(), HttpVersion.HTTP_2, info.getStatus(), System.lineSeparator(), info.getFields()); } @@ -195,8 +196,9 @@ public class HttpTransportOverHTTP2 implements HttpTransport { if (LOG.isDebugEnabled()) { - LOG.debug("HTTP2 Response #{}: {} content bytes{}", - stream.getId(), content.remaining(), lastContent ? " (last chunk)" : ""); + LOG.debug("HTTP2 Response #{}/{}: {} content bytes{}", + stream.getId(), Integer.toHexString(stream.getSession().hashCode()), + content.remaining(), lastContent ? " (last chunk)" : ""); } DataFrame frame = new DataFrame(stream.getId(), content, lastContent); stream.data(frame, callback); @@ -222,7 +224,8 @@ public class HttpTransportOverHTTP2 implements HttpTransport { IStream stream = this.stream; if (LOG.isDebugEnabled()) - LOG.debug("HTTP2 Response #{} aborted", stream == null ? -1 : stream.getId()); + LOG.debug("HTTP2 Response #{}/{} aborted", stream == null ? -1 : stream.getId(), + stream == null ? -1 : Integer.toHexString(stream.getSession().hashCode())); if (stream != null) stream.reset(new ResetFrame(stream.getId(), ErrorCode.INTERNAL_ERROR.code), Callback.NOOP); } From 8aa32071646e7a31101a91e69ff1bdda2464eec4 Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Mon, 29 Feb 2016 11:58:08 +0100 Subject: [PATCH 04/15] Improved test by making requests carry a unique identifier. --- .../org/eclipse/jetty/http/client/HttpClientLoadTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientLoadTest.java b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientLoadTest.java index a66c9b4b6e3..6a16b533b09 100644 --- a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientLoadTest.java +++ b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientLoadTest.java @@ -71,6 +71,7 @@ import static org.junit.Assert.assertThat; public class HttpClientLoadTest extends AbstractTest { private final Logger logger = Log.getLogger(HttpClientLoadTest.class); + private final AtomicLong requestCount = new AtomicLong(); private final AtomicLong connectionLeaks = new AtomicLong(); public HttpClientLoadTest(Transport transport) @@ -236,7 +237,7 @@ public class HttpClientLoadTest extends AbstractTest logger.info("{} requests in {} ms, {} req/s", iterations, elapsed, elapsed > 0 ? iterations * 1000 / elapsed : -1); for (String failure : failures) - System.err.println("FAILED: "+failure); + logger.info("FAILED: {}", failure); Assert.assertTrue(failures.toString(), failures.isEmpty()); } @@ -267,8 +268,10 @@ public class HttpClientLoadTest extends AbstractTest private void test(String scheme, String host, String method, boolean clientClose, boolean serverClose, int contentLength, final boolean checkContentLength, final CountDownLatch latch, final List failures) { + long requestId = requestCount.incrementAndGet(); Request request = client.newRequest(host, connector.getLocalPort()) .scheme(scheme) + .path("/" + requestId) .method(method); if (clientClose) @@ -326,7 +329,8 @@ public class HttpClientLoadTest extends AbstractTest latch.countDown(); } }); - await(requestLatch, 5, TimeUnit.SECONDS); + if (!await(requestLatch, 5, TimeUnit.SECONDS)) + logger.warn("Request {} took too long", requestId); } private boolean await(CountDownLatch latch, long time, TimeUnit unit) From aa6de825b7fb28384c58ff959a4d2703cf7a1cd0 Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Mon, 29 Feb 2016 14:02:17 +0100 Subject: [PATCH 05/15] Issue #372 (Data race in HttpReceiverOverHTTP2) Fixed by copying the buffer passed to onData(). --- .../client/http/HttpReceiverOverHTTP2.java | 39 ++++++++++++++++++- .../http2/server/HttpChannelOverHTTP2.java | 7 ++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java index 21f5bb39b5a..f9d2648929a 100644 --- a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java +++ b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java @@ -19,6 +19,7 @@ package org.eclipse.jetty.http2.client.http; import java.io.IOException; +import java.nio.ByteBuffer; import java.util.Locale; import org.eclipse.jetty.client.HttpChannel; @@ -34,6 +35,8 @@ import org.eclipse.jetty.http2.frames.DataFrame; import org.eclipse.jetty.http2.frames.HeadersFrame; import org.eclipse.jetty.http2.frames.PushPromiseFrame; import org.eclipse.jetty.http2.frames.ResetFrame; +import org.eclipse.jetty.io.ByteBufferPool; +import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.Callback; public class HttpReceiverOverHTTP2 extends HttpReceiver implements Stream.Listener @@ -95,7 +98,41 @@ public class HttpReceiverOverHTTP2 extends HttpReceiver implements Stream.Listen return; } - if (responseContent(exchange, frame.getData(), callback)) + // We must copy the data since we do not know when the + // application will consume the bytes and the parsing + // will continue as soon as this method returns, eventually + // leading to reusing the underlying buffer for more reads. + ByteBufferPool byteBufferPool = getHttpDestination().getHttpClient().getByteBufferPool(); + ByteBuffer original = frame.getData(); + int length = original.remaining(); + final ByteBuffer copy = byteBufferPool.acquire(length, original.isDirect()); + BufferUtil.clearToFill(copy); + copy.put(original).flip(); + + Callback delegate = new Callback() + { + @Override + public boolean isNonBlocking() + { + return callback.isNonBlocking(); + } + + @Override + public void succeeded() + { + byteBufferPool.release(copy); + callback.succeeded(); + } + + @Override + public void failed(Throwable x) + { + byteBufferPool.release(copy); + callback.failed(x); + } + }; + + if (responseContent(exchange, copy, delegate)) { if (frame.isEndStream()) responseSuccess(exchange); diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpChannelOverHTTP2.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpChannelOverHTTP2.java index 2c9451c426a..ecfc95fee96 100644 --- a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpChannelOverHTTP2.java +++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpChannelOverHTTP2.java @@ -164,9 +164,10 @@ public class HttpChannelOverHTTP2 extends HttpChannel public Runnable requestContent(DataFrame frame, final Callback callback) { // We must copy the data since we do not know when the - // application will consume its bytes (we queue them by - // calling onContent()), and we cannot stop the parsing - // since there may be frames for other streams. + // application will consume the bytes (we queue them by + // calling onContent()), and the parsing will continue + // as soon as this method returns, eventually leading + // to reusing the underlying buffer for more reads. final ByteBufferPool byteBufferPool = getByteBufferPool(); ByteBuffer original = frame.getData(); int length = original.remaining(); From b8fcc5112fcc3ef315e53ddf67931a7fb2764870 Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Mon, 29 Feb 2016 14:39:27 +0100 Subject: [PATCH 06/15] Issue #372 (Data race in HttpReceiverOverHTTP2) Fixed implementations of onData() to properly complete the callback and to copy the data if they use it asynchronously. --- .../org/eclipse/jetty/http2/client/IdleTimeoutTest.java | 1 + .../eclipse/jetty/http2/client/PushCacheFilterTest.java | 8 ++++++++ .../org/eclipse/jetty/http2/client/StreamCloseTest.java | 8 +++++++- .../org/eclipse/jetty/http2/client/StreamCountTest.java | 8 ++++++++ .../org/eclipse/jetty/http2/client/StreamResetTest.java | 2 ++ 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/IdleTimeoutTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/IdleTimeoutTest.java index ef39cde87a6..1466c300132 100644 --- a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/IdleTimeoutTest.java +++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/IdleTimeoutTest.java @@ -357,6 +357,7 @@ public class IdleTimeoutTest extends AbstractTest @Override public void onData(Stream stream, DataFrame frame, Callback callback) { + callback.succeeded(); dataLatch.countDown(); } diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PushCacheFilterTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PushCacheFilterTest.java index 5258127bb48..9b796108397 100644 --- a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PushCacheFilterTest.java +++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PushCacheFilterTest.java @@ -101,6 +101,7 @@ public class PushCacheFilterTest extends AbstractTest @Override public void onData(Stream stream, DataFrame frame, Callback callback) { + callback.succeeded(); warmupLatch.countDown(); } }); @@ -188,6 +189,7 @@ public class PushCacheFilterTest extends AbstractTest @Override public void onData(Stream stream, DataFrame frame, Callback callback) { + callback.succeeded(); warmupLatch.countDown(); } }); @@ -273,6 +275,7 @@ public class PushCacheFilterTest extends AbstractTest @Override public void onData(Stream stream, DataFrame frame, Callback callback) { + callback.succeeded(); warmupLatch.countDown(); } }); @@ -298,6 +301,7 @@ public class PushCacheFilterTest extends AbstractTest @Override public void onData(Stream stream, DataFrame frame, Callback callback) { + callback.succeeded(); pushLatch.countDown(); } }; @@ -325,6 +329,7 @@ public class PushCacheFilterTest extends AbstractTest @Override public void onData(Stream stream, DataFrame frame, Callback callback) { + callback.succeeded(); if (frame.isEndStream()) secondaryResponseLatch.countDown(); } @@ -372,6 +377,7 @@ public class PushCacheFilterTest extends AbstractTest @Override public void onData(Stream stream, DataFrame frame, Callback callback) { + callback.succeeded(); warmupLatch.countDown(); } }); @@ -655,6 +661,7 @@ public class PushCacheFilterTest extends AbstractTest @Override public void onData(Stream stream, DataFrame frame, Callback callback) { + callback.succeeded(); if (frame.isEndStream()) warmupLatch.countDown(); } @@ -676,6 +683,7 @@ public class PushCacheFilterTest extends AbstractTest @Override public void onData(Stream stream, DataFrame frame, Callback callback) { + callback.succeeded(); if (frame.isEndStream()) primaryResponseLatch.countDown(); } diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCloseTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCloseTest.java index 72a63922482..f154b201dfd 100644 --- a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCloseTest.java +++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCloseTest.java @@ -129,7 +129,12 @@ public class StreamCloseTest extends AbstractTest public void onData(final Stream stream, DataFrame frame, final Callback callback) { Assert.assertTrue(((HTTP2Stream)stream).isRemotelyClosed()); - stream.data(frame, new Callback() + + // We must copy the data that we send asynchronously. + ByteBuffer data = frame.getData(); + ByteBuffer copy = ByteBuffer.allocate(data.remaining()); + copy.put(data).flip(); + stream.data(new DataFrame(stream.getId(), copy, frame.isEndStream()), new Callback() { @Override public void succeeded() @@ -155,6 +160,7 @@ public class StreamCloseTest extends AbstractTest public void onData(Stream stream, DataFrame frame, Callback callback) { // The sent data callback may not be notified yet here. + callback.succeeded(); completeLatch.countDown(); } }); diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCountTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCountTest.java index b81e9a294e2..efc01cca85c 100644 --- a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCountTest.java +++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCountTest.java @@ -70,6 +70,10 @@ public class StreamCountTest extends AbstractTest MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, fields); stream.headers(new HeadersFrame(stream.getId(), metaData, null, true), callback); } + else + { + callback.succeeded(); + } } }; } @@ -144,6 +148,10 @@ public class StreamCountTest extends AbstractTest MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, fields); stream.headers(new HeadersFrame(stream.getId(), metaData, null, true), callback); } + else + { + callback.succeeded(); + } } }; } diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamResetTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamResetTest.java index ba1923871b0..776cb56bec8 100644 --- a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamResetTest.java +++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamResetTest.java @@ -171,6 +171,7 @@ public class StreamResetTest extends AbstractTest @Override public void onData(Stream stream, DataFrame frame, Callback callback) { + callback.succeeded(); stream1DataLatch.countDown(); } }); @@ -186,6 +187,7 @@ public class StreamResetTest extends AbstractTest @Override public void onData(Stream stream, DataFrame frame, Callback callback) { + callback.succeeded(); stream2DataLatch.countDown(); } }); From cec36943556b58e254404cd3dcc52439314ee840 Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Mon, 29 Feb 2016 16:31:38 +0100 Subject: [PATCH 07/15] Consistently using BufferUtil, especially clearToFill() and flipToFlush(). --- .../jetty/fcgi/generator/ClientGenerator.java | 6 +- .../jetty/fcgi/generator/Generator.java | 2 +- .../jetty/fcgi/generator/ServerGenerator.java | 4 +- .../jetty/http2/client/PrefaceTest.java | 13 ++-- .../client/http/HttpReceiverOverHTTP2.java | 3 +- .../http2/server/HttpChannelOverHTTP2.java | 3 +- .../org/eclipse/jetty/server/HttpOutput.java | 64 +++++++++---------- .../eclipse/jetty/util/BufferUtilTest.java | 47 +++++++------- 8 files changed, 71 insertions(+), 71 deletions(-) diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ClientGenerator.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ClientGenerator.java index c033fa22fe7..e571c9862c6 100644 --- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ClientGenerator.java +++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ClientGenerator.java @@ -89,7 +89,7 @@ public class ClientGenerator extends Generator beginRequestBuffer.putInt(0x00_08_00_00); // Hardcode RESPONDER role and KEEP_ALIVE flag beginRequestBuffer.putLong(0x00_01_01_00_00_00_00_00L); - beginRequestBuffer.flip(); + BufferUtil.flipToFlush(beginRequestBuffer, 0); int index = 0; while (fieldsLength > 0) @@ -129,7 +129,7 @@ public class ClientGenerator extends Generator } buffer.putShort(4, (short)length); - buffer.flip(); + BufferUtil.flipToFlush(buffer, 0); } @@ -140,7 +140,7 @@ public class ClientGenerator extends Generator // Generate the last FCGI_PARAMS frame lastParamsBuffer.putInt(0x01_04_00_00 + request); lastParamsBuffer.putInt(0x00_00_00_00); - lastParamsBuffer.flip(); + BufferUtil.flipToFlush(lastParamsBuffer, 0); return result; } diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/Generator.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/Generator.java index 666a37b8471..bed88cae6a5 100644 --- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/Generator.java +++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/Generator.java @@ -58,7 +58,7 @@ public class Generator int length = Math.min(MAX_CONTENT_LENGTH, contentLength); buffer.putShort((short)length); buffer.putShort((short)0); - buffer.flip(); + BufferUtil.flipToFlush(buffer, 0); if (contentLength == 0) break; diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ServerGenerator.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ServerGenerator.java index 9e75c564784..07e191228a6 100644 --- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ServerGenerator.java +++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ServerGenerator.java @@ -95,7 +95,7 @@ public class ServerGenerator extends Generator buffer.put(bytes.get(i)).put(COLON).put(bytes.get(i + 1)).put(EOL); buffer.put(EOL); - buffer.flip(); + BufferUtil.flipToFlush(buffer, 0); return generateContent(request, buffer, true, false, callback, FCGI.FrameType.STDOUT); } @@ -129,7 +129,7 @@ public class ServerGenerator extends Generator endRequestBuffer.putInt(0x00_08_00_00); endRequestBuffer.putInt(aborted ? 1 : 0); endRequestBuffer.putInt(0); - endRequestBuffer.flip(); + BufferUtil.flipToFlush(endRequestBuffer, 0); return endRequestBuffer; } } diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PrefaceTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PrefaceTest.java index 94e3122209e..b20e8d1f43d 100644 --- a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PrefaceTest.java +++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PrefaceTest.java @@ -53,6 +53,7 @@ import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.util.ArrayQueue; +import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Promise; import org.junit.Assert; @@ -168,12 +169,12 @@ public class PrefaceTest extends AbstractTest ByteBuffer buffer = byteBufferPool.acquire(1024, true); while (true) { + BufferUtil.clearToFill(buffer); int read = socket.read(buffer); - buffer.flip(); + BufferUtil.flipToFlush(buffer, 0); if (read < 0) break; parser.parse(buffer); - buffer.clear(); } Assert.assertEquals(2, settings.size()); @@ -248,9 +249,9 @@ public class PrefaceTest extends AbstractTest ByteBuffer buffer = byteBufferPool.acquire(1024, true); http1: while (true) { - buffer.clear(); + BufferUtil.clearToFill(buffer); int read = socket.read(buffer); - buffer.flip(); + BufferUtil.flipToFlush(buffer, 0); if (read < 0) Assert.fail(); @@ -314,9 +315,9 @@ public class PrefaceTest extends AbstractTest if (responded.get()) break; - buffer.clear(); + BufferUtil.clearToFill(buffer); int read = socket.read(buffer); - buffer.flip(); + BufferUtil.flipToFlush(buffer, 0); if (read < 0) Assert.fail(); } diff --git a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java index f9d2648929a..b092d00dd77 100644 --- a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java +++ b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java @@ -107,7 +107,8 @@ public class HttpReceiverOverHTTP2 extends HttpReceiver implements Stream.Listen int length = original.remaining(); final ByteBuffer copy = byteBufferPool.acquire(length, original.isDirect()); BufferUtil.clearToFill(copy); - copy.put(original).flip(); + copy.put(original); + BufferUtil.flipToFlush(copy, 0); Callback delegate = new Callback() { diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpChannelOverHTTP2.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpChannelOverHTTP2.java index ecfc95fee96..ee98d2179eb 100644 --- a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpChannelOverHTTP2.java +++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpChannelOverHTTP2.java @@ -173,7 +173,8 @@ public class HttpChannelOverHTTP2 extends HttpChannel int length = original.remaining(); final ByteBuffer copy = byteBufferPool.acquire(length, original.isDirect()); BufferUtil.clearToFill(copy); - copy.put(original).flip(); + copy.put(original); + BufferUtil.flipToFlush(copy, 0); boolean handle = onContent(new HttpInput.Content(copy) { diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java index d61c33a06de..d88053916aa 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java @@ -61,16 +61,16 @@ public class HttpOutput extends ServletOutputStream implements Runnable Interceptor getNextInterceptor(); boolean isOptimizedForDirectBuffers(); } - + private static Logger LOG = Log.getLogger(HttpOutput.class); private final HttpChannel _channel; private final SharedBlockingCallback _writeBlock; private Interceptor _interceptor; - + /** Bytes written via the write API (excludes bytes written via sendContent). Used to autocommit once content length is written. */ private long _written; - + private ByteBuffer _aggregate; private int _bufferSize; private int _commitSize; @@ -115,7 +115,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable _commitSize=_bufferSize; } } - + public HttpChannel getHttpChannel() { return _channel; @@ -130,7 +130,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable { _interceptor=filter; } - + public boolean isWritten() { return _written > 0; @@ -155,11 +155,11 @@ public class HttpOutput extends ServletOutputStream implements Runnable { return _writeBlock.acquire(); } - + private void write(ByteBuffer content, boolean complete) throws IOException { try (Blocker blocker = _writeBlock.acquire()) - { + { write(content, complete, blocker); blocker.block(); } @@ -314,7 +314,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable case ERROR: throw new EofException(_onError); - + case CLOSED: return; @@ -378,7 +378,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable case ERROR: throw new EofException(_onError); - + case CLOSED: throw new EofException("Closed"); @@ -480,7 +480,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable case ERROR: throw new EofException(_onError); - + case CLOSED: throw new EofException("Closed"); @@ -562,7 +562,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable case ERROR: throw new EofException(_onError); - + case CLOSED: throw new EofException("Closed"); @@ -592,7 +592,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable { if (LOG.isDebugEnabled()) LOG.debug("sendContent({})",BufferUtil.toDetailString(content)); - + write(content, true); closed(); } @@ -672,7 +672,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable { if (LOG.isDebugEnabled()) LOG.debug("sendContent(buffer={},{})",BufferUtil.toDetailString(content),callback); - + write(content, true, new Callback() { @Override @@ -702,7 +702,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable { if (LOG.isDebugEnabled()) LOG.debug("sendContent(stream={},{})",in,callback); - + new InputStreamWritingCB(in, callback).iterate(); } @@ -717,7 +717,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable { if (LOG.isDebugEnabled()) LOG.debug("sendContent(channel={},{})",in,callback); - + new ReadableByteChannelWritingCB(in, callback).iterate(); } @@ -731,7 +731,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable { if (LOG.isDebugEnabled()) LOG.debug("sendContent(http={},{})",httpContent,callback); - + if (BufferUtil.hasContent(_aggregate)) { callback.failed(new IOException("cannot sendContent() after write()")); @@ -755,7 +755,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable case ERROR: callback.failed(new EofException(_onError)); return; - + case CLOSED: callback.failed(new EofException("Closed")); return; @@ -765,7 +765,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable } break; } - + ByteBuffer buffer = _channel.useDirectBuffers() ? httpContent.getDirectBuffer() : null; if (buffer == null) @@ -819,7 +819,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable resetBuffer(); _interceptor=_channel; } - + public void resetBuffer() { _written = 0; @@ -875,7 +875,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable case ERROR: return true; - + case CLOSED: return true; @@ -918,7 +918,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable } continue; } - + switch(_state.get()) { case CLOSED: @@ -939,7 +939,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable _onError = e; } break; - + default: _onError=new IllegalStateException("state="+_state.get()); } @@ -1062,7 +1062,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable { _slice=_buffer.duplicate(); _buffer.position(_buffer.limit()); - } + } _complete=complete; } @@ -1085,7 +1085,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable BufferUtil.flipToFlush(_aggregate, position); return Action.SUCCEEDED; } - + // Is there data left to write? if (_buffer.hasRemaining()) { @@ -1096,7 +1096,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable write(_buffer, _complete, this); return Action.SCHEDULED; } - + // otherwise take a slice int p=_buffer.position(); int l=Math.min(getBufferSize(),_buffer.remaining()); @@ -1108,7 +1108,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable write(_slice, _complete && _completed, this); return Action.SCHEDULED; } - + // all content written, but if we have not yet signal completion, we // need to do so if (_complete && !_completed) @@ -1168,7 +1168,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable _channel.getByteBufferPool().release(_buffer); return Action.SUCCEEDED; } - + // Read until buffer full or EOF int len=0; while (len<_buffer.capacity() && !_eof) @@ -1218,7 +1218,7 @@ public class HttpOutput extends ServletOutputStream implements Runnable _in=in; _buffer = _channel.getByteBufferPool().acquire(getBufferSize(), _channel.useDirectBuffers()); } - + @Override protected Action process() throws Exception { @@ -1233,16 +1233,16 @@ public class HttpOutput extends ServletOutputStream implements Runnable _channel.getByteBufferPool().release(_buffer); return Action.SUCCEEDED; } - + // Read from stream until buffer full or EOF - _buffer.clear(); + BufferUtil.clearToFill(_buffer); while (_buffer.hasRemaining() && !_eof) _eof = (_in.read(_buffer)) < 0; // write what we have - _buffer.flip(); + BufferUtil.flipToFlush(_buffer, 0); write(_buffer,_eof,this); - + return Action.SCHEDULED; } diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/BufferUtilTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/BufferUtilTest.java index 5df95bff3c3..f187c6c72b2 100644 --- a/jetty-util/src/test/java/org/eclipse/jetty/util/BufferUtilTest.java +++ b/jetty-util/src/test/java/org/eclipse/jetty/util/BufferUtilTest.java @@ -19,22 +19,13 @@ package org.eclipse.jetty.util; -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.nio.BufferOverflowException; import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.channels.FileChannel.MapMode; import java.nio.charset.StandardCharsets; -import java.nio.file.OpenOption; import java.util.Arrays; import java.util.concurrent.ThreadLocalRandom; @@ -44,6 +35,12 @@ import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + public class BufferUtilTest { @Test @@ -159,7 +156,7 @@ public class BufferUtilTest assertEquals(2,from.remaining()); assertEquals("1234567890",BufferUtil.toString(to)); } - + @Test @@ -172,7 +169,7 @@ public class BufferUtilTest assertEquals("123",BufferUtil.toString(to)); BufferUtil.append(to,from.array(),3,2); assertEquals("12345",BufferUtil.toString(to)); - + try { BufferUtil.append(to,from.array(),0,5); @@ -181,7 +178,7 @@ public class BufferUtilTest catch(BufferOverflowException e) {} } - + @Test public void testPutDirect() throws Exception @@ -296,7 +293,7 @@ public class BufferUtilTest int capacity = BufferUtil.TEMP_BUFFER_SIZE*2+1024; testWriteToWithBufferThatDoesNotExposeArray(capacity); } - + @Test public void testEnsureCapacity() throws Exception @@ -305,13 +302,13 @@ public class BufferUtilTest assertTrue(b==BufferUtil.ensureCapacity(b, 0)); assertTrue(b==BufferUtil.ensureCapacity(b, 10)); assertTrue(b==BufferUtil.ensureCapacity(b, b.capacity())); - + ByteBuffer b1 = BufferUtil.ensureCapacity(b, 64); assertTrue(b!=b1); assertEquals(64, b1.capacity()); assertEquals("Goodbye Cruel World", BufferUtil.toString(b1)); - + b1.position(8); b1.limit(13); assertEquals("Cruel", BufferUtil.toString(b1)); @@ -328,9 +325,9 @@ public class BufferUtilTest assertEquals(64, b3.capacity()); assertEquals("Cruel", BufferUtil.toString(b3)); assertEquals(0, b3.arrayOffset()); - + } - + private void testWriteToWithBufferThatDoesNotExposeArray(int capacity) throws IOException { @@ -342,7 +339,7 @@ public class BufferUtilTest BufferUtil.writeTo(buffer.asReadOnlyBuffer(), out); assertThat("Bytes in out equal bytes in buffer", Arrays.equals(bytes, out.toByteArray()), is(true)); } - + @Test public void testMappedFile() throws Exception { @@ -353,26 +350,26 @@ public class BufferUtilTest { out.write(data); } - + ByteBuffer mapped = BufferUtil.toMappedBuffer(file); assertEquals(data,BufferUtil.toString(mapped)); assertTrue(BufferUtil.isMappedBuffer(mapped)); - + ByteBuffer direct = BufferUtil.allocateDirect(data.length()); - direct.clear(); + BufferUtil.clearToFill(direct); direct.put(data.getBytes(StandardCharsets.ISO_8859_1)); - direct.flip(); + BufferUtil.flipToFlush(direct, 0); assertEquals(data,BufferUtil.toString(direct)); assertFalse(BufferUtil.isMappedBuffer(direct)); - + ByteBuffer slice = direct.slice(); assertEquals(data,BufferUtil.toString(slice)); assertFalse(BufferUtil.isMappedBuffer(slice)); - + ByteBuffer duplicate = direct.duplicate(); assertEquals(data,BufferUtil.toString(duplicate)); assertFalse(BufferUtil.isMappedBuffer(duplicate)); - + ByteBuffer readonly = direct.asReadOnlyBuffer(); assertEquals(data,BufferUtil.toString(readonly)); assertFalse(BufferUtil.isMappedBuffer(readonly)); From bd62320285a17a8ec7b13be548aa81e5c82e80de Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Mon, 29 Feb 2016 18:45:30 +0100 Subject: [PATCH 08/15] Issue #360 (Improve HTTP/2 stream interleaving) Fixed by making the interleave quantum be the frame size rather than the flow control window size. Reworked HTTP2Flusher.process() to be simpler and properly interleave frames. --- .../eclipse/jetty/http2/client/HTTP2Test.java | 50 ++++ .../jetty/http2/client/InterleavingTest.java | 231 ++++++++++++++++++ .../jetty/http2/client/StreamCloseTest.java | 31 ++- .../org/eclipse/jetty/http2/HTTP2Flusher.java | 192 +++++++-------- .../org/eclipse/jetty/http2/HTTP2Session.java | 90 +++---- .../jetty/http2/generator/DataGenerator.java | 38 ++- .../jetty/http2/generator/Generator.java | 4 +- .../http2/frames/DataGenerateParseTest.java | 18 +- 8 files changed, 451 insertions(+), 203 deletions(-) create mode 100644 jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/InterleavingTest.java diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/HTTP2Test.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/HTTP2Test.java index 5ec01772d4b..a32d6686cec 100644 --- a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/HTTP2Test.java +++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/HTTP2Test.java @@ -88,6 +88,56 @@ public class HTTP2Test extends AbstractTest Assert.assertTrue(latch.await(5, TimeUnit.SECONDS)); } + @Test + public void testRequestNoContentResponseEmptyContent() throws Exception + { + start(new ServerSessionListener.Adapter() + { + @Override + public Stream.Listener onNewStream(Stream stream, HeadersFrame frame) + { + MetaData.Response response = new MetaData.Response(HttpVersion.HTTP_2, HttpStatus.OK_200, new HttpFields()); + stream.headers(new HeadersFrame(stream.getId(), response, null, false), new Callback() + { + @Override + public void succeeded() + { + stream.data(new DataFrame(stream.getId(), BufferUtil.EMPTY_BUFFER, true), NOOP); + } + }); + return null; + } + }); + + Session session = newClient(new Session.Listener.Adapter()); + + HttpFields fields = new HttpFields(); + MetaData.Request metaData = newRequest("GET", fields); + HeadersFrame frame = new HeadersFrame(metaData, null, true); + final CountDownLatch latch = new CountDownLatch(1); + session.newStream(frame, new Promise.Adapter<>(), new Stream.Listener.Adapter() + { + @Override + public void onHeaders(Stream stream, HeadersFrame frame) + { + Assert.assertFalse(frame.isEndStream()); + Assert.assertEquals(stream.getId(), frame.getStreamId()); + MetaData.Response response = (MetaData.Response)frame.getMetaData(); + Assert.assertEquals(200, response.getStatus()); + } + + @Override + public void onData(Stream stream, DataFrame frame, Callback callback) + { + Assert.assertTrue(frame.isEndStream()); + callback.succeeded(); + latch.countDown(); + } + }); + + Assert.assertTrue(latch.await(5, TimeUnit.SECONDS)); + } + @Test public void testRequestNoContentResponseContent() throws Exception { diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/InterleavingTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/InterleavingTest.java new file mode 100644 index 00000000000..d64b521f2b1 --- /dev/null +++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/InterleavingTest.java @@ -0,0 +1,231 @@ +// +// ======================================================================== +// Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// 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.http2.client; + +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.TimeUnit; + +import org.eclipse.jetty.http.HttpFields; +import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.http.HttpVersion; +import org.eclipse.jetty.http.MetaData; +import org.eclipse.jetty.http2.ISession; +import org.eclipse.jetty.http2.api.Session; +import org.eclipse.jetty.http2.api.Stream; +import org.eclipse.jetty.http2.api.server.ServerSessionListener; +import org.eclipse.jetty.http2.frames.DataFrame; +import org.eclipse.jetty.http2.frames.Frame; +import org.eclipse.jetty.http2.frames.HeadersFrame; +import org.eclipse.jetty.http2.frames.SettingsFrame; +import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.FuturePromise; +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Logger; +import org.hamcrest.Matchers; +import org.junit.Assert; +import org.junit.Test; + +public class InterleavingTest extends AbstractTest +{ + @Test + public void testInterleaving() throws Exception + { + CountDownLatch serverStreamsLatch = new CountDownLatch(2); + List serverStreams = new ArrayList<>(); + start(new ServerSessionListener.Adapter() + { + @Override + public Stream.Listener onNewStream(Stream stream, HeadersFrame frame) + { + serverStreams.add(stream); + serverStreamsLatch.countDown(); + return null; + } + }); + + int maxFrameSize = Frame.DEFAULT_MAX_LENGTH + 1; + Session session = newClient(new Session.Listener.Adapter() + { + @Override + public Map onPreface(Session session) + { + Map settings = new HashMap<>(); + settings.put(SettingsFrame.MAX_FRAME_SIZE, maxFrameSize); + return settings; + } + }); + + BlockingQueue dataFrames = new LinkedBlockingDeque<>(); + Stream.Listener streamListener = new Stream.Listener.Adapter() + { + @Override + public void onData(Stream stream, DataFrame frame, Callback callback) + { + ByteBuffer data = frame.getData(); + byte[] bytes = new byte[data.remaining()]; + data.get(bytes); + dataFrames.offer(new FrameBytesCallback(frame, bytes, callback)); + } + }; + + HeadersFrame headersFrame1 = new HeadersFrame(newRequest("GET", new HttpFields()), null, true); + FuturePromise streamPromise1 = new FuturePromise<>(); + session.newStream(headersFrame1, streamPromise1, streamListener); + streamPromise1.get(5, TimeUnit.SECONDS); + + HeadersFrame headersFrame2 = new HeadersFrame(newRequest("GET", new HttpFields()), null, true); + FuturePromise streamPromise2 = new FuturePromise<>(); + session.newStream(headersFrame2, streamPromise2, streamListener); + streamPromise2.get(5, TimeUnit.SECONDS); + + Assert.assertTrue(serverStreamsLatch.await(5, TimeUnit.SECONDS)); + + Thread.sleep(1000); + + Stream serverStream1 = serverStreams.get(0); + Stream serverStream2 = serverStreams.get(1); + MetaData.Response response1 = new MetaData.Response(HttpVersion.HTTP_2, HttpStatus.OK_200, new HttpFields(), 0); + serverStream1.headers(new HeadersFrame(serverStream1.getId(), response1, null, false), Callback.NOOP); + + Random random = new Random(); + byte[] content1 = new byte[2 * ((ISession)serverStream1.getSession()).updateSendWindow(0)]; + random.nextBytes(content1); + byte[] content2 = new byte[2 * ((ISession)serverStream2.getSession()).updateSendWindow(0)]; + random.nextBytes(content2); + + MetaData.Response response2 = new MetaData.Response(HttpVersion.HTTP_2, HttpStatus.OK_200, new HttpFields(), 0); + serverStream2.headers(new HeadersFrame(serverStream2.getId(), response2, null, false), new Callback() + { + @Override + public void succeeded() + { + // Write data for both streams from within the callback so that they get queued together. + + ByteBuffer buffer1 = ByteBuffer.wrap(content1); + serverStream1.data(new DataFrame(serverStream1.getId(), buffer1, true), NOOP); + + ByteBuffer buffer2 = ByteBuffer.wrap(content2); + serverStream2.data(new DataFrame(serverStream2.getId(), buffer2, true), NOOP); + } + }); + + // The client reads with a buffer size that is different from the + // frame size and synthesizes DATA frames, so expect N frames for + // stream1 up to maxFrameSize of data, then M frames for stream2 + // up to maxFrameSize of data, and so forth, interleaved. + + Map contents = new HashMap<>(); + contents.put(serverStream1.getId(), new ByteArrayOutputStream()); + contents.put(serverStream2.getId(), new ByteArrayOutputStream()); + List streamLengths = new ArrayList<>(); + int finished = 0; + while (finished < 2) + { + FrameBytesCallback frameBytesCallback = dataFrames.poll(5, TimeUnit.SECONDS); + if (frameBytesCallback == null) + Assert.fail(); + + DataFrame dataFrame = frameBytesCallback.frame; + int streamId = dataFrame.getStreamId(); + int length = dataFrame.remaining(); + streamLengths.add(new StreamLength(streamId, length)); + if (dataFrame.isEndStream()) + ++finished; + + contents.get(streamId).write(frameBytesCallback.bytes); + + frameBytesCallback.callback.succeeded(); + } + + // Verify that the content has been sent properly. + Assert.assertArrayEquals(content1, contents.get(serverStream1.getId()).toByteArray()); + Assert.assertArrayEquals(content2, contents.get(serverStream2.getId()).toByteArray()); + + // Verify that the interleaving is correct. + Map> groups = new HashMap<>(); + groups.put(serverStream1.getId(), new ArrayList<>()); + groups.put(serverStream2.getId(), new ArrayList<>()); + int currentStream = 0; + int currentLength = 0; + for (StreamLength streamLength : streamLengths) + { + if (currentStream == 0) + currentStream = streamLength.stream; + if (currentStream != streamLength.stream) + { + groups.get(currentStream).add(currentLength); + currentStream = streamLength.stream; + currentLength = 0; + } + currentLength += streamLength.length; + } + groups.get(currentStream).add(currentLength); + + Logger logger = Log.getLogger(getClass()); + logger.debug("frame lengths = {}", streamLengths); + + groups.forEach((stream, lengths) -> + { + logger.debug("stream {} interleaved lengths = {}", stream, lengths); + for (Integer length : lengths) + Assert.assertThat(length, Matchers.lessThanOrEqualTo(maxFrameSize)); + }); + } + + private static class FrameBytesCallback + { + private final DataFrame frame; + private final byte[] bytes; + private final Callback callback; + + private FrameBytesCallback(DataFrame frame, byte[] bytes, Callback callback) + { + this.frame = frame; + this.bytes = bytes; + this.callback = callback; + } + } + + private static class StreamLength + { + private final int stream; + private final int length; + + private StreamLength(int stream, int length) + { + this.stream = stream; + this.length = length; + } + + @Override + public String toString() + { + return String.format("(%d,%d)", stream, length); + } + } +} diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCloseTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCloseTest.java index 9f0590f0dbb..ebe47c2fc23 100644 --- a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCloseTest.java +++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCloseTest.java @@ -131,24 +131,23 @@ public class StreamCloseTest extends AbstractTest { Assert.assertTrue(((HTTP2Stream)stream).isRemotelyClosed()); + // We must copy the data that we send asynchronously. + ByteBuffer data = frame.getData(); + ByteBuffer copy = ByteBuffer.allocate(data.remaining()); + copy.put(data).flip(); + completable.thenRun(() -> - { - // We must copy the data that we send asynchronously. - ByteBuffer data = frame.getData(); - ByteBuffer copy = ByteBuffer.allocate(data.remaining()); - copy.put(data).flip(); - stream.data(new DataFrame(stream.getId(), copy, frame.isEndStream()), new Callback() - { - @Override - public void succeeded() + stream.data(new DataFrame(stream.getId(), copy, frame.isEndStream()), new Callback() { - Assert.assertTrue(stream.isClosed()); - Assert.assertEquals(0, stream.getSession().getStreams().size()); - callback.succeeded(); - serverDataLatch.countDown(); - } - }); - }); + @Override + public void succeeded() + { + Assert.assertTrue(stream.isClosed()); + Assert.assertEquals(0, stream.getSession().getStreams().size()); + callback.succeeded(); + serverDataLatch.countDown(); + } + })); } }; } diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Flusher.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Flusher.java index 9ddd316d8b4..55d06b49871 100644 --- a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Flusher.java +++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Flusher.java @@ -22,9 +22,7 @@ import java.nio.ByteBuffer; import java.nio.channels.ClosedChannelException; import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Queue; import org.eclipse.jetty.http2.frames.Frame; @@ -43,11 +41,11 @@ public class HTTP2Flusher extends IteratingCallback private final Queue windows = new ArrayDeque<>(); private final ArrayQueue frames = new ArrayQueue<>(ArrayQueue.DEFAULT_CAPACITY, ArrayQueue.DEFAULT_GROWTH, this); - private final Map streams = new HashMap<>(); - private final List resets = new ArrayList<>(); + private final Queue entries = new ArrayDeque<>(); private final List actives = new ArrayList<>(); private final HTTP2Session session; private final ByteBufferPool.Lease lease; + private Entry stalled; private boolean terminated; public HTTP2Flusher(HTTP2Session session) @@ -106,17 +104,6 @@ public class HTTP2Flusher extends IteratingCallback return !closed; } - private Entry remove(int index) - { - synchronized (this) - { - if (index == 0) - return frames.pollUnsafe(); - else - return frames.remove(index); - } - } - public int getQueueSize() { synchronized (this) @@ -136,112 +123,75 @@ public class HTTP2Flusher extends IteratingCallback if (terminated) throw new ClosedChannelException(); - // First thing, update the window sizes, so we can - // reason about the frames to remove from the queue. while (!windows.isEmpty()) { WindowEntry entry = windows.poll(); entry.perform(); } - // Now the window sizes cannot change. - // Window updates that happen concurrently will - // be queued and processed on the next iteration. - int sessionWindow = session.getSendWindow(); - - int index = 0; - int size = frames.size(); - while (index < size) + if (!frames.isEmpty()) { - Entry entry = frames.get(index); - IStream stream = entry.stream; - - // If the stream has been reset, don't send the frame. - if (stream != null && stream.isReset() && !entry.isProtocol()) + for (Entry entry : frames) { - remove(index); - --size; - resets.add(entry); - if (LOG.isDebugEnabled()) - LOG.debug("Gathered for reset {}", entry); - continue; + entries.offer(entry); + actives.add(entry); } - - // Check if the frame fits in the flow control windows. - int remaining = entry.dataRemaining(); - if (remaining > 0) - { - if (sessionWindow <= 0) - { - ++index; - // There may be *non* flow controlled frames to send. - continue; - } - - if (stream != null) - { - // The stream may have a smaller window than the session. - Integer streamWindow = streams.get(stream); - if (streamWindow == null) - { - streamWindow = stream.updateSendWindow(0); - streams.put(stream, streamWindow); - } - - // Is it a frame belonging to an already stalled stream ? - if (streamWindow <= 0) - { - ++index; - // There may be *non* flow controlled frames to send. - continue; - } - } - - // The frame fits both flow control windows, reduce them. - sessionWindow -= remaining; - if (stream != null) - streams.put(stream, streams.get(stream) - remaining); - } - - // The frame will be written, remove it from the queue. - remove(index); - --size; - actives.add(entry); - - if (LOG.isDebugEnabled()) - LOG.debug("Gathered for write {}", entry); + frames.clear(); } - streams.clear(); } - // Perform resets outside the sync block. - for (int i = 0; i < resets.size(); ++i) - { - Entry entry = resets.get(i); - entry.reset(); - } - resets.clear(); - if (actives.isEmpty()) + if (entries.isEmpty()) { if (LOG.isDebugEnabled()) LOG.debug("Flushed {}", session); return Action.IDLE; } - for (int i = 0; i < actives.size(); ++i) + while (!entries.isEmpty()) { - Entry entry = actives.get(i); - Throwable failure = entry.generate(lease); - if (failure != null) + Entry entry = entries.poll(); + if (LOG.isDebugEnabled()) + LOG.debug("Processing {}", entry); + + // If the stream has been reset, don't send the frame. + if (entry.reset()) + { + if (LOG.isDebugEnabled()) + LOG.debug("Resetting {}", entry); + continue; + } + + try + { + if (entry.generate(lease)) + { + if (entry.dataRemaining() > 0) + entries.offer(entry); + } + else + { + if (stalled == null) + stalled = entry; + } + } + catch (Throwable failure) { // Failure to generate the entry is catastrophic. + if (LOG.isDebugEnabled()) + LOG.debug("Failure generating frame " + entry.frame, failure); failed(failure); return Action.SUCCEEDED; } } List byteBuffers = lease.getByteBuffers(); + if (byteBuffers.isEmpty()) + { + complete(); + return Action.IDLE; + } + if (LOG.isDebugEnabled()) LOG.debug("Writing {} buffers ({} bytes) for {} frames {}", byteBuffers.size(), lease.getTotalLength(), actives.size(), actives); session.getEndPoint().write(this, byteBuffers.toArray(new ByteBuffer[byteBuffers.size()])); @@ -251,17 +201,45 @@ public class HTTP2Flusher extends IteratingCallback @Override public void succeeded() { - lease.recycle(); - if (LOG.isDebugEnabled()) LOG.debug("Written {} frames for {}", actives.size(), actives); - actives.forEach(Entry::succeeded); - actives.clear(); + complete(); super.succeeded(); } + private void complete() + { + lease.recycle(); + + actives.forEach(Entry::complete); + + if (stalled != null) + { + // We have written part of the frame, but there is more to write. + // The API will not allow to send two data frames for the same + // stream so we append the unfinished frame at the end to allow + // better interleaving with other streams. + int index = actives.indexOf(stalled); + for (int i = index; i < actives.size(); ++i) + { + Entry entry = actives.get(i); + if (entry.dataRemaining() > 0) + append(entry); + } + for (int i = 0; i < index; ++i) + { + Entry entry = actives.get(i); + if (entry.dataRemaining() > 0) + append(entry); + } + stalled = null; + } + + actives.clear(); + } + @Override protected void onCompleteSuccess() { @@ -317,6 +295,7 @@ public class HTTP2Flusher extends IteratingCallback protected final Frame frame; protected final IStream stream; protected final Callback callback; + private boolean reset; protected Entry(Frame frame, IStream stream, Callback callback) { @@ -330,14 +309,14 @@ public class HTTP2Flusher extends IteratingCallback return 0; } - public Throwable generate(ByteBufferPool.Lease lease) - { - return null; - } + protected abstract boolean generate(ByteBufferPool.Lease lease); - public void reset() + private void complete() { - failed(new EofException("reset")); + if (reset) + failed(new EofException("reset")); + else + succeeded(); } @Override @@ -351,7 +330,12 @@ public class HTTP2Flusher extends IteratingCallback callback.failed(x); } - public boolean isProtocol() + private boolean reset() + { + return this.reset = stream != null && stream.isReset() && !isProtocol(); + } + + private boolean isProtocol() { switch (frame.getType()) { diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java index 72b74d6aba8..1b45f6f49ae 100644 --- a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java +++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java @@ -1048,22 +1048,13 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements ISessio super(frame, stream, callback); } - public Throwable generate(ByteBufferPool.Lease lease) + protected boolean generate(ByteBufferPool.Lease lease) { - try - { - generator.control(lease, frame); - if (LOG.isDebugEnabled()) - LOG.debug("Generated {}", frame); - prepare(); - return null; - } - catch (Throwable x) - { - if (LOG.isDebugEnabled()) - LOG.debug("Failure generating frame " + frame, x); - return x; - } + generator.control(lease, frame); + if (LOG.isDebugEnabled()) + LOG.debug("Generated {}", frame); + prepare(); + return true; } /** @@ -1154,71 +1145,58 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements ISessio private class DataEntry extends HTTP2Flusher.Entry { - private int length; + private int remaining; + private int generated; private DataEntry(DataFrame frame, IStream stream, Callback callback) { super(frame, stream, callback); - } - - @Override - public int dataRemaining() - { // We don't do any padding, so the flow control length is // always the data remaining. This simplifies the handling // of data frames that cannot be completely written due to // the flow control window exhausting, since in that case // we would have to count the padding only once. - return ((DataFrame)frame).remaining(); + remaining = frame.remaining(); } - public Throwable generate(ByteBufferPool.Lease lease) + @Override + public int dataRemaining() { - try - { - int flowControlLength = dataRemaining(); + return remaining; + } - int sessionSendWindow = getSendWindow(); - if (sessionSendWindow < 0) - throw new IllegalStateException(); + protected boolean generate(ByteBufferPool.Lease lease) + { + int toWrite = dataRemaining(); - int streamSendWindow = stream.updateSendWindow(0); - if (streamSendWindow < 0) - throw new IllegalStateException(); + int sessionSendWindow = getSendWindow(); + int streamSendWindow = stream.updateSendWindow(0); + int window = Math.min(streamSendWindow, sessionSendWindow); + if (window <= 0 && toWrite > 0) + return false; - int window = Math.min(streamSendWindow, sessionSendWindow); + int length = Math.min(toWrite, window); - int length = this.length = Math.min(flowControlLength, window); - if (LOG.isDebugEnabled()) - LOG.debug("Generated {}, length/window={}/{}", frame, length, window); + int generated = generator.data(lease, (DataFrame)frame, length); + if (LOG.isDebugEnabled()) + LOG.debug("Generated {}, length/window/data={}/{}/{}", frame, generated, window, toWrite); - generator.data(lease, (DataFrame)frame, length); - flowControl.onDataSending(stream, length); - return null; - } - catch (Throwable x) - { - if (LOG.isDebugEnabled()) - LOG.debug("Failure generating frame " + frame, x); - return x; - } + this.generated += generated; + this.remaining -= generated; + + flowControl.onDataSending(stream, generated); + + return true; } @Override public void succeeded() { - flowControl.onDataSent(stream, length); + flowControl.onDataSent(stream, generated); + generated = 0; // Do we have more to send ? DataFrame dataFrame = (DataFrame)frame; - if (dataFrame.remaining() > 0) - { - // We have written part of the frame, but there is more to write. - // The API will not allow to send two data frames for the same - // stream so we append the unfinished frame at the end to allow - // better interleaving with other streams. - flusher.append(this); - } - else + if (dataRemaining() == 0) { // Only now we can update the close state // and eventually remove the stream. diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/DataGenerator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/DataGenerator.java index b859ec6e2e5..66bfcb75151 100644 --- a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/DataGenerator.java +++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/DataGenerator.java @@ -36,43 +36,34 @@ public class DataGenerator this.headerGenerator = headerGenerator; } - public void generate(ByteBufferPool.Lease lease, DataFrame frame, int maxLength) + public int generate(ByteBufferPool.Lease lease, DataFrame frame, int maxLength) { - generateData(lease, frame.getStreamId(), frame.getData(), frame.isEndStream(), maxLength); + return generateData(lease, frame.getStreamId(), frame.getData(), frame.isEndStream(), maxLength); } - public void generateData(ByteBufferPool.Lease lease, int streamId, ByteBuffer data, boolean last, int maxLength) + public int generateData(ByteBufferPool.Lease lease, int streamId, ByteBuffer data, boolean last, int maxLength) { if (streamId < 0) throw new IllegalArgumentException("Invalid stream id: " + streamId); int dataLength = data.remaining(); int maxFrameSize = headerGenerator.getMaxFrameSize(); - if (dataLength <= maxLength && dataLength <= maxFrameSize) + int length = Math.min(dataLength, Math.min(maxFrameSize, maxLength)); + if (length == dataLength) { - // Single frame. generateFrame(lease, streamId, data, last); - return; } - - // Other cases, we need to slice the original buffer into multiple frames. - - int length = Math.min(maxLength, dataLength); - int frames = length / maxFrameSize; - if (frames * maxFrameSize != length) - ++frames; - - int begin = data.position(); - int end = data.limit(); - for (int i = 1; i <= frames; ++i) + else { - int limit = begin + Math.min(maxFrameSize * i, length); - data.limit(limit); + int limit = data.limit(); + int newLimit = data.position() + length; + data.limit(newLimit); ByteBuffer slice = data.slice(); - data.position(limit); - generateFrame(lease, streamId, slice, i == frames && last && limit == end); + data.position(newLimit); + data.limit(limit); + generateFrame(lease, streamId, slice, false); } - data.limit(end); + return length; } private void generateFrame(ByteBufferPool.Lease lease, int streamId, ByteBuffer data, boolean last) @@ -88,6 +79,7 @@ public class DataGenerator BufferUtil.flipToFlush(header, 0); lease.append(header, true); - lease.append(data, false); + if (data.remaining() > 0) + lease.append(data, false); } } diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/Generator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/Generator.java index 961e2de9b8b..a86c26ea4eb 100644 --- a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/Generator.java +++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/Generator.java @@ -80,8 +80,8 @@ public class Generator generators[frame.getType().getType()].generate(lease, frame); } - public void data(ByteBufferPool.Lease lease, DataFrame frame, int maxLength) + public int data(ByteBufferPool.Lease lease, DataFrame frame, int maxLength) { - dataGenerator.generate(lease, frame, maxLength); + return dataGenerator.generate(lease, frame, maxLength); } } diff --git a/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/DataGenerateParseTest.java b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/DataGenerateParseTest.java index c8a12ef3474..d730589a70a 100644 --- a/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/DataGenerateParseTest.java +++ b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/DataGenerateParseTest.java @@ -103,7 +103,14 @@ public class DataGenerateParseTest for (int i = 0; i < 2; ++i) { ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool); - generator.generateData(lease, 13, data.slice(), true, data.remaining()); + ByteBuffer slice = data.slice(); + int generated = 0; + while (true) + { + generated += generator.generateData(lease, 13, slice, true, slice.remaining()); + if (generated == data.remaining()) + break; + } frames.clear(); for (ByteBuffer buffer : lease.getByteBuffers()) @@ -135,7 +142,14 @@ public class DataGenerateParseTest { ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool); ByteBuffer data = ByteBuffer.wrap(largeContent); - generator.generateData(lease, 13, data.slice(), true, data.remaining()); + ByteBuffer slice = data.slice(); + int generated = 0; + while (true) + { + generated += generator.generateData(lease, 13, slice, true, slice.remaining()); + if (generated == data.remaining()) + break; + } frames.clear(); for (ByteBuffer buffer : lease.getByteBuffers()) From b8d0ad50f86fe07f13f6bc8b7af8ead37797f0c7 Mon Sep 17 00:00:00 2001 From: Jan Bartel Date: Mon, 29 Feb 2016 21:02:44 +0100 Subject: [PATCH 09/15] Reimplementation of expiry and introduction of passivating unused sessions. --- .../InfinispanSessionDataStore.java | 20 +- .../InfinispanSessionIdManager.java | 23 +- .../session/AbstractSessionIdManager.java | 40 ++-- .../server/session/AbstractSessionStore.java | 212 +++++++++++++++--- .../jetty/server/session/ExpiryInspector.java | 114 ++++++++++ .../server/session/FileSessionDataStore.java | 2 + .../jetty/server/session/IdleInspector.java | 108 +++++++++ .../server/session/JDBCSessionIdManager.java | 2 +- .../server/session/MemorySessionStore.java | 15 +- ...ger.java => PeriodicSessionInspector.java} | 59 ++--- .../eclipse/jetty/server/session/Session.java | 48 +++- .../jetty/server/session/SessionData.java | 44 +++- .../server/session/SessionInspector.java | 34 +++ .../jetty/server/session/SessionManager.java | 7 +- .../jetty/server/session/SessionStore.java | 8 +- .../server/session/SessionCookieTest.java | 9 +- .../session/AbstractImmortalSessionTest.java | 6 +- .../server/session/AbstractTestServer.java | 6 +- 18 files changed, 627 insertions(+), 130 deletions(-) create mode 100644 jetty-server/src/main/java/org/eclipse/jetty/server/session/ExpiryInspector.java create mode 100644 jetty-server/src/main/java/org/eclipse/jetty/server/session/IdleInspector.java rename jetty-server/src/main/java/org/eclipse/jetty/server/session/{SessionScavenger.java => PeriodicSessionInspector.java} (79%) create mode 100644 jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionInspector.java diff --git a/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/InfinispanSessionDataStore.java b/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/InfinispanSessionDataStore.java index e4f3f535d7a..5457845b854 100644 --- a/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/InfinispanSessionDataStore.java +++ b/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/InfinispanSessionDataStore.java @@ -97,6 +97,9 @@ public class InfinispanSessionDataStore extends AbstractSessionDataStore try { + if (LOG.isDebugEnabled()) + LOG.debug("Loading session {} from infinispan", id); + SessionData sd = (SessionData)_cache.get(getCacheKey(id, _context)); reference.set(sd); } @@ -201,9 +204,24 @@ public class InfinispanSessionDataStore extends AbstractSessionDataStore @Override public boolean isPassivating() { - return true; + //TODO run in the _context to ensure classloader is set + try + { + Class remoteClass = Thread.currentThread().getContextClassLoader().loadClass("org.infinispan.client.hotrod.RemoteCache"); + if (_cache.getClass().isAssignableFrom(remoteClass)) + { + return true; + } + return false; + } + catch (ClassNotFoundException e) + { + return false; + } } + + public void setInfinispanIdleTimeoutSec (int sec) { _infinispanIdleTimeoutSec = sec; diff --git a/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/InfinispanSessionIdManager.java b/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/InfinispanSessionIdManager.java index 3260f748981..9f422167fc0 100644 --- a/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/InfinispanSessionIdManager.java +++ b/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/InfinispanSessionIdManager.java @@ -293,24 +293,7 @@ public class InfinispanSessionIdManager extends AbstractSessionIdManager return delete (id); } - /* ------------------------------------------------------------ */ - /** - * Remove an id from use by telling all contexts to remove a session with this id. - * - * @see org.eclipse.jetty.server.SessionIdManager#expireAll(java.lang.String) - */ - @Override - public void expireAll(String id) - { - LOG.debug("Expiring "+id); - //take the id out of the list of known sessionids for this node - TODO consider if we didn't remove it from this node - //it is because infinispan probably already timed it out. So, we only want to expire it from memory and NOT load it if present - removeId(id); - //tell all contexts that may have a session object with this id to - //get rid of them - for (SessionManager manager:getSessionManagers()) - { - manager.invalidate(id); - } - } + + + } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionIdManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionIdManager.java index f4e4aee5300..76dfda588a1 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionIdManager.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionIdManager.java @@ -55,7 +55,7 @@ public abstract class AbstractSessionIdManager extends AbstractLifeCycle impleme protected String _workerAttr; protected long _reseed=100000L; protected Server _server; - protected SessionScavenger _scavenger; + protected PeriodicSessionInspector _scavenger; /* ------------------------------------------------------------ */ /** @@ -102,7 +102,7 @@ public abstract class AbstractSessionIdManager extends AbstractLifeCycle impleme /** * @param scavenger a SessionScavenger */ - public void setSessionScavenger (SessionScavenger scavenger) + public void setSessionScavenger (PeriodicSessionInspector scavenger) { _scavenger = scavenger; _scavenger.setSessionIdManager(this); @@ -285,7 +285,7 @@ public abstract class AbstractSessionIdManager extends AbstractLifeCycle impleme if (_scavenger == null) { LOG.warn("No SessionScavenger set, using defaults"); - _scavenger = new SessionScavenger(); + _scavenger = new PeriodicSessionInspector(); _scavenger.setSessionIdManager(this); } @@ -388,17 +388,14 @@ public abstract class AbstractSessionIdManager extends AbstractLifeCycle impleme //session data store, AND have listeners called on them. //BUT want to avoid loading into memory sessions that this node is not managing (eg have 3 nodes all running session mgrs, //all 3 find the expired session and load it into memory and expire it - if (removeId(id)) + removeId(id); + + //tell all contexts that may have a session object with this id to + //get rid of them + for (SessionManager manager:getSessionManagers()) { - //tell all contexts that may have a session object with this id to - //get rid of them - for (SessionManager manager:getSessionManagers()) - { - manager.invalidate(id); - } + manager.invalidate(id); } - else if (LOG.isDebugEnabled()) - LOG.debug("Not present in idmgr: {}", id); } /* ------------------------------------------------------------ */ @@ -408,17 +405,16 @@ public abstract class AbstractSessionIdManager extends AbstractLifeCycle impleme public void invalidateAll (String id) { //take the id out of the list of known sessionids for this node - if (removeId(id)) - { - //tell all contexts that may have a session object with this id to - //get rid of them - for (SessionManager manager:getSessionManagers()) - { - manager.invalidate(id); - } - } + removeId(id); + + //tell all contexts that may have a session object with this id to + //get rid of them + for (SessionManager manager:getSessionManagers()) + { + manager.invalidate(id); + } } - + /* ------------------------------------------------------------ */ /** Generate a new id for a session and update across diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionStore.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionStore.java index e5484d4634e..8176504628d 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionStore.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionStore.java @@ -20,10 +20,14 @@ package org.eclipse.jetty.server.session; import java.util.Collections; +import java.util.List; import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Stream; import javax.servlet.http.HttpServletRequest; +import org.eclipse.jetty.util.MultiException; import org.eclipse.jetty.util.component.AbstractLifeCycle; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; @@ -43,8 +47,9 @@ public abstract class AbstractSessionStore extends AbstractLifeCycle implements protected StalenessStrategy _staleStrategy; protected SessionManager _manager; protected SessionContext _context; - - + protected int _idlePassivationTimeoutSec; + private IdleInspector _idleInspector; + private ExpiryInspector _expiryInspector; /** @@ -91,16 +96,7 @@ public abstract class AbstractSessionStore extends AbstractLifeCycle implements * @return true if removed false otherwise */ public abstract Session doDelete (String id); - - - - - /** - * Get a list of keys for sessions that the store thinks has expired - * @return ids of all Session objects that might have expired - */ - public abstract Set doGetExpiredCandidates(); - + @@ -128,7 +124,6 @@ public abstract class AbstractSessionStore extends AbstractLifeCycle implements return _manager; } - /** * @see org.eclipse.jetty.server.session.SessionStore#initialize(org.eclipse.jetty.server.session.SessionContext) @@ -158,6 +153,8 @@ public abstract class AbstractSessionStore extends AbstractLifeCycle implements _sessionDataStore.initialize(_context); _sessionDataStore.start(); + _expiryInspector = new ExpiryInspector(this, _manager.getSessionIdManager()); + super.doStart(); } @@ -168,6 +165,7 @@ public abstract class AbstractSessionStore extends AbstractLifeCycle implements protected void doStop() throws Exception { _sessionDataStore.stop(); + _expiryInspector = null; super.doStop(); } @@ -204,6 +202,30 @@ public abstract class AbstractSessionStore extends AbstractLifeCycle implements } + /** + * @see org.eclipse.jetty.server.session.SessionStore#getIdlePassivationTimeoutSec() + */ + public int getIdlePassivationTimeoutSec() + { + return _idlePassivationTimeoutSec; + } + + + + /** + * @see org.eclipse.jetty.server.session.SessionStore#setIdlePassivationTimeoutSec(int) + */ + public void setIdlePassivationTimeoutSec(int idleTimeoutSec) + { + _idlePassivationTimeoutSec = idleTimeoutSec; + if (_idlePassivationTimeoutSec == 0) + _idleInspector = null; + else if (_idleInspector == null) + _idleInspector = new IdleInspector(this); + } + + + /** * Get a session object. * @@ -219,28 +241,47 @@ public abstract class AbstractSessionStore extends AbstractLifeCycle implements //look locally Session session = doGet(id); - - if (staleCheck && isStale(session)) - { - //delete from session store so should reload from session data store - doDelete(id); - session = null; - } - - //not in session store, load the data for the session if possible - if (session == null && _sessionDataStore != null) + //TODO also check that session is only written out if only the access time changes infrequently + + //session is either not in session store, or it is stale, or its been passivated, load the data for the session if possible + if (session == null || (staleCheck && isStale(session)) || session.isPassivated() && _sessionDataStore != null) { SessionData data = _sessionDataStore.load(id); - if (data != null) + + //session wasn't in session store + if (session == null) { - session = newSession(data); - session.setSessionManager(_manager); - Session existing = doPutIfAbsent(id, session); - if (existing != null) + if (data != null) { - //some other thread has got in first and added the session - //so use it - session = existing; + session = newSession(data); + session.setSessionManager(_manager); + Session existing = doPutIfAbsent(id, session); + if (existing != null) + { + //some other thread has got in first and added the session + //so use it + session = existing; + } + } + //else session not in store and not in data store either, so doesn't exist + } + else + { + //session was already in session store, refresh it if its still stale/passivated + try (Lock lock = session.lock()) + { + if (session.isPassivated() || staleCheck && isStale(session)) + { + //if we were able to load it, then update our session object + if (data != null) + { + session.setPassivated(false); + session.getSessionData().copy(data); + session.didActivate(); + } + else + session = null; //TODO rely on the expiry mechanism to get rid of it? + } } } } @@ -303,11 +344,39 @@ public abstract class AbstractSessionStore extends AbstractLifeCycle implements /** * Remove a session object from this store and from any backing store. * + * If session has been passivated, may need to reload it before it can + * be properly deleted + * * @see org.eclipse.jetty.server.session.SessionStore#delete(java.lang.String) */ @Override public Session delete(String id) throws Exception { + //Ensure that the session object is not passivated so that its attributes + //are valid + Session session = doGet(id); + + //TODO if (session == null) do we want to load it to delete it? + if (session != null) + { + try (Lock lock = session.lock()) + { + //TODO don't check stale on deletion? + if (session.isPassivated() && _sessionDataStore != null) + { + session.setPassivated(false); + SessionData data = _sessionDataStore.load(id); + if (data != null) + { + session.getSessionData().copy(data); + session.didActivate(); + } + } + } + } + + + //Always delete it from the data store if (_sessionDataStore != null) { boolean dsdel = _sessionDataStore.delete(id); @@ -331,19 +400,93 @@ public abstract class AbstractSessionStore extends AbstractLifeCycle implements + /** - * @see org.eclipse.jetty.server.session.SessionStore#getExpired() + * @see org.eclipse.jetty.server.session.SessionStore#checkExpiry(java.util.Set) */ @Override - public Set getExpired() + public Set checkExpiration(Set candidates) { if (!isStarted()) return Collections.emptySet(); - Set candidates = doGetExpiredCandidates(); + + if (LOG.isDebugEnabled()) + LOG.debug("SessionStore checking expiration on {}", candidates); return _sessionDataStore.getExpired(candidates); } + + + /** + * @see org.eclipse.jetty.server.session.SessionStore#inspect() + */ + public void inspect () + { + Stream stream = getStream(); + try + { + _expiryInspector.preInspection(); + if (_idleInspector != null) + _idleInspector.preInspection(); + stream.forEach(s->{_expiryInspector.inspect(s); if (_idleInspector != null) _idleInspector.inspect(s);}); + _expiryInspector.postInspection(); + _idleInspector.postInspection(); + } + finally + { + stream.close(); + } + } + + + + + /** + * If the SessionDataStore supports passivation, passivate any + * sessions that have not be accessed for longer than x sec + * + * @param id identity of session to passivate + */ + public void passivateIdleSession(String id) + { + if (!isStarted()) + return; + + if (_sessionDataStore == null) + return; //no data store to passivate + + if (!_sessionDataStore.isPassivating()) + return; //doesn't support passivation + + + //get the session locally + Session s = doGet(id); + + if (s == null) + { + LOG.warn("Session {} not in this session store", s); + return; + } + + + try (Lock lock = s.lock()) + { + //check the session is still idle first + if (s.isValid() && s.isIdleLongerThan(_idlePassivationTimeoutSec)) + { + s.willPassivate(); + _sessionDataStore.store(id, s.getSessionData()); + s.getSessionData().clearAllAttributes(); + s.getSessionData().setDirty(false); + } + } + catch (Exception e) + { + LOG.warn("Passivation of idle session {} failed", id, e); + // TODO should do session.invalidate(); ??? + } + } @@ -355,5 +498,4 @@ public abstract class AbstractSessionStore extends AbstractLifeCycle implements { return null; } - } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/ExpiryInspector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/ExpiryInspector.java new file mode 100644 index 00000000000..f7f80082c97 --- /dev/null +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/ExpiryInspector.java @@ -0,0 +1,114 @@ +// +// ======================================================================== +// Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// 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.server.session; + +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.jetty.server.SessionIdManager; +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Logger; + +/** + * ExpiryInspector + * + * + */ +public class ExpiryInspector implements SessionInspector +{ + private final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session"); + + protected Set _expiryCandidates; + protected SessionIdManager _idManager; + protected AbstractSessionStore _sessionStore; + + + + /** + * @param sessionStore + * @param idManager + */ + public ExpiryInspector (AbstractSessionStore sessionStore, SessionIdManager idManager) + { + _idManager = idManager; + _sessionStore = sessionStore; + } + + /** + * @see org.eclipse.jetty.server.session.SessionInspector#inspect(org.eclipse.jetty.server.session.SessionStore, org.eclipse.jetty.server.session.Session) + */ + @Override + public void inspect(Session s) + { + //Does the session object think it is expired? + long now = System.currentTimeMillis(); + if (s.isExpiredAt(now)) + _expiryCandidates.add(s.getId()); + } + + + + + /** + * @return the expiryCandidates + */ + public Set getExpiryCandidates() + { + return _expiryCandidates; + } + + /** + * @see org.eclipse.jetty.server.session.SessionInspector#preInspection() + */ + @Override + public void preInspection() + { + if (LOG.isDebugEnabled()) + LOG.debug("PreInspection"); + _expiryCandidates = new HashSet(); + } + + /** + * @see org.eclipse.jetty.server.session.SessionInspector#postInspection() + */ + @Override + public void postInspection() + { + if (LOG.isDebugEnabled()) + LOG.debug("ExpiryInspector checking expiration for {}", _expiryCandidates); + + try + { + Set candidates = _sessionStore.checkExpiration(_expiryCandidates); + for (String id:candidates) + { + _idManager.expireAll(id); + } + } + catch (Exception e) + { + LOG.warn(e); + } + finally + { + _expiryCandidates = null; + } + } +} diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/FileSessionDataStore.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/FileSessionDataStore.java index 0686a5ddd5f..8ebb4291a3d 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/FileSessionDataStore.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/FileSessionDataStore.java @@ -117,6 +117,8 @@ public class FileSessionDataStore extends AbstractSessionDataStore public Set getExpired(Set candidates) { //we don't want to open up each file and check, so just leave it up to the SessionStore + //TODO as the session manager is likely to be a lazy loader, if a session is never requested, its + //file will stay forever after a restart return candidates; } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/IdleInspector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/IdleInspector.java new file mode 100644 index 00000000000..ca0d7979c02 --- /dev/null +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/IdleInspector.java @@ -0,0 +1,108 @@ +// +// ======================================================================== +// Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// 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.server.session; + +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Logger; + + +/** + * IdleExpiryInspector + * + * Checks if a session is idle + */ +public class IdleInspector implements SessionInspector +{ + private final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session"); + + protected Set _idleCandidates; + protected AbstractSessionStore _sessionStore; + + /** + * @param sessionStore + */ + public IdleInspector (AbstractSessionStore sessionStore) + { + _sessionStore = sessionStore; + } + + + /** + * @see org.eclipse.jetty.server.session.SessionInspector#inspect(org.eclipse.jetty.server.session.Session) + */ + @Override + public void inspect(Session s) + { + //Does the session object think it is expired? + long now = System.currentTimeMillis(); + if (s.isExpiredAt(now)) + return; + + if (s.isValid() && s.isIdleLongerThan(_sessionStore.getIdlePassivationTimeoutSec())) + { + _idleCandidates.add(s.getId()); + }; + } + + + /** + * @return the idleCandidates + */ + public Set getIdleCandidates() + { + return _idleCandidates; + } + + + /** + * @see org.eclipse.jetty.server.session.SessionInspector#preInspection() + */ + @Override + public void preInspection() + { + _idleCandidates = new HashSet(); + } + + + + /** + * @see org.eclipse.jetty.server.session.SessionInspector#postInspection() + */ + @Override + public void postInspection() + { + for (String id:_idleCandidates) + { + try + { + _sessionStore.passivateIdleSession(id); + } + catch (Exception e) + { + LOG.warn(e); + } + } + + _idleCandidates = null; + } +} diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionIdManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionIdManager.java index 6a82f9da872..ebce29c1c29 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionIdManager.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionIdManager.java @@ -50,7 +50,7 @@ public class JDBCSessionIdManager extends org.eclipse.jetty.server.session.Abstr protected final HashSet _sessionIds = new HashSet(); protected Server _server; - protected SessionScavenger _scavenger; + protected PeriodicSessionInspector _scavenger; private DatabaseAdaptor _dbAdaptor = new DatabaseAdaptor(); diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/MemorySessionStore.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/MemorySessionStore.java index a4d62fbdd4a..6ecf9021fdb 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/MemorySessionStore.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/MemorySessionStore.java @@ -22,6 +22,7 @@ package org.eclipse.jetty.server.session; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Stream; import javax.servlet.http.HttpServletRequest; @@ -150,7 +151,7 @@ public class MemorySessionStore extends AbstractSessionStore } - +/* @Override public Set doGetExpiredCandidates() @@ -167,7 +168,7 @@ public class MemorySessionStore extends AbstractSessionStore } return candidates; } - +*/ @@ -242,4 +243,14 @@ public class MemorySessionStore extends AbstractSessionStore } + /** + * @see org.eclipse.jetty.server.session.SessionStore#getStream() + */ + @Override + public Stream getStream() + { + return _sessions.values().stream(); + } + + } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionScavenger.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/PeriodicSessionInspector.java similarity index 79% rename from jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionScavenger.java rename to jetty-server/src/main/java/org/eclipse/jetty/server/session/PeriodicSessionInspector.java index d5acdb759c8..c10520dfb70 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionScavenger.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/PeriodicSessionInspector.java @@ -35,25 +35,26 @@ import org.eclipse.jetty.util.thread.Scheduler; * There is 1 session scavenger per SessionIdManager/Server instance. * */ -public class SessionScavenger extends AbstractLifeCycle +public class PeriodicSessionInspector extends AbstractLifeCycle { private final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session"); - public static final long DEFAULT_SCAVENGE_MS = 1000L * 60 * 10; + public static final long DEFAULT_PERIOD_MS = 1000L * 60 * 10; protected SessionIdManager _sessionIdManager; protected Scheduler _scheduler; protected Scheduler.Task _task; //scavenge task - protected ScavengerRunner _runner; + protected Runner _runner; protected boolean _ownScheduler = false; - private long _scavengeIntervalMs = DEFAULT_SCAVENGE_MS; - + private long _intervalMs = DEFAULT_PERIOD_MS; + private long _lastTime = 0L; + /** - * ScavengerRunner + * Runner * */ - protected class ScavengerRunner implements Runnable + protected class Runner implements Runnable { @Override @@ -61,12 +62,12 @@ public class SessionScavenger extends AbstractLifeCycle { try { - scavenge(); + inspect(); } finally { if (_scheduler != null && _scheduler.isRunning()) - _task = _scheduler.schedule(this, _scavengeIntervalMs, TimeUnit.MILLISECONDS); + _task = _scheduler.schedule(this, _intervalMs, TimeUnit.MILLISECONDS); } } } @@ -96,6 +97,7 @@ public class SessionScavenger extends AbstractLifeCycle if (!(_sessionIdManager instanceof AbstractSessionIdManager)) throw new IllegalStateException ("SessionIdManager is not an AbstractSessionIdManager"); + _lastTime = System.currentTimeMillis(); //set it to a non zero value //try and use a common scheduler, fallback to own _scheduler = ((AbstractSessionIdManager)_sessionIdManager).getServer().getBean(Scheduler.class); @@ -109,7 +111,7 @@ public class SessionScavenger extends AbstractLifeCycle else if (!_scheduler.isStarted()) throw new IllegalStateException("Shared scheduler not started"); - setScavengeIntervalSec(getScavengeIntervalSec()); + setIntervalSec(getIntervalSec()); super.doStart(); } @@ -138,24 +140,24 @@ public class SessionScavenger extends AbstractLifeCycle * Set the period between scavenge cycles * @param sec */ - public void setScavengeIntervalSec (long sec) + public void setIntervalSec (long sec) { if (sec<=0) sec=60; - long old_period=_scavengeIntervalMs; + long old_period=_intervalMs; long period=sec*1000L; - _scavengeIntervalMs=period; + _intervalMs=period; //add a bit of variability into the scavenge time so that not all //nodes with the same scavenge interval sync up - long tenPercent = _scavengeIntervalMs/10; + long tenPercent = _intervalMs/10; if ((System.currentTimeMillis()%2) == 0) - _scavengeIntervalMs += tenPercent; + _intervalMs += tenPercent; if (LOG.isDebugEnabled()) - LOG.debug("Scavenging every "+_scavengeIntervalMs+" ms"); + LOG.debug("Inspecting every "+_intervalMs+" ms"); synchronized (this) { @@ -164,8 +166,8 @@ public class SessionScavenger extends AbstractLifeCycle if (_task!=null) _task.cancel(); if (_runner == null) - _runner = new ScavengerRunner(); - _task = _scheduler.schedule(_runner,_scavengeIntervalMs,TimeUnit.MILLISECONDS); + _runner = new Runner(); + _task = _scheduler.schedule(_runner,_intervalMs,TimeUnit.MILLISECONDS); } } } @@ -173,13 +175,13 @@ public class SessionScavenger extends AbstractLifeCycle /** - * Get the period between scavenge cycles. + * Get the period between inspection cycles. * * @return */ - public long getScavengeIntervalSec () + public long getIntervalSec () { - return _scavengeIntervalMs/1000; + return _intervalMs/1000; } @@ -189,26 +191,33 @@ public class SessionScavenger extends AbstractLifeCycle * ask all SessionManagers to find sessions they think have expired and then make * sure that a session sharing the same id is expired on all contexts */ - public void scavenge () + public void inspect () { //don't attempt to scavenge if we are shutting down if (isStopping() || isStopped()) return; if (LOG.isDebugEnabled()) - LOG.debug("Scavenging sessions"); + LOG.debug("Inspecting sessions"); + long now = System.currentTimeMillis(); + //find the session managers for (SessionManager manager:((AbstractSessionIdManager)_sessionIdManager).getSessionManagers()) { if (manager != null) { + manager.inspect(); + + /* //call scavenge on each manager to find keys for sessions that have expired Set expiredKeys = manager.scavenge(); //for each expired session, tell the session id manager to invalidate its key on all contexts for (String key:expiredKeys) { + + // if it recently expired try { ((AbstractSessionIdManager)_sessionIdManager).expireAll(key); @@ -217,7 +226,7 @@ public class SessionScavenger extends AbstractLifeCycle { LOG.warn(e); } - } + }*/ } } } @@ -229,7 +238,7 @@ public class SessionScavenger extends AbstractLifeCycle @Override public String toString() { - return super.toString()+"[interval="+_scavengeIntervalMs+", ownscheduler="+_ownScheduler+"]"; + return super.toString()+"[interval="+_intervalMs+", ownscheduler="+_ownScheduler+"]"; } } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/Session.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/Session.java index 43dd9a80604..d23d627c76a 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/Session.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/Session.java @@ -65,6 +65,9 @@ public class Session implements SessionManager.SessionIf private boolean _newSession; private State _state = State.VALID; //state of the session:valid,invalid or being invalidated private Locker _lock = new Locker(); + + + private boolean _isPassivated; public Session (HttpServletRequest request, SessionData data) { @@ -147,6 +150,17 @@ public class Session implements SessionManager.SessionIf } } + + protected boolean isIdleLongerThan (int sec) + { + long now = System.currentTimeMillis(); + try (Lock lock = _lock.lockIfNotHeld()) + { + return ((_sessionData.getAccessed() + (sec*1000)) < now); + } + } + + /* ------------------------------------------------------------ */ /** * @param nodename @@ -520,7 +534,7 @@ public class Session implements SessionManager.SessionIf public void setAttribute(String name, Object value) { Object old=null; - try (Lock lock = lock()) + try (Lock lock = _lock.lockIfNotHeld()) { //if session is not valid, don't accept the set checkValidForWrite(); @@ -578,7 +592,7 @@ public class Session implements SessionManager.SessionIf String id = null; String extendedId = null; - try (Lock lock = lock()) + try (Lock lock = _lock.lockIfNotHeld()) { checkValidForWrite(); //don't renew id on a session that is not valid id = _sessionData.getId(); //grab the values as they are now @@ -601,7 +615,7 @@ public class Session implements SessionManager.SessionIf */ public void renewId (String oldId, String oldExtendedId, String newId, String newExtendedId) { - try (Lock lock = lock()) + try (Lock lock = _lock.lockIfNotHeld()) { checkValidForWrite(); //can't change id on invalid session @@ -632,7 +646,7 @@ public class Session implements SessionManager.SessionIf boolean result = false; - try (Lock lock = lock()) + try (Lock lock = _lock.lockIfNotHeld()) { switch (_state) { @@ -669,7 +683,7 @@ public class Session implements SessionManager.SessionIf } } - + /* ------------------------------------------------------------- */ /** Grab the lock on the session @@ -687,7 +701,7 @@ public class Session implements SessionManager.SessionIf /* ------------------------------------------------------------- */ protected void doInvalidate() throws IllegalStateException { - try (Lock lock = lock()) + try (Lock lock = _lock.lockIfNotHeld()) { try { @@ -769,4 +783,26 @@ public class Session implements SessionManager.SessionIf { return _sessionData; } + + + /* ------------------------------------------------------------- */ + /** + * @return + */ + public boolean isPassivated() + { + return _isPassivated; + } + + /* ------------------------------------------------------------- */ + /** + * @param isPassivated + */ + public void setPassivated(boolean isPassivated) + { + _isPassivated = isPassivated; + } + + + } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionData.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionData.java index 7d0ea1b0ebf..3f05b08aca1 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionData.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionData.java @@ -83,6 +83,36 @@ public class SessionData implements Serializable _maxInactiveMs = maxInactiveMs; } + + /** + * Copy the info from the given sessiondata + * + * @param data the sessiondata to be copied + */ + public void copy (SessionData data) + { + if (data == null) + return; //don't copy if no data + + if (data.getId() == null || !(getId().equals(data.getId()))) + throw new IllegalStateException ("Can only copy data for same session id"); + + if (data == this) + return; //don't copy ourself + + setLastNode(data.getLastNode()); + setContextPath(data.getContextPath()); + setVhost(data.getVhost()); + setCookieSet(data.getCookieSet()); + setCreated(data.getCreated()); + setAccessed(data.getAccessed()); + setLastAccessed(data.getLastAccessed()); + setMaxInactiveMs(data.getMaxInactiveMs()); + setExpiry(data.getExpiry()); + setLastSaved(data.getLastSaved()); + clearAllAttributes(); + putAllAttributes(data.getAllAttributes()); + } /** * @return time at which session was last written out @@ -170,6 +200,14 @@ public class SessionData implements Serializable _attributes.putAll(attributes); } + /** + * Remove all attributes + */ + public void clearAllAttributes () + { + _attributes.clear(); + } + /** * @return an unmodifiable map of the attributes */ @@ -322,12 +360,6 @@ public class SessionData implements Serializable _lastAccessed = lastAccessed; } - /* public boolean isInvalid() - { - return _invalid; - } -*/ - /** * @return diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionInspector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionInspector.java new file mode 100644 index 00000000000..e70c372b5cf --- /dev/null +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionInspector.java @@ -0,0 +1,34 @@ +// +// ======================================================================== +// Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// 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.server.session; + + + +/** + * SessionInspector + * + * + */ +public interface SessionInspector +{ + public void preInspection(); + public void inspect(Session s); + public void postInspection (); //on completion +} diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionManager.java index ea9683d920a..746a90f0f20 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionManager.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionManager.java @@ -1017,13 +1017,14 @@ public class SessionManager extends ContainerLifeCycle implements org.eclipse.je /** * @return */ - public Set scavenge () + public void inspect () { //don't attempt to scavenge if we are shutting down if (isStopping() || isStopped()) - return Collections.emptySet(); + return; - return _sessionStore.getExpired(); + _sessionStore.inspect(); + //return _sessionStore.getExpired(); } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionStore.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionStore.java index 214c7787c6a..2ab2fc06e88 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionStore.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionStore.java @@ -19,7 +19,9 @@ package org.eclipse.jetty.server.session; +import java.util.List; import java.util.Set; +import java.util.stream.Stream; import javax.servlet.http.HttpServletRequest; @@ -43,5 +45,9 @@ public interface SessionStore extends LifeCycle boolean exists (String id) throws Exception; Session delete (String id) throws Exception; void shutdown (); - Set getExpired (); + Set checkExpiration (Set candidates); + void inspect(); + void setIdlePassivationTimeoutSec(int sec); + int getIdlePassivationTimeoutSec(); + Stream getStream(); } diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionCookieTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionCookieTest.java index 0a1b3ce84c9..b6d83e9ae1c 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionCookieTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionCookieTest.java @@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue; import java.util.Enumeration; import java.util.Map; import java.util.Set; +import java.util.stream.Stream; import javax.servlet.SessionCookieConfig; import javax.servlet.http.HttpServletRequest; @@ -113,14 +114,16 @@ public class SessionCookieTest } /** - * @see org.eclipse.jetty.server.session.AbstractSessionStore#doGetExpiredCandidates() + * @see org.eclipse.jetty.server.session.SessionStore#getStream() */ @Override - public Set doGetExpiredCandidates() + public Stream getStream() { // TODO Auto-generated method stub return null; - } + } + + } diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractImmortalSessionTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractImmortalSessionTest.java index 4bfb0472f06..d031e4ec706 100644 --- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractImmortalSessionTest.java +++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractImmortalSessionTest.java @@ -20,6 +20,7 @@ package org.eclipse.jetty.server.session; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.io.PrintWriter; @@ -76,7 +77,7 @@ public abstract class AbstractImmortalSessionTest // Let's wait for the scavenger to run, waiting 2.5 times the scavenger period Thread.sleep(scavengePeriod * 2500L); - + // Be sure the session is still there Request request = client.newRequest("http://localhost:" + port + contextPath + servletMapping + "?action=get"); request.header("Cookie", sessionCookie); @@ -114,7 +115,8 @@ public abstract class AbstractImmortalSessionTest } else if ("get".equals(action)) { - HttpSession session = request.getSession(false); + HttpSession session = request.getSession(false); + assertNotNull(session); if (session!=null) result = (String)session.getAttribute("value"); } diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractTestServer.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractTestServer.java index 04e8bb99577..2b922b7b539 100644 --- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractTestServer.java +++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractTestServer.java @@ -42,7 +42,7 @@ public abstract class AbstractTestServer protected final int _scavengePeriod; protected final ContextHandlerCollection _contexts; protected SessionIdManager _sessionIdManager; - private SessionScavenger _scavenger; + private PeriodicSessionInspector _scavenger; @@ -83,8 +83,8 @@ public abstract class AbstractTestServer _sessionIdManager = newSessionIdManager(sessionIdMgrConfig); _server.setSessionIdManager(_sessionIdManager); ((AbstractSessionIdManager) _sessionIdManager).setServer(_server); - _scavenger = new SessionScavenger(); - _scavenger.setScavengeIntervalSec(scavengePeriod); + _scavenger = new PeriodicSessionInspector(); + _scavenger.setIntervalSec(scavengePeriod); ((AbstractSessionIdManager)_sessionIdManager).setSessionScavenger(_scavenger); } From d53766f6fe0cfa03579c7e0053c9d72e0037df2d Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Tue, 1 Mar 2016 15:18:28 +0100 Subject: [PATCH 10/15] Issue #365 (Potential connection leakage in case of aborted request) Fixed by releasing the connection that will not be used to the pool. --- .../jetty/client/PoolingHttpDestination.java | 3 ++ .../jetty/client/HttpRequestAbortTest.java | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java b/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java index 8b72a7a399a..a3a55f68f88 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java @@ -127,6 +127,9 @@ public abstract class PoolingHttpDestination extends HttpD { if (LOG.isDebugEnabled()) LOG.debug("Aborted before processing {}: {}", exchange, cause); + // Won't use this connection, release it back. + if (!connectionPool.release(connection)) + connection.close(); // It may happen that the request is aborted before the exchange // is created. Aborting the exchange a second time will result in // a no-operation, so we just abort here to cover that edge case. diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpRequestAbortTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpRequestAbortTest.java index 19d8f8fb283..1be59fce8fd 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpRequestAbortTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpRequestAbortTest.java @@ -25,6 +25,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; + import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -47,6 +48,33 @@ public class HttpRequestAbortTest extends AbstractHttpClientServerTest super(sslContextFactory); } + @Test + public void testAbortBeforeQueued() throws Exception + { + start(new EmptyServerHandler()); + + Exception failure = new Exception("oops"); + try + { + Request request = client.newRequest("localhost", connector.getLocalPort()) + .scheme(scheme) + .timeout(5, TimeUnit.SECONDS); + request.abort(failure); + request.send(); + Assert.fail(); + } + catch (ExecutionException x) + { + Assert.assertSame(failure, x.getCause()); + // Make sure the pool is in a sane state. + HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, "localhost", connector.getLocalPort()); + ConnectionPool connectionPool = destination.getConnectionPool(); + Assert.assertEquals(1, connectionPool.getConnectionCount()); + Assert.assertEquals(0, connectionPool.getActiveConnections().size()); + Assert.assertEquals(1, connectionPool.getIdleConnections().size()); + } + } + @Test public void testAbortOnQueued() throws Exception { From 24a203f9760bdc280814042dace4f4c446db8b13 Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Tue, 1 Mar 2016 15:58:32 +0100 Subject: [PATCH 11/15] Fixed compilation issue. --- .../java/org/eclipse/jetty/client/HttpRequestAbortTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpRequestAbortTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpRequestAbortTest.java index d2a6ffd3c74..1827a88e2f8 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpRequestAbortTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpRequestAbortTest.java @@ -68,7 +68,7 @@ public class HttpRequestAbortTest extends AbstractHttpClientServerTest Assert.assertSame(failure, x.getCause()); // Make sure the pool is in a sane state. HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, "localhost", connector.getLocalPort()); - ConnectionPool connectionPool = destination.getConnectionPool(); + DuplexConnectionPool connectionPool = destination.getConnectionPool(); Assert.assertEquals(1, connectionPool.getConnectionCount()); Assert.assertEquals(0, connectionPool.getActiveConnections().size()); Assert.assertEquals(1, connectionPool.getIdleConnections().size()); From a8bbe8749f44f0e561947d64f7ee42281371d9ac Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Tue, 1 Mar 2016 16:31:40 +0100 Subject: [PATCH 12/15] Issue #353 (Jetty Client doesn't forward authentication headers with redirects when using proxy) Added test case, but code seems already good. --- .../jetty/client/HttpClientProxyTest.java | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientProxyTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientProxyTest.java index 3d72bb7e557..8a8866c2d1e 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientProxyTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientProxyTest.java @@ -32,6 +32,7 @@ import org.eclipse.jetty.client.api.ContentResponse; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.client.util.BasicAuthentication; import org.eclipse.jetty.http.HttpHeader; +import org.eclipse.jetty.http.HttpScheme; import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.util.B64Code; @@ -157,4 +158,100 @@ public class HttpClientProxyTest extends AbstractHttpClientServerTest Assert.assertEquals(status, response3.getStatus()); Assert.assertEquals(1, requests.get()); } + + @Test + public void testAuthenticatedProxiedRequestWithRedirect() throws Exception + { + String user = "foo"; + String password = "bar"; + String credentials = B64Code.encode(user + ":" + password, StandardCharsets.ISO_8859_1); + String proxyHost = "localhost"; + String serverHost = "server"; + int serverPort = HttpScheme.HTTP.is(scheme) ? 80 : 443; + String realm = "test_realm"; + int status = HttpStatus.NO_CONTENT_204; + start(new AbstractHandler() + { + @Override + public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + { + baseRequest.setHandled(true); + if (target.startsWith("/proxy")) + { + String authorization = request.getHeader(HttpHeader.PROXY_AUTHORIZATION.asString()); + if (authorization == null) + { + response.setStatus(HttpStatus.PROXY_AUTHENTICATION_REQUIRED_407); + response.setHeader(HttpHeader.PROXY_AUTHENTICATE.asString(), "Basic realm=\"" + realm + "\""); + } + else + { + String prefix = "Basic "; + if (authorization.startsWith(prefix)) + { + String attempt = authorization.substring(prefix.length()); + if (credentials.equals(attempt)) + { + // Change also the host, to verify that proxy authentication works in this case too. + response.sendRedirect(scheme + "://127.0.0.1:" + serverPort + "/server"); + } + } + } + } + else if (target.startsWith("/server")) + { + response.setStatus(status); + } + else + { + response.sendError(HttpStatus.INTERNAL_SERVER_ERROR_500); + } + } + }); + + int proxyPort = connector.getLocalPort(); + client.getProxyConfiguration().getProxies().add(new HttpProxy(proxyHost, proxyPort)); + + ContentResponse response1 = client.newRequest(serverHost, serverPort) + .scheme(scheme) + .path("/proxy") + .timeout(5, TimeUnit.SECONDS) + .send(); + + // No Authentication available => 407. + Assert.assertEquals(HttpStatus.PROXY_AUTHENTICATION_REQUIRED_407, response1.getStatus()); + + // Add authentication... + URI uri = URI.create(scheme + "://" + proxyHost + ":" + proxyPort); + client.getAuthenticationStore().addAuthentication(new BasicAuthentication(uri, realm, user, password)); + final AtomicInteger requests = new AtomicInteger(); + client.getRequestListeners().add(new Request.Listener.Adapter() + { + @Override + public void onSuccess(Request request) + { + requests.incrementAndGet(); + } + }); + // ...and perform the request again => 407 + 302 + 204. + ContentResponse response2 = client.newRequest(serverHost, serverPort) + .scheme(scheme) + .path("/proxy") + .timeout(5, TimeUnit.SECONDS) + .send(); + + Assert.assertEquals(status, response2.getStatus()); + Assert.assertEquals(3, requests.get()); + + // Now the authentication result is cached => 204. + requests.set(0); + ContentResponse response3 = client.newRequest(serverHost, serverPort) + .scheme(scheme) + .path("/server") + .timeout(5, TimeUnit.SECONDS) + .send(); + + Assert.assertEquals(status, response3.getStatus()); + Assert.assertEquals(1, requests.get()); + } } From 7e7b126847dd09804b5d042d582e97ad692163b7 Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Tue, 1 Mar 2016 22:08:02 +0100 Subject: [PATCH 13/15] Issue #362 (Very slow page load and missing resources when using HTTP/2 with Jetty 9.3.7) The issue happened when the selector was both read ready and write ready. In that case fillable() was called before completeWrite(), causing the reader thread to read, parse, call the application which performed a blocking write, thus never returning to call completeWrite(). Inverting the calls (first completeWrite() then fillable()) solves the issue because completeWrite() never calls application code. --- .../org/eclipse/jetty/io/SelectChannelEndPoint.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/SelectChannelEndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/SelectChannelEndPoint.java index 435c81621a0..499a29685b8 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/SelectChannelEndPoint.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/SelectChannelEndPoint.java @@ -68,10 +68,10 @@ public class SelectChannelEndPoint extends ChannelEndPoint implements ManagedSel return SelectChannelEndPoint.this.toString()+":runUpdateKey"; } }; - + private abstract class RejectableRunnable implements Runnable,Rejectable { - @Override + @Override public void reject() { try @@ -84,7 +84,7 @@ public class SelectChannelEndPoint extends ChannelEndPoint implements ManagedSel } } } - + private final Runnable _runFillable = new RejectableRunnable() { @Override @@ -118,8 +118,8 @@ public class SelectChannelEndPoint extends ChannelEndPoint implements ManagedSel @Override public void run() { - getFillInterest().fillable(); getWriteFlusher().completeWrite(); + getFillInterest().fillable(); } @Override @@ -175,7 +175,7 @@ public class SelectChannelEndPoint extends ChannelEndPoint implements ManagedSel if (LOG.isDebugEnabled()) LOG.debug("onSelected {}->{} r={} w={} for {}", oldInterestOps, newInterestOps, readable, writable, this); - + // Run non-blocking code immediately. // This producer knows that this non-blocking code is special // and that it must be run in this thread and not fed to the From 9c5a8d3f281623a91160194158074db9dcf9dee9 Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Wed, 2 Mar 2016 14:03:58 +0100 Subject: [PATCH 14/15] Issue #378 Can't configure per nodes settings in start.ini Updated gcloud-session to look for GAE environment variable for the node ID --- .../src/main/config/etc/jetty-gcloud-sessions.xml | 2 +- .../src/main/config/modules/gcloud-sessions.mod | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/jetty-gcloud/jetty-gcloud-session-manager/src/main/config/etc/jetty-gcloud-sessions.xml b/jetty-gcloud/jetty-gcloud-session-manager/src/main/config/etc/jetty-gcloud-sessions.xml index 72f9da6a513..62a3ad6af92 100644 --- a/jetty-gcloud/jetty-gcloud-session-manager/src/main/config/etc/jetty-gcloud-sessions.xml +++ b/jetty-gcloud/jetty-gcloud-session-manager/src/main/config/etc/jetty-gcloud-sessions.xml @@ -26,7 +26,7 @@ - + node diff --git a/jetty-gcloud/jetty-gcloud-session-manager/src/main/config/modules/gcloud-sessions.mod b/jetty-gcloud/jetty-gcloud-session-manager/src/main/config/modules/gcloud-sessions.mod index 14671f75b85..c70c3ffe303 100644 --- a/jetty-gcloud/jetty-gcloud-session-manager/src/main/config/modules/gcloud-sessions.mod +++ b/jetty-gcloud/jetty-gcloud-session-manager/src/main/config/modules/gcloud-sessions.mod @@ -53,7 +53,8 @@ https://github.com/GoogleCloudPlatform/gcloud-java http://www.apache.org/licenses/LICENSE-2.0.html [ini-template] -## Unique identifier for this node in the cluster +## Unique identifier to force the workername for this node in the cluster +## If not set, will default to the string "node" plus the Env variable $GAE_MODULE_INSTANCE # jetty.gcloudSession.workerName=node1 From 3963309f62b1fe25c2a716644a62a81a8de310ca Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Wed, 2 Mar 2016 14:09:15 +0100 Subject: [PATCH 15/15] Issue #379 Insufficient information on asyncNotSupported Converted the boolean for asyncSupported to a String holding the source of the async not supported. --- .../org/eclipse/jetty/server/Request.java | 18 ++++---- .../eclipse/jetty/servlet/ServletHandler.java | 46 +++++++++++-------- .../eclipse/jetty/servlet/ServletHolder.java | 20 +++++--- .../jetty/servlet/AsyncServletTest.java | 43 +++++++++++++++++ 4 files changed, 93 insertions(+), 34 deletions(-) diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java index a7cb18ca927..2867dfc2bb5 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java @@ -167,7 +167,7 @@ public class Request implements HttpServletRequest private String _pathInfo; private boolean _secure; - private boolean _asyncSupported = true; + private String _asyncNotSupportedSource = null; private boolean _newContext; private boolean _cookiesExtracted = false; private boolean _handled = false; @@ -1653,7 +1653,7 @@ public class Request implements HttpServletRequest @Override public boolean isAsyncSupported() { - return _asyncSupported; + return _asyncNotSupportedSource==null; } /* ------------------------------------------------------------ */ @@ -1828,7 +1828,7 @@ public class Request implements HttpServletRequest if (_async!=null) _async.reset(); _async=null; - _asyncSupported = true; + _asyncNotSupportedSource = null; _handled = false; if (_attributes != null) _attributes.clearAttributes(); @@ -1898,9 +1898,9 @@ public class Request implements HttpServletRequest } /* ------------------------------------------------------------ */ - public void setAsyncSupported(boolean supported) + public void setAsyncSupported(boolean supported,String source) { - _asyncSupported = supported; + _asyncNotSupportedSource = supported?null:(source==null?"unknown":source); } /* ------------------------------------------------------------ */ @@ -2220,8 +2220,8 @@ public class Request implements HttpServletRequest @Override public AsyncContext startAsync() throws IllegalStateException { - if (!_asyncSupported) - throw new IllegalStateException("!asyncSupported"); + if (_asyncNotSupportedSource!=null) + throw new IllegalStateException("!asyncSupported: "+_asyncNotSupportedSource); HttpChannelState state = getHttpChannelState(); if (_async==null) _async=new AsyncContextState(state); @@ -2234,8 +2234,8 @@ public class Request implements HttpServletRequest @Override public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { - if (!_asyncSupported) - throw new IllegalStateException("!asyncSupported"); + if (_asyncNotSupportedSource!=null) + throw new IllegalStateException("!asyncSupported: "+_asyncNotSupportedSource); HttpChannelState state = getHttpChannelState(); if (_async==null) _async=new AsyncContextState(state); diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java index 4210aea1ade..ecb1f92ccc3 100644 --- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java +++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java @@ -1660,17 +1660,21 @@ public class ServletHandler extends ScopedHandler //if the request already does not support async, then the setting for the filter //is irrelevant. However if the request supports async but this filter does not //temporarily turn it off for the execution of the filter - boolean requestAsyncSupported = baseRequest.isAsyncSupported(); - try - { - if (!_filterHolder.isAsyncSupported() && requestAsyncSupported) - baseRequest.setAsyncSupported(false); + if (baseRequest.isAsyncSupported() && !_filterHolder.isAsyncSupported()) + { + try + { + baseRequest.setAsyncSupported(false,_filterHolder.toString()); + filter.doFilter(request, response, _next); + } + finally + { + baseRequest.setAsyncSupported(true,null); + } + } + else filter.doFilter(request, response, _next); - } - finally - { - baseRequest.setAsyncSupported(requestAsyncSupported); - } + return; } @@ -1733,17 +1737,21 @@ public class ServletHandler extends ScopedHandler //if the request already does not support async, then the setting for the filter //is irrelevant. However if the request supports async but this filter does not //temporarily turn it off for the execution of the filter - boolean requestAsyncSupported = _baseRequest.isAsyncSupported(); - try + if (!holder.isAsyncSupported() && _baseRequest.isAsyncSupported()) { - if (!holder.isAsyncSupported() && requestAsyncSupported) - _baseRequest.setAsyncSupported(false); + try + { + _baseRequest.setAsyncSupported(false,holder.toString()); + filter.doFilter(request, response, this); + } + finally + { + _baseRequest.setAsyncSupported(true,null); + } + } + else filter.doFilter(request, response, this); - } - finally - { - _baseRequest.setAsyncSupported(requestAsyncSupported); - } + return; } diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java index bfcb2711ed1..a652deed507 100644 --- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java +++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java @@ -829,10 +829,20 @@ public class ServletHolder extends Holder implements UserIdentity.Scope if (_identityService!=null) old_run_as=_identityService.setRunAs(baseRequest.getResolvedUserIdentity(),_runAsToken); - if (!isAsyncSupported()) - baseRequest.setAsyncSupported(false); - - servlet.service(request,response); + if (baseRequest.isAsyncSupported() && !isAsyncSupported()) + { + try + { + baseRequest.setAsyncSupported(false,this.toString()); + servlet.service(request,response); + } + finally + { + baseRequest.setAsyncSupported(true,null); + } + } + else + servlet.service(request,response); servlet_error=false; } catch(UnavailableException e) @@ -842,8 +852,6 @@ public class ServletHolder extends Holder implements UserIdentity.Scope } finally { - baseRequest.setAsyncSupported(suspendable); - // pop run-as role if (_identityService!=null) _identityService.unsetRunAs(old_run_as); diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncServletTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncServletTest.java index da9b9f9c861..63e5bbdfea9 100644 --- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncServletTest.java +++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncServletTest.java @@ -56,6 +56,7 @@ import org.eclipse.jetty.toolchain.test.AdvancedRunner; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.URIUtil; import org.eclipse.jetty.util.component.AbstractLifeCycle; +import org.eclipse.jetty.util.log.StdErrLog; import org.hamcrest.Matchers; import org.junit.After; import org.junit.Assert; @@ -63,6 +64,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import static org.eclipse.jetty.util.log.Log.getLogger; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertEquals; @@ -112,6 +114,9 @@ public class AsyncServletTest _servletHandler.addServletWithMapping(holder,"/path2/*"); _servletHandler.addServletWithMapping(holder,"/p th3/*"); _servletHandler.addServletWithMapping(new ServletHolder(new FwdServlet()),"/fwd/*"); + ServletHolder holder2=new ServletHolder("NoAsync",_servlet); + holder2.setAsyncSupported(false); + _servletHandler.addServletWithMapping(holder2,"/noasync/*"); _server.start(); _port=_connector.getLocalPort(); __history.clear(); @@ -163,7 +168,45 @@ public class AsyncServletTest assertContains("NORMAL",response); } + + @Test + public void testAsyncNotSupportedNoAsync() throws Exception + { + _expectedCode="200 "; + String response=process("noasync","",null); + Assert.assertThat(response,Matchers.startsWith("HTTP/1.1 200 OK")); + assertThat(__history,contains( + "REQUEST /ctx/noasync/info", + "initial" + )); + + assertContains("NORMAL",response); + } + @Test + public void testAsyncNotSupportedAsync() throws Exception + { + ((StdErrLog)getLogger(ServletHandler.class)).setHideStacks(true); + try + { + _expectedCode="500 "; + String response=process("noasync","start=200",null); + Assert.assertThat(response,Matchers.startsWith("HTTP/1.1 500 ")); + assertThat(__history,contains( + "REQUEST /ctx/noasync/info", + "initial" + )); + + assertContains("HTTP ERROR: 500",response); + assertContains("!asyncSupported",response); + assertContains("AsyncServletTest$AsyncServlet",response); + } + finally + { + ((StdErrLog)getLogger(ServletHandler.class)).setHideStacks(false); + } + } + @Test public void testStart() throws Exception {