[rules-users] NPE from reteoo.AccumulateNode
Davide Sottara
dsotty at gmail.com
Tue May 14 15:22:56 EDT 2013
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
> <mailto: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
> <mailto: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 <mailto:rules-users at lists.jboss.org>
> > https://lists.jboss.org/mailman/listinfo/rules-users
> >
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org <mailto: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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20130514/bea6b359/attachment.html
More information about the rules-users
mailing list