https://bz.apache.org/bugzilla/show_bug.cgi?id=65177

            Bug ID: 65177
           Summary: org.apache.tomcat.util.net.TestSsl fails with
                    OutOfMemoryError on 32-bit JVM
           Product: Tomcat 8
           Version: 8.5.63
          Hardware: PC
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Catalina
          Assignee: dev@tomcat.apache.org
          Reporter: knst.koli...@gmail.com
  Target Milestone: ----

Testing 8.5.64 release candidate, one unit test fails with OutOfMemoryError
when running with a 32-bit JVM. It completes successfully with a 64-bit one.

The failing test:
org.apache.tomcat.util.net.TestSsl

Testcase: testPost took 12,641 sec
    FAILED
expected:<0> but was:<2>
junit.framework.AssertionFailedError: expected:<0> but was:<2>
    at org.apache.tomcat.util.net.TestSsl.testPost(TestSsl.java:160)

It fails in the same way with all 3 connectors. Here is an output from running
with NIO connector and Java 7u80 (Oracle):

[[[
09-Mar-2021 08:42:25.819 INFO [main]
org.apache.catalina.startup.LoggingBaseTest.setUp Starting test case [testPost]
09-Mar-2021 08:42:25.824 INFO [main] org.apache.coyote.AbstractProtocol.init
Initializing ProtocolHandler ["https-jsse-nio-127.0.0.1-auto-3"]
09-Mar-2021 08:42:25.826 INFO [main]
org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared
selector for servlet write/read
09-Mar-2021 08:42:25.827 INFO [main]
org.apache.catalina.core.StandardService.startInternal Starting service
[Tomcat]
09-Mar-2021 08:42:25.827 INFO [main]
org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine:
Apache Tomcat/8.5.64
09-Mar-2021 08:42:25.842 INFO [main] org.apache.coyote.AbstractProtocol.start
Starting ProtocolHandler ["https-jsse-nio-127.0.0.1-auto-3-59015"]
09-Mar-2021 08:42:26.475 SEVERE [https-jsse-nio-127.0.0.1-auto-3-exec-5]
org.apache.coyote.AbstractProtocol$ConnectionHandler.process Failed to complete
processing of a request
    java.lang.OutOfMemoryError: Java heap space
        at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:77)
        at
org.apache.tomcat.util.net.TestSsl$SimplePostServlet.doPost(TestSsl.java:300)
        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.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:364)
        at
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:616)
        at
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831)
        at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1629)
        at
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)
09-Mar-2021 08:42:26.555 SEVERE [https-jsse-nio-127.0.0.1-auto-3-exec-6]
org.apache.coyote.AbstractProtocol$ConnectionHandler.process Failed to complete
processing of a request
    java.lang.OutOfMemoryError: Java heap space
        at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:77)
        at
org.apache.tomcat.util.net.TestSsl$SimplePostServlet.doPost(TestSsl.java:300)
        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.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:364)
        at
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:616)
        at
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831)
        at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1629)
        at
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)
java.net.SocketException: Connection reset by peer: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
    at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:377)
    at sun.security.ssl.OutputRecord.write(OutputRecord.java:363)
    at
sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:837)
    at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:808)
    at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122)
    at org.apache.tomcat.util.net.TestSsl$1.run(TestSsl.java:117)
java.net.SocketException: Connection reset by peer: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
    at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:377)
    at sun.security.ssl.OutputRecord.write(OutputRecord.java:363)
    at
sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:837)
    at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:808)
    at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122)
    at org.apache.tomcat.util.net.TestSsl$1.run(TestSsl.java:117)
09-Mar-2021 08:42:38.441 INFO [main] org.apache.coyote.AbstractProtocol.pause
Pausing ProtocolHandler ["https-jsse-nio-127.0.0.1-auto-3-59015"]
09-Mar-2021 08:42:38.448 INFO [main]
org.apache.catalina.core.StandardService.stopInternal Stopping service [Tomcat]
09-Mar-2021 08:42:38.451 INFO [main] org.apache.coyote.AbstractProtocol.stop
Stopping ProtocolHandler ["https-jsse-nio-127.0.0.1-auto-3-59015"]
09-Mar-2021 08:42:38.456 INFO [main] org.apache.coyote.AbstractProtocol.destroy
Destroying ProtocolHandler ["https-jsse-nio-127.0.0.1-auto-3-59015"]
]]]

The failing line (TestSsl.java:300) does

>300: ByteArrayOutputStream baos = new ByteArrayOutputStream(POST_DATA_SIZE);

where POST_DATA_SIZE = 16 * 1024 * 1024, i.e. 16 Mb.

The test runs 8 threads (iterations = 8), and each of them allocates 16 Mb on
the sending side:

>96:  int iterations = 8;

>109: byte[] bytes = new byte[POST_DATA_SIZE]; // 16MB

and 16 Mb on the receiving side (the ByteArrayOutputStream above created in a
servlet's method), i.e. 256 Mb total in byte arrays.

Thus far I tested the following:

1) Running the test case alone, with the following setting in a
build.properties file, fails in the same way:

[[[
test.entry=org.apache.tomcat.util.net.TestSsl
test.entry.methods=testPost
]]]

2) The test fails with 32-bit Java 7u80 from Oracle.
3) The test fails with 32-bit Java 8u202 from Oracle.
4) The test completes successfully with 64-bit Java 8u282 from AdoptOpenJDK.

5) If I change the ByteArrayOutputStream constructor call above to one without
arguments, it fails at a different place - when growing an internal byte array:

[[[
    java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:3236)
        at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
        at
java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
        at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
        at
org.apache.tomcat.util.net.TestSsl$SimplePostServlet.doPost(TestSsl.java:306)
]]]

6) If I reduce the count of threads from 8 to 6 (changing 'iterations' on line
96), the test passes successfully.

Thus a solution is to reduce the number of threads.

Alternatively, it is possible to reuse the same array on the sending side.
Those arrays could contain random data, but as of now they all have the same
content:

>110: Arrays.fill(bytes, (byte) 1);

-- 
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

Reply via email to