Hi Have patience, we will take a look at this later when we get time.
On Tue, Jan 9, 2018 at 1:52 AM, Bhuvan Gupta <bhuva...@gmail.com> wrote: > Humble request to validate my findings and confirming that it is a bug > > On 06-Jan-2018 5:06 PM, "Bhuvan Gupta" <bhuva...@gmail.com> wrote: > > Camel Users, > > I have found the issue > First lets go over the code routines that are executed for a route like > > from("file:stageDummy") > .threads(1) > .process(myProcess) > > [1] In the above route there will be one polling thread (Let call it as " > *pollingThread*",) which poll the route directory and fetch all the files > in it. (link > <https://github.com/apache/camel/blob/20936b173f332090c6fc5903737152e7d26eb60b/camel-core/src/main/java/org/apache/camel/component/file/FileConsumer.java#L75> > ) > [2] Then fo reach file *pollingThread *does a GenericFileConsumer.isValid > check , inside isValid it checks if the file is processed using LRUcache of > size 1000 (link) > <https://github.com/apache/camel/blob/bb39dc44d9603c0e6fce2460ddf35a7b94ca30d4/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java#L541> > [3] If file is Valid then *pollingThread *submit the task to > executorService having 1 thread(Lets Name is it CamelThread#1) > [4] Inside CamelThread#1 does following things > [1] Call the processor > [1] moving the file to .camel > [2] clear up the .camelLock file > [3] Remove the entry from LRU cache ----- IMPORTANT Point (link > <https://github.com/apache/camel/blob/f6ac3d81420d3f53b029a0f0c31dd4610810e2c2/camel-core/src/main/java/org/apache/camel/component/file/GenericFileOnCompletion.java#L95> > ) > > > Now if the two thread execution in the following timeline fashion THEN we > will end up with the same file been processed twice. > > [1] *pollingThread*: poll and fetch all the files in it let say we get > [File1] > [2] *pollingThread*: send the file for isValid Check > [3] *pollingThread*: isValid Check passes for File1 as it is not present in > LRU cahce > [4] *pollingThread*: Submit the File1 exchange to CamelThread#1 > [5] *pollingThread*: poll and fetch all the files in it let say we get > [File1, File1.camelLock] > [6] *CamelThread#1*: call processor for File1 and then remove File1 entry > from LRU cache > [7] *pollingThread*: send the file for isValid Check > [8] *pollingThread*: isValid check passes for the File1 as it is not is LRU > cache. > NOTE: isValid checked passed for File1 twice....HENCE THE EXCEPTION > > > Solution I see: > [1] Dont remove entry from cache after onCompletion (link > <https://github.com/apache/camel/blob/f6ac3d81420d3f53b029a0f0c31dd4610810e2c2/camel-core/src/main/java/org/apache/camel/component/file/GenericFileOnCompletion.java#L95> > ) > > *Humble request to validate my findings and confirming it as a bug :)* > Feel free to ask for more explanatory text if above text is not clean > enough. > > Thanks > Bhuvan > > On Wed, Jan 3, 2018 at 11:18 PM, <sim_yihts...@yahoo.com.invalid> wrote: > >> I suspect using “File consumer + threads(…) + default readLock” is like >> having multiple File consumer watching the same folder - they’ll screw up >> each other. >> >> >> I offer this as a possible proof: if you add an `idempotent=true` to your >> URI, the problem should go away. >> >> >> >> p/s: I think you’re trying to process your files parallel-ly. If that is >> your _actual_ question, I have no idea if the above is what you’re supposed >> to do even if it works. >> >> >> >> >> >> >> From: Claus Ibsen >> Sent: Wednesday, 3 January, 2018 9:56 PM >> To: users@camel.apache.org >> >> >> >> >> >> We cannot reproduce your problem. >> >> There can be several reasons why a file cannot be renamed, but >> unfortunately the file api just returns a boolean if it cannot rename >> a file. >> A typical problem is that your do some custom code where you read the >> file or do something with a input stream you do not close properly. >> >> Also using threads(1) does not really make sense. >> >> >> >> On Tue, Jan 2, 2018 at 6:02 AM, Bhuvan Gupta <bhuva...@gmail.com> wrote: >> > Hello nice people, >> > >> > We are using camel 2.17 with java 1.7 in our sample project and we >> defined >> > our route as: >> > >> > from("file:stageDummy") >> > .threads(1) >> > .process(myProcess); >> > >> > We first add 1000 file in stageDummy folder, then we run the code and >> we >> > get exception as below >> > >> > >> > org.apache.camel.component.file.GenericFileOperationFailedException: >> Cannot >> > rename file: GenericFile[newFile319] to: GenericFile[.camel/newFile319] >> > at >> > org.apache.camel.component.file.strategy.GenericFileProcessS >> trategySupport.renameFile(GenericFileProcessStrategySupport.java:115) >> > at >> > org.apache.camel.component.file.strategy.GenericFileRenamePr >> ocessStrategy.commit(GenericFileRenameProcessStrategy.java:88) >> > at >> > org.apache.camel.component.file.GenericFileOnCompletion.proc >> essStrategyCommit(GenericFileOnCompletion.java:127) >> > at >> > org.apache.camel.component.file.GenericFileOnCompletion.onCo >> mpletion(GenericFileOnCompletion.java:83) >> > at >> > org.apache.camel.component.file.GenericFileOnCompletion.onCo >> mplete(GenericFileOnCompletion.java:57) >> > at >> > org.apache.camel.util.UnitOfWorkHelper.doneSynchronizations( >> UnitOfWorkHelper.java:104) >> > at org.apache.camel.impl.DefaultUnitOfWork.done(DefaultUnitOfWo >> rk.java:229) >> > at org.apache.camel.util.UnitOfWorkHelper.doneUow(UnitOfWorkHel >> per.java:65) >> > at >> > org.apache.camel.processor.CamelInternalProcessor$UnitOfWork >> ProcessorAdvice.after(CamelInternalProcessor.java:654) >> > at >> > org.apache.camel.processor.CamelInternalProcessor$UnitOfWork >> ProcessorAdvice.after(CamelInternalProcessor.java:609) >> > at >> > org.apache.camel.processor.CamelInternalProcessor$InternalCa >> llback.done(CamelInternalProcessor.java:239) >> > at >> > org.apache.camel.processor.CamelInternalProcessor$InternalCa >> llback.done(CamelInternalProcessor.java:250) >> > at >> > org.apache.camel.processor.RedeliveryErrorHandler$1.done(Red >> eliveryErrorHandler.java:480) >> > at >> > org.apache.camel.management.InstrumentationProcessor$1.done( >> InstrumentationProcessor.java:86) >> > at org.apache.camel.processor.Pipeline$1.done(Pipeline.java:148) >> > at >> > org.apache.camel.processor.ThreadsProcessor$ProcessCall.run( >> ThreadsProcessor.java:85) >> > at java.util.concurrent.Executors$RunnableAdapter.call( >> Executors.java:471) >> > at java.util.concurrent.FutureTask.run(FutureTask.java:262) >> > at >> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPool >> Executor.java:1145) >> > at >> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoo >> lExecutor.java:615) >> > at java.lang.Thread.run(Thread.java:745) >> > >> > As per our understanding camel picks up the file from the mentioned >> > directory i.e in my case-stageDummy and processed by process-myProcess >> > and moves it to .camel sub folder.We noticed that if we were having more >> > than or around 1000 files in the folder -stageDummy ,there were some >> > exceptions >> > thrown >> > >> > This exception is thrown randomly for n number of files,where n changes >> > everytime we execute our main.Note that we were not trying to access the >> > exchange >> > instead we kept our process simple.We could see that if there are 1000 >> files >> > in our folder then the processor is getting called 1000+x times ,where x >> > changes everytime example it gets called 1024 times,and we could see that >> > camel is trying to process these x number of files again >> > >> > We are attaching the Main class as well as the project zip >> > >> > AND HAPPY NEW YEAR. >> > >> > hoping to resolve it soon >> > >> > >> > >> > >> >> >> >> -- >> Claus Ibsen >> ----------------- >> http://davsclaus.com @davsclaus >> Camel in Action 2: https://www.manning.com/ibsen2 >> -- Claus Ibsen ----------------- http://davsclaus.com @davsclaus Camel in Action 2: https://www.manning.com/ibsen2