Coverage41C
Coverage41C copied to clipboard
Команда stop не освобождает порт (сокет) в linux
После запуска dbgs делаю
Coverage41C start -i DefAlias -u http://127.0.0.1:1550 -o /test/genericCoverage.xml
потом в соседнем терминале
Coverage41C stop -i DefAlias -u http://127.0.0.1:1550
потом в первом терминале, как только служба завершается, повторно вызываю start - получаю вот что
# Coverage41C start -i DefAlias -u http://127.0.0.1:1550/ -o /test/genericCoverage.xml
java.io.IOException: org.scalasbt.ipcsocket.NativeErrorException: [98] Address already in use
at org.scalasbt.ipcsocket.UnixDomainServerSocket.bind(UnixDomainServerSocket.java:140)
at org.scalasbt.ipcsocket.UnixDomainServerSocket.<init>(UnixDomainServerSocket.java:114)
at org.scalasbt.ipcsocket.UnixDomainServerSocket.<init>(UnixDomainServerSocket.java:88)
at com.clouds42.Commands.CoverServer.getServerSocket(CoverServer.java:70)
at com.clouds42.Commands.CoverageCommand.call(CoverageCommand.java:128)
at com.clouds42.Commands.CoverageCommand.call(CoverageCommand.java:62)
at picocli.CommandLine.executeUserObject(CommandLine.java:1953)
at picocli.CommandLine.access$1300(CommandLine.java:145)
at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2358)
at picocli.CommandLine$RunLast.handle(CommandLine.java:2352)
at picocli.CommandLine$RunLast.handle(CommandLine.java:2314)
at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2179)
at picocli.CommandLine$RunLast.execute(CommandLine.java:2316)
at picocli.CommandLine.execute(CommandLine.java:2078)
at com.clouds42.Coverage41C.main(Coverage41C.java:47)
Caused by: org.scalasbt.ipcsocket.NativeErrorException: [98] Address already in use
at org.scalasbt.ipcsocket.JNAUnixDomainSocketLibraryProvider.bind(UnixDomainSocketLibrary.java:178)
at org.scalasbt.ipcsocket.UnixDomainServerSocket.bind(UnixDomainServerSocket.java:136)
... 14 more
Таким образом повторный запуск через start заканчивается ошибкой.
При остановке приложения видим что не закрывается сокет, хотя в винде закрывается и там такой проблемы нет.
# ss -a
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
nl UNCONN 0 0 rtnl:915 *
nl UNCONN 0 0 rtnl:kernel *
nl UNCONN 4352 0 tcpdiag:ss/1334 *
nl UNCONN 768 0 tcpdiag:kernel *
nl UNCONN 0 0 xfrm:kernel *
nl UNCONN 0 0 audit:kernel *
nl UNCONN 0 0 fiblookup:kernel *
nl UNCONN 0 0 nft:kernel *
nl UNCONN 0 0 uevent:kernel *
nl UNCONN 0 0 genl:kernel *
u_str LISTEN 0 4096 /tmp/.X11-unix/X99 3513007 * 0
u_str LISTEN 0 4096 @/tmp/.X11-unix/X99 3513006 * 0
tcp LISTEN 0 128 127.0.0.1:1554 0.0.0.0:*
tcp TIME-WAIT 0 0 127.0.0.1:54432 127.0.0.1:1554
tcp TIME-WAIT 0 0 127.0.0.1:36460 127.0.0.1:1554
В коде подозрительного ничего не вижу https://github.com/1c-syntax/Coverage41C/blob/4de4f8cd6ace643ef5abd0851678fcad5edd33af/src/main/java/com/clouds42/Commands/CoverServer.java#L66-L72
Не совсем понял, причём тут докер?
@nixel2007 докер тут не при чем, имелось ввиду создание сокета в линуксе
https://stackoverflow.com/questions/18849754/why-doesnt-socket-close-free-up-the-bound-port
попробовал socket.setReuseAddress(true); - не помогло
могу конечно ошибаться, но такой ошибки в винде нет
в итоге выяснил в чём дело нужно чтобы удалялся файл /tmp/coverage41c/DefAlias_http___127.0.0.1_1550.sock