You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by cu...@apache.org on 2009/11/09 23:02:15 UTC

svn commit: r834252 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractQueryCache.java openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestQueryTimestampEviction.java

Author: curtisr7
Date: Mon Nov  9 22:02:15 2009
New Revision: 834252

URL: http://svn.apache.org/viewvc?rev=834252&view=rev
Log:
OPENJPA-1379: Fixed locking problem in AbstractQueryCache when using timestamp eviction policy and added new test case.

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractQueryCache.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestQueryTimestampEviction.java

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractQueryCache.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractQueryCache.java?rev=834252&r1=834251&r2=834252&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractQueryCache.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractQueryCache.java Mon Nov  9 22:02:15 2009
@@ -94,9 +94,9 @@
     }
 
     public void onTypesChanged(TypesChangedEvent ev) {
-        writeLock();
-        Collection keys = null;
         if (evictPolicy == EvictPolicy.DEFAULT) {
+            writeLock();
+            Collection keys = null;
             try {
                 if (hasListeners())
                     fireEvent(ev);

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestQueryTimestampEviction.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestQueryTimestampEviction.java?rev=834252&r1=834251&r2=834252&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestQueryTimestampEviction.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestQueryTimestampEviction.java Mon Nov  9 22:02:15 2009
@@ -18,7 +18,11 @@
  */
 package org.apache.openjpa.persistence.jdbc.query.cache;
 
+import java.util.Collections;
+
 import org.apache.openjpa.datacache.ConcurrentQueryCache;
+import org.apache.openjpa.datacache.QueryCache;
+import org.apache.openjpa.datacache.TypesChangedEvent;
 import org.apache.openjpa.datacache.AbstractQueryCache.EvictPolicy;
 import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
 
@@ -58,5 +62,31 @@
 
         this.recreateData = false;
     }
+
+    /**
+     * This testcase was added for OPENJPA-1379. Prior to this fix, the main thread holds a lock on
+     * the QueryCache which it never released. As a result, thread t2 will never successfully obtain
+     * the writeLock().
+     * 
+     * The main thread holds the writeLock because setUp(..) calls deleteAllData() which eventually
+     * results in AbstractQueryCache.onTypesChanges(TypesChangedEvent) being called.
+     * 
+     * @throws Exception
+     */
+    public void testWriteLock() throws Exception {
+        final QueryCache qc = emf.getConfiguration().getDataCacheManagerInstance().getSystemQueryCache();
+        Thread t2 = new Thread() {
+            public void run() {
+                qc.writeLock();
+                qc.writeUnlock();
+            }
+        };
+        t2.start();
+        t2.join(5000);
+        
+        if (t2.getState().equals(java.lang.Thread.State.WAITING)) {
+            fail("The thread is still waiting on a writeLock()!");
+        }
+    }
 }