RE: Re: Re: Tomcat 8.5.75 Servlet WriteListener and ReadListener setting thread

2022-03-01 Thread Istvan SZEKELY
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

2022-02-28 Thread Istvan SZEKELY
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(Test

Tomcat 8.5.75 Servlet WriteListener and ReadListener setting thread

2022-02-24 Thread Istvan SZEKELY
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?

Thank You in Advance,
 Istvan