[GitHub] [tomcat] yanming16 closed pull request #229: 8.5.x note xiaoming
yanming16 closed pull request #229: 8.5.x note xiaoming URL: https://github.com/apache/tomcat/pull/229 This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
[GitHub] [tomcat] yanming16 opened a new pull request #229: 8.5.x note xiaoming
yanming16 opened a new pull request #229: 8.5.x note xiaoming URL: https://github.com/apache/tomcat/pull/229 This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
Re: [tomcat] branch master updated: Add a currently disabled test for async timeout with HTTP/2
On Mon, Dec 9, 2019 at 7:59 PM Mark Thomas wrote: > On 09/12/2019 17:34, ma...@apache.org wrote: > > This is an automated email from the ASF dual-hosted git repository. > > > > markt pushed a commit to branch master > > in repository https://gitbox.apache.org/repos/asf/tomcat.git > > > > > > The following commit(s) were added to refs/heads/master by this push: > > new dcc6ad5 Add a currently disabled test for async timeout with > HTTP/2 > > dcc6ad5 is described below > > > > commit dcc6ad52ad6a3ca53ebc1270b89df9fbc6da2f31 > > Author: Mark Thomas > > AuthorDate: Mon Dec 9 17:34:10 2019 + > > > > Add a currently disabled test for async timeout with HTTP/2 > > Note: This test isn't quite right yet. I'll commit the fix once I've > fixed the underlying issue. The issue is proving trickier than I thought > it would - mainly because it looks like I'm going to need to make a > bigger change than I really want to. I know what needs to happen, I'm > trying to figure out the best way to make it happen. > > There's indeed a problem and it's a lot harder than I expected. With async the timeoutAsync goes nowhere as no processor gets added to the waitingProcessors. Without async, the timeout goes to the processor of the connection which isn't much better, it would have to go to the stream which was doing the async request (but it's not processed through the protocol, obviously). Either way it's not going to work :( Earlier, I wanted to remove the waitingProcessors from AbstractProtocol in favor of some processing in the endpoint. I found out that isn't a very good idea. Maybe instead the actual async timeout processing should be moved one level up (do them in the Catalina adapter, but as usual use a dispatch to do it when they happen). Would that work better ? Rémy
Re: [VOTE] Release Apache Tomcat 9.0.30
+1 (non binding) Le lun. 9 déc. 2019 à 16:18, Coty Sutherland a écrit : > On Sat, Dec 7, 2019 at 12:24 PM Mark Thomas wrote: > >> The proposed Apache Tomcat 9.0.30 release is now available for voting. >> >> The major changes compared to the 9.0.29 release are: >> >> - Correct multiple regressions in the static resource caching related to >> using URLs provided for cached resources >> >> - Improvements to the Realm interface and implementations >> >> - Bug fixes and improvements to the CORS filter >> >> Along with lots of other bug fixes and improvements. >> >> For full details, see the changelog: >> https://ci.apache.org/projects/tomcat/tomcat9/docs/changelog.html >> >> It can be obtained from: >> https://dist.apache.org/repos/dist/dev/tomcat/tomcat-9/v9.0.30/ >> The Maven staging repo is: >> https://repository.apache.org/content/repositories/orgapachetomcat-1240/ >> The tag is: >> https://github.com/apache/tomcat/tree/9.0.30 >> 4fab4cc012d0c31852e957d198cb0549f3d6074c >> >> The proposed 9.0.30 release is: >> [ ] Broken - do not release >> [x] Stable - go ahead and release as 9.0.30 >> > > +1 > > >> >> - >> To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org >> For additional commands, e-mail: dev-h...@tomcat.apache.org >> >>
Re: [tomcat] branch master updated: Add a currently disabled test for async timeout with HTTP/2
On 09/12/2019 17:34, ma...@apache.org wrote: > This is an automated email from the ASF dual-hosted git repository. > > markt pushed a commit to branch master > in repository https://gitbox.apache.org/repos/asf/tomcat.git > > > The following commit(s) were added to refs/heads/master by this push: > new dcc6ad5 Add a currently disabled test for async timeout with HTTP/2 > dcc6ad5 is described below > > commit dcc6ad52ad6a3ca53ebc1270b89df9fbc6da2f31 > Author: Mark Thomas > AuthorDate: Mon Dec 9 17:34:10 2019 + > > Add a currently disabled test for async timeout with HTTP/2 Note: This test isn't quite right yet. I'll commit the fix once I've fixed the underlying issue. The issue is proving trickier than I thought it would - mainly because it looks like I'm going to need to make a bigger change than I really want to. I know what needs to happen, I'm trying to figure out the best way to make it happen. Mark > --- > test/org/apache/coyote/http2/TestAsyncTimeout.java | 142 > + > 1 file changed, 142 insertions(+) > > diff --git a/test/org/apache/coyote/http2/TestAsyncTimeout.java > b/test/org/apache/coyote/http2/TestAsyncTimeout.java > new file mode 100644 > index 000..70a5348 > --- /dev/null > +++ b/test/org/apache/coyote/http2/TestAsyncTimeout.java > @@ -0,0 +1,142 @@ > +/* > + * Licensed to the Apache Software Foundation (ASF) under one or more > + * contributor license agreements. See the NOTICE file distributed with > + * this work for additional information regarding copyright ownership. > + * The ASF licenses this file to You under the Apache License, Version 2.0 > + * (the "License"); you may not use this file except in compliance with > + * the License. You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, software > + * distributed under the License is distributed on an "AS IS" BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + */ > +package org.apache.coyote.http2; > + > +import java.io.IOException; > +import java.io.PrintWriter; > +import java.nio.ByteBuffer; > +import java.util.concurrent.atomic.AtomicBoolean; > + > +import javax.servlet.AsyncContext; > +import javax.servlet.AsyncEvent; > +import javax.servlet.AsyncListener; > +import javax.servlet.http.HttpServlet; > +import javax.servlet.http.HttpServletRequest; > +import javax.servlet.http.HttpServletResponse; > + > +import org.junit.Assert; > +import org.junit.Ignore; > +import org.junit.Test; > + > +import org.apache.catalina.Context; > +import org.apache.catalina.Wrapper; > +import org.apache.catalina.startup.Tomcat; > + > +public class TestAsyncTimeout extends Http2TestBase { > + > +@Ignore // Until this HTTP/2 + async timeouts is fixed > +@Test > +public void testTimeout() throws Exception { > +enableHttp2(); > + > +Tomcat tomcat = getTomcatInstance(); > + > +Context ctxt = tomcat.addContext("", null); > +Tomcat.addServlet(ctxt, "simple", new SimpleServlet()); > +ctxt.addServletMappingDecoded("/simple", "simple"); > +Wrapper w = Tomcat.addServlet(ctxt, "async", new > AsyncTimeoutServlet()); > +w.setAsyncSupported(true); > +ctxt.addServletMappingDecoded("/async", "async"); > +tomcat.start(); > + > +openClientConnection(); > +doHttpUpgrade(); > +sendClientPreface(); > +validateHttp2InitialResponse(); > + > +// Reset connection window size after intial response > +sendWindowUpdate(0, SimpleServlet.CONTENT_LENGTH); > + > +output.setTraceBody(true); > + > +// Send request > +byte[] frameHeader = new byte[9]; > +ByteBuffer headersPayload = ByteBuffer.allocate(128); > +buildGetRequest(frameHeader, headersPayload, null, 3, "/async"); > +writeFrame(frameHeader, headersPayload); > + > +// Headers > +parser.readFrame(true); > +// Body > +parser.readFrame(true); > + > +// Check that the right number of bytes were received > +String trace = output.getTrace(); > +Assert.assertTrue(trace, trace.contains("PASS")); > +} > + > + > +public static class AsyncTimeoutServlet extends HttpServlet { > + > +private static final long serialVersionUID = 1L; > + > +@Override > +protected void doGet(HttpServletRequest request, HttpServletResponse > response) > +throws IOException { > + > +final AsyncContext asyncContext = request.startAsync(); > + > +response.setStatus(HttpServletResponse.SC_OK); > +response.setContentType("text/plain"); > +response.setCharacterEncoding("UTF-8"); > + > +asyncContext.addList
[tomcat] branch master updated: Add a currently disabled test for async timeout with HTTP/2
This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tomcat.git The following commit(s) were added to refs/heads/master by this push: new dcc6ad5 Add a currently disabled test for async timeout with HTTP/2 dcc6ad5 is described below commit dcc6ad52ad6a3ca53ebc1270b89df9fbc6da2f31 Author: Mark Thomas AuthorDate: Mon Dec 9 17:34:10 2019 + Add a currently disabled test for async timeout with HTTP/2 --- test/org/apache/coyote/http2/TestAsyncTimeout.java | 142 + 1 file changed, 142 insertions(+) diff --git a/test/org/apache/coyote/http2/TestAsyncTimeout.java b/test/org/apache/coyote/http2/TestAsyncTimeout.java new file mode 100644 index 000..70a5348 --- /dev/null +++ b/test/org/apache/coyote/http2/TestAsyncTimeout.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.coyote.http2; + +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.ByteBuffer; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.servlet.AsyncContext; +import javax.servlet.AsyncEvent; +import javax.servlet.AsyncListener; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + +import org.apache.catalina.Context; +import org.apache.catalina.Wrapper; +import org.apache.catalina.startup.Tomcat; + +public class TestAsyncTimeout extends Http2TestBase { + +@Ignore // Until this HTTP/2 + async timeouts is fixed +@Test +public void testTimeout() throws Exception { +enableHttp2(); + +Tomcat tomcat = getTomcatInstance(); + +Context ctxt = tomcat.addContext("", null); +Tomcat.addServlet(ctxt, "simple", new SimpleServlet()); +ctxt.addServletMappingDecoded("/simple", "simple"); +Wrapper w = Tomcat.addServlet(ctxt, "async", new AsyncTimeoutServlet()); +w.setAsyncSupported(true); +ctxt.addServletMappingDecoded("/async", "async"); +tomcat.start(); + +openClientConnection(); +doHttpUpgrade(); +sendClientPreface(); +validateHttp2InitialResponse(); + +// Reset connection window size after intial response +sendWindowUpdate(0, SimpleServlet.CONTENT_LENGTH); + +output.setTraceBody(true); + +// Send request +byte[] frameHeader = new byte[9]; +ByteBuffer headersPayload = ByteBuffer.allocate(128); +buildGetRequest(frameHeader, headersPayload, null, 3, "/async"); +writeFrame(frameHeader, headersPayload); + +// Headers +parser.readFrame(true); +// Body +parser.readFrame(true); + +// Check that the right number of bytes were received +String trace = output.getTrace(); +Assert.assertTrue(trace, trace.contains("PASS")); +} + + +public static class AsyncTimeoutServlet extends HttpServlet { + +private static final long serialVersionUID = 1L; + +@Override +protected void doGet(HttpServletRequest request, HttpServletResponse response) +throws IOException { + +final AsyncContext asyncContext = request.startAsync(); + +response.setStatus(HttpServletResponse.SC_OK); +response.setContentType("text/plain"); +response.setCharacterEncoding("UTF-8"); + +asyncContext.addListener(new AsyncListener() { + +AtomicBoolean ended = new AtomicBoolean(false); + +@Override +public void onTimeout(AsyncEvent event) throws IOException { +if (ended.compareAndSet(false, true)) { +PrintWriter pw = event.getAsyncContext().getResponse().getWriter(); +pw.write("PASS"); +pw.flush(); +event.getAsyncContext().complete(); +} +} + +@Override +public void onStartAsync(AsyncEvent event) throws IOExc
[Bug 63995] New: Statements are not closed when a JDBC connection is passivated in tomcat-dbcp
https://bz.apache.org/bugzilla/show_bug.cgi?id=63995 Bug ID: 63995 Summary: Statements are not closed when a JDBC connection is passivated in tomcat-dbcp Product: Tomcat 8 Version: 8.5.49 Hardware: PC Status: NEW Severity: normal Priority: P2 Component: Catalina Assignee: dev@tomcat.apache.org Reporter: s...@iname.com Target Milestone: Web-application opens connection from JNDI pool, creates PreparedStatements, closes connection without closing statements. Statements are kept open and "ORA-01000: maximum open cursors exceeded" error is thrown. Pool is expected to close statements on connection close. The problem seems to be in src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java, ported from DBCP2. Tomcat version (but not dbcp2 version) contains following code: https://github.com/apache/tomcat/blob/master/java/org/apache/tomcat/dbcp/dbcp2/DelegatingConnection.java#L624 protected void passivate() throws SQLException { ... if (traces != null && traces.isEmpty()) { In DBCP2 version this line has ! before isEmpty(): https://github.com/apache/commons-dbcp/blob/master/src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java#L624 if (traces != null && !traces.isEmpty()) { ^^^ -- You are receiving this mail because: You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
[Bug 63859] AJP cping/cpong mode failing on Tomcat 9.x
https://bz.apache.org/bugzilla/show_bug.cgi?id=63859 --- Comment #25 from Aurelien Pernoud --- FYI I disabled the mod_jk debug to avoid having to clean it on a daily basis, I will continue to monitor with mode "A" if the issue eventually comes back but to me I would consider this one fix now ;) Many thanks Mark -- You are receiving this mail because: You are the assignee for the bug. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
Re: [VOTE] Release Apache Tomcat 8.5.50
On Sat, Dec 7, 2019 at 2:54 PM Mark Thomas wrote: > The proposed Apache Tomcat 8.5.50 release is now available for voting. > > The major changes compared to the 8.5.49 release are: > > - Correct multiple regressions in the static resource caching related to > using URLs provided for cached resources > > - Improvements to the Realm interface and implementations > > - Bug fixes and improvements to the CORS filter > > Along with lots of other bug fixes and improvements. > > For full details, see the changelog: > https://ci.apache.org/projects/tomcat/tomcat85/docs/changelog.html > > It can be obtained from: > https://dist.apache.org/repos/dist/dev/tomcat/tomcat-8/v8.5.50/ > > The Maven staging repo is: > https://repository.apache.org/content/repositories/orgapachetomcat-1241/ > > The tag is: > https://github.com/apache/tomcat/tree/8.5.50 > c40ede65ea4fb44b1957ec482f28c7afa71f1b50 > > The proposed 8.5.50 release is: > [ ] Broken - do not release > [x] Stable - go ahead and release as 8.5.50 > +1 > > - > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > For additional commands, e-mail: dev-h...@tomcat.apache.org > >
Re: [VOTE] Release Apache Tomcat 9.0.30
On Sat, Dec 7, 2019 at 12:24 PM Mark Thomas wrote: > The proposed Apache Tomcat 9.0.30 release is now available for voting. > > The major changes compared to the 9.0.29 release are: > > - Correct multiple regressions in the static resource caching related to > using URLs provided for cached resources > > - Improvements to the Realm interface and implementations > > - Bug fixes and improvements to the CORS filter > > Along with lots of other bug fixes and improvements. > > For full details, see the changelog: > https://ci.apache.org/projects/tomcat/tomcat9/docs/changelog.html > > It can be obtained from: > https://dist.apache.org/repos/dist/dev/tomcat/tomcat-9/v9.0.30/ > The Maven staging repo is: > https://repository.apache.org/content/repositories/orgapachetomcat-1240/ > The tag is: > https://github.com/apache/tomcat/tree/9.0.30 > 4fab4cc012d0c31852e957d198cb0549f3d6074c > > The proposed 9.0.30 release is: > [ ] Broken - do not release > [x] Stable - go ahead and release as 9.0.30 > +1 > > - > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > For additional commands, e-mail: dev-h...@tomcat.apache.org > >
Re: NioSelectorPool usefulness
On Tue, Dec 3, 2019 at 11:08 PM Mark Thomas wrote: > On 03/12/2019 21:00, Rémy Maucherat wrote: > > Hi, > > > > NioSelectorPool is probably never used out of its default default > > configuration as the capability is well hidden, so I had a look. I > > couldn't really see a difference with ab/h2load between the default > > (shared = true) and a pooled selector with all the extra code. > > > > Then moving down the stack NioBlockingSelector is also an experience. > > "Possibly encountered sun bug 5076772 on windows JDK 1.5" might not be > > the most useful debug log anymore. > > > > Any opinion on that ? > > No objections to removing the NioSelectorPool or cleaning up the > NioBlockingSelector at some point fairly soon. However, I'm a little > concerned about connector stability right now (see thread on asyncIO) so > I think we should move a little more carefully on this than usual. > Committed for review now that 9.0.30 is tagged, since it's very easy to revert if needed for any reason (test failures, urgent release need). Rémy
[tomcat] branch master updated: Simplify blocking read and write for NIO
This is an automated email from the ASF dual-hosted git repository. remm pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tomcat.git The following commit(s) were added to refs/heads/master by this push: new 5bdd7d4 Simplify blocking read and write for NIO 5bdd7d4 is described below commit 5bdd7d4712fac4e1af47421c3600b18fabc22ed6 Author: remm AuthorDate: Mon Dec 9 15:15:00 2019 +0100 Simplify blocking read and write for NIO This does not remove or cleanup any of the code that is now unused (NioSelectorPool, NioBlockingSlector, channel flush method, fields, etc), it will be done after actual review. I do not see any negative performance impact. Note: for performance testing, use HTTP/1.1 (avoiding sendfile). --- java/org/apache/tomcat/util/net/NioEndpoint.java | 106 --- webapps/docs/changelog.xml | 7 ++ 2 files changed, 84 insertions(+), 29 deletions(-) diff --git a/java/org/apache/tomcat/util/net/NioEndpoint.java b/java/org/apache/tomcat/util/net/NioEndpoint.java index 6a0bfdc..7d4104a 100644 --- a/java/org/apache/tomcat/util/net/NioEndpoint.java +++ b/java/org/apache/tomcat/util/net/NioEndpoint.java @@ -40,6 +40,7 @@ import java.util.Iterator; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import javax.net.ssl.SSLEngine; @@ -773,6 +774,12 @@ public class NioEndpoint extends AbstractJsseEndpoint if (!socketWrapper.readOperation.process()) { closeSocket = true; } +} else if (socketWrapper.blockReadDone != null) { +if (socketWrapper.blockReadDone.compareAndSet(false, true)) { +synchronized (socketWrapper.blockReadDone) { + socketWrapper.blockReadDone.notify(); +} +} } else if (!processSocket(socketWrapper, SocketEvent.OPEN_READ, true)) { closeSocket = true; } @@ -782,6 +789,12 @@ public class NioEndpoint extends AbstractJsseEndpoint if (!socketWrapper.writeOperation.process()) { closeSocket = true; } +} else if (socketWrapper.blockWriteDone != null) { +if (socketWrapper.blockWriteDone.compareAndSet(false, true)) { +synchronized (socketWrapper.blockWriteDone) { + socketWrapper.blockWriteDone.notify(); +} +} } else if (!processSocket(socketWrapper, SocketEvent.OPEN_WRITE, true)) { closeSocket = true; } @@ -1025,6 +1038,9 @@ public class NioEndpoint extends AbstractJsseEndpoint private volatile long lastRead = System.currentTimeMillis(); private volatile long lastWrite = lastRead; +private AtomicBoolean blockReadDone = null; +private AtomicBoolean blockWriteDone = null; + public NioSocketWrapper(NioChannel channel, NioEndpoint endpoint) { super(channel, endpoint); pool = endpoint.getSelectorPool(); @@ -1215,24 +1231,37 @@ public class NioEndpoint extends AbstractJsseEndpoint if (socket instanceof ClosedNioChannel) { throw new ClosedChannelException(); } -if (block) { -Selector selector = null; -try { -selector = pool.get(); -} catch (IOException x) { -// Ignore -} +nRead = socket.read(to); +if (nRead == -1) { +throw new EOFException(); +} +if (block && nRead == 0) { +long timeout = getReadTimeout(); try { -nRead = pool.read(to, socket, selector, getReadTimeout()); -} finally { -if (selector != null) { -pool.put(selector); +blockReadDone = new AtomicBoolean(false); +registerReadInterest(); +synchronized (blockReadDone) { +if (!blockReadDone.get()) { +try { +if (timeout > 0) { +
Re: [VOTE] Release Apache Tomcat 8.5.50
On Sat, Dec 7, 2019 at 8:54 PM Mark Thomas wrote: > The proposed Apache Tomcat 8.5.50 release is now available for voting. > > The major changes compared to the 8.5.49 release are: > > - Correct multiple regressions in the static resource caching related to > using URLs provided for cached resources > > - Improvements to the Realm interface and implementations > > - Bug fixes and improvements to the CORS filter > > Along with lots of other bug fixes and improvements. > > For full details, see the changelog: > https://ci.apache.org/projects/tomcat/tomcat85/docs/changelog.html > > It can be obtained from: > https://dist.apache.org/repos/dist/dev/tomcat/tomcat-8/v8.5.50/ > > The Maven staging repo is: > https://repository.apache.org/content/repositories/orgapachetomcat-1241/ > > The tag is: > https://github.com/apache/tomcat/tree/8.5.50 > c40ede65ea4fb44b1957ec482f28c7afa71f1b50 > > The proposed 8.5.50 release is: > [ ] Broken - do not release > [X] Stable - go ahead and release as 8.5.50 > > Great job on turning around these two releases ! Rémy
Re: [VOTE] Release Apache Tomcat 9.0.30
On Sat, Dec 7, 2019 at 6:24 PM Mark Thomas wrote: > The proposed Apache Tomcat 9.0.30 release is now available for voting. > > The major changes compared to the 9.0.29 release are: > > - Correct multiple regressions in the static resource caching related to > using URLs provided for cached resources > > - Improvements to the Realm interface and implementations > > - Bug fixes and improvements to the CORS filter > > Along with lots of other bug fixes and improvements. > > For full details, see the changelog: > https://ci.apache.org/projects/tomcat/tomcat9/docs/changelog.html > > It can be obtained from: > https://dist.apache.org/repos/dist/dev/tomcat/tomcat-9/v9.0.30/ > The Maven staging repo is: > https://repository.apache.org/content/repositories/orgapachetomcat-1240/ > The tag is: > https://github.com/apache/tomcat/tree/9.0.30 > 4fab4cc012d0c31852e957d198cb0549f3d6074c > > The proposed 9.0.30 release is: > [ ] Broken - do not release > [X] Stable - go ahead and release as 9.0.30 > > Rémy