db-jdo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michelle Caisse <Michelle.Cai...@Sun.COM>
Subject Re: pmf not closed
Date Mon, 02 May 2005 20:18:51 GMT
Okay, here's what was going on.  PersistenceManagerTest extends JDO_Test 
and overrides its tearDown() method.  The former's tearDown() calls 
cleanupMylib() before calling closePMF(). cleanupMylib() fails on trying 
to clean up the database, throws an exception, and never returns to 
tearDown, so closePMF() does not get executed.

cleanupMylib() fails because it attempts to delete PCPoint objects 
before deleting PCRect objects that hold foreign keys to the PCPoints.  
I changed the order of execution and the tests now pass.  I will accept 
advice on how to avoid this problem in the future if cleanupMylib() 
fails.  Here is the offending code:

    /** */
    protected void tearDown() {
        try {
            cleanup();
            cleanupMylib();
            closePMF();
        }
        catch (Throwable ex) {
            if (debug) ex.printStackTrace();
            if (testSucceeded) {
                // runTest succeeded, but closePMF throws exception =>
                // failure
                fail("Exception during tearDown: " + ex);
            }
            else {
                // runTest failed and closePMF throws exception =>
                // just print the closePMF exception, otherwise the
                // closePMF exception would swallow the test case failure
                if (debug)
                    logger.debug("Exception during tearDown: " + ex);
            }
        }
    }
   
    /** */
    protected void cleanupMylib() {
        PersistenceManager pm = getPM();
        Transaction tx = null;
        try {
            pm = pmf.getPersistenceManager();
            tx = pm.currentTransaction();
            tx.begin();
            Collection c = getAllObjects(pm, PCRect.class);
            pm.deletePersistentAll(c);
            tx.commit();
       
            tx.begin();
            c = getAllObjects(pm, PCPoint.class);
            pm.deletePersistentAll(c);
            tx.commit();
        }
        finally {
            if ((tx != null) && tx.isActive())
                tx.rollback();
            if ((pm != null) && pm.isClosed())
                pm.close();
        }
    }

-- Michelle

Michael Bouschen wrote:

> Hi Michelle,
>
>> Hi, Michael,
>>
>> When you get a chance to look at the tests that don't close pmf when 
>> they fail, the JIRA number is JDO-32.
>
>
> I looked into this. Attached you find an updated version of 
> JDO_Test.java. It checks whether pmf.close throws an exception because 
> of open pms. If so it closes the pms and closes the pmf again.
>
> However, I was not able to reproduce the issue. I removed the heap 
> size increase from project.properties. I also added some debug 
> messages to the pm cleanup code I added to the method closing the pmf. 
> It got never printed. I tried the tck default configuration and used 
> the JPOX nightly builds from April 1 and May 1.
>
> Could you please try the attached version of JDO_Test and let me know 
> whether it makes any difference? It might be good to check it in 
> anyway, even if todays tests do not need it.The attached file works 
> for tck20 and tck11 and I'm planning a similar change for ri11.
>
> Thanks!
>
> Regards Michael
>
>>
>> Thanks,
>> Michelle
>
>


Mime
View raw message