thanks

On Thu, Jan 11, 2018 at 3:09 PM, Claus Ibsen <claus.ib...@gmail.com> wrote:

> Hi
>
> Yes its a little bug, its easier to reproduce if you make the
> processing slower, and speedup the file polling consumer to scan
> faster.
>
>
>
> On Tue, Jan 9, 2018 at 8:26 AM, Claus Ibsen <claus.ib...@gmail.com> wrote:
> > 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/20936b173f332090c6fc5903737152
> e7d26eb60b/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/bb39dc44d9603c0e6fce2460ddf35a
> 7b94ca30d4/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/f6ac3d81420d3f53b029a0f0c31dd4
> 610810e2c2/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/f6ac3d81420d3f53b029a0f0c31dd4
> 610810e2c2/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
>
>
>
> --
> Claus Ibsen
> -----------------
> http://davsclaus.com @davsclaus
> Camel in Action 2: https://www.manning.com/ibsen2
>

Reply via email to