openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Craig Russell (JIRA)" <j...@apache.org>
Subject [jira] Commented: (OPENJPA-453) Evicting embedded object nullifies statemanager
Date Thu, 04 Jun 2009 18:09:07 GMT

    [ https://issues.apache.org/jira/browse/OPENJPA-453?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12716349#action_12716349
] 

Craig Russell commented on OPENJPA-453:
---------------------------------------

Ravi, I've given you contributor status on OpenJPA JIRA. Let me know if that doesn't work
for you.

> The race condition arises from the repeated use of the following logic in enhancement
added code (expressed as pseudo code here): 

> [PC object class].pc[SomeMethod] 
>     { 
>     if (pcStateManager == null) 
>         ... do something by default with current values in 
>             this object 
>     else 
>         { 
>         ... use pcStateManager, likely resulting in an 
>             eventual lock, and possibly in a call back to 
>             this object's PersistenceCapable interface 
>             methods 
>         ... 
>         } 
>     } 
         
>The race condition arises because the check of the value of pcStateManager is obtained
and used twice in succession without first locking the state manager. Another thread using
and having locked the state manager has the time to alter the state of this pc object, including
nulling out its pcStateManager reference. 

The use of the multithreaded flag was intended to add a bit of overhead to the StateManager
in exchange for thread-safe behavior. It's understandable why a "context" StateManager lock
was used: it prevents many cases of deadlock for multithreaded access.

But the footprint of sm->pc seems to be small. Would it be possible to use a simple semaphore
before calling the pc methods? For example,

    void provideField(PersistenceCapable pc, FieldManager store, int field) {
if (multithreaded) {
        FieldManager beforeFM = _fm;
        _fm = store;
synchronized(this) {
        pc.pcProvideField(field);
}
        // Retaining original FM because of the possibility of reentrant calls
        _fm = beforeFM;
} else {
        FieldManager beforeFM = _fm;
        _fm = store;
        pc.pcProvideField(field);
        // Retaining original FM because of the possibility of reentrant calls
        _fm = beforeFM;
}
    }




> Evicting embedded object nullifies statemanager
> -----------------------------------------------
>
>                 Key: OPENJPA-453
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-453
>             Project: OpenJPA
>          Issue Type: Bug
>         Environment: Kodo 4.1.4, Ms sql server 2005, jTDS 1.2, jdk 1.6
>            Reporter: Christiaan
>            Assignee: David Ezzio
>         Attachments: OpenJPABug453Embedded.zip, openJPATestCase.zip, TestCaseEvictEmbedded.zip
>
>
> I am noticing the following behaviour: If evict() is called on an embedded
> object the statemanager is nullified which is in contrast to non-embedded
> objects. Subsequently, calling JDOHelper.getPersistenceManager() on the
> evicted embedded object returns null. Is this the correct behaviour?

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message