Re: Virtual Threads

2023-09-07 Thread Mark Thomas

On 07/09/2023 15:41, Christopher Schultz wrote:

On 9/6/23 16:29, Mark Thomas wrote:




There isn't 
much point using an executor with virtual threads.


Okay then perche 
https://tomcat.apache.org/tomcat-11.0-doc/config/executor.html#Virtual_Thread_Implementation ?


That is the internal executor we use to provide virtual threads to the 
connector. The same code exists in all current versions.


Not sure why it was documented. It may have been while we were exploring 
what was possible. I'd lean towards removing that section from the 
Tomcat 11 docs.


Mark

-
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org



Re: Virtual Thread Configuration In Tomcat 11

2023-09-07 Thread Christopher Schultz

William,

On 9/7/23 08:04, William Crowell wrote:

When I set -Djdk.tracePinnedThreads=short, then I see this:

…
Thread[#41,ForkJoinPool-1-worker-4,5,CarrierThreads]
 com.mysql.cj.jdbc.ConnectionImpl.isValid(ConnectionImpl.java:2516) <== 
monitors:1
Thread[#39,ForkJoinPool-1-worker-2,5,CarrierThreads]
 com.mysql.cj.jdbc.ConnectionImpl.isValid(ConnectionImpl.java:2516) <== 
monitors:1
Thread[#41,ForkJoinPool-1-worker-4,5,CarrierThreads]
 com.mysql.cj.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:2005) 
<== monitors:1
Thread[#43,ForkJoinPool-1-worker-5,5,CarrierThreads]
 
com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:893)
 <== monitors:1
 
com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1061)
 <== monitors:1
 
com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1009)
 <== monitors:1
Thread[#43,ForkJoinPool-1-worker-5,5,CarrierThreads]
 com.mysql.cj.jdbc.ConnectionImpl.commit(ConnectionImpl.java:791) <== 
monitors:1
Thread[#43,ForkJoinPool-1-worker-5,5,CarrierThreads]
 com.mysql.cj.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:2005) 
<== monitors:1
…

I started digging into the MySQL client code: 
https://github.com/mysql/mysql-connector-j/blob/8.0.33/src/main/user-impl/java/com/mysql/cj/jdbc/ConnectionImpl.java

This class is littered with synchronized blocks, so now this makes sense to me 
why virtual threads would take longer than a regular OS thread.


This is precisely the kind of thing I was expecting to see.

If your "application code" (which includes everything your application 
does, including calling into libraries) contains lots of "synchronized" 
blocks, then I think this is the situation you will often find yourself in.


I would expect that if you were to increase the size of the virtual 
thread pool things would start to get better, but in order to truly use 
virtual threads effectively, you have to track-down and eliminate many 
uses of synchronized blocks and methods in both your application and the 
libraries you use.


I wouldn't expect virtual threads to become a very widely-deployed 
performance-optimization technique in the immediate future. I expect 
that, eventually, lots of code will be re-written to be more 
virtual-thread-friendly.


-chris

-
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org



solved: java.lang.ClassNotFoundException for listener class

2023-09-07 Thread Ivano Luberti
I was wong, the deployed context under eclipse and under tomcat 
autonomous instance were not identical at all.


Form some reason when eclipse deploys the web application copy the class 
files under WEB-INF/services/  under WEB-INF/classes, so 
the tomcat class loading finds classes were expected




--

Hello all.

I have developed a web application using Eclipse as an IDE and test 
environment and it runs as expected.


Then I have built a war file and deployed it under another Tomcat instance.

In both case tomcat version is 8.5

Under this last instance the application can't start and in the log 
files I find:


07-Sep-2023 07:48:18.173 SEVERE [http-nio-8080-exec-129] 
org.apache.catalina.core.StandardContext.listenerStart Error 
configuring application listener of class 
[it.archimede.met.obliterazione.zse.servlet.CreaConnessione]
    java.lang.ClassNotFoundException: 
it.archimede.met.obliterazione.zse.servlet.CreaConnessione
        at 
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1358)
        at 
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1180)
        at 
org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:545)
        at 
org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:526)
        at 
org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:150)
        at 
org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4613)
        at 
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5155)
        at 
org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at 
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743)
        at 
org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
        at 
org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
        at 
org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:614)
        at 
org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:486)
        at 
org.apache.catalina.startup.HostConfig.check(HostConfig.java:1634)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:607)
        at 
org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:286)
        at 
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
        at 
com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
        at 
org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1562)
        at 
org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:990)
        at 
org.apache.catalina.manager.HTMLManagerServlet.deployInternal(HTMLManagerServlet.java:320)
        at 
org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:209)

        at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at 
org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:211)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at 
org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:109)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:668)
        at 
org.apache.catalina.valves.RequestFilterValve.process(RequestFilterValve.java:348)
        at 

Re: Virtual Threads

2023-09-07 Thread Christopher Schultz

Mark,

On 9/6/23 16:29, Mark Thomas wrote:

On 06/09/2023 21:24, Christopher Schultz wrote:

On 9/6/23 03:29, Mark Thomas wrote:

On 05/09/2023 22:02, Christopher Schultz wrote:




Thanks for the correction. I just did a quick docs[1] search for 
"virtual" in Tomcat 10.x for example and I didn't see 
useVirtualThreads, so I assumed it wasn't in there. Maybe we need 
some documentation back-ports?


Odd. It is there as an attribute on the Connector. And in 9.0.x and 
8.5.x too.


https://tomcat.apache.org/tomcat-10.0-doc/config/executor.html

I don't find the word "virtual" anywhere on that page.


It is a Connector attribute, not an Executor attribute. There isn't much 
point using an executor with virtual threads.


