[
https://issues.apache.org/jira/browse/CAMEL-19849?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17764669#comment-17764669
]
Otavio Rodolfo Piske commented on CAMEL-19849:
----------------------------------------------
We found that:
1. This happens only when using parallelProcessing
2. We also found that in that case, it call the [close on
checkNullAnswer|https://github.com/apache/camel/blob/09db270a944fdb43c51635f1a8b1ea03bc46c378/components/camel-zipfile/src/main/java/org/apache/camel/dataformat/zipfile/ZipIterator.java#L133]
and [the close on the
ZipIterator|https://github.com/apache/camel/blob/09db270a944fdb43c51635f1a8b1ea03bc46c378/components/camel-zipfile/src/main/java/org/apache/camel/dataformat/zipfile/ZipIterator.java#L162]
before the [close on the
ZipInputStreamWrapper|https://github.com/apache/camel/blob/09db270a944fdb43c51635f1a8b1ea03bc46c378/components/camel-zipfile/src/main/java/org/apache/camel/dataformat/zipfile/ZipInputStreamWrapper.java#L34].
This is the contrary of the non-parallel mode, in which it calls the close on
the ZipInputstream before the one in hasNext and the one in close (see below)
{code:java}
#### Baseline (running in non parallel)
Calling close on ZipInputStreamWrapper # 1
Calling close on ZipInputStreamWrapper # 2
Calling close on ZipInputStreamWrapper # 3
Calling close on ZipInputStreamWrapper # 4
Calling close on ZipInputStreamWrapper # 5
Calling hasNext # 1
Calling close # 1
###### With parallelProcessing
Calling checkNullAnswer # 1
Calling close # 1
Calling close on ZipInputStreamWrapper # 1
Calling close on ZipInputStreamWrapper # 3
Calling close on ZipInputStreamWrapper # 4
Calling close on ZipInputStreamWrapper # 2
Calling close on ZipInputStreamWrapper # 5
{code}
A reproducer can be [found
here|https://github.com/orpiske/camel/blob/camel-19849/components/camel-zipfile/src/test/java/org/apache/camel/dataformat/zipfile/ZipSplitterRouteParallelTest.java].
Essentially it can be reproduced using a route like:
{code:java}
public void configure() {
// Unzip file and Split it according to FileEntry
from("file:src/test/resources/org/apache/camel/dataformat/zipfile/data?delay=1000&noop=true")
.log("Start processing big file:
${header.CamelFileName}")
.split(new
ZipSplitter()).streaming().parallelProcessing()
.to("log:entry")
.convertBodyTo(String.class).to("mock:processZipEntry")
// .end()
.log("Done processing big file:
${header.CamelFileName}");
}
{code}
> camel-zipfile: fails to release exchange due to Exceptions
> ----------------------------------------------------------
>
> Key: CAMEL-19849
> URL: https://issues.apache.org/jira/browse/CAMEL-19849
> Project: Camel
> Issue Type: Bug
> Components: camel-zipfile
> Reporter: Otavio Rodolfo Piske
> Assignee: Otavio Rodolfo Piske
> Priority: Major
>
> *Note*: this issue is still under investigation.
> {code:java}
> 2023-09-12 10:48:41,210 DEBUG [org.apa.cam.dat.zip.ZipIterator] (Camel
> (camel-1) thread #10 - Split) read zipEntry
> META-INF/services/io.quarkus.dev.spi.HotReplacementSetup
> 2023-09-12 10:48:41,211 WARN [org.apa.cam.pro.MulticastProcessor] (Camel
> (camel-1) thread #4 - Split) Error releasing exchange due to
> java.util.zip.ZipException: invalid code -- missing end-of-block. This
> exception is ignored.: org.apache.camel.RuntimeCamelException:
> java.util.zip.ZipException: invalid code -- missing end-of-block
> at
> org.apache.camel.dataformat.zipfile.ZipIterator.getNextElement(ZipIterator.java:129)
> at
> org.apache.camel.dataformat.zipfile.ZipIterator.next(ZipIterator.java:93)
> at
> org.apache.camel.dataformat.zipfile.ZipIterator.next(ZipIterator.java:40)
> at
> org.apache.camel.processor.Splitter$SplitterIterable$1.next(Splitter.java:230)
> at
> org.apache.camel.processor.Splitter$SplitterIterable$1.next(Splitter.java:203)
> at
> org.apache.camel.processor.MulticastProcessor.doDone(MulticastProcessor.java:816)
> at
> org.apache.camel.processor.MulticastProcessor$MulticastTask.doDone(MulticastProcessor.java:484)
> at
> org.apache.camel.processor.MulticastProcessor$MulticastReactiveTask.run(MulticastProcessor.java:584)
> at
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:189)
> at
> org.apache.camel.impl.engine.DefaultReactiveExecutor.schedule(DefaultReactiveExecutor.java:56)
> at
> org.apache.camel.processor.MulticastProcessor.lambda$schedule$1(MulticastProcessor.java:336)
> at
> java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
> at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
> 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)
> Caused by: java.util.zip.ZipException: invalid code -- missing end-of-block
> at
> java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)
> at java.base/java.util.zip.ZipInputStream.read(ZipInputStream.java:196)
> at
> java.base/java.util.zip.ZipInputStream.closeEntry(ZipInputStream.java:142)
> at
> java.base/java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:120)
> at
> org.apache.camel.dataformat.zipfile.ZipIterator.getNextEntry(ZipIterator.java:143)
> at
> org.apache.camel.dataformat.zipfile.ZipIterator.getNextElement(ZipIterator.java:114)
> ... 15 more
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)