[ 
https://issues.apache.org/jira/browse/SUREFIRE-1302?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Yuriy updated SUREFIRE-1302:
----------------------------
    Description: 
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.

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

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 );
    }

to create ScheduledFuture.

In some of the cases the forked container might respond a bit later than it's 
expected and surefire kills it

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 );
                }
            }
        };
    }

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.


> The forked VM terminated without properly saying goodbye. VM crash or 
> System.exit called?
> -----------------------------------------------------------------------------------------
>
>                 Key: SUREFIRE-1302
>                 URL: https://issues.apache.org/jira/browse/SUREFIRE-1302
>             Project: Maven Surefire
>          Issue Type: Bug
>          Components: Maven Surefire Plugin
>    Affects Versions: 2.19.1
>            Reporter: Yuriy
>
> 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.4#6332)

Reply via email to