Okay then perche 
https://tomcat.apache.org/tomcat-11.0-doc/config/executor.html#Virtual_Thread_Implementation 
?


-chris

-
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org



Re: Virtual Thread Configuration In Tomcat 11

2023-09-07 Thread William Crowell
When I set -Djdk.tracePinnedThreads=short, then I see this:

…
Thread[#41,ForkJoinPool-1-worker-4,5,CarrierThreads]
com.mysql.cj.jdbc.ConnectionImpl.isValid(ConnectionImpl.java:2516) <== 
monitors:1
Thread[#39,ForkJoinPool-1-worker-2,5,CarrierThreads]
com.mysql.cj.jdbc.ConnectionImpl.isValid(ConnectionImpl.java:2516) <== 
monitors:1
Thread[#41,ForkJoinPool-1-worker-4,5,CarrierThreads]
com.mysql.cj.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:2005) 
<== monitors:1
Thread[#43,ForkJoinPool-1-worker-5,5,CarrierThreads]

com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:893)
 <== monitors:1

com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1061)
 <== monitors:1

com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1009)
 <== monitors:1
Thread[#43,ForkJoinPool-1-worker-5,5,CarrierThreads]
com.mysql.cj.jdbc.ConnectionImpl.commit(ConnectionImpl.java:791) <== 
monitors:1
Thread[#43,ForkJoinPool-1-worker-5,5,CarrierThreads]
com.mysql.cj.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:2005) 
<== monitors:1
…

I started digging into the MySQL client code: 
https://github.com/mysql/mysql-connector-j/blob/8.0.33/src/main/user-impl/java/com/mysql/cj/jdbc/ConnectionImpl.java

This class is littered with synchronized blocks, so now this makes sense to me 
why virtual threads would take longer than a regular OS thread.

Regards,

William Crowell



This e-mail may contain information that is privileged or confidential. If you 
are not the intended recipient, please delete the e-mail and any attachments 
and notify us immediately.



Re: Virtual Thread Configuration In Tomcat 11

2023-09-07 Thread William Crowell
Chris,

I did set -Djdk.tracePinnedThreads=full and found there were a few pinned 
threads:


Thread[#43,ForkJoinPool-1-worker-4,5,CarrierThreads]


java.base/java.lang.VirtualThread$VThreadContinuation.onPinned(VirtualThread.java:185)

java.base/jdk.internal.vm.Continuation.onPinned0(Continuation.java:393)

java.base/java.lang.VirtualThread.parkNanos(VirtualThread.java:631)

java.base/java.lang.System$2.parkVirtualThread(System.java:2648)

java.base/jdk.internal.misc.VirtualThreads.park(VirtualThreads.java:67)


java.base/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:408)

…


com.mysql.cj.protocol.FullReadInputStream.readFully(FullReadInputStream.java:64)


com.mysql.cj.protocol.a.SimplePacketReader.readHeaderLocal(SimplePacketReader.java:81)

…

com.mysql.cj.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:2005) 
<== monitors:1


com.zaxxer.hikari.pool.ProxyConnection.setAutoCommit(ProxyConnection.java:401)


com.zaxxer.hikari.pool.HikariProxyConnection.setAutoCommit(HikariProxyConnection.java)

…

Over the 12 test runs I have performed, I found a 53% decrease in throughput 
when using virtual threads: 
http://ec2-18-188-185-212.us-east-2.compute.amazonaws.com:8080/web-report/

My example code is located here: https://github.com/wcrowell/rest-mysql-app/

The JMX test I used is located here: 
https://github.com/wcrowell/rest-mysql-app/blob/main/virtual-thread-test.jmx

This test makes a POST request to save a record to MySQL: 
http://ec2-18-117-196-158.us-east-2.compute.amazonaws.com:8080/vt/save

Regards,

William Crowell


This e-mail may contain information that is privileged or confidential. If you 
are not the intended recipient, please delete the e-mail and any attachments 
and notify us immediately.



java.lang.ClassNotFoundException for listener class

2023-09-07 Thread Ivano Luberti

Hello all.

I have developed a web application using Eclipse as an IDE and test 
environment and it runs as expected.


Then I have built a war file and deployed it under another Tomcat instance.

In both case tomcat version is 8.5

Under this last instance the application can't start and in the log 
files I find:


07-Sep-2023 07:48:18.173 SEVERE [http-nio-8080-exec-129] 
org.apache.catalina.core.StandardContext.listenerStart Error 
configuring application listener of class 
[it.archimede.met.obliterazione.zse.servlet.CreaConnessione]
    java.lang.ClassNotFoundException: 
it.archimede.met.obliterazione.zse.servlet.CreaConnessione
        at 
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1358)
        at 
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1180)
        at 
org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:545)
        at 
org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:526)
        at 
org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:150)
        at 
org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4613)
        at 
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5155)
        at 
org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at 
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743)
        at 
org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
        at 
org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
        at 
org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:614)
        at 
org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:486)
        at 
org.apache.catalina.startup.HostConfig.check(HostConfig.java:1634)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:607)
        at 
org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:286)
        at 
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
        at 
com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
        at 
org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1562)
        at 
org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:990)
        at 
org.apache.catalina.manager.HTMLManagerServlet.deployInternal(HTMLManagerServlet.java:320)
        at 
org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:209)

        at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at 
org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:211)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at 
org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:109)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:668)
        at 
org.apache.catalina.valves.RequestFilterValve.process(RequestFilterValve.java:348)
        at 
org.apache.catalina.valves.RemoteAddrValve.invoke(RemoteAddrValve.java:52)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at 
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
        at