RE: Re: Re: Tomcat 8.5.75 Servlet WriteListener and ReadListener setting thread
Thanks for the quick fix :) On 2022/02/28 16:47:20 Rémy Maucherat wrote: > Thanks for the test, this is what I had in mind. As I kind of expected > when reading about the sequential technique used, the previous fix was > causing a new problem since the thread id was not reset until the full > recycle, making the new check inaccurate as well in another scenario. > https://github.com/apache/tomcat/commit/2739565fa5286623e8bb31823770595de14b6370 > > The fix will be in the next round of monthly releases (9.0.60). > > Thanks ! > > Rémy
Re: Re: Tomcat 8.5.75 Servlet WriteListener and ReadListener setting thread
On Mon, Feb 28, 2022 at 4:39 PM Istvan SZEKELY wrote: > > I've written a NonBlocking ReadWrite test (testDelayedNBReadWrite, in the > attached file). I'm not sure if it is a valid test case (though works on > 8.5.73, fails on 8.5.75). If it is valid, i can make a PR if needed. Thanks for the test, this is what I had in mind. As I kind of expected when reading about the sequential technique used, the previous fix was causing a new problem since the thread id was not reset until the full recycle, making the new check inaccurate as well in another scenario. https://github.com/apache/tomcat/commit/2739565fa5286623e8bb31823770595de14b6370 The fix will be in the next round of monthly releases (9.0.60). Thanks ! Rémy > > On 2022/02/24 10:42:29 Rémy Maucherat wrote: > > On Thu, Feb 24, 2022 at 10:31 AM Istvan SZEKELY > > wrote: > > > > > > Hello! > > > > > > I have an application where a ReadListener and a WriteListener (call it > > > MyWriteListener) set to the ServletInputStream and the ServletOutputStream > > > objects. Updating the Tomcat container from 8.5.73 to 8.5.75, the follow > > > error occured. The ServletOutputStream objects's isReady function always > > > returns false (within MyWriteListener.onWritePossible). > > > > > > I think its because of this commit: > > > https://github.com/apache/tomcat/commit/2bfbbef65d1b1b07da46c8dcd6cee96cb5567998#diff-1ffbc1c154370a6c5385c168a0846a1c385aacbf5f880feb74cb1c27baa76003 > > > > > > The ReadListener is set first, where dispatch fired > > > (action(ActionCode.DISPATCH_EXECUTE, null);). There the request threadId > > > updated (req.setRequestThread();). > > > Then when i'm setting the WriteListener (within the same thread), the > > > DISPACTH_EXECUTE action not fired (due to threadId equals request objects > > > thread id). Thus registeredForWrite flag remains is true state, causing > > > the isReady false behaviour. > > > > > > Is this a Tomcat bug, or I should do something differently. I could't set > > > WriteListener within a different thread, but it feels weird. Should i do > > > something else? > > > > I think I see the problem, but would you have test code or example > > like this testcase to submit ? > > https://github.com/apache/tomcat/blob/main/test/org/apache/catalina/nonblocking/TestNonBlockingAPI.java#L951 > > It would allow verifying and validating a fix. > > > > Rémy > > > > > Thank You in Advance, > > > Istvan > > > > - > > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > > For additional commands, e-mail: users-h...@tomcat.apache.org > > > > > > - > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > For additional commands, e-mail: users-h...@tomcat.apache.org - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
RE: Re: Tomcat 8.5.75 Servlet WriteListener and ReadListener setting thread
I've written a NonBlocking ReadWrite test (testDelayedNBReadWrite, in the attached file). I'm not sure if it is a valid test case (though works on 8.5.73, fails on 8.5.75). If it is valid, i can make a PR if needed. On 2022/02/24 10:42:29 Rémy Maucherat wrote: > On Thu, Feb 24, 2022 at 10:31 AM Istvan SZEKELY > wrote: > > > > Hello! > > > > I have an application where a ReadListener and a WriteListener (call it > > MyWriteListener) set to the ServletInputStream and the ServletOutputStream > > objects. Updating the Tomcat container from 8.5.73 to 8.5.75, the follow > > error occured. The ServletOutputStream objects's isReady function always > > returns false (within MyWriteListener.onWritePossible). > > > > I think its because of this commit: > > https://github.com/apache/tomcat/commit/2bfbbef65d1b1b07da46c8dcd6cee96cb5567998#diff-1ffbc1c154370a6c5385c168a0846a1c385aacbf5f880feb74cb1c27baa76003 > > > > The ReadListener is set first, where dispatch fired > > (action(ActionCode.DISPATCH_EXECUTE, null);). There the request threadId > > updated (req.setRequestThread();). > > Then when i'm setting the WriteListener (within the same thread), the > > DISPACTH_EXECUTE action not fired (due to threadId equals request objects > > thread id). Thus registeredForWrite flag remains is true state, causing > > the isReady false behaviour. > > > > Is this a Tomcat bug, or I should do something differently. I could't set > > WriteListener within a different thread, but it feels weird. Should i do > > something else? > > I think I see the problem, but would you have test code or example > like this testcase to submit ? > https://github.com/apache/tomcat/blob/main/test/org/apache/catalina/nonblocking/TestNonBlockingAPI.java#L951 > It would allow verifying and validating a fix. > > Rémy > > > Thank You in Advance, > > Istvan > > - > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > For additional commands, e-mail: users-h...@tomcat.apache.org > > /* * 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.catalina.nonblocking; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Serializable; import java.lang.reflect.Field; import java.net.HttpURLConnection; import java.net.Socket; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import javax.net.SocketFactory; import javax.servlet.AsyncContext; import javax.servlet.AsyncEvent; import javax.servlet.AsyncListener; import javax.servlet.DispatcherType; import javax.servlet.ReadListener; import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import javax.servlet.ServletOutputStream; import javax.servlet.WriteListener; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.junit.Assert; import org.junit.Test; import org.apache.catalina.Context; import org.apache.catalina.Wrapper; import org.apache.catalina.core.AsyncContextImpl; import org.apache.catalina.startup.BytesStreamer; import org.apache.catalina.startup.SimpleHttpClient; import org.apache.catalina.startup.TesterServlet; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.startup.TomcatBaseTest; import org.apache.catalina.valves.TesterAccessLogValve; import org.apache.coyote.Request; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.buf.ByteChunk; public class TestNonBlockingAPI extends TomcatBaseTest { private static final Log log = LogFactory.getLog(TestNonBlockingAPI.class); private static final int CHUNK_SIZE = 1024 * 1024; private static final int WRITE_SIZE = CHUNK_SIZE * 10; private static final byte[] DATA = new byte[WRITE_SIZE]; private static
Re: Tomcat 8.5.75 Servlet WriteListener and ReadListener setting thread
On Thu, Feb 24, 2022 at 10:31 AM Istvan SZEKELY wrote: > > Hello! > > I have an application where a ReadListener and a WriteListener (call it > MyWriteListener) set to the ServletInputStream and the ServletOutputStream > objects. Updating the Tomcat container from 8.5.73 to 8.5.75, the follow > error occured. The ServletOutputStream objects's isReady function always > returns false (within MyWriteListener.onWritePossible). > > I think its because of this commit: > https://github.com/apache/tomcat/commit/2bfbbef65d1b1b07da46c8dcd6cee96cb5567998#diff-1ffbc1c154370a6c5385c168a0846a1c385aacbf5f880feb74cb1c27baa76003 > > The ReadListener is set first, where dispatch fired > (action(ActionCode.DISPATCH_EXECUTE, null);). There the request threadId > updated (req.setRequestThread();). > Then when i'm setting the WriteListener (within the same thread), the > DISPACTH_EXECUTE action not fired (due to threadId equals request objects > thread id). Thus registeredForWrite flag remains is true state, causing > the isReady false behaviour. > > Is this a Tomcat bug, or I should do something differently. I could't set > WriteListener within a different thread, but it feels weird. Should i do > something else? I think I see the problem, but would you have test code or example like this testcase to submit ? https://github.com/apache/tomcat/blob/main/test/org/apache/catalina/nonblocking/TestNonBlockingAPI.java#L951 It would allow verifying and validating a fix. Rémy > Thank You in Advance, > Istvan - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org