]
Edson Tirelli resolved JBRULES-3237.
------------------------------------
Fix Version/s: 5.4.0.Beta1
Resolution: Done
After discussing the issue with Mark and Kris, the conclusion was to implement the simple
fix as suggested by Marco in the description of this ticket, in order to fix the broken
tests in persistence. Later, under a different ticket, we will implement the other
features, including kbase signing and the session scoped cache for object types.
Closing this ticket. Please let me know if you still face any problems.
Unmarshalling a marshalled session fails when using a newly
initialized knowledgebase
-------------------------------------------------------------------------------------
Key: JBRULES-3237
URL:
https://issues.jboss.org/browse/JBRULES-3237
Project: Drools
Issue Type: Bug
Security Level: Public(Everyone can see)
Affects Versions: 5.3.0.CR1
Reporter: Marco Rietveld
Assignee: Edson Tirelli
Fix For: 5.4.0.Beta1
Attachments: UnmarshallingTest.java
A marshalled ReteooStatefulSession can not be unmarshalled if it contains an
InitialFactHandle node _and_ if the knowledge base has been reinitialized.
This bug started appearing because of this change:
https://github.com/droolsjbpm/drools/commit/0a3575e8073f2abc035b13e113814...
{code}
- public static final ClassObjectType InitialFact_ObjectType = new ClassObjectType(
InitialFact.class );
+ public static final ClassObjectType InitialFact_ObjectType = new ClassObjectType(
InitialFactImpl.class );
{code}
As far as I can tell, the above change caused the following:
1. The OutputMarshaller now marshalls the InitialFactnode: the following line now returns
a non-null object, which causes the subsequent if clause to run (which wasn't
happening before).
Approximately here:
-
https://github.com/droolsjbpm/drools/blob/master/drools-core/src/main/jav...
{code}
ObjectTypeNode initialFactNode = ruleBase.getRete().getEntryPointNode( EntryPoint.DEFAULT
).getObjectTypeNodes().get( ClassObjectType.InitialFact_ObjectType );
{code}
2. When the InputMarshaller tries to unmarshall a marshalled session and it's using a
(new) ruleBase that doesn't contain an ObjectTypeNode that descibes the
{{InitialFact_ObjectType}}, then a NPE is thrown.
- This is caused because the sinks that are given to the {{MarshallerReaderContext}}
(used in InputMarshaller.readSession) do not contain the {{InitialFact_ObjectType}}.
- These sinks:
-- come from KnowledgeBaseImpl.ruleBase which
--- contains a .rete attribute which
---- contains .entrypoints (Map<EntryPoint, EntryPointNode> which
----- contains EntryPointNode's which
------ contains objectTypeNodes (Map<ObjectType, ObjectTypeNode>) which
------- contain objectTypeNodes
-------- which _should_ contain a ObjectTypeNode describing the InitialFactNode.
I can't figure out where to add this information when initializing the
KnowledgeSession or KnowledgeBase for unmarshalling -- or whether the unmarshalling
process should take care of this.
The NPE is thrown here (the {{node}} variable at line 65 is null):
{code}
ConcurrentNodeMemories.getNodeMemory(NodeMemory) line: 65
ReteooStatefulSession(AbstractWorkingMemory).getNodeMemory(NodeMemory) line: 1018
InputMarshaller.readSession(ReteooStatefulSession, DefaultAgenda, long, boolean,
MarshallerReaderContext) line: 237
InputMarshaller.readSession(MarshallerReaderContext, int, ExecutorService, Environment,
SessionConfiguration) line: 209
{code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: