[rules-users] NPE from reteoo.AccumulateNode

Jason Barto jason.p.barto at gmail.com
Wed May 15 12:30:06 EDT 2013


Davide and Wolfgang, thank you both for your time and feedback into my
questions as well as to other's questions. I'm rather interested in
learning more about the internals of drools in the hopes of making
contribution when and where possible. I'd imagine there's a developer guide
that talks to fusion's architecture that would act as a companion to
reviewing the source code?

Sincerely,
Jason
On May 14, 2013 8:25 PM, "Davide Sottara" <dsotty at gmail.com> wrote:

>  Confirmed as a race condition, hopefully it will be fixed in 5.6
> Thanks Jason and Wolfgang
> Davide
>
> On 05/14/2013 06:43 AM, Jason Barto wrote:
>
> Thanks Wolfgang. I'll change over to the 5.3 libraries and carry on with
> my testing. I'll also enter this issue into jira if it doesn't yet exist.
>
> Sincerely,
> Jason
> On May 14, 2013 11:30 AM, "Wolfgang Laun" <wolfgang.laun at gmail.com> wrote:
>
>> Looks like a bug in Drools to me. It has the classic hallmark of a
>> race condition: the NPE does not happen with every run (on my system),
>> perhaps only with 85%.
>>
>> Moreover, with 5.4.0 I get a similar NPE and also:
>> Exception in thread "main" java.util.NoSuchElementException
>>         at java.util.LinkedList.remove(LinkedList.java:788)
>>         at java.util.LinkedList.removeFirst(LinkedList.java:134)
>>         at
>> org.drools.common.PropagationContextImpl.evaluateActionQueue(PropagationContextImpl.java:344)
>>         at
>> org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:342)
>>         at
>> org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:298)
>>         at
>> org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:123)
>>         at
>> org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:53)
>>         at overrun.Main.main(Main.java:64)
>>
>> 5.3.0 is the last version without this bug.
>>
>> -W
>>
>>
>> On 14/05/2013, jpbarto <Jason.P.Barto at gmail.com> wrote:
>> > First the specifics: JDK 1.6, Mac OSX, using Drools 5.5 Final
>> >
>> > The full source code and rules are pasted below but here's the gist, I
>> have
>> > a stateful knowledge session to which I am inserting events and running
>> an
>> > accumulate on the input events.  I have a for loop generating the events
>> > and
>> > inserting them as rapidly as possible.  In the rules I use an
>> accumulator
>> > to
>> > calculate the average of the values contained within the events.  The
>> > behavior I'm observing is that if I insert ~120 events without any
>> waiting
>> > I
>> > receive an NPE.  If I Thread.sleep for even just 1ms the test goes off
>> > without a hitch.  Have I uncovered a bug which should be logged in
>> JIRA?  I
>> > would check through JIRA to see if something similar has been logged but
>> > I'm
>> > so unfamiliar with the codebase, not to mention it could all just be
>> user
>> > error.
>> >
>> > The NPE is as follows:
>> > Exception in thread "main" java.lang.NullPointerException
>> >       at
>> > org.drools.reteoo.AccumulateNode.getFirstMatch(AccumulateNode.java:1050)
>> >       at
>> >
>> org.drools.reteoo.AccumulateNode.modifyLeftTuple(AccumulateNode.java:345)
>> >       at
>> >
>> org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateModifyChildLeftTuple(SingleLeftTupleSinkAdapter.java:259)
>> >       at
>> >
>> org.drools.reteoo.AccumulateNode.evaluateResultConstraints(AccumulateNode.java:676)
>> >       at
>> >
>> org.drools.reteoo.ReteooWorkingMemory$EvaluateResultConstraints.execute(ReteooWorkingMemory.java:590)
>> >       at
>> >
>> org.drools.common.PropagationContextImpl.evaluateActionQueue(PropagationContextImpl.java:350)
>> >       at
>> >
>> org.drools.rule.SlidingLengthWindow.assertFact(SlidingLengthWindow.java:119)
>> >       at
>> org.drools.rule.BehaviorManager.assertFact(BehaviorManager.java:94)
>> >       at org.drools.reteoo.WindowNode.assertObject(WindowNode.java:167)
>> >       at
>> >
>> org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:497)
>> >       at
>> >
>> org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:382)
>> >       at
>> org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:235)
>> >       at
>> org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:240)
>> >       at
>> org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:350)
>> >       at
>> org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:311)
>> >       at
>> org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:127)
>> >       at
>> org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:55)
>> >       at drools5fusioneval.Average.main(Average.java:66)
>> >
>> > ### Average.java ###
>> > package drools5fusioneval;
>> >
>> > import java.io.IOException;
>> > import java.util.Random;
>> > import org.drools.KnowledgeBase;
>> > import org.drools.KnowledgeBaseConfiguration;
>> > import org.drools.KnowledgeBaseFactory;
>> > import org.drools.builder.KnowledgeBuilder;
>> > import org.drools.builder.KnowledgeBuilderFactory;
>> > import org.drools.builder.ResourceType;
>> > import org.drools.conf.EventProcessingOption;
>> > import org.drools.io.ResourceFactory;
>> > import org.drools.runtime.StatefulKnowledgeSession;
>> > import org.drools.runtime.rule.WorkingMemoryEntryPoint;
>> >
>> > class AvgDFEChannel implements org.drools.runtime.Channel {
>> >     @Override
>> >     public void send(Object o) {
>> >         System.err.println ("Recieved channel message: "+ o);
>> >     }
>> > }
>> >
>> > public class Average {
>> >     public static void main(String[] args) throws InterruptedException,
>> > IOException {
>> >         KnowledgeBaseConfiguration kbconfig =
>> > KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
>> >         kbconfig.setOption(EventProcessingOption.STREAM);
>> >
>> >         KnowledgeBase kbase =
>> > KnowledgeBaseFactory.newKnowledgeBase(kbconfig);
>> >
>> >         KnowledgeBuilder kbuilder =
>> > KnowledgeBuilderFactory.newKnowledgeBuilder();
>> >
>> >
>> kbuilder.add(ResourceFactory.newClassPathResource("drools5fusioneval/average.drl"),
>> > ResourceType.DRL);
>> >         if (kbuilder.hasErrors()) {
>> >             System.err.println(kbuilder.getErrors().toString());
>> >         }
>> >         kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
>> >
>> >         final StatefulKnowledgeSession session =
>> > kbase.newStatefulKnowledgeSession();
>> >         session.registerChannel("heartbeat", new AvgDFEChannel ());
>> >         WorkingMemoryEntryPoint ep01 =
>> > session.getWorkingMemoryEntryPoint("ep01");
>> >
>> >         new Thread() {
>> >             public void run() {
>> >                 session.fireUntilHalt();
>> >             }
>> >         }.start();
>> >
>> >         Thread.sleep (5000); // give the engine time to get setup
>> >
>> >         Server hiwaesdk = new Server ("hiwaesdk");
>> >         session.insert(hiwaesdk);
>> >         long LIMIT = 120;
>> >         Random rnd = new Random (System.nanoTime());
>> >
>> >         for (long i = LIMIT; i > 0; i--) {
>> >             int j = rnd.nextInt (212);
>> >             ep01.insert (new IntEvent (j));
>> >             //Thread.sleep (0x1);
>> >         }
>> >
>> >         System.out.println (hiwaesdk);
>> >     }
>> > }
>> >
>> >
>> > ### average.drl ###
>> > package drools5fusioneval
>> >
>> > declare IntEvent
>> >     @role ( event )
>> >     @expires(15s)
>> > end
>> >
>> > declare Statistics
>> >     opsec : long
>> >     total : long
>> > end
>> > global Statistics stats;
>> >
>> > rule "Init engine"
>> >     salience 100
>> > when
>> > then
>> >     stats = new Statistics ();
>> >     stats.setTotal (0);
>> >     stats.setOpsec (0);
>> >     drools.getWorkingMemory ().setGlobal ("stats", stats);
>> >     System.out.println ("Engine initialized");
>> > end
>> >
>> > rule "number rule"
>> > when
>> >     $e : IntEvent () from entry-point ep01
>> >     $s : Server (hostname == "hiwaesdk")
>> > then
>> >     $s.currentTemp = $e.data;
>> >     stats.setOpsec (stats.getOpsec () + 1);
>> >     stats.setTotal (stats.getTotal () + 1);
>> > end
>> >
>> > rule "average temp"
>> > when
>> >     Number ($avg : intValue) from accumulate (
>> >             IntEvent ($temp : data) over window:length(10) from
>> entry-point
>> > ep01, average ($temp)
>> >         )
>> >     $s : Server (hostname == "hiwaesdk")
>> > then
>> >     $s.avgTemp = $avg;
>> > end
>> >
>> > rule "Heartbeat"
>> >     timer ( int: 5s 5s)
>> > when
>> > then
>> >     channels["heartbeat"].send ("Heartbeat: "+ stats.getOpsec () / 5
>> +", "+
>> > stats.getTotal ());
>> >     stats.setOpsec (0);
>> > end
>> >
>> >
>> >
>> > --
>> > View this message in context:
>> >
>> http://drools.46999.n3.nabble.com/NPE-from-reteoo-AccumulateNode-tp4023810.html
>> > Sent from the Drools: User forum mailing list archive at Nabble.com.
>> > _______________________________________________
>> > rules-users mailing list
>> > rules-users at lists.jboss.org
>> > https://lists.jboss.org/mailman/listinfo/rules-users
>> >
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>
>
> _______________________________________________
> rules-users mailing listrules-users at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20130515/d9d9907a/attachment.html 


More information about the rules-users mailing list