| Summary: | Incremental compilation is not correctly synchronized | ||
|---|---|---|---|
| Product: | [Retired] JBoss BRMS Platform 6 | Reporter: | Mario Fusco <mfusco> |
| Component: | BRE | Assignee: | Mario Fusco <mfusco> |
| Status: | CLOSED CURRENTRELEASE | QA Contact: | Marek Winkler <mwinkler> |
| Severity: | urgent | Docs Contact: | |
| Priority: | urgent | ||
| Version: | 6.0.0 | CC: | etirelli |
| Target Milestone: | ER6 | ||
| Target Release: | 6.0.0 | ||
| Hardware: | Unspecified | ||
| OS: | Unspecified | ||
| Whiteboard: | |||
| Fixed In Version: | Doc Type: | Bug Fix | |
| Doc Text: | Story Points: | --- | |
| Clone Of: | Environment: | ||
| Last Closed: | 2014-08-06 20:15:57 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: | |
Verified on BRMS 6.0.0 ER6. |
Incremental compilation is not correctly synchronized and then a kiesession can fire when the underlying rule base is in an inconsistent state. The test case below shows the problem @Test(timeout = 10000) public void testIncrementalCompilationSynchronization() throws Exception { final KieServices kieServices = KieServices.Factory.get(); ReleaseId releaseId = kieServices.newReleaseId("org.kie.test", "sync-scanner-test", "1.0.0"); createAndDeployJar( kieServices, releaseId, createDRL("rule0") ); final KieContainer kieContainer = kieServices.newKieContainer(releaseId); KieSession kieSession = kieContainer.newKieSession(); List<String> list = new ArrayList<String>(); kieSession.setGlobal("list", list); kieSession.fireAllRules(); kieSession.dispose(); assertEquals(1, list.size()); Thread t = new Thread(new Runnable() { @Override public void run() { for (int i = 1; i < 10; i++) { ReleaseId releaseId = kieServices.newReleaseId("org.kie.test", "sync-scanner-test", "1.0." + i); createAndDeployJar( kieServices, releaseId, createDRL("rule" + i) ); kieContainer.updateToVersion(releaseId); } } }); t.setDaemon(true); t.start(); while (true) { kieSession = kieContainer.newKieSession(); list = new ArrayList<String>(); kieSession.setGlobal("list", list); kieSession.fireAllRules(); kieSession.dispose(); assertEquals(1, list.size()); if (list.get(0).equals("rule9")) { break; } } } private String createDRL(String ruleName) { return "package org.kie.test\n" + "global java.util.List list\n" + "rule " + ruleName + "\n" + "when\n" + "then\n" + "list.add( drools.getRule().getName() );\n" + "end\n"; }