[ 
https://issues.apache.org/jira/browse/NIFI-5885?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16714559#comment-16714559
 ] 

ASF subversion and git services commented on NIFI-5885:
-------------------------------------------------------

Commit 4e7a856f77fb8b7fbe1067ce667d8dff93dbd271 in nifi's branch 
refs/heads/master from [~ijokarumawak]
[ https://git-wip-us.apache.org/repos/asf?p=nifi.git;h=4e7a856 ]

NIFI-5885 ArrayOutOfBoundsException at EL 'or' and 'and' functions

EL 'or' and 'and' functions can be called multiple times within the same 
context using the same evaluator instance.
That happens if their subject is derived from an IteratingEvaluator such as 
'anyDelineatedValues'.

And if the right hand side expression for such 'or' and 'and' contains another 
IteratingEvaluator,
then it can be evaluated more than the number of its candidates, ultimately an 
ArrayOutOfBoundsException is thrown.

This commit makes Or/AndEvaluator caching its right hand side result to prevent 
that happens.
For 'or' and 'and' functions, the right hand side expression is independant 
from their subject boolean value.
It's enough evaluating right hand side once, because it returns the same result 
even with different subjects.

Signed-off-by: Pierre Villard <pierre.villard...@gmail.com>

This closes #3212.


> EL expression of anyDelineatedValue() and or() fails with stacktrace 
> ---------------------------------------------------------------------
>
>                 Key: NIFI-5885
>                 URL: https://issues.apache.org/jira/browse/NIFI-5885
>             Project: Apache NiFi
>          Issue Type: Bug
>    Affects Versions: 1.0.0
>            Reporter: Yan Chen
>            Assignee: Koji Kawamura
>            Priority: Major
>             Fix For: 1.9.0
>
>         Attachments: anyDelineatedValue_or_test.xml, 
> image-2018-12-10-11-37-55-545.png
>
>
> See attached Template test-case. Following EL expression failed:
> ${anyDelineatedValue('${names}', 
> ','):equals('${my_name}'):or(${anyDelineatedValue('${types}', 
> ','):equals('${my_type}')})}
> with stacktrace:
> {code:java}
> // code placeholder
> 2018-12-09 19:03:25,534 ERROR [Timer-Driven Process Thread-7] 
> o.a.n.p.standard.RouteOnAttribute 
> RouteOnAttribute[id=954d4a07-0167-1000-ffff-ffff93233dd3] 
> RouteOnAttribute[id=954d4a07-0167-1000-ffff-ffff93233dd3] failed to process 
> session due to java.lang.ArrayIndexOutOfBoundsException: 1; Processor 
> Administratively Yielded for 1 sec: java.lang.ArrayIndexOutOfBoundsException: 
> 1
> java.lang.ArrayIndexOutOfBoundsException: 1
> at 
> org.apache.nifi.attribute.expression.language.evaluation.selection.DelineatedAttributeEvaluator.evaluate(DelineatedAttributeEvaluator.java:65)
> at 
> org.apache.nifi.attribute.expression.language.evaluation.functions.EqualsEvaluator.evaluate(EqualsEvaluator.java:40)
> at 
> org.apache.nifi.attribute.expression.language.evaluation.selection.AnyAttributeEvaluator.evaluate(AnyAttributeEvaluator.java:38)
> at 
> org.apache.nifi.attribute.expression.language.evaluation.functions.OrEvaluator.evaluate(OrEvaluator.java:47)
> at 
> org.apache.nifi.attribute.expression.language.evaluation.selection.AnyAttributeEvaluator.evaluate(AnyAttributeEvaluator.java:49)
> at 
> org.apache.nifi.attribute.expression.language.Query.evaluate(Query.java:363)
> at 
> org.apache.nifi.attribute.expression.language.Query.evaluateExpression(Query.java:204)
> at 
> org.apache.nifi.attribute.expression.language.CompiledExpression.evaluate(CompiledExpression.java:58)
> at 
> org.apache.nifi.attribute.expression.language.StandardPreparedQuery.evaluateExpressions(StandardPreparedQuery.java:53)
> at 
> org.apache.nifi.attribute.expression.language.StandardPropertyValue.evaluateAttributeExpressions(StandardPropertyValue.java:160)
> at 
> org.apache.nifi.attribute.expression.language.StandardPropertyValue.evaluateAttributeExpressions(StandardPropertyValue.java:148)
> at 
> org.apache.nifi.attribute.expression.language.StandardPropertyValue.evaluateAttributeExpressions(StandardPropertyValue.java:133)
> at 
> org.apache.nifi.processors.standard.RouteOnAttribute.onTrigger(RouteOnAttribute.java:219)
> at 
> org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:27)
> at 
> org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1165)
> at 
> org.apache.nifi.controller.tasks.ConnectableTask.invoke(ConnectableTask.java:203)
> at 
> org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(TimerDrivenSchedulingAgent.java:117)
> 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:1149)
> at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748)
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to