Jasper D created FLUME-3423:
-------------------------------

             Summary: Taildir source will throw unnecessay exception when 
restart agent
                 Key: FLUME-3423
                 URL: https://issues.apache.org/jira/browse/FLUME-3423
             Project: Flume
          Issue Type: Bug
          Components: Sinks+Sources
    Affects Versions: 1.9.0
            Reporter: Jasper D
             Fix For: 1.10.0


h2. *Phenomenon*

When we use Taildir source, it will auto create an empty tail position file at 
start time. But if the filegroup directory is empty,  it has no file to tail 
and then we restart agent, it will throw an EOFException. Although it has 
little effect on functionality, it will annoy users.
h2. *Recur*

This problem can esaily recur.

We can use the example.conf from flume user guide directly.
{code:java}
//代码占位符
a1.sources = r1
a1.channels = c1
a1.sources.r1.type = TAILDIR
a1.sources.r1.channels = c1
a1.sources.r1.positionFile = /var/log/flume/taildir_position.json
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /var/log/test1/*.log
a1.sources.ri.maxBatchCount = 1000 
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sinks.k1.type = logger 
a1.sinks.k1.channel = c1{code}
and start flume with it
{code:java}
//代码占位符
bin/flume-ng agent --conf conf --conf-file conf/example.conf --name a1 
-Dflume.root.logger=INFO,console {code}
then ctrl + c stop it.

Just wait a moment, and then start flume again, then it will throw an exception 
like below.
{code:java}
//代码占位符
ERROR [lifecycleSupervisor-1-1] 
(org.apache.flume.source.taildir.ReliableTaildirEventReader.loadPositionFile:147)
  - Failed loading positionFile: /var/log/flume/taildir_position.json
java.io.EOFException: End of input at line 1 column 1
        at 
com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:954) 
~[gson-2.2.2.jar:?]
        at com.google.gson.stream.JsonReader.nextValue(JsonReader.java:771) 
~[gson-2.2.2.jar:?]
        at com.google.gson.stream.JsonReader.peek(JsonReader.java:367) 
~[gson-2.2.2.jar:?]
        at com.google.gson.stream.JsonReader.expect(JsonReader.java:337) 
~[gson-2.2.2.jar:?]
        at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:306) 
~[gson-2.2.2.jar:?]
        at 
org.apache.flume.source.taildir.ReliableTaildirEventReader.loadPositionFile(ReliableTaildirEventReader.java:111)
 [flume-taildir-source-1.10.0-SNAPSHOT.jar:1.10.0-SNAPSHOT]
        at 
org.apache.flume.source.taildir.ReliableTaildirEventReader.<init>(ReliableTaildirEventReader.java:96)
 [flume-taildir-source-1.10.0-SNAPSHOT.jar:1.10.0-SNAPSHOT]
        at 
org.apache.flume.source.taildir.ReliableTaildirEventReader.<init>(ReliableTaildirEventReader.java:49)
 [flume-taildir-source-1.10.0-SNAPSHOT.jar:1.10.0-SNAPSHOT]
        at 
org.apache.flume.source.taildir.ReliableTaildirEventReader$Builder.build(ReliableTaildirEventReader.java:355)
 [flume-taildir-source-1.10.0-SNAPSHOT.jar:1.10.0-SNAPSHOT]
        at 
org.apache.flume.source.taildir.TaildirSource.start(TaildirSource.java:105) 
[flume-taildir-source-1.10.0-SNAPSHOT.jar:1.10.0-SNAPSHOT]
        at 
org.apache.flume.source.PollableSourceRunner.start(PollableSourceRunner.java:71)
 [flume-ng-core-1.10.0-SNAPSHOT.jar:1.10.0-SNAPSHOT]
        at 
org.apache.flume.lifecycle.LifecycleSupervisor$MonitorRunnable.run(LifecycleSupervisor.java:249)
 [flume-ng-core-1.10.0-SNAPSHOT.jar:1.10.0-SNAPSHOT]
        at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
[?:1.8.0-292]
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) 
[?:1.8.0-292]
        at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
 [?:1.8.0-292]
        at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
 [?:1.8.0-292]
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
[?:1.8.0-292]
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
[?:1.8.0-292]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0-292] {code}
h2. Fix

We just add a condition in ReliableTaildirEventReader constructor.

The pr/patch will be submitted as as shown below.

Or let it still exist and using warning log instead of exception thrown is 
better?

 



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to