| Summary: | ClassCastException on classes with the same FQCN after incremental build | ||||||
|---|---|---|---|---|---|---|---|
| Product: | [Retired] JBoss BRMS Platform 6 | Reporter: | Toshiya Kobayashi <tkobayas> | ||||
| Component: | BRE | Assignee: | Mario Fusco <mfusco> | ||||
| Status: | CLOSED EOL | QA Contact: | Tibor Zimanyi <tzimanyi> | ||||
| Severity: | high | Docs Contact: | |||||
| Priority: | unspecified | ||||||
| Version: | 6.2.0 | CC: | mfusco | ||||
| Target Milestone: | ER2 | ||||||
| Target Release: | 6.3.0 | ||||||
| Hardware: | Unspecified | ||||||
| OS: | Unspecified | ||||||
| Whiteboard: | |||||||
| Fixed In Version: | Doc Type: | Bug Fix | |||||
| Doc Text: | Story Points: | --- | |||||
| Clone Of: | |||||||
| : | 1318855 (view as bug list) | Environment: | |||||
| Last Closed: | 2020-03-27 19:09:39 UTC | Type: | Bug | ||||
| Regression: | --- | Mount Type: | --- | ||||
| Documentation: | --- | CRM: | |||||
| Verified Versions: | Category: | --- | |||||
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |||||
| Cloudforms Team: | --- | Target Upstream Version: | |||||
| Bug Depends On: | |||||||
| Bug Blocks: | 1318855 | ||||||
| Attachments: |
|
||||||
Created attachment 1137321 [details]
ClassFieldReaderRuleRepo.zip
Analysis: With a debugger, I observed that the ClassFieldReader.reader is overwritten because FieldLookupEntry is shared between the existing ksession's ClassFieldAccessorStore and incremental build's ClassFieldAccessorStore. ======== Thread [EJB default - 1] (Suspended (breakpoint at line 70 in ClassFieldReader)) owns: ClassFieldAccessorStore (id=214) owns: KieFileSystemImpl (id=215) ClassFieldReader.setReadAccessor(InternalReadAccessor) line: 70 ClassFieldAccessorStore.wire(InternalReadAccessor) line: 293 ClassFieldAccessorStore.getReader(String, String, AcceptsReadAccessor, AccessorKey$AccessorType) line: 112 ClassFieldAccessorStore.getReader(String, String, AcceptsReadAccessor) line: 90 PatternBuilder.getFieldReadAccessor(RuleBuildContext, BaseDescr, Pattern, ObjectType, String, AcceptsReadAccessor, boolean) line: 1761 PatternBuilder.getFieldReadAccessor(RuleBuildContext, BaseDescr, Pattern, String, AcceptsReadAccessor, boolean) line: 1720 PatternBuilder.buildRuleBindings(RuleBuildContext, PatternDescr, Pattern, BindingDescr) line: 1352 PatternBuilder.buildCcdDescr(RuleBuildContext, PatternDescr, Pattern, BaseDescr, ConstraintConnectiveDescr, MVELDumper$MVELDumperContext) line: 850 PatternBuilder.build(RuleBuildContext, PatternDescr, Pattern, ConstraintConnectiveDescr, MVELDumperContext) line: 715 PatternBuilder.processConstraintsAndBinds(RuleBuildContext, PatternDescr, Pattern) line: 580 PatternBuilder.build(RuleBuildContext, PatternDescr, Pattern) line: 182 PatternBuilder.build(RuleBuildContext, PatternDescr) line: 146 PatternBuilder.build(RuleBuildContext, BaseDescr) line: 127 GroupElementBuilder.build(RuleBuildContext, BaseDescr, Pattern) line: 63 RuleBuilder.build(RuleBuildContext) line: 97 KnowledgeBuilderImpl.addRule(RuleBuildContext) line: 1820 KnowledgeBuilderImpl.compileRules(PackageDescr, PackageRegistry) line: 1111 KnowledgeBuilderImpl.compileAllRules(PackageDescr, PackageRegistry) line: 989 CompositeKnowledgeBuilderImpl.buildRules(Collection<CompositePackageDescr>) line: 257 CompositeKnowledgeBuilderImpl.buildPackages() line: 121 CompositeKnowledgeBuilderImpl.build() line: 105 KieBuilderSetImpl.buildChanges(Collection<String>) line: 140 KieBuilderSetImpl.build() line: 92 Builder.buildIncrementally(IncrementalBuildResults, String...) line: 474 Builder.addResource(Path) line: 310 Builder.updateResource(Path) line: 347 BuildServiceImpl.updatePackageResource(Path) line: 244 Sent a PR test case: https://github.com/droolsjbpm/drools/pull/693 I'm not 100% sure if this unit test simulates the reproduce step in business-central correctly. Please take this as a hint. Anyway, this reproduces the ClassCastException. Verified by going through the "Steps to reproduce" and by running new test from Mario's PR. |
Description of problem: Assuming you have a rule which uses ClassFieldReader, for example a rule like this: === when $p : Person ($types : types) $type : String() from $types === ("types" is a List field.) Incremental Build overwrites existing ClassFieldReader.reader. So later runtime execution results in ClassCastException on classes with the same FQCN. ========= 16:07:09,011 WARN [org.drools.persistence.SingleSessionCommandService] (http-localhost.localdomain/127.0.0.1:8080-1) Could not commit session: java.lang.ClassCastException: org.kie.example.project1.Person cannot be cast to org.kie.example.project1.Person at org.drools.base.org.kie.example.project1.Person1340276313$getTypes.getValue(Unknown Source) at org.drools.core.base.ClassFieldReader.getValue(ClassFieldReader.java:91) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.rule.Declaration.getValue(Declaration.java:253) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.base.mvel.MVELCompilationUnit.updateFactory(MVELCompilationUnit.java:366) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.base.mvel.MVELCompilationUnit.getFactory(MVELCompilationUnit.java:297) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.base.dataproviders.MVELDataProvider.getResults(MVELDataProvider.java:117) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.phreak.PhreakFromNode.doLeftInserts(PhreakFromNode.java:105) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.phreak.PhreakFromNode.doNode(PhreakFromNode.java:67) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.phreak.RuleNetworkEvaluator.evalNode(RuleNetworkEvaluator.java:386) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:332) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:166) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:123) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(RuleExecutor.java:194) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:73) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:978) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1292) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.impl.StatefulKnowledgeSessionImpl.internalFireAllRules(StatefulKnowledgeSessionImpl.java:1294) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1281) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1260) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.command.runtime.rule.FireAllRulesCommand.execute(FireAllRulesCommand.java:111) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.command.runtime.rule.FireAllRulesCommand.execute(FireAllRulesCommand.java:36) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.command.impl.DefaultCommandService.execute(DefaultCommandService.java:36) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.persistence.SingleSessionCommandService$TransactionInterceptor.execute(SingleSessionCommandService.java:584) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.persistence.jpa.OptimisticLockRetryInterceptor.execute(OptimisticLockRetryInterceptor.java:82) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.persistence.jta.TransactionLockInterceptor.execute(TransactionLockInterceptor.java:73) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.persistence.SingleSessionCommandService.execute(SingleSessionCommandService.java:377) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.command.impl.CommandBasedStatefulKnowledgeSession.fireAllRules(CommandBasedStatefulKnowledgeSession.java:268) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.process.instance.event.listeners.TriggerRulesEventListener.afterRuleFlowGroupActivated(TriggerRulesEventListener.java:83) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.event.AgendaEventSupport.fireAfterRuleFlowGroupActivated(AgendaEventSupport.java:152) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.common.DefaultAgenda.activateRuleFlowGroup(DefaultAgenda.java:703) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.common.DefaultAgenda.activateRuleFlowGroup(DefaultAgenda.java:691) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.workflow.instance.node.RuleSetNodeInstance.internalTrigger(RuleSetNodeInstance.java:87) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:173) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:366) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:325) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.workflow.instance.node.ActionNodeInstance.triggerCompleted(ActionNodeInstance.java:61) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.workflow.instance.node.ActionNodeInstance.internalTrigger(ActionNodeInstance.java:57) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:173) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:366) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:325) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.workflow.instance.node.StartNodeInstance.triggerCompleted(StartNodeInstance.java:73) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.workflow.instance.node.StartNodeInstance.internalTrigger(StartNodeInstance.java:44) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:173) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.ruleflow.instance.RuleFlowProcessInstance.internalStart(RuleFlowProcessInstance.java:35) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.process.instance.impl.ProcessInstanceImpl.start(ProcessInstanceImpl.java:236) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl.start(WorkflowProcessInstanceImpl.java:439) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.process.instance.ProcessRuntimeImpl.startProcessInstance(ProcessRuntimeImpl.java:208) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.process.instance.ProcessRuntimeImpl.startProcessInstance(ProcessRuntimeImpl.java:217) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:225) [jbpm-flow-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.impl.StatefulKnowledgeSessionImpl.startProcess(StatefulKnowledgeSessionImpl.java:1812) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.command.runtime.process.StartCorrelatedProcessCommand.execute(StartCorrelatedProcessCommand.java:146) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.command.runtime.process.StartCorrelatedProcessCommand.execute(StartCorrelatedProcessCommand.java:44) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.command.impl.DefaultCommandService.execute(DefaultCommandService.java:36) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.persistence.SingleSessionCommandService$TransactionInterceptor.execute(SingleSessionCommandService.java:584) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.persistence.jpa.OptimisticLockRetryInterceptor.execute(OptimisticLockRetryInterceptor.java:82) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.persistence.jta.TransactionLockInterceptor.execute(TransactionLockInterceptor.java:73) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.persistence.SingleSessionCommandService.execute(SingleSessionCommandService.java:377) [drools-persistence-jpa-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.drools.core.command.impl.CommandBasedStatefulKnowledgeSession.startProcess(CommandBasedStatefulKnowledgeSession.java:529) [drools-core-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.kie.services.impl.ProcessServiceImpl.startProcess(ProcessServiceImpl.java:126) [jbpm-kie-services-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.services.cdi.impl.ProcessServiceCDIImpl$Proxy$_$$_WeldClientProxy.startProcess(ProcessServiceCDIImpl$Proxy$_$$_WeldClientProxy.java) [jbpm-services-cdi-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at org.jbpm.console.ng.bd.backend.server.KieSessionEntryPointImpl.startProcess(KieSessionEntryPointImpl.java:78) [jbpm-console-ng-business-domain-backend-6.3.0.Final-redhat-5.jar:6.3.0.Final-redhat-5] at ... =============== Steps to Reproduce: 1. Start BPMS 6.2.0 2. Access business-central. 3. Clone the attached repository (ClassFieldReaderRuleRepo.zip) to business-central 4. Click [Build&Deploy] -> the project is deployed 5. Open 'drl1' under org/kie/example/project1 6. Edit 'drl1' and Save (e.g. add a white-space) -> Incremental Build done 7. Go to [Process Management] -> [Process Definitions] 8. Press [Start] for 'process1' 9. Press [Submit] on the pop-up * This is not a concurrency issue. You can reproduce this step-by-step. Actual results: java.lang.ClassCastException: org.kie.example.project1.Person cannot be cast to org.kie.example.project1.Person is thrown. Expected results: Execute the process without Exception. Additional info: This reproduce step requires BPMS but I filed this BZ for BRMS because the issue seems to belong to drools build process. Reproduced in BPMS 6.1.3 / 6.2.0 / 6.2.1