]
RH Bugzilla Integration commented on DROOLS-551:
------------------------------------------------
Lukáš Petrovický <lpetrovi(a)redhat.com> changed the Status of [bug
Incorrect serialization of Drools STREAM KieSession with expirable
events causes NPE
------------------------------------------------------------------------------------
Key: DROOLS-551
URL:
https://issues.jboss.org/browse/DROOLS-551
Project: Drools
Issue Type: Bug
Security Level: Public(Everyone can see)
Affects Versions: 6.1.0.CR2
Environment: Mac OS X 10.9.2, Oracle HotSpot 1.7.0_60, JBoss BRMS 6.0.2.GA
Reporter: Duncan Doyle
Assignee: Mario Fusco
Priority: Critical
Labels: backport-to-6.0.x
Fix For: 6.1.0.Final
There is an issue in Drools 6, both in PHREAK and RETEOO mode, which causes NPEs to be
thrown when a session is serialized and deserialized.
The problem occurs when running a stateful KieSession in STREAM mode and using Events
with @expires annotations. When you insert an event with an @expires annotation, and you
explicitly retract that Event again from the engine (i.e. KieSession.delete), and after
that serialize the session, you end up with an invalid serialized session.
When you later deserialize the session, and immediately serialize it again, a NPE is
thrown at:
org.drools.core.reteoo.ObjectTypeNode$ExpireJobContextTimerOutputMarshaller.serialize(ObjectTypeNode.java:669).
When you deserialize the session and then advance the pseudo clock to a moment where the
original event (which we've already retracted from the working memory) should have
expired, a NPE is thrown at:
org.drools.core.common.AbstractWorkingMemory$WorkingMemoryReteExpireAction.execute(AbstractWorkingMemory.java:1524)
So, it seems that when the Event is explicitly retracted with KieSesion.delete(event),
the event is removed from the WM, but the Expiry Timer Job is not. That ExpiryJob gets
serialized with a 'null' fact handle, which does not give issues on
de-serialization, but on the next serialization of the session, or when an action is
peformed that triggers the expire action (i.e. move the pseudo-clock).
A reproducer can be found here:
http://www.github.com/DuncanDoyle/DroolsSerializationIssue . To reproduce:
- git clone
http://www.github.com/DuncanDoyle/DroolsSerializationIssue
- cd DroolsSerializationIssue/DroolSerializationIssue
- mvn clean test -P phreak (runs the test with Drools in PHREAK mode)
- mvn clean test -P reteoo (runs the test with Drools in RETEOO mode)
In both modes 2 of the 3 tests produce an NPE.
Cheers,
Duncan