Return-Path: X-Original-To: apmail-geode-commits-archive@minotaur.apache.org Delivered-To: apmail-geode-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id C9B831897B for ; Fri, 16 Oct 2015 20:42:19 +0000 (UTC) Received: (qmail 15494 invoked by uid 500); 16 Oct 2015 20:42:18 -0000 Delivered-To: apmail-geode-commits-archive@geode.apache.org Received: (qmail 15447 invoked by uid 500); 16 Oct 2015 20:42:18 -0000 Mailing-List: contact commits-help@geode.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@geode.incubator.apache.org Delivered-To: mailing list commits@geode.incubator.apache.org Received: (qmail 15437 invoked by uid 99); 16 Oct 2015 20:42:18 -0000 Received: from Unknown (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 16 Oct 2015 20:42:18 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id BEF84C63B1 for ; Fri, 16 Oct 2015 20:42:17 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.791 X-Spam-Level: * X-Spam-Status: No, score=1.791 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, T_RP_MATCHES_RCVD=-0.01, URIBL_BLOCKED=0.001] autolearn=disabled Received: from mx1-us-west.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id E23aWhrkPGfv for ; Fri, 16 Oct 2015 20:42:03 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-us-west.apache.org (ASF Mail Server at mx1-us-west.apache.org) with SMTP id B97542743E for ; Fri, 16 Oct 2015 20:41:43 +0000 (UTC) Received: (qmail 8889 invoked by uid 99); 16 Oct 2015 20:41:43 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 16 Oct 2015 20:41:43 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 9AD86E045F; Fri, 16 Oct 2015 20:41:43 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: klund@apache.org To: commits@geode.incubator.apache.org Date: Fri, 16 Oct 2015 20:42:29 -0000 Message-Id: <0b8d554a2ada48ca92dadaf1e2685984@git.apache.org> In-Reply-To: <95c7941e4a5d4eb8ad528cab2ad71fba@git.apache.org> References: <95c7941e4a5d4eb8ad528cab2ad71fba@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [48/50] [abbrv] incubator-geode git commit: GEODE-391, GEODE-398: fix race condition in TXExpiryJUnitTest GEODE-391, GEODE-398: fix race condition in TXExpiryJUnitTest The test now handled ExpiryTask reschedule. Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/8d1ada30 Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/8d1ada30 Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/8d1ada30 Branch: refs/heads/feature/GEODE-291 Commit: 8d1ada30648acce2e09211ac20cfcb935ad77a89 Parents: 17fdf57 Author: Darrel Schneider Authored: Tue Oct 13 16:12:55 2015 -0700 Committer: Darrel Schneider Committed: Tue Oct 13 16:12:55 2015 -0700 ---------------------------------------------------------------------- .../gemfire/internal/cache/EntryExpiryTask.java | 3 ++ .../gemfire/internal/cache/ExpiryTask.java | 24 ++++++++- .../internal/cache/RegionExpiryTask.java | 3 ++ .../com/gemstone/gemfire/TXExpiryJUnitTest.java | 51 +++++++++++++++----- 4 files changed, 68 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8d1ada30/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/EntryExpiryTask.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/EntryExpiryTask.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/EntryExpiryTask.java index ca9a4ef..ef47514 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/EntryExpiryTask.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/EntryExpiryTask.java @@ -196,6 +196,9 @@ public class EntryExpiryTask extends ExpiryTask { } if (getExpirationTime() > 0) { addExpiryTask(); + if (expiryTaskListener != null) { + expiryTaskListener.afterReschedule(this); + } } } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8d1ada30/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/ExpiryTask.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/ExpiryTask.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/ExpiryTask.java index 357c0a8..9d5795a 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/ExpiryTask.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/ExpiryTask.java @@ -223,7 +223,11 @@ public abstract class ExpiryTask extends SystemTimer.SystemTimerTask { { ExpirationAction action = getAction(); if (action == null) return false; - return expire(action, isPending); + boolean result = expire(action, isPending); + if (result && expiryTaskListener != null) { + expiryTaskListener.afterExpire(this); + } + return result; } /** Why did this expire? @@ -380,7 +384,7 @@ public abstract class ExpiryTask extends SystemTimer.SystemTimerTask { logger.fatal(LocalizedMessage.create(LocalizedStrings.ExpiryTask_EXCEPTION_IN_EXPIRATION_TASK), ex); } finally { if (expiryTaskListener != null) { - expiryTaskListener.afterExpire(this); + expiryTaskListener.afterTaskRan(this); } } } @@ -503,6 +507,22 @@ public abstract class ExpiryTask extends SystemTimer.SystemTimerTask { */ public interface ExpiryTaskListener { /** + * Called after the given expiry task has run. + * This means that the time it was originally + * scheduled to run has elapsed and the scheduler + * has run the task. While running the task it + * may decide to expire it or reschedule it. + */ + public void afterTaskRan(ExpiryTask et); + /** + * Called after the given expiry task has been + * rescheduled. afterTaskRan can still be called + * on the same task. + * In some cases a task is rescheduled without expiring it. + * In others it is expired and rescheduled. + */ + public void afterReschedule(ExpiryTask et); + /** * Called after the given expiry task has expired. */ public void afterExpire(ExpiryTask et); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8d1ada30/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/RegionExpiryTask.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/RegionExpiryTask.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/RegionExpiryTask.java index 68c4e3e..e17ad58 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/RegionExpiryTask.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/RegionExpiryTask.java @@ -120,6 +120,9 @@ abstract class RegionExpiryTask extends ExpiryTask } addExpiryTask(); + if (expiryTaskListener != null) { + expiryTaskListener.afterReschedule(this); + } } @Override http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8d1ada30/gemfire-core/src/test/java/com/gemstone/gemfire/TXExpiryJUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/TXExpiryJUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/TXExpiryJUnitTest.java index 867ebb2..ae94002 100644 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/TXExpiryJUnitTest.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/TXExpiryJUnitTest.java @@ -231,21 +231,27 @@ public class TXExpiryJUnitTest { } private void waitForEntryExpiration(LocalRegion lr, String key) { - ExpirationDetector detector = new ExpirationDetector(lr.getEntryExpiryTask(key)); - ExpiryTask.expiryTaskListener = detector; try { - ExpiryTask.permitExpiration(); - DistributedTestCase.waitForCriterion(detector, 3000, 2, true); + ExpirationDetector detector; + do { + detector = new ExpirationDetector(lr.getEntryExpiryTask(key)); + ExpiryTask.expiryTaskListener = detector; + ExpiryTask.permitExpiration(); + DistributedTestCase.waitForCriterion(detector, 3000, 2, true); + } while (!detector.hasExpired() && detector.wasRescheduled()); } finally { ExpiryTask.expiryTaskListener = null; } } private void waitForRegionExpiration(LocalRegion lr, boolean ttl) { - ExpirationDetector detector = new ExpirationDetector(ttl ? lr.getRegionTTLExpiryTask() : lr.getRegionIdleExpiryTask()); - ExpiryTask.expiryTaskListener = detector; try { - ExpiryTask.permitExpiration(); - DistributedTestCase.waitForCriterion(detector, 3000, 2, true); + ExpirationDetector detector; + do { + detector = new ExpirationDetector(ttl ? lr.getRegionTTLExpiryTask() : lr.getRegionIdleExpiryTask()); + ExpiryTask.expiryTaskListener = detector; + ExpiryTask.permitExpiration(); + DistributedTestCase.waitForCriterion(detector, 3000, 2, true); + } while (!detector.hasExpired() && detector.wasRescheduled()); } finally { ExpiryTask.expiryTaskListener = null; } @@ -256,25 +262,48 @@ public class TXExpiryJUnitTest { * Used to detect that a particular ExpiryTask has expired. */ public static class ExpirationDetector implements ExpiryTaskListener, WaitCriterion { + private volatile boolean ran = false; private volatile boolean expired = false; - private final ExpiryTask et; + private volatile boolean rescheduled = false; + public final ExpiryTask et; public ExpirationDetector(ExpiryTask et) { assertNotNull(et); this.et = et; } @Override + public void afterReschedule(ExpiryTask et) { + if (et == this.et) { + if (!hasExpired()) { + ExpiryTask.suspendExpiration(); + } + this.rescheduled = true; + } + } + @Override public void afterExpire(ExpiryTask et) { if (et == this.et) { this.expired = true; } } @Override + public void afterTaskRan(ExpiryTask et) { + if (et == this.et) { + this.ran = true; + } + } + @Override public boolean done() { - return this.expired; + return this.ran; } @Override public String description() { - return "the expiry task " + this.et + " did not expire"; + return "the expiry task " + this.et + " never ran"; + } + public boolean wasRescheduled() { + return this.rescheduled; + } + public boolean hasExpired() { + return this.expired; } }