[ 
https://issues.apache.org/jira/browse/SUREFIRE-1302?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15969177#comment-15969177
 ] 

Olivier Peyrusse commented on SUREFIRE-1302:
--------------------------------------------

Hello everyone,

I'd like to add my case to the one of [~xeagle]. 

In my case, we are developing an in-memory database for huge volume of data. 
Given that, it is common that we fill the JVM with a lot of objects during our 
tests, implying a lot of huge GCs after that. As you may know, GCs imply a 
stop-of-the-world at the JVM level, preventing it from sending its command 
expected by the ping. If the GC is too long, the VM is assumed to be dead and 
is killed by the {{ForkedBooter}}.
As Yuriy, having the possibility to configure the ping period is enough to fix 
this issue.

Side note: is it possible to add a log or something stating that the VM was 
killed by ForkedBooter since it was not responding ? 
bq. The forked VM terminated without properly saying goodbye. VM crash or 
System.exit called?
This is not really explicit. We first assumed that it was our code or in a 
third plugin. Directly knowing would have spare investigation hours :)

Thanks and regards

> Surefire does not wait long enough for the forked VM and assumes it to be dead
> ------------------------------------------------------------------------------
>
>                 Key: SUREFIRE-1302
>                 URL: https://issues.apache.org/jira/browse/SUREFIRE-1302
>             Project: Maven Surefire
>          Issue Type: Request
>          Components: Maven Surefire Plugin
>    Affects Versions: 2.19.1
>            Reporter: Yuriy Zaplavnov
>            Assignee: Tibor Digana
>             Fix For: Backlog
>
>         Attachments: 
> surefire-tests-terminated-master-aa9330316038f6b46316ce36ff40714ffc7cf299.zip,
>  tests_log_01.txt, tests_log_02.txt
>
>
> This issue happens because surefire kills the forked container if it times 
> out waiting for the 'ping'.
> In org.apache.maven.surefire.booter.ForkedBooter class there is hardcoded 
> constant PING_TIMEOUT_IN_SECONDS  = 20 which is used in the following method:
> {code}
> private static ScheduledFuture<?> listenToShutdownCommands( CommandReader 
> reader )
>     {
>         reader.addShutdownListener( createExitHandler( reader ) );
>         AtomicBoolean pingDone = new AtomicBoolean( true );
>         reader.addNoopListener( createPingHandler( pingDone ) );
>         return JVM_TERMINATOR.scheduleAtFixedRate( createPingJob( pingDone, 
> reader ),
>                                                    0,PING_TIMEOUT_IN_SECONDS, 
> SECONDS );
>     }
> {code}
> to create ScheduledFuture.
> In some of the cases the forked container might respond a bit later than it's 
> expected and surefire kills it
> {code}
> private static Runnable createPingJob( final AtomicBoolean pingDone, final 
> CommandReader reader  )
>     {
>         return new Runnable()
>         {
>             public void run()
>             {
>                 boolean hasPing = pingDone.getAndSet( false );
>                 if ( !hasPing )
>                 {
>                     exit( 1, KILL, reader, true );
>                 }
>             }
>         };
>     }
> {code}
> As long as we need to terminate it anyway, It would be really helpful if the 
> problem could be solved making the PING_TIMEOUT_IN_SECONDS  configurable with 
> the ability to specify the value from maven-surefire-plugin. 
> It would help to configure this timeout based on needs and factors of the 
> projects where surefire runs.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to