Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[eclipselink-dev] Need help understanding why invalid object still returned without refresh when read via UOW

The original issue was fixed in TopLink 10.x under bug/patch 6865193 - INVALID OBJECTS IN CACHE SHOULD BE REFRESHED WHEN REGISTERED IN UOW.

 

But now I'm testing my production application using EclipseLink 1.1.1 RC1 and the bug is back. Simple test case doesn't fail! So besides answering questions below, if someone wants to have a live trace session on my desktop using my application for test case that's a possibility.

 

In the stack below getAndCloneCacheKeyFromParent is called with shouldReturnInvalidatedObjects ==  true while the object is invalid, so the code in getAndCloneCacheKeyFromParent still return the object because of this condition:

if ((cacheKey != null) && (shouldReturnInvalidatedObjects || !descriptor.getCacheInvalidationPolicy().isInvalidated(cacheKey))) {

 

Strangely the caller passing true for shouldReturnInvalidatedObjects has this comment:

//Bug#4613774  In the parent session, only return the object if it has not been Invalidated

        return getAndCloneCacheKeyFromParent(primaryKey, theClass, shouldReturnInvalidatedObjects, descriptor);

 

True is hardcoded in the code of line 327:

public Object getFromIdentityMap(Vector primaryKey, Class theClass, ClassDescriptor descriptor) {

        return getFromIdentityMap(primaryKey, theClass, true, descriptor);

    }

 

So the questions are:

1-    Does the following comment wrong? only return the object if it has not been Invalidated

2-    Should line 327 be modified to pass false?

3-    Where is the responsibility to refresh the invalid object?

 

Daemon Thread [WebContainer : 0] (Suspended)   

      UnitOfWorkIdentityMapAccessor.getAndCloneCacheKeyFromParent(Vector, Class, boolean, ClassDescriptor) line: 136   

      UnitOfWorkIdentityMapAccessor.getFromIdentityMap(Vector, Class, boolean, ClassDescriptor) line: 110   

      UnitOfWorkIdentityMapAccessor(IdentityMapAccessor).getFromIdentityMap(Vector, Class, ClassDescriptor) line: 327   

      UnitOfWorkImpl.registerExistingObject(Object, ClassDescriptor) line: 3781    

      UnitOfWorkImpl.registerExistingObject(Object) line: 3741   

      OneToOneMapping(ObjectReferenceMapping).buildCloneForPartObject(Object, Object, Object, UnitOfWorkImpl, boolean) line: 68  

      NoIndirectionPolicy.cloneAttribute(Object, Object, Object, UnitOfWorkImpl, boolean) line: 72   

      OneToOneMapping(ForeignReferenceMapping).buildClone(Object, Object, UnitOfWorkImpl) line: 156  

      ObjectBuilder.populateAttributesForClone(Object, Object, UnitOfWorkImpl) line: 2627

      UnitOfWorkImpl.populateAndRegisterObject(Object, Object, CacheKey, CacheKey, ClassDescriptor) line: 3537  

      UnitOfWorkImpl.cloneAndRegisterObject(Object, CacheKey, CacheKey, ClassDescriptor) line: 923  

      UnitOfWorkImpl.cloneAndRegisterObject(Object, CacheKey, ClassDescriptor) line: 832 

      UnitOfWorkIdentityMapAccessor.getAndCloneCacheKeyFromParent(Vector, Class, boolean, ClassDescriptor) line: 171   

      UnitOfWorkIdentityMapAccessor.getFromIdentityMap(Vector, Class, boolean, ClassDescriptor) line: 110   

      UnitOfWorkIdentityMapAccessor(IdentityMapAccessor).getFromIdentityMap(Vector, Class, ClassDescriptor) line: 327   

      UnitOfWorkImpl.registerExistingObject(Object, ClassDescriptor) line: 3781    

      UnitOfWorkImpl.registerExistingObject(Object) line: 3741   

      ReadObjectQuery(ObjectBuildingQuery).registerIndividualResult(Object, UnitOfWorkImpl, JoinedAttributeManager) line: 362  

      ObjectBuilder.buildWorkingCopyCloneNormally(ObjectBuildingQuery, AbstractRecord, UnitOfWorkImpl, Vector, ClassDescriptor, JoinedAttributeManager) line: 584   

      ObjectBuilder.buildObjectInUnitOfWork(ObjectBuildingQuery, JoinedAttributeManager, AbstractRecord, UnitOfWorkImpl, Vector, ClassDescriptor) line: 544     

      ObjectBuilder.buildObject(ObjectBuildingQuery, AbstractRecord, JoinedAttributeManager) line: 485  

      ObjectBuilder.buildObject(ObjectLevelReadQuery, AbstractRecord) line: 437    

      ReadObjectQuery(ObjectLevelReadQuery).buildObject(AbstractRecord) line: 569  

      ReadObjectQuery.registerResultInUnitOfWork(Object, UnitOfWorkImpl, AbstractRecord, boolean) line: 712     

      ReadObjectQuery.executeObjectLevelReadQuery() line: 436    

      ReadObjectQuery(ObjectLevelReadQuery).executeDatabaseQuery() line: 928 

      ReadObjectQuery(DatabaseQuery).execute(AbstractSession, AbstractRecord) line: 664  

      ReadObjectQuery(ObjectLevelReadQuery).execute(AbstractSession, AbstractRecord) line: 889  

      ReadObjectQuery.execute(AbstractSession, AbstractRecord) line: 397     

      ReadObjectQuery(ObjectLevelReadQuery).executeInUnitOfWork(UnitOfWorkImpl, AbstractRecord) line: 952    

      UnitOfWorkImpl.internalExecuteQuery(DatabaseQuery, AbstractRecord) line: 2755

      UnitOfWorkImpl(AbstractSession).executeQuery(DatabaseQuery, AbstractRecord, int) line: 1181 


Back to the top