Issue Details (XML | Word | Printable)

Key: CORE-2975
Type: Bug Bug
Status: Closed Closed
Resolution: Fixed
Priority: Major Major
Assignee: Unassigned
Reporter: Luca Garulli
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
JPOX Core (ARCHIVED)

Circular references make StackOverflow in PM.makePersistent

Created: 11/Sep/06 02:56 PM   Updated: 15/Mar/10 11:50 AM   Resolved: 18/Oct/06 05:08 AM
Component/s: JDO
Affects Version/s: 1.1.2
Fix Version/s: 1.1.3

Environment:
Windows XP SP 2

JDK: Sun version "1.5.0_07"

Datastore: HSQL
Severity: Production


 Description  « Hide
The scenario is:

public class Ability extends Feature {
}

public abstract class Feature {
  ...
  private ArrayList<Question> questions;
}

public class Question {
  private Feature feature;
}

MyAbility->questions[0]->feature == MyAbility

I report below a snippet of the stack trace. In debug I see a StackOverflow exception is thrown after some seconds the JVM is freezed.

<snippet>
at it.assetdata.aventinus.domain.Ability.jdoReplaceField(Ability.java)
at it.assetdata.aventinus.domain.Feature.jdoReplaceFields(Feature.java)
at org.jpox.state.StateManagerImpl.replaceFields(StateManagerImpl.java:3045)
at org.jpox.state.StateManagerImpl.loadFieldsInFetchPlan(StateManagerImpl.java:1740)
at org.jpox.state.LoadFieldManager.internalFetchObjectField(LoadFieldManager.java:101)
at org.jpox.state.AbstractFetchFieldManager.fetchObjectField(AbstractFetchFieldManager.java:108)
at org.jpox.state.StateManagerImpl.replacingObjectField(StateManagerImpl.java:2865)
at it.assetdata.aventinus.domain.Question.jdoReplaceField(Question.java)
at it.assetdata.aventinus.domain.Question.jdoReplaceFields(Question.java)
at org.jpox.state.StateManagerImpl.replaceFields(StateManagerImpl.java:3045)
at org.jpox.state.StateManagerImpl.loadFieldsInFetchPlan(StateManagerImpl.java:1740)
at org.jpox.sco.ArrayList.loadFieldsInFetchPlan(ArrayList.java:326)
at org.jpox.state.LoadFieldManager.internalFetchObjectField(LoadFieldManager.java:82)
at org.jpox.state.AbstractFetchFieldManager.fetchObjectField(AbstractFetchFieldManager.java:108)
at org.jpox.state.StateManagerImpl.replacingObjectField(StateManagerImpl.java:2865)
at it.assetdata.aventinus.domain.Feature.jdoReplaceField(Feature.java)
at it.assetdata.aventinus.domain.Ability.jdoReplaceField(Ability.java)
at it.assetdata.aventinus.domain.Feature.jdoReplaceFields(Feature.java)
at org.jpox.state.StateManagerImpl.replaceFields(StateManagerImpl.java:3045)
at org.jpox.state.StateManagerImpl.loadFieldsInFetchPlan(StateManagerImpl.java:1740)
at org.jpox.state.LoadFieldManager.internalFetchObjectField(LoadFieldManager.java:101)
at org.jpox.state.AbstractFetchFieldManager.fetchObjectField(AbstractFetchFieldManager.java:108)
at org.jpox.state.StateManagerImpl.replacingObjectField(StateManagerImpl.java:2865)
</snippet>


Sort Order: Ascending order - Click to sort in descending order
Andy Jefferson added a comment - 11/Sep/06 03:10 PM
I dont see the JPOX-compliant testcase (see Bug Reporting guide)

Luca Garulli added a comment - 11/Sep/06 08:02 PM
Replacing the old JPOX version 1.1.1 it works... I'll post a test case

Andy Jefferson added a comment - 12/Sep/06 06:00 AM
Related to http://www.jpox.org/servlet/jira/browse/CORE-2910
and you probably have maxFetchDepth as -1 ?

Andy Jefferson added a comment - 19/Sep/06 05:06 PM
While I respect users wanting to raise issues as "Blocker"s they must provide a testcase so we have a chance of reproducing exactly what is "blocking". Downgraded to Major until a testcase is provided

Andy Jefferson added a comment - 14/Oct/06 05:09 PM
testcase ?

Luca Garulli added a comment - 17/Oct/06 09:32 PM
With the just downloaded version 1.1.3 anything works! ;-)

Andy Jefferson added a comment - 18/Oct/06 05:08 AM
Marking as fixed then :-) If it reoccurs we reopen it but will need a way of reproducing.

Clive Cox added a comment - 15/Mar/10 11:50 AM
I'm getting a very similar issue using 1.1.5. Stack trace below.
I'm guessing this is because there was a bug in our code where we have a friendship Set inside a Member object and the code was adding the same Member instance to this set. A person being a friend of themselves!

I realise I need to create a test case and also update to version 2 of DataNucleus. However, can an expert at least suggest when this might be happening as it doesn't seem to happen all the time. For example, we have ehcache, is it when the object is retrieved from the cache rather than DB? I'm just hoping the stack trace below might give this signature? It would help me in creating a test case for you.



java.lang.StackOverflowError
        at java.security.AccessController.doPrivileged(Native Method)
        at org.datanucleus.state.JDOStateManagerImpl.replaceStateManager(JDOStateManagerImpl.java:992)
        at org.datanucleus.state.JDOStateManagerImpl.initialiseForDetached(JDOStateManagerImpl.java:552)
        at org.datanucleus.state.JDOStateManagerImpl.initialiseForCachedPC(JDOStateManagerImpl.java:596)
        at org.datanucleus.state.StateManagerFactory.newStateManagerForCachedPC(StateManagerFactory.java:216)
        at org.datanucleus.ObjectManagerImpl.getObjectFromCache(ObjectManagerImpl.java:3647)
        at org.datanucleus.ObjectManagerImpl.findObject(ObjectManagerImpl.java:2208)
        at org.datanucleus.store.fieldmanager.CacheRetrieveFieldManager.fetchObjectField(CacheRetrieveFieldManager.java:178)
        at org.datanucleus.state.AbstractStateManager.replacingObjectField(AbstractStateManager.java:1197)
        at net.playtxt.member.Member.jdoReplaceField(Member.java)
        at net.playtxt.member.Member.jdoReplaceFields(Member.java)
        at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2772)
        at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2791)
        at org.datanucleus.state.JDOStateManagerImpl.initialiseForCachedPC(JDOStateManagerImpl.java:602)
        at org.datanucleus.state.StateManagerFactory.newStateManagerForCachedPC(StateManagerFactory.java:216)
        at org.datanucleus.ObjectManagerImpl.getObjectFromCache(ObjectManagerImpl.java:3647)
        at org.datanucleus.ObjectManagerImpl.findObject(ObjectManagerImpl.java:2208)
        at org.datanucleus.store.fieldmanager.CacheRetrieveFieldManager.fetchObjectField(CacheRetrieveFieldManager.java:90)
        at org.datanucleus.state.AbstractStateManager.replacingObjectField(AbstractStateManager.java:1197)
        at net.playtxt.member.MemberInteract.jdoReplaceField(MemberInteract.java)
        at net.playtxt.member.MemberInteract.jdoReplaceFields(MemberInteract.java)
        at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2772)
        at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2791)
        at org.datanucleus.state.JDOStateManagerImpl.initialiseForCachedPC(JDOStateManagerImpl.java:602)
        at org.datanucleus.state.StateManagerFactory.newStateManagerForCachedPC(StateManagerFactory.java:216)
        at org.datanucleus.ObjectManagerImpl.getObjectFromCache(ObjectManagerImpl.java:3647)
        at org.datanucleus.ObjectManagerImpl.findObject(ObjectManagerImpl.java:2208)
        at org.datanucleus.store.fieldmanager.CacheRetrieveFieldManager.fetchObjectField(CacheRetrieveFieldManager.java:178)
        at org.datanucleus.state.AbstractStateManager.replacingObjectField(AbstractStateManager.java:1197)
        at net.playtxt.member.Member.jdoReplaceField(Member.java)
        at net.playtxt.member.Member.jdoReplaceFields(Member.java)