[jboss-jira] [JBoss JIRA] Commented: (JBRULES-946) RuleBase serialization fails with StackOverflowError

Michael Neale (JIRA) jira-events at lists.jboss.org
Sun Jul 15 00:33:04 EDT 2007


    [ http://jira.jboss.com/jira/browse/JBRULES-946?page=comments#action_12368998 ] 
            
Michael Neale commented on JBRULES-946:
---------------------------------------

Thanks for the excellent test to reproduce it ! (one nice feature of eclipse  - copy all the source from above into the clipboard, and then past it into an eclipse project and it will create the right file for you !). So kudos for taking the time to provide a test.

FYI, for me on linux, JVM 1.5 - I don't get the error. But mark does - on his Windows machine.

So we will find a solution for this. 

Some things to try as work arounds are to increase the stack by using -Xss2048k.

> RuleBase serialization fails with StackOverflowError
> ----------------------------------------------------
>
>                 Key: JBRULES-946
>                 URL: http://jira.jboss.com/jira/browse/JBRULES-946
>             Project: JBoss Rules
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>    Affects Versions: 4.0.0.MR2,  4.0.0.MR3
>            Reporter: Alexandre Gattiker
>         Assigned To: Mark Proctor
>             Fix For:  4.0.0.MR4
>
>
> I created 920 rules, all in this format, with different values in the string literals.
> rule "Rule_1"
> 	when
> 		$g:Parent()
> 		$c:Child(parent==$g,code=="yyy1")
> 		Item(parentObject==$c,name=="xxx1", value == "1")
> 		Item(parentObject==$c,name=="xxx2",value == "1")
> 		Item(parentObject==$g,name=="xxx3",value == "200")
> 	then
> 		System.out.println("2");
> end
> With the following code, I create a RuleBase that I serialize.
> RuleBase ruleBase = RuleBaseFactory.newRuleBase();
> PackageBuilderConfiguration conf = new PackageBuilderConfiguration();
> conf.setCompiler(PackageBuilderConfiguration.JANINO);
> Reader source = new InputStreamReader(PolicyServiceImpl.class.getResourceAsStream(fileName));
> PackageBuilder builder = new PackageBuilder(conf);
> builder.addPackageFromDrl(source);
> Package pkg = builder.getPackage();
> ruleBase.addPackage(pkg);
> //serialize RuleBase
> File outFile = new File(f.getPath() + ".tmp");
> FileOutputStream fout = new FileOutputStream(outFile);
> ObjectOutputStream oos = new ObjectOutputStream(fout);
> oos.writeObject(ruleBase);
> oos.close();
> The serialization fails with the following exception. Otherwise the RuleBase is perfectly fine and working.
> java.lang.StackOverflowError
> 	at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream$BlockDataOutputStream.write(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java(Compiled Code))
> 	at java.util.ArrayList.writeObject(ArrayList.java(Compiled Code))
> 	at sun.reflect.GeneratedMethodAccessor16.invoke(Unknown Source)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java(Compiled Code))
> 	at java.lang.reflect.Method.invoke(Method.java(Compiled Code))
> 	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java(Inlined Compiled Code))
> 	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java(Inlined Compiled Code))
> 	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java(Inlined Compiled Code))
> 	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java(Inlined Compiled Code))
> 	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java(Inlined Compiled Code))
> 	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Inlined Compiled Code))
> 	at java.util.ArrayList.writeObject(ArrayList.java(Compiled Code))
> 	at sun.reflect.GeneratedMethodAccessor16.invoke(Unknown Source)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java(Compiled Code))
> 	at java.lang.reflect.Method.invoke(Method.java(Compiled Code))
> 	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java(Inlined Compiled Code))
> 	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java(Inlined Compiled Code))
> 	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java(Inlined Compiled Code))
> 	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java(Inlined Compiled Code))
> 	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java(Inlined Compiled Code))
> 	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Inlined Compiled Code))
> 	at java.util.ArrayList.writeObject(ArrayList.java(Compiled Code))
> 	at sun.reflect.GeneratedMethodAccessor16.invoke(Unknown Source)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java(Compiled Code))
> 	at java.lang.reflect.Method.invoke(Method.java(Compiled Code))
> 	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java(Compiled Code))
> 	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java(Inlined Compiled Code))
> (last four lines repeated over 1000 times)

-- 
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