Docker 컨테이너 내에서 Spring 애플리케이션을 실행 중입니다. 우리의 응용 프로그램은 SVG 파일을 PDF 형식으로 변환하여 PDF에 포함 할 수 있습니다.Apache Batik 트랜스 코더 (도커 컨테이너 차단 포함)
응용 프로그램이 osx에서 올바르게 작동하고 예상대로 트랜스 코드됩니다. 그러나 다른 파일 시스템을 가진 도커 컨테이너 내부에서 실행하면 트랜스 코더가 멈추어 일부 기괴한 재귀 파일 검색 루프에서 CPU를 처리합니다.
java.lang.Thread.State: RUNNABLE
at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:242)
at java.io.File.isFile(File.java:882)
at org.apache.commons.io.filefilter.FileFileFilter.accept(FileFileFilter.java:59)
at org.apache.commons.io.filefilter.AndFileFilter.accept(AndFileFilter.java:122)
at org.apache.commons.io.filefilter.AndFileFilter.accept(AndFileFilter.java:122)
at org.apache.commons.io.filefilter.OrFileFilter.accept(OrFileFilter.java:118)
at java.io.File.listFiles(File.java:1291)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:357)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364
다음은 PDFTranscoder를 실행 한 스레드의 스택 추적에 대한 것입니다. Walk는 잠시 동안 재귀 적으로 호출되고 결국에는 getBooleanAttributes0이 호출되고 모든 것이 차단됩니다.
추가 조사가 끝나면 strace 명령으로 어떤 일이 일어나는지 자세히 살펴보고 시스템이 본질적으로 다음과 같은 무한 루프에서 스팸을 보내는 것을 확인했습니다. PNP0103 : 00/subsystem/devices/PNP0103 : 00/subsystem/devices/
stat ("/./ sys/devices/pci0000 : 00/PNP0103 : 00/하위 시스템/장치/PNP0103 : PNP0103 : 00/subsystem/devices/PNP0103 : 00/subsystem/devices/PNP0103 : 00/subsystem/devices/PNP0103 : 00/subsystem/devices/PNP0103 : PNP0103 : 00/서브 시스템/장치/PNP0103 : 00/서브 시스템/장치/PNP0103 : 00/서브 시스템/장치/PNP0103 : 00/서브 시스템/(st_mode = S_IFREG | 0444, st_size = 4096, ...}) = 0 < 0.000224> 서브 시스템/장치/PNP0103 : 00/subsystem/devices/pcspkr/input/input1/subsystem/input0/subsystem/input0/uniq "
stat 호출이 차단되거나 걸려있는 것 같습니다. 그러나 우리는 시스템 호출에 대해 깊이 파고 들었으므로 이제는 디버깅하기가 어렵습니다. 누구든지 아이디어가 있습니까?