[ 
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)

Reply via email to