[jboss-jira] [JBoss JIRA] Commented: (JBRULES-1392) Rules behave incorrectly (randomly) in multi-threaded environment

Navaljit Bhasin (JIRA) jira-events at lists.jboss.org
Sun Feb 10 18:43:04 EST 2008


    [ http://jira.jboss.com/jira/browse/JBRULES-1392?page=comments#action_12399046 ] 
            
Navaljit Bhasin commented on JBRULES-1392:
------------------------------------------

I have excluded the tests using
mvn assembly:assembly -Dmaven.test.skip clean install
Now the new error is as follows.

Since I am running into errors, I really don't waant to waste your valuable time. Is it possible for you to mail me a zip file of the jar files build with the updated code ? Thanks a lot.


Downloading: http://people.apache.org/repo/m2-snapshot-repository/org/drools/dro
ols-core/4.0.3.SNAPSHOT/drools-core-4.0.3.SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

Missing:
----------
1) org.drools:drools-core:jar:4.0.3.SNAPSHOT

  Try downloading the file manually from the project website.

  Then, install it using the command:
      mvn install:install-file -DgroupId=org.drools -DartifactId=drools-core -Dv
ersion=4.0.3.SNAPSHOT -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there:

      mvn deploy:deploy-file -DgroupId=org.drools -DartifactId=drools-core -Dver
sion=4.0.3.SNAPSHOT -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -Drepositor
yId=[id]

  Path to dependency:
        1) org.drools:drools-compiler:jar:4.0.3.SNAPSHOT
        2) org.drools:drools-core:jar:4.0.3.SNAPSHOT

----------
1 required artifact is missing.

for artifact:
  org.drools:drools-compiler:jar:4.0.3.SNAPSHOT

from the specified remote repositories:
  Maven Snapshots (http://snapshots.maven.codehaus.org/maven2/),
  central (http://repo1.maven.org/maven2),
  softeu-repo (http://maven.softeu.cz/),
  jboss-snapshot (http://snapshots.jboss.org/maven2),
  apache.org (http://people.apache.org/repo/m2-snapshot-repository),
  basedir (file://C:\TEMP\drools_4x\drools-compiler/../m2_repo),
  jboss (http://repository.jboss.com/maven2/)


[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5 seconds
[INFO] Finished at: Sun Feb 10 18:35:30 EST 2008
[INFO] Final Memory: 42M/64M
[INFO] ------------------------------------------------------------------------

> Rules behave incorrectly (randomly) in multi-threaded environment
> -----------------------------------------------------------------
>
>                 Key: JBRULES-1392
>                 URL: http://jira.jboss.com/jira/browse/JBRULES-1392
>             Project: JBoss Drools
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>          Components: Reteoo
>    Affects Versions: 4.0.3
>            Reporter: Brian Stiles
>         Assigned To: Edson Tirelli
>            Priority: Blocker
>             Fix For: 5.0.0-M1, 4.0.5
>
>         Attachments: DroolsMVELFactoryProject.zip
>
>
> Rules behave seemingly indeterminately when sessions are created from the same RuleBase and executed in multiple threads.  The problem is a bit difficult to reproduce.  The following code demonstrates the behavior in my environment (single processor PowerBook), but not on every try.  I've had up to 5 consecutive executions not exhibit the problem before the failure was exhibited, so you may need to run the class a number of times to see the problem.  Also, I periodically get OutOfMemoryErrors when using the default heap size (64m).  I've had better success with -Xmx256m.  That, by the way, is suspiciously coincidental to the random nature of the incorrect rule firing problem.
> I've experienced this behavior in my application, and it manifests by rules firing from time to time that shouldn't have fired.  I can't see a pattern to the rules that fire inappropriately, and there absolutely were not facts asserted that would support the firing of the rule.
> Synchronizing the calls to insert, fireAllRules, and dispose on the session object seems to get rid of the problem, giving further evidence to the guess that it's a multithreading bug.
> Please, please, please find a solution to  this problem.  This will be a serious scalability problem for my application.  I'm more than happy to help however I can.  I've stepped through Drools code before and found solutions, but I really don't know where to go with this one.
> Following is the code (self-contained class with main method) that I've used to demonstrate the problem.
> Thank you!
> --
> package sample;
> import java.io.StringReader;
> import java.util.ArrayList;
> import org.drools.RuleBase;
> import org.drools.RuleBaseConfiguration;
> import org.drools.RuleBaseFactory;
> import org.drools.StatefulSession;
> import org.drools.compiler.PackageBuilder;
> import org.drools.compiler.PackageBuilderConfiguration;
> public class MultithreadedRuleBaseProblem {
>     public static void main(String[] args) throws Exception {
>         final PackageBuilderConfiguration packageBuilderConfiguration =
>                 new PackageBuilderConfiguration();
>         final PackageBuilder packageBuilder = new PackageBuilder(packageBuilderConfiguration);
>         packageBuilder.addPackageFromDrl(new StringReader("\n"
>                 + "package sample\n"
>                 + "\n"
>                 + "import java.lang.Integer;\n"
>                 + "global java.util.ArrayList shouldFireList;\n"
>                 + "global java.util.ArrayList shouldNotFireList;\n"
>                 + "\n"
>                 + "rule should_fire\n"
>                 + "    when\n"
>                 + "        $e : Integer(intValue == -1)\n"
>                 + "        $f : Integer(intValue > $e)\n"
>                 + "    then \n"
>                 + "        shouldFireList.add($f);\n"
>                 + "end \n"
>                 + "\n"
>                 + "rule should_not_fire\n"
>                 + " when\n"
>                 + " $f : String()\n"
>                 + " then \n"
>                 + " shouldNotFireList.add($f);\n"
>                 + "end \n"));
>         final RuleBaseConfiguration ruleBaseConfiguration = new RuleBaseConfiguration();
>         final RuleBase ruleBase = RuleBaseFactory.newRuleBase(ruleBaseConfiguration);
>         ruleBase.addPackage(packageBuilder.getPackage());
>         final Exception[] exception = {
>             null
>         };
>         final Thread t[] = new Thread[50];
>         for (int i = 0; i < t.length; i++) {
>             final int count = i;
>             t[i] = new Thread(new Runnable() {
>                 public void run() {
>                     try {
>                         System.out.println("Start " + count);
>                         final int iterations = count * 15 + 3000;
>                         final ArrayList shouldFireList = new ArrayList();
>                         final ArrayList shouldNotFireList = new ArrayList();
>                         final StatefulSession session2 = ruleBase.newStatefulSession();
>                         session2.setGlobal("shouldFireList", shouldFireList);
>                         session2.setGlobal("shouldNotFireList", shouldNotFireList);
>                         session2.insert(new Integer(- 1));
>                         for (int k = 0; k < iterations; k++) {
>                             session2.insert(new Integer(k));
>                         }
>                         session2.insert("foo");
>                         System.out.println("Fire " + count);
>                         session2.fireAllRules();
>                         session2.dispose();
>                         if (shouldFireList.size() != iterations) {
>                             System.out.println("Thread "
>                                     + count
>                                     + " shouldFireList.size(): expected "
>                                     + iterations
>                                     + " was "
>                                     + shouldFireList.size()
>                                     + "\n!!!!! Thread "
>                                     + count
>                                     + " rule didn't fire as many times as it should have!!!!!!!!!!!!!!!!!!");
>                         }
>                     } catch (Exception e) {
>                         e.printStackTrace();
>                         exception[0] = e;
>                     }
>                     System.out.println("Thread " + count + " done");
>                 }
>             });
>             t[i].start();
>         }
>         for (int i = 0; i < t.length; i++) {
>             t[i].join();
>         }
>         System.out.println("done");
>     }
> }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the jboss-jira mailing list