[hibernate-commits] Hibernate SVN: r17657 - in core/trunk/cache-jbosscache/src: test/java/org/hibernate/test/cache/jbc/access and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Thu Oct 8 13:50:08 EDT 2009


Author: bstansberry at jboss.com
Date: 2009-10-08 13:50:07 -0400 (Thu, 08 Oct 2009)
New Revision: 17657

Modified:
   core/trunk/cache-jbosscache/src/main/java/org/hibernate/cache/jbc/access/PutFromLoadValidator.java
   core/trunk/cache-jbosscache/src/test/java/org/hibernate/test/cache/jbc/access/PutFromLoadValidatorUnitTestCase.java
Log:
[HHH-3817] Further refine, test PutFromLoadValidator

Modified: core/trunk/cache-jbosscache/src/main/java/org/hibernate/cache/jbc/access/PutFromLoadValidator.java
===================================================================
--- core/trunk/cache-jbosscache/src/main/java/org/hibernate/cache/jbc/access/PutFromLoadValidator.java	2009-10-08 13:29:47 UTC (rev 17656)
+++ core/trunk/cache-jbosscache/src/main/java/org/hibernate/cache/jbc/access/PutFromLoadValidator.java	2009-10-08 17:50:07 UTC (rev 17657)
@@ -115,11 +115,14 @@
     *                           may be <code>null</code>
     */
    public PutFromLoadValidator(TransactionManager transactionManager) {
-      this(transactionManager, NAKED_PUT_INVALIDATION_PERIOD, PENDING_PUT_OVERAGE_PERIOD, PENDING_PUT_RECENT_PERIOD, MAX_PENDING_PUT_DELAY);
+      this(transactionManager, NAKED_PUT_INVALIDATION_PERIOD, PENDING_PUT_OVERAGE_PERIOD, 
+    		  PENDING_PUT_RECENT_PERIOD, MAX_PENDING_PUT_DELAY);
    }
    
-   /** Constructor variant for use by unit tests; allows control of variouts timeouts by the test. */
-   protected PutFromLoadValidator(TransactionManager transactionManager, long nakedPutInvalidationPeriod, long pendingPutOveragePeriod, long pendingPutRecentPeriod, long maxPendingPutDelay) {
+   /** Constructor variant for use by unit tests; allows control of various timeouts by the test. */
+   protected PutFromLoadValidator(TransactionManager transactionManager, 
+		   long nakedPutInvalidationPeriod, long pendingPutOveragePeriod, 
+		   long pendingPutRecentPeriod, long maxPendingPutDelay) {
       this.transactionManager = transactionManager;
       this.nakedPutInvalidationPeriod = nakedPutInvalidationPeriod;
       this.pendingPutOveragePeriod = pendingPutOveragePeriod;
@@ -127,6 +130,8 @@
       this.maxPendingPutDelay = maxPendingPutDelay;
    }
 
+   // -----------------------------------------------------------------  Public
+   
    public boolean isPutValid(Object key)
    {
       boolean valid = false;
@@ -264,6 +269,41 @@
       // Guard against memory leaks
       preventOutdatedPendingPuts(pendingPut);
    }
+   // --------------------------------------------------------------  Protected
+   
+   /** Only for use by unit tests; may be removed at any time */
+   protected int getPendingPutQueueLength() {
+	   pendingLock.lock();
+	   try {
+		   return pendingQueue.size();
+	   }
+	   finally {
+		   pendingLock.unlock();
+	   }
+   }
+   
+   /** Only for use by unit tests; may be removed at any time */
+   protected int getOveragePendingPutQueueLength() {
+	   pendingLock.lock();
+	   try {
+		   return overagePendingQueue.size();
+	   }
+	   finally {
+		   pendingLock.unlock();
+	   }
+   }
+   
+   /** Only for use by unit tests; may be removed at any time */
+   protected int getRemovalQueueLength() {
+	   removalsLock.lock();
+	   try {
+		   return removalsQueue.size();
+	   }
+	   finally {
+		   removalsLock.unlock();
+	   }
+   }
+   // ----------------------------------------------------------------  Private
 
    private Object getOwnerForPut()
    {
@@ -307,7 +347,7 @@
          
          int pos = 0;
          while (pendingQueue.size() > pos) {
-            WeakReference<PendingPut> ref = pendingQueue.get(0);
+            WeakReference<PendingPut> ref = pendingQueue.get(pos);
             PendingPut item = ref.get();
             if (item == null || item.completed) {
                pendingQueue.remove(pos);
@@ -343,6 +383,7 @@
             }
             else {
                if (item.timestamp < mustCleanTime) {
+                  overagePendingQueue.remove(0);
                   toClean = item;
                }
                break;
@@ -357,7 +398,7 @@
       
       // We've found a pendingPut that never happened; clean it up
       if (toClean != null) {
-         PendingPutMap map = pendingPuts.get(toClean.key);
+    	 PendingPutMap map = pendingPuts.get(toClean.key);
          if (map != null) {
             synchronized (map) {
                PendingPut cleaned = map.remove(toClean.owner);

Modified: core/trunk/cache-jbosscache/src/test/java/org/hibernate/test/cache/jbc/access/PutFromLoadValidatorUnitTestCase.java
===================================================================
--- core/trunk/cache-jbosscache/src/test/java/org/hibernate/test/cache/jbc/access/PutFromLoadValidatorUnitTestCase.java	2009-10-08 13:29:47 UTC (rev 17656)
+++ core/trunk/cache-jbosscache/src/test/java/org/hibernate/test/cache/jbc/access/PutFromLoadValidatorUnitTestCase.java	2009-10-08 17:50:07 UTC (rev 17657)
@@ -23,224 +23,406 @@
  */
 package org.hibernate.test.cache.jbc.access;
 
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.transaction.Transaction;
 import javax.transaction.TransactionManager;
 
+import junit.framework.TestCase;
+
 import org.hibernate.cache.jbc.access.PutFromLoadValidator;
 import org.hibernate.test.cache.jbc.functional.util.DualNodeJtaTransactionManagerImpl;
 
-import junit.framework.TestCase;
-
 /**
  * Tests of {@link PutFromLoadValidator}.
- *
+ * 
  * @author Brian Stansberry
  * 
  * @version $Revision: $
  */
-public class PutFromLoadValidatorUnitTestCase extends TestCase
-{
-   private Object KEY1= "KEY1";
-   
-   private TransactionManager tm;
-   
-   public PutFromLoadValidatorUnitTestCase(String name) {
-      super(name);
-   }
-   
-   @Override
-   protected void setUp() throws Exception
-   {
-      super.setUp();
-      tm = DualNodeJtaTransactionManagerImpl.getInstance("test");
-   }
+public class PutFromLoadValidatorUnitTestCase extends TestCase {
+	private Object KEY1 = "KEY1";
 
-   @Override
-   protected void tearDown() throws Exception
-   {
-      try {
-         super.tearDown();
-      }
-      finally {
-         tm = null;
-         try {
-            DualNodeJtaTransactionManagerImpl.cleanupTransactions();
-         }
-         finally {
-            DualNodeJtaTransactionManagerImpl.cleanupTransactionManagers();
-         }
-      }
-   }
+	private TransactionManager tm;
 
-   public void testNakedPut() throws Exception  {
-      nakedPutTest(false);
-   }
+	public PutFromLoadValidatorUnitTestCase(String name) {
+		super(name);
+	}
 
-   public void testNakedPutTransactional() throws Exception {
-      nakedPutTest(true);
-   }
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		tm = DualNodeJtaTransactionManagerImpl.getInstance("test");
+	}
 
-   private void nakedPutTest(boolean transactional) throws Exception {
-      PutFromLoadValidator testee = new PutFromLoadValidator(transactional ? tm : null);
-      if (transactional) {
-         tm.begin();
-      }
-      assertTrue(testee.isPutValid(KEY1));
-   }
+	@Override
+	protected void tearDown() throws Exception {
+		try {
+			super.tearDown();
+		} finally {
+			tm = null;
+			try {
+				DualNodeJtaTransactionManagerImpl.cleanupTransactions();
+			} finally {
+				DualNodeJtaTransactionManagerImpl.cleanupTransactionManagers();
+			}
+		}
+	}
 
-   public void testRegisteredPut() throws Exception {
-      registeredPutTest(false);
-   }
+	public void testNakedPut() throws Exception {
+		nakedPutTest(false);
+	}
 
-   public void testRegisteredPutTransactional() throws Exception {
-      registeredPutTest(true);
-   }
+	public void testNakedPutTransactional() throws Exception {
+		nakedPutTest(true);
+	}
 
-   private void registeredPutTest(boolean transactional) throws Exception {
-      PutFromLoadValidator testee = new PutFromLoadValidator(transactional ? tm : null);
-      if (transactional) {
-         tm.begin();
-      }
-      testee.registerPendingPut(KEY1);
-      assertTrue(testee.isPutValid(KEY1));
-   }
-   
-   public void testNakedPutAfterKeyRemoval() throws Exception {
-      nakedPutAfterRemovalTest(false, false);
-   }
-   
-   public void testNakedPutAfterKeyRemovalTransactional() throws Exception {
-      nakedPutAfterRemovalTest(true, false);
-   }
-   
-   public void testNakedPutAfterRegionRemoval() throws Exception {
-      nakedPutAfterRemovalTest(false, true);
-   }
-   
-   public void testNakedPutAfterRegionRemovalTransactional() throws Exception {
-      nakedPutAfterRemovalTest(true, true);
-   }
+	private void nakedPutTest(boolean transactional) throws Exception {
+		PutFromLoadValidator testee = new PutFromLoadValidator(
+				transactional ? tm : null);
+		if (transactional) {
+			tm.begin();
+		}
+		assertTrue(testee.isPutValid(KEY1));
+	}
 
-   private void nakedPutAfterRemovalTest(boolean transactional, boolean removeRegion) throws Exception
-   {
-      PutFromLoadValidator testee = new PutFromLoadValidator(transactional ? tm : null);
-      if (removeRegion) {
-         testee.regionRemoved();
-      }
-      else {
-         testee.keyRemoved(KEY1);
-      }
-      if (transactional) {
-         tm.begin();
-      }
-      assertFalse(testee.isPutValid(KEY1));
-      
-   }
-   
-   public void testRegisteredPutAfterKeyRemoval() throws Exception {
-      registeredPutAfterRemovalTest(false, false);
-   }
-   
-   public void testRegisteredPutAfterKeyRemovalTransactional() throws Exception {
-      registeredPutAfterRemovalTest(true, false);
-   }
-   
-   public void testRegisteredPutAfterRegionRemoval() throws Exception {
-      registeredPutAfterRemovalTest(false, true);
-   }
-   
-   public void testRegisteredPutAfterRegionRemovalTransactional() throws Exception {
-      registeredPutAfterRemovalTest(true, true);
-   }
+	public void testRegisteredPut() throws Exception {
+		registeredPutTest(false);
+	}
 
-   private void registeredPutAfterRemovalTest(boolean transactional, boolean removeRegion) throws Exception
-   {
-      PutFromLoadValidator testee = new PutFromLoadValidator(transactional ? tm : null);
-      if (removeRegion) {
-         testee.regionRemoved();
-      }
-      else {
-         testee.keyRemoved(KEY1);
-      }
-      if (transactional) {
-         tm.begin();
-      }
-      testee.registerPendingPut(KEY1);
-      assertTrue(testee.isPutValid(KEY1));      
-   }
-   
-   public void testRegisteredPutWithInterveningKeyRemoval() throws Exception {
-      registeredPutWithInterveningRemovalTest(false, false);
-   }
-   
-   public void testRegisteredPutWithInterveningKeyRemovalTransactional() throws Exception {
-      registeredPutWithInterveningRemovalTest(true, false);
-   }
-   
-   public void testRegisteredPutWithInterveningRegionRemoval() throws Exception {
-      registeredPutWithInterveningRemovalTest(false, true);
-   }
-   
-   public void testRegisteredPutWithInterveningRegionRemovalTransactional() throws Exception {
-      registeredPutWithInterveningRemovalTest(true, true);
-   }
+	public void testRegisteredPutTransactional() throws Exception {
+		registeredPutTest(true);
+	}
 
-   private void registeredPutWithInterveningRemovalTest(boolean transactional, boolean removeRegion) throws Exception
-   {
-      PutFromLoadValidator testee = new PutFromLoadValidator(transactional ? tm : null);
-      if (transactional) {
-         tm.begin();
-      }
-      testee.registerPendingPut(KEY1);
-      if (removeRegion) {
-         testee.regionRemoved();
-      }
-      else {
-         testee.keyRemoved(KEY1);
-      }
-      assertFalse(testee.isPutValid(KEY1));      
-   }
-   
-   public void testDelayedNakedPutAfterKeyRemoval() throws Exception {
-      delayedNakedPutAfterRemovalTest(false, false);
-   }
-   
-   public void testDelayedNakedPutAfterKeyRemovalTransactional() throws Exception {
-      delayedNakedPutAfterRemovalTest(true, false);
-   }
-   
-   public void testDelayedNakedPutAfterRegionRemoval() throws Exception {
-      delayedNakedPutAfterRemovalTest(false, true);
-   }
-   
-   public void testDelayedNakedPutAfterRegionRemovalTransactional() throws Exception {
-      delayedNakedPutAfterRemovalTest(true, true);
-   }
+	private void registeredPutTest(boolean transactional) throws Exception {
+		PutFromLoadValidator testee = new PutFromLoadValidator(
+				transactional ? tm : null);
+		if (transactional) {
+			tm.begin();
+		}
+		testee.registerPendingPut(KEY1);
+		assertTrue(testee.isPutValid(KEY1));
+	}
 
-   private void delayedNakedPutAfterRemovalTest(boolean transactional, boolean removeRegion) throws Exception
-   {
-      PutFromLoadValidator testee = new TestValidator(transactional ? tm : null, 100, 1000, 500, 10000);
-      if (removeRegion) {
-         testee.regionRemoved();
-      }
-      else {
-         testee.keyRemoved(KEY1);
-      }
-      if (transactional) {
-         tm.begin();
-      }
-      Thread.sleep(110);
-      assertTrue(testee.isPutValid(KEY1));
-      
-   }
-   
-   private static class TestValidator extends PutFromLoadValidator {
+	public void testNakedPutAfterKeyRemoval() throws Exception {
+		nakedPutAfterRemovalTest(false, false);
+	}
 
-      protected TestValidator(TransactionManager transactionManager, long nakedPutInvalidationPeriod,
-            long pendingPutOveragePeriod, long pendingPutRecentPeriod, long maxPendingPutDelay)
-      {
-         super(transactionManager, nakedPutInvalidationPeriod, pendingPutOveragePeriod, pendingPutRecentPeriod,
-               maxPendingPutDelay);
-      }
-      
-   }
+	public void testNakedPutAfterKeyRemovalTransactional() throws Exception {
+		nakedPutAfterRemovalTest(true, false);
+	}
+
+	public void testNakedPutAfterRegionRemoval() throws Exception {
+		nakedPutAfterRemovalTest(false, true);
+	}
+
+	public void testNakedPutAfterRegionRemovalTransactional() throws Exception {
+		nakedPutAfterRemovalTest(true, true);
+	}
+
+	private void nakedPutAfterRemovalTest(boolean transactional,
+			boolean removeRegion) throws Exception {
+		PutFromLoadValidator testee = new PutFromLoadValidator(
+				transactional ? tm : null);
+		if (removeRegion) {
+			testee.regionRemoved();
+		} else {
+			testee.keyRemoved(KEY1);
+		}
+		if (transactional) {
+			tm.begin();
+		}
+		assertFalse(testee.isPutValid(KEY1));
+
+	}
+
+	public void testRegisteredPutAfterKeyRemoval() throws Exception {
+		registeredPutAfterRemovalTest(false, false);
+	}
+
+	public void testRegisteredPutAfterKeyRemovalTransactional()
+			throws Exception {
+		registeredPutAfterRemovalTest(true, false);
+	}
+
+	public void testRegisteredPutAfterRegionRemoval() throws Exception {
+		registeredPutAfterRemovalTest(false, true);
+	}
+
+	public void testRegisteredPutAfterRegionRemovalTransactional()
+			throws Exception {
+		registeredPutAfterRemovalTest(true, true);
+	}
+
+	private void registeredPutAfterRemovalTest(boolean transactional,
+			boolean removeRegion) throws Exception {
+		PutFromLoadValidator testee = new PutFromLoadValidator(
+				transactional ? tm : null);
+		if (removeRegion) {
+			testee.regionRemoved();
+		} else {
+			testee.keyRemoved(KEY1);
+		}
+		if (transactional) {
+			tm.begin();
+		}
+		testee.registerPendingPut(KEY1);
+		assertTrue(testee.isPutValid(KEY1));
+	}
+
+	public void testRegisteredPutWithInterveningKeyRemoval() throws Exception {
+		registeredPutWithInterveningRemovalTest(false, false);
+	}
+
+	public void testRegisteredPutWithInterveningKeyRemovalTransactional()
+			throws Exception {
+		registeredPutWithInterveningRemovalTest(true, false);
+	}
+
+	public void testRegisteredPutWithInterveningRegionRemoval()
+			throws Exception {
+		registeredPutWithInterveningRemovalTest(false, true);
+	}
+
+	public void testRegisteredPutWithInterveningRegionRemovalTransactional()
+			throws Exception {
+		registeredPutWithInterveningRemovalTest(true, true);
+	}
+
+	private void registeredPutWithInterveningRemovalTest(boolean transactional,
+			boolean removeRegion) throws Exception {
+		PutFromLoadValidator testee = new PutFromLoadValidator(
+				transactional ? tm : null);
+		if (transactional) {
+			tm.begin();
+		}
+		testee.registerPendingPut(KEY1);
+		if (removeRegion) {
+			testee.regionRemoved();
+		} else {
+			testee.keyRemoved(KEY1);
+		}
+		assertFalse(testee.isPutValid(KEY1));
+	}
+
+	public void testDelayedNakedPutAfterKeyRemoval() throws Exception {
+		delayedNakedPutAfterRemovalTest(false, false);
+	}
+
+	public void testDelayedNakedPutAfterKeyRemovalTransactional()
+			throws Exception {
+		delayedNakedPutAfterRemovalTest(true, false);
+	}
+
+	public void testDelayedNakedPutAfterRegionRemoval() throws Exception {
+		delayedNakedPutAfterRemovalTest(false, true);
+	}
+
+	public void testDelayedNakedPutAfterRegionRemovalTransactional()
+			throws Exception {
+		delayedNakedPutAfterRemovalTest(true, true);
+	}
+
+	private void delayedNakedPutAfterRemovalTest(boolean transactional,
+			boolean removeRegion) throws Exception {
+		PutFromLoadValidator testee = new TestValidator(transactional ? tm
+				: null, 100, 1000, 500, 10000);
+		if (removeRegion) {
+			testee.regionRemoved();
+		} else {
+			testee.keyRemoved(KEY1);
+		}
+		if (transactional) {
+			tm.begin();
+		}
+		Thread.sleep(110);
+		assertTrue(testee.isPutValid(KEY1));
+
+	}
+	
+	public void testMultipleRegistrations() throws Exception {
+		multipleRegistrationtest(false);
+	}
+	
+	public void testMultipleRegistrationsTransactional() throws Exception {
+		multipleRegistrationtest(true);
+	}
+
+	private void multipleRegistrationtest(final boolean transactional) throws Exception {
+		final PutFromLoadValidator testee = new PutFromLoadValidator(transactional ? tm : null);
+		
+		final CountDownLatch registeredLatch = new CountDownLatch(3);
+		final CountDownLatch finishedLatch = new CountDownLatch(3);
+		final AtomicInteger success = new AtomicInteger();
+		
+		Runnable r = new Runnable() {
+			public void run() {
+				try {
+					if (transactional) {
+						tm.begin();
+					}
+					testee.registerPendingPut(KEY1);
+					registeredLatch.countDown();
+					registeredLatch.await(5, TimeUnit.SECONDS);
+					if (testee.isPutValid(KEY1)) {
+						success.incrementAndGet();
+					}
+					finishedLatch.countDown();
+				}
+				catch (Exception e)  {
+					e.printStackTrace();
+				}
+			}
+		};
+		
+		ExecutorService executor = Executors.newFixedThreadPool(3);
+		
+		// Start with a removal so the "isPutValid" calls will fail if
+		// any of the concurrent activity isn't handled properly
+		
+		testee.regionRemoved();
+		
+		// Do the registration + isPutValid calls
+		executor.execute(r);
+		executor.execute(r);
+		executor.execute(r);
+		
+		finishedLatch.await(5, TimeUnit.SECONDS);
+		
+		assertEquals("All threads succeeded", 3, success.get());
+	}
+	
+	/**
+	 * White box test for ensuring key removals get cleaned up.
+	 * 
+	 * @throws Exception
+	 */
+	public void testRemovalCleanup() throws Exception {
+		TestValidator testee = new TestValidator(null, 200, 1000, 500, 10000);
+		testee.keyRemoved("KEY1");
+		testee.keyRemoved("KEY2");
+		Thread.sleep(210);
+		assertEquals(2, testee.getRemovalQueueLength());
+		testee.keyRemoved("KEY1");
+		assertEquals(2, testee.getRemovalQueueLength());
+		testee.keyRemoved("KEY2");
+		assertEquals(2, testee.getRemovalQueueLength());
+	}
+	
+	/** 
+	 * Very much a white box test of the logic for ensuring pending
+	 * put registrations get cleaned up.
+	 *  
+	 * @throws Exception
+	 */
+	public void testPendingPutCleanup() throws Exception {
+		TestValidator testee = new TestValidator(tm, 5000, 600, 300, 900);
+		
+		// Start with a regionRemoval so we can confirm at the end that all
+		// registrations have been cleaned out
+		testee.regionRemoved();
+		
+		testee.registerPendingPut("1");
+		testee.registerPendingPut("2");
+		testee.registerPendingPut("3");
+		testee.registerPendingPut("4");
+		testee.registerPendingPut("5");
+		testee.registerPendingPut("6");
+		testee.isPutValid("6");
+		testee.isPutValid("2");
+        // ppq = [1,2(c),3,4,5,6(c)]
+		assertEquals(6, testee.getPendingPutQueueLength());
+		assertEquals(0, testee.getOveragePendingPutQueueLength());
+		
+		// Sleep past "pendingPutRecentPeriod"
+		Thread.sleep(310);
+		testee.registerPendingPut("7");
+        // White box -- should have cleaned out 2 (completed) but 
+		// not gotten to 6 (also removed)
+		// ppq = [1,3,4,5,6(c),7]
+		assertEquals(0, testee.getOveragePendingPutQueueLength());
+		assertEquals(6, testee.getPendingPutQueueLength());
+		
+		// Sleep past "pendingPutOveragePeriod"
+		Thread.sleep(310);
+		testee.registerPendingPut("8");
+		// White box -- should have cleaned out 6 (completed) and 
+		// moved 1, 3, 4  and 5 to overage queue
+		// oppq = [1,3,4,5] ppq = [7,8]
+        assertEquals(4, testee.getOveragePendingPutQueueLength());
+		assertEquals(2, testee.getPendingPutQueueLength());
+		
+		// Sleep past "maxPendingPutDelay"
+		Thread.sleep(310);
+		testee.isPutValid("3");
+		// White box -- should have cleaned out 1 (overage) and 
+		// moved 7 to overage queue
+		// oppq = [3(c),4,5,7] ppq=[8]
+        assertEquals(4, testee.getOveragePendingPutQueueLength());
+		assertEquals(1, testee.getPendingPutQueueLength());
+		
+		// Sleep past "maxPendingPutDelay"
+		Thread.sleep(310);
+		tm.begin();
+		testee.registerPendingPut("7");
+		Transaction tx = tm.suspend();
+		
+		// White box -- should have cleaned out 3 (completed) 
+		// and 4 (overage) and moved 8 to overage queue
+		// We now have 5,7,8 in overage and 7tx in pending
+		// oppq = [5,7,8] ppq=[7tx]
+        assertEquals(3, testee.getOveragePendingPutQueueLength());
+		assertEquals(1, testee.getPendingPutQueueLength());
+		
+		// Validate that only expected items can do puts, thus indirectly
+		// proving the others have been cleaned out of pendingPuts map
+		assertFalse(testee.isPutValid("1"));
+		// 5 was overage, so should have been cleaned
+		assertEquals(2, testee.getOveragePendingPutQueueLength());
+		assertFalse(testee.isPutValid("2"));
+		// 7 was overage, so should have been cleaned
+		assertEquals(1, testee.getOveragePendingPutQueueLength());
+		assertFalse(testee.isPutValid("3"));
+		assertFalse(testee.isPutValid("4"));
+		assertFalse(testee.isPutValid("5"));
+		assertFalse(testee.isPutValid("6"));
+		assertFalse(testee.isPutValid("7"));
+		assertTrue(testee.isPutValid("8"));
+		tm.resume(tx);
+		assertTrue(testee.isPutValid("7"));
+	}
+
+	private static class TestValidator extends PutFromLoadValidator {
+
+		protected TestValidator(TransactionManager transactionManager,
+				long nakedPutInvalidationPeriod, long pendingPutOveragePeriod,
+				long pendingPutRecentPeriod, long maxPendingPutDelay) {
+			super(transactionManager, nakedPutInvalidationPeriod,
+					pendingPutOveragePeriod, pendingPutRecentPeriod,
+					maxPendingPutDelay);
+		}
+
+		@Override
+		public int getOveragePendingPutQueueLength() {
+			// TODO Auto-generated method stub
+			return super.getOveragePendingPutQueueLength();
+		}
+
+		@Override
+		public int getPendingPutQueueLength() {
+			// TODO Auto-generated method stub
+			return super.getPendingPutQueueLength();
+		}
+
+		@Override
+		public int getRemovalQueueLength() {
+			// TODO Auto-generated method stub
+			return super.getRemovalQueueLength();
+		}
+
+	}
 }



More information about the hibernate-commits mailing list