fixed testEntryIdleTimeout3
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/01cc5899 Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/01cc5899 Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/01cc5899 Branch: refs/heads/feature/GEODE-77 Commit: 01cc58992ec856d3e8d6afe9a1ac2355447a7be5 Parents: 653acba Author: Darrel Schneider <dschnei...@pivotal.io> Authored: Tue Jul 21 14:51:10 2015 -0700 Committer: Darrel Schneider <dschnei...@pivotal.io> Committed: Thu Jul 23 17:14:07 2015 -0700 ---------------------------------------------------------------------- .../gemfire/cache30/RegionTestCase.java | 151 +++++++------------ 1 file changed, 55 insertions(+), 96 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/01cc5899/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/RegionTestCase.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/RegionTestCase.java b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/RegionTestCase.java index acf071c..ff24434 100644 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/RegionTestCase.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/RegionTestCase.java @@ -3167,17 +3167,18 @@ public abstract class RegionTestCase extends CacheTestCase { } /** - * Expire an entry with a given idle time. Set a new idle time, create the - * same entry again, make sure it observes the <em>new</em> idle time. + * Configure entry expiration with a idle time. + * Create an entry and records its scheduled expiration time. + * Then mutate the region expiration configuration and confirm + * that the entry's expiration time is rescheduled. */ public void testEntryIdleTimeout3() { - final String name = this.getUniqueName(); - final int timeout1 = 200; // ms - final int timeout2 = 2000; + // test no longer waits for this expiration to happen + final int timeout1 = 500 * 1000; // ms + final int timeout2 = 2000 * 1000; // ms final String key1 = "KEY1"; final String value1 = "VALUE1"; - final String value2 = "VALUE2"; AttributesFactory factory = new AttributesFactory(getRegionAttributes()); ExpirationAttributes expire1 = @@ -3193,104 +3194,62 @@ public abstract class RegionTestCase extends CacheTestCase { factory.addCacheListener(list); RegionAttributes attrs = factory.create(); - Region region = null; + LocalRegion region; System.setProperty(LocalRegion.EXPIRY_MS_PROPERTY, "true"); try { - region = createRegion(name, attrs); - } - finally { - if(region.getAttributes().getPartitionAttributes() == null) - System.getProperties().remove(LocalRegion.EXPIRY_MS_PROPERTY); + region = (LocalRegion) createRegion(name, attrs); + } finally { + System.getProperties().remove(LocalRegion.EXPIRY_MS_PROPERTY); } - // DebuggerSupport.waitForJavaDebugger(getLogWriter(), "Set breakpoint in invalidate"); - ExpiryTask.suspendExpiration(); - Region.Entry entry = null; - long tilt; - try { - region.create(key1, value1); - tilt = System.currentTimeMillis() + timeout1; - assertTrue(list.waitForInvocation(5000)); - entry = region.getEntry(key1); - Assert.assertTrue(value1.equals(entry.getValue())); - } - finally { - ExpiryTask.permitExpiration(); - } - waitForInvalidate(entry, tilt); - if (!getRegionAttributes().getDataPolicy().withPartitioning()) { - // Disk regions are VERY slow, so we need to wait for the event... - WaitCriterion wc = new WaitCriterion() { - public boolean done() { - return eventCount == 1; - } - public String description() { - return "eventCount never became 1"; - } - }; - DistributedTestCase.waitForCriterion(wc, 10 * 1000, 100, true); - } - eventCount = 0; + region.create(key1, value1); + EntryExpiryTask eet = region.getEntryExpiryTask(key1); + final long firstExpiryTime = eet.getExpirationTime(); - // Do it again with a put (I guess) - ExpiryTask.suspendExpiration(); - try { - region.put(key1, value1); - tilt = System.currentTimeMillis() + timeout1; - entry = region.getEntry(key1); - Assert.assertTrue(value1.equals(entry.getValue())); - assertTrue(list.waitForInvocation(5000)); - } - finally { - ExpiryTask.permitExpiration(); - } - waitForInvalidate(entry, tilt); - if (!getRegionAttributes().getDataPolicy().withPartitioning()) { - // Disk regions are VERY slow, so we need to wait for the event... - WaitCriterion wc = new WaitCriterion() { - public boolean done() { - return eventCount == 1; - } - public String description() { - return "eventCount never became 1"; - } - }; - DistributedTestCase.waitForCriterion(wc, 10 * 1000, 100, true); - } - eventCount = 0; - - // Change expiry for this region now... AttributesMutator mutt = region.getAttributesMutator(); - ExpirationAttributes expire2 = - new ExpirationAttributes(timeout2, ExpirationAction.INVALIDATE); + ExpirationAttributes expire2 = new ExpirationAttributes(timeout2, ExpirationAction.INVALIDATE); mutt.setEntryIdleTimeout(expire2); - - ExpiryTask.suspendExpiration(); - try { - region.put(key1, value2); - tilt = System.currentTimeMillis() + timeout2; - entry = region.getEntry(key1); - Assert.assertTrue(value2.equals(entry.getValue())); - assertTrue(list.waitForInvocation(5000)); - } - finally { - ExpiryTask.permitExpiration(); - if(region.getAttributes().getPartitionAttributes() != null) - System.getProperties().remove(LocalRegion.EXPIRY_MS_PROPERTY); - } - waitForInvalidate(entry, tilt); - if (!region.getAttributes().getDataPolicy().withPartitioning()) { - // Disk regions are VERY slow, so we need to wait for the event... - WaitCriterion wc = new WaitCriterion() { - public boolean done() { - return eventCount == 1; - } - public String description() { - return "eventCount never became 1"; - } - }; - DistributedTestCase.waitForCriterion(wc, 10 * 1000, 100, true); + eet = region.getEntryExpiryTask(key1); + final long secondExpiryTime = eet.getExpirationTime(); + if ((secondExpiryTime - firstExpiryTime) <= 0) { + fail("expiration time should have been greater after changing region config from 500 to 2000. firstExpiryTime=" + firstExpiryTime + " secondExpiryTime=" + secondExpiryTime); } + + // now set back to be more recent + mutt = region.getAttributesMutator(); + ExpirationAttributes expire3 = new ExpirationAttributes(timeout1, ExpirationAction.INVALIDATE); + mutt.setEntryIdleTimeout(expire3); + eet = region.getEntryExpiryTask(key1); + final long thirdExpiryTime = eet.getExpirationTime(); + assertEquals(firstExpiryTime, thirdExpiryTime); + // confirm that it still has not expired + assertEquals(0, eventCount); + + // now set it to a really short time and make sure it expires immediately + waitForExpiryClockToChange(region); + final Region.Entry entry = region.getEntry(key1); + mutt = region.getAttributesMutator(); + ExpirationAttributes expire4 = new ExpirationAttributes(1, ExpirationAction.INVALIDATE); + mutt.setEntryIdleTimeout(expire4); + WaitCriterion wc = new WaitCriterion() { + public boolean done() { + return fetchEntryValue(entry) == null; + } + public String description() { + return "entry never became invalid"; + } + }; + DistributedTestCase.waitForCriterion(wc, 10 * 1000, 10, true); + + WaitCriterion waitForEventCountToBeOne = new WaitCriterion() { + public boolean done() { + return eventCount == 1; + } + public String description() { + return "eventCount never became 1"; + } + }; + DistributedTestCase.waitForCriterion(waitForEventCountToBeOne, 10 * 1000, 10, true); eventCount = 0; }