Synching of DataCache with QueryCache outside of a transaction
--------------------------------------------------------------

                 Key: OPENJPA-1448
                 URL: https://issues.apache.org/jira/browse/OPENJPA-1448
             Project: OpenJPA
          Issue Type: Sub-task
          Components: datacache
    Affects Versions: 2.0.0-M3
            Reporter: Kevin Sutter
            Priority: Minor


One of the tests (CacheTest.testQueryImplicitEvictions) re-enabled for the 
parent JIRA (openjpa-1443) expected that the DataCache would automatically 
synch up with the QueryCache, even outside of a transaction.  This test would 
first load up the DataCache with Entity instances.  Then, a Query would be 
created and executed against these Entities to create an entry in the 
QueryCache.  Then, using implicit eviction processing, those target Entities 
were removed from the DataCache.  The expectation was that this implicit 
eviction would also clean up the QueryCache so that the Query and Results were 
no longer present.

It doesn't look like our synchronization between the DataCache and QueryCache 
work that way.  We will do synchronization when a "dirty" transaction 
completes.  That is, if you have updated or deleted Entities that exist in the 
DataCache, when that transaction completes, we will do a synch with the 
QueryCache to remove stale Queries and Results.  But, we don't do this 
synchronization on every eviction.

Maybe Kodo did and that's why this testcase exists?  Not sure.  To be honest, 
I'm concerned about this type of synchronization from an overhead perspective.  
If every eviction required us to scour the QueryCache for a potential stale 
Result, we might be chewing up a lot of resources.  But, since this previously 
disabled testcase expected this capability, I thought I would write a 
low-priority JIRA to track the issue.  Here are my comments from the 
CacheTest.testQueryImplicitEvictions method:

            /*
             * Not a valid test...  At least not with the current 
implementation...
             * 
             * Just removing items from the DataCache (as done via the previous 
loop) is not sufficient
             * to remove the entries from the QueryCache.  Currently, this 
notification is done at the end
             * of a transaction after inserts, updates, and deletes have been 
performed.  Then, the 
             * updateCaches() method is invoked on the DataCacheStoreManager 
which will flow the request to
             * the QueryCache.  With no direct updates to the "Entities of 
interest", then there's nothing to
             * flow over to the QueryCache for cleanup.  Even putting the above 
loop within a transaction is
             * not sufficient, since there have been no updates to the 
"Entities of interest".
             */
//            em = factory.createEntityManager();
//            broker = JPAFacadeHelper.toBroker(em);
//            q = broker.newQuery(JPQLParser.LANG_JPQL, "Select a FROM "
//                + CacheObjectJ.class.getSimpleName()
//                + " a where a.str = 'h'");
//            try {
//                assertInCache(q, null);
//            }
//            catch (AssertionFailedError e) {
//                bug(626, "query cache invalidation is broken");
//            }

Thanks,
Kevin

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

Reply via email to