[jboss-jira] [JBoss JIRA] (DROOLS-1046) Threads blocking during ReteWorkingMemory initialization of facts

Akshay Gehi (JIRA) issues at jboss.org
Fri Jan 29 03:07:00 EST 2016


     [ https://issues.jboss.org/browse/DROOLS-1046?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Akshay Gehi updated DROOLS-1046:
--------------------------------
    Steps to Reproduce: 
Create a drools file with the following condition: 


{noformat}
rule "slowWhenCondition" 
	when
		eval(mySlowCondition(fact))
	then
		
end
{noformat}

Create a StatefulSession and fire all the rules from multiple threads. Observe the threads in Blocking state using JVisualVM or Stack Trace. 

  was:
Create a drools file with the following condition: 

rule "slowWhenCondition" 
	when
		eval(mySlowConditionFromDatabase(fact))
	then
		
end

Create a StatefulSession and fire all the rules from multiple threads. Observe the threads in Blocking state using JVisualVM or Stack Trace. 



> Threads blocking during ReteWorkingMemory initialization of facts
> -----------------------------------------------------------------
>
>                 Key: DROOLS-1046
>                 URL: https://issues.jboss.org/browse/DROOLS-1046
>             Project: Drools
>          Issue Type: Bug
>          Components: core engine
>    Affects Versions: 6.3.0.Final
>            Reporter: Akshay Gehi
>            Assignee: Mario Fusco
>
> While initializing facts for the first time the following method in ReteWorkingMemory is invoked: 
> {code:java}
>     private final Integer syncLock = 42;
>     public void initInitialFact() {
>         if ( initialFactHandle == null ) {
>             synchronized ( syncLock ) {
>                 if ( initialFactHandle == null ) {
>                     // double check, inside of sync point incase some other thread beat us to it.
>                     initInitialFact(kBase, null);
>                 }
>             }
>         }
>     }
> {code}
> Since the synchronized lock is taken on a Integer constant variable, the same object gets used across different threads. This causes the initialization of all the ReteMemoryObjects to wait in the initInitialFact() method across different threads. 
> The lock should be taken on Object lock = new Object() instead



--
This message was sent by Atlassian JIRA
(v6.4.11#64026)


More information about the jboss-jira mailing list