Необходимо объяснение ошибки
При выполнение программы возникли следующие ошибки, что они означают и как их можно исправить?
[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
Что со всем этим делать?
Насколько я понимаю:
- Во-первых они позволили настраивать размер этого самого таймаута, чтобы мы могли его увеличить
- Во-вторых можно изменить способ проверки процессов
- В-третьих, как говорят, начиная с версии
3.0.0-M4проверку процессов отключили.
Поэтому можете:
- обновить плагин
- установить таймаут пробросив forkedProcessTimeoutInSeconds
mvn test -Dsurefire.forkedProcessTimeoutInSeconds={кол-во секунд}
см: