Koji Kawamura created NIFI-3818:
-----------------------------------

             Summary: HiveStreaming processor sometimes throws 
IllegalStateException resulting rollback
                 Key: NIFI-3818
                 URL: https://issues.apache.org/jira/browse/NIFI-3818
             Project: Apache NiFi
          Issue Type: Bug
          Components: Extensions
    Affects Versions: 1.2.0
            Reporter: Koji Kawamura
            Assignee: Koji Kawamura


PutHive Streaming processor is sometimes throwing IllegalStateException with 
following stack trace, resulting in the rollback of the session. 

{code}
2017-05-04 03:35:04,190 ERROR [Timer-Driven Process Thread-2] 
o.a.n.processors.hive.PutHiveStreaming 
PutHiveStreaming[id=d17c8654-015b-1000-0000-0000701816b4] 
org.apache.nifi.processors.hive.PutHiveStreaming$$Lambda$1254/2096694862@5bf15592
 failed to process due to java.lang.IllegalStateException; rolling back 
session: {}
java.lang.IllegalStateException: null
        at 
org.apache.nifi.controller.repository.StandardProcessSession.checkpoint(StandardProcessSession.java:210)
        at 
org.apache.nifi.controller.repository.StandardProcessSession.commit(StandardProcessSession.java:306)
        at 
org.apache.nifi.processor.util.pattern.PartialFunctions.onTrigger(PartialFunctions.java:115)
        at 
org.apache.nifi.processor.util.pattern.RollbackOnFailure.onTrigger(RollbackOnFailure.java:184)
        at 
org.apache.nifi.processors.hive.PutHiveStreaming.onTrigger(PutHiveStreaming.java:582)
        at 
org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1118)
        at 
org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:144)
        at 
org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:47)
        at 
org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(TimerDrivenSchedulingAgent.java:132)
        at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
        at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
        at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
{code}

This is caused by the incorrect use of ProcessSession at PutHiveStreaming, that 
is added by NIFI-3145. The processor reads Avro records from incoming FlowFile, 
as well as writing succeeded and failed records to outgoing FlowFiles 
(success/fail).

To write outgoing FlowFiles, the processor uses different threads so that it 
can append those Avro record without closing the OutputStream passed from 
ProcessSession.append method.

However, StandardProcessSession is not thread-safe. It has many HashMaps in it 
and particularly, the 'recursionSet' (HashSet) was the cause of this issue, as 
different threads add/remove entries from the set, its 'isEmpty' method doesn't 
work correctly, and can cause the IllegalStateException reported in this JIRA.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to