[hibernate-commits] Hibernate SVN: r18790 - in core/trunk/cache-infinispan/src: main/java/org/hibernate/cache/infinispan/query and 2 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Feb 12 07:21:44 EST 2010


Author: galder.zamarreno at jboss.com
Date: 2010-02-12 07:21:43 -0500 (Fri, 12 Feb 2010)
New Revision: 18790

Modified:
   core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java
   core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/query/QueryResultsRegionImpl.java
   core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/timestamp/TimestampsRegionImpl.java
   core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/BasicTransactionalTestCase.java
Log:
[HHH-4836] (Infinispan: 2L QueryCache don't considers cached queries which belong to current transaction) Fixed by not suspending transactions on get any more, since no locks are aquired on get.

Modified: core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java
===================================================================
--- core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java	2010-02-12 06:22:52 UTC (rev 18789)
+++ core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java	2010-02-12 12:21:43 UTC (rev 18790)
@@ -194,28 +194,21 @@
    }
 
    /**
-    * Performs a JBoss Cache <code>get(Fqn, Object)</code> after first
-    * {@link #suspend suspending any ongoing transaction}. Wraps any exception
-    * in a {@link CacheException}. Ensures any ongoing transaction is resumed.
-    * 
+    * Performs a Infinispan <code>get(Fqn, Object)</code>
+    *
     * @param key The key of the item to get
     * @param opt any option to add to the get invocation. May be <code>null</code>
     * @param suppressTimeout should any TimeoutException be suppressed?
     * @return The retrieved object
       * @throws CacheException issue managing transaction or talking to cache
     */
-   protected Object suspendAndGet(Object key, FlagAdapter opt, boolean suppressTimeout) throws CacheException {
-       Transaction tx = suspend();
-       try {
-           if (suppressTimeout)
-               return cacheAdapter.getAllowingTimeout(key);
-           else
-               return cacheAdapter.get(key);
-       } finally {
-           resume(tx);
-       }
+   protected Object get(Object key, FlagAdapter opt, boolean suppressTimeout) throws CacheException {
+      if (suppressTimeout)
+         return cacheAdapter.getAllowingTimeout(key);
+      else
+         return cacheAdapter.get(key);
    }
-
+   
    public Object getOwnerForPut() {
       Transaction tx = null;
       try {

Modified: core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/query/QueryResultsRegionImpl.java
===================================================================
--- core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/query/QueryResultsRegionImpl.java	2010-02-12 06:22:52 UTC (rev 18789)
+++ core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/query/QueryResultsRegionImpl.java	2010-02-12 12:21:43 UTC (rev 18790)
@@ -50,12 +50,13 @@
       if (!checkValid())
          return null;
 
-      // Don't hold the JBC node lock throughout the tx, as that
-      // prevents updates
+      // In Infinispan get doesn't acquire any locks, so no need to suspend the tx.
+      // In the past, when get operations acquired locks, suspending the tx was a way
+      // to avoid holding locks that would prevent updates.
       // Add a zero (or low) timeout option so we don't block
       // waiting for tx's that did a put to commit
-      return suspendAndGet(key, FlagAdapter.ZERO_LOCK_ACQUISITION_TIMEOUT, true);
-   }
+      return get(key, FlagAdapter.ZERO_LOCK_ACQUISITION_TIMEOUT, true);
+   }   
 
    public void put(Object key, Object value) throws CacheException {
       if (checkValid()) {

Modified: core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/timestamp/TimestampsRegionImpl.java
===================================================================
--- core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/timestamp/TimestampsRegionImpl.java	2010-02-12 06:22:52 UTC (rev 18789)
+++ core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/timestamp/TimestampsRegionImpl.java	2010-02-12 12:21:43 UTC (rev 18790)
@@ -58,7 +58,7 @@
    public Object get(Object key) throws CacheException {
       Object value = localCache.get(key);
       if (value == null && checkValid()) {
-         value = suspendAndGet(key, null, false);
+         value = get(key, null, false);
          if (value != null)
             localCache.put(key, value);
       }

Modified: core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/BasicTransactionalTestCase.java
===================================================================
--- core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/BasicTransactionalTestCase.java	2010-02-12 06:22:52 UTC (rev 18789)
+++ core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/BasicTransactionalTestCase.java	2010-02-12 12:21:43 UTC (rev 18790)
@@ -287,4 +287,47 @@
          commitOrRollbackTx();
       }
    }
+
+   public void testQueryCacheHitInSameTransaction() throws Exception {
+      Session s = null;
+      Item item = new Item("galder", "Galder's Item");
+
+      beginTx();
+      try {
+         s = openSession();
+         s.getTransaction().begin();
+         s.persist(item);
+         s.getTransaction().commit();
+         s.close();
+      } catch (Exception e) {
+         setRollbackOnlyTx(e);
+      } finally {
+         commitOrRollbackTx();
+      }
+
+      beginTx();
+      try {
+         s = openSession();
+         Statistics stats = s.getSessionFactory().getStatistics();
+         s.createQuery("from Item").setCacheable(true).list();
+         s.createQuery("from Item").setCacheable(true).list();
+         assertEquals(1, stats.getQueryCacheHitCount());
+         s.close();
+      } catch (Exception e) {
+         setRollbackOnlyTx(e);
+      } finally {
+         commitOrRollbackTx();
+      }
+
+      beginTx();
+      try {
+         s = openSession();
+         s.createQuery("delete from Item").executeUpdate();
+         s.close();
+      } catch (Exception e) {
+         setRollbackOnlyTx(e);
+      } finally {
+         commitOrRollbackTx();
+      }
+   }   
 }



More information about the hibernate-commits mailing list