On 25/05/2015 06:26, Rainer Jung wrote:
> When testing tcnative I observed a strange 1000 seconds timeout. The
> occurrence of the timeout was likely due to using an old OpenSSL version
> (0.9.8m) in combination with the unit tests that want a newer one, but I
> found the long duration of 1000 seconds strange.
> 
> It happens in TestSsl.testSimpleSsl lines 66 and again in line 86 (TC8):
> 
> 25-May-2015 00:30:27.121 SEVERE [main]
> org.apache.coyote.AbstractProtocol.init Failed to initialize end point
> associated with ProtocolHandler ["http-apr-127.0.0.1-auto-1-40424"]
>  java.lang.Exception: Unable to create SSLContext. Check that SSLEngine
> is enabled in the AprLifecycleListener, the AprLifecycleListener has
> initialised correctly and that a valid SSLProtocol has been specified
>         at
> org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:538)
>         at
> org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:737)
> 
> 
> As a consequence the handshakes hangs:
> 
> 
> Testcase: testSimpleSsl took 1,006.091 sec
>         Caused an ERROR
> Read timed out
> java.net.SocketTimeoutException: Read timed out
>         at java.net.SocketInputStream.socketRead0(Native Method)
> ...
>         at
> sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
> ...
> org.apache.tomcat.util.net.TestSsl.testSimpleSsl(TestSsl.java:67)
> 
> 
> I did a little svn archaelogy and I think the problem goes back to
> revision r1433976 in AprEndpoint where the following code block
> 
> 
> -                    // Check timeouts (much less frequently than polling)
> -                    if (maintainTime > 1000000L && running) {
> -                        maintainTime = 0;
> -                        if (socketProperties.getSoTimeout() > 0) {
> -                            doTimeout(connectionPollset);
> -                        }
> -                    }
> 
> 
> changed into
> 
> 
> +                    // Process socket timeouts
> +                    if (getSoTimeout() > 0 && maintain++ > 1000 &&
> running) {
> +                        // This works and uses only one timeout
> mechanism for everything, but the
> +                        // non event poller might be a bit faster by
> using the old maintain.
> +                        maintain = 0;
> +                        maintain();
>                      }
> 
> The commit contains many more changes, but I think the problem can be
> localized in this block. In APR maintainTime is in microseconds (it is
> incremented with pollTime which is in microseconds), so 1000000L is one
> second. The new block counts maintain and I think that is incremented
> once per second, so we switch from a 1000000 microsecond = 1 second
> condition to a 1000 second condition.
> 
> I'm not sure whether it is better to simply check for maintain++ > 1 (or
>>= 1) or switch back to summing up pollTime.Needs more investigation.

Looking at it now. I think there are some simplifications that can be
made but I need to look into the more closely.

Mark


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

Reply via email to