Необходимо объяснение ошибки

При выполнение программы возникли следующие ошибки, что они означают и как их можно исправить?

[SUREFIRE] std/in stream corrupted
java.io.IOException: Command NOOP unexpectedly read Void data with length 4.
    at org.apache.maven.surefire.booter.MasterProcessCommand.decode(MasterProcessCommand.java:130)
    at org.apache.maven.surefire.booter.CommandReader$CommandRunnable.run(CommandReader.java:391)
    at java.base/java.lang.Thread.run(Thread.java:833)
System.exit() or native command error interrupted process checker.
java.lang.IllegalStateException: Cannot use PPID 10756 process information. Going to use NOOP events.
    at org.apache.maven.surefire.booter.PpidChecker.checkProcessInfo(PpidChecker.java:155)
    at org.apache.maven.surefire.booter.PpidChecker.isProcessAlive(PpidChecker.java:116)
    at org.apache.maven.surefire.booter.ForkedBooter$2.run(ForkedBooter.java:214)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
    at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)

Ответы (1 шт):

Автор решения: Михаил Ребров

Разберем все по порядку:

std/in stream corrupted

Дословно: поток ввода-вывода поврежден.
В целом уже лучше...понятно, что что-то случилось со стандартным потоком ввода-вывода, но пока еще непонятно почему.

Разбираем дальше:

java.io.IOException: Command NOOP unexpectedly read Void data with length 4.

Тут говориться что какая-то команда NOOP вдруг неожиданно вторглась в наши планы и начала считывать данные.

Кто такая эта NOOP'а?

NOOP - это простейщий планировщик ввода-вывода в UNIX, без возможности переопределения порядка операций, основанный на обычной очереди (FIFO).
https://en.wikipedia.org/wiki/Noop_scheduler

Уже понятнее:
получается уже не что какая-то непонятная команда прервала наше безмятежное существование, а сам планировщик ввода-вывода решил нам прервать сеанс этого самого ввода-вывода.

Почему? С какой стати? И кто это сделал?

Сделал это Surefire Plugin

Собственно, вот здесь: org.apache.maven.surefire.booter.ForkedBooter

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

Собственно вот строка в которой добавляется Noop Listener

reader.addNoopListener( createPingHandler( pingDone ) );

И далее самое страшное:

  • обращение к JVM_TERMINATOR
    как следует из названия он убивает JVM
  • и там происходит планирование этого события на конкретный таймаут

Surefire plugin отправляет ping процессу и если тот не отвечает за определенное время то происходит то, что произошло у Вас.

По данному кейсу есть таска в Jira:
https://issues.apache.org/jira/browse/SUREFIRE-1302


Что со всем этим делать?

Насколько я понимаю:

  1. Во-первых они позволили настраивать размер этого самого таймаута, чтобы мы могли его увеличить
  2. Во-вторых можно изменить способ проверки процессов
  3. В-третьих, как говорят, начиная с версии 3.0.0-M4 проверку процессов отключили.

Поэтому можете:

  • обновить плагин
  • установить таймаут пробросив forkedProcessTimeoutInSeconds
    mvn test -Dsurefire.forkedProcessTimeoutInSeconds={кол-во секунд}

см:

→ Ссылка