Return-Path: Delivered-To: apmail-openjpa-commits-archive@www.apache.org Received: (qmail 57931 invoked from network); 9 Nov 2009 22:02:38 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 9 Nov 2009 22:02:38 -0000 Received: (qmail 2831 invoked by uid 500); 9 Nov 2009 22:02:38 -0000 Delivered-To: apmail-openjpa-commits-archive@openjpa.apache.org Received: (qmail 2776 invoked by uid 500); 9 Nov 2009 22:02:38 -0000 Mailing-List: contact commits-help@openjpa.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openjpa.apache.org Delivered-To: mailing list commits@openjpa.apache.org Received: (qmail 2766 invoked by uid 99); 9 Nov 2009 22:02:38 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 09 Nov 2009 22:02:38 +0000 X-ASF-Spam-Status: No, hits=-2.6 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 09 Nov 2009 22:02:36 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id D283823889B6; Mon, 9 Nov 2009 22:02:15 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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 Date: Mon, 09 Nov 2009 22:02:15 -0000 To: commits@openjpa.apache.org From: curtisr7@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20091109220215.D283823889B6@eris.apache.org> 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()!"); + } + } }