Return-Path: X-Original-To: apmail-hadoop-common-commits-archive@www.apache.org Delivered-To: apmail-hadoop-common-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id B151E1825F for ; Tue, 7 Jul 2015 16:04:16 +0000 (UTC) Received: (qmail 58261 invoked by uid 500); 7 Jul 2015 16:04:10 -0000 Delivered-To: apmail-hadoop-common-commits-archive@hadoop.apache.org Received: (qmail 57544 invoked by uid 500); 7 Jul 2015 16:04:09 -0000 Mailing-List: contact common-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: common-dev@hadoop.apache.org Delivered-To: mailing list common-commits@hadoop.apache.org Received: (qmail 57123 invoked by uid 99); 7 Jul 2015 16:04:09 -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; Tue, 07 Jul 2015 16:04:09 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id C4019E3A9C; Tue, 7 Jul 2015 16:04:08 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: arp@apache.org To: common-commits@hadoop.apache.org Date: Tue, 07 Jul 2015 16:04:20 -0000 Message-Id: <289490744405465b8dd7a5610fd7bc32@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [13/24] hadoop git commit: HADOOP-12186. ActiveStandbyElector shouldn't call monitorLockNodeAsync multiple times (Contributed by zhihai xu) HADOOP-12186. ActiveStandbyElector shouldn't call monitorLockNodeAsync multiple times (Contributed by zhihai xu) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/233cab89 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/233cab89 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/233cab89 Branch: refs/heads/HDFS-7240 Commit: 233cab89adb6bae21d7e171f2af516b92266242c Parents: bff67df Author: Vinayakumar B Authored: Mon Jul 6 15:39:43 2015 +0530 Committer: Vinayakumar B Committed: Mon Jul 6 15:39:43 2015 +0530 ---------------------------------------------------------------------- hadoop-common-project/hadoop-common/CHANGES.txt | 3 ++ .../apache/hadoop/ha/ActiveStandbyElector.java | 20 +++++++++++-- .../hadoop/ha/TestActiveStandbyElector.java | 31 ++++++++++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/233cab89/hadoop-common-project/hadoop-common/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 312a996..1d737e5 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -924,6 +924,9 @@ Release 2.8.0 - UNRELEASED HADOOP-12164. Fix TestMove and TestFsShellReturnCode failed to get command name using reflection. (Lei (Eddy) Xu) + HADOOP-12186. ActiveStandbyElector shouldn't call monitorLockNodeAsync + multiple times (zhihai xu via vinayakumarb) + Release 2.7.2 - UNRELEASED INCOMPATIBLE CHANGES http://git-wip-us.apache.org/repos/asf/hadoop/blob/233cab89/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ActiveStandbyElector.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ActiveStandbyElector.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ActiveStandbyElector.java index e520a16..e458181 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ActiveStandbyElector.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ActiveStandbyElector.java @@ -173,7 +173,9 @@ public class ActiveStandbyElector implements StatCallback, StringCallback { private Lock sessionReestablishLockForTests = new ReentrantLock(); private boolean wantToBeInElection; - + private boolean monitorLockNodePending = false; + private ZooKeeper monitorLockNodeClient; + /** * Create a new ActiveStandbyElector object
* The elector is created by providing to it the Zookeeper configuration, the @@ -468,7 +470,8 @@ public class ActiveStandbyElector implements StatCallback, StringCallback { public synchronized void processResult(int rc, String path, Object ctx, Stat stat) { if (isStaleClient(ctx)) return; - + monitorLockNodePending = false; + assert wantToBeInElection : "Got a StatNode result after quitting election"; @@ -744,6 +747,11 @@ public class ActiveStandbyElector implements StatCallback, StringCallback { return state; } + @VisibleForTesting + synchronized boolean isMonitorLockNodePending() { + return monitorLockNodePending; + } + private boolean reEstablishSession() { int connectionRetryCount = 0; boolean success = false; @@ -949,7 +957,13 @@ public class ActiveStandbyElector implements StatCallback, StringCallback { } private void monitorLockNodeAsync() { - zkClient.exists(zkLockFilePath, + if (monitorLockNodePending && monitorLockNodeClient == zkClient) { + LOG.info("Ignore duplicate monitor lock-node request."); + return; + } + monitorLockNodePending = true; + monitorLockNodeClient = zkClient; + zkClient.exists(zkLockFilePath, watcher, this, zkClient); } http://git-wip-us.apache.org/repos/asf/hadoop/blob/233cab89/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestActiveStandbyElector.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestActiveStandbyElector.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestActiveStandbyElector.java index 2e578e2..83a3a4f 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestActiveStandbyElector.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestActiveStandbyElector.java @@ -452,6 +452,10 @@ public class TestActiveStandbyElector { Event.KeeperState.SyncConnected); elector.processWatchEvent(mockZK, mockEvent); verifyExistCall(1); + Assert.assertTrue(elector.isMonitorLockNodePending()); + elector.processResult(Code.SESSIONEXPIRED.intValue(), ZK_LOCK_NAME, + mockZK, new Stat()); + Assert.assertFalse(elector.isMonitorLockNodePending()); // session expired should enter safe mode and initiate re-election // re-election checked via checking re-creation of new zookeeper and @@ -495,6 +499,13 @@ public class TestActiveStandbyElector { ZK_LOCK_NAME); Mockito.verify(mockApp, Mockito.times(1)).becomeStandby(); verifyExistCall(1); + Assert.assertTrue(elector.isMonitorLockNodePending()); + + Stat stat = new Stat(); + stat.setEphemeralOwner(0L); + Mockito.when(mockZK.getSessionId()).thenReturn(1L); + elector.processResult(Code.OK.intValue(), ZK_LOCK_NAME, mockZK, stat); + Assert.assertFalse(elector.isMonitorLockNodePending()); WatchedEvent mockEvent = Mockito.mock(WatchedEvent.class); Mockito.when(mockEvent.getPath()).thenReturn(ZK_LOCK_NAME); @@ -504,12 +515,18 @@ public class TestActiveStandbyElector { Event.EventType.NodeDataChanged); elector.processWatchEvent(mockZK, mockEvent); verifyExistCall(2); + Assert.assertTrue(elector.isMonitorLockNodePending()); + elector.processResult(Code.OK.intValue(), ZK_LOCK_NAME, mockZK, stat); + Assert.assertFalse(elector.isMonitorLockNodePending()); // monitoring should be setup again after event is received Mockito.when(mockEvent.getType()).thenReturn( Event.EventType.NodeChildrenChanged); elector.processWatchEvent(mockZK, mockEvent); verifyExistCall(3); + Assert.assertTrue(elector.isMonitorLockNodePending()); + elector.processResult(Code.OK.intValue(), ZK_LOCK_NAME, mockZK, stat); + Assert.assertFalse(elector.isMonitorLockNodePending()); // lock node deletion when in standby mode should create znode again // successful znode creation enters active state and sets monitor @@ -524,6 +541,10 @@ public class TestActiveStandbyElector { ZK_LOCK_NAME); Mockito.verify(mockApp, Mockito.times(1)).becomeActive(); verifyExistCall(4); + Assert.assertTrue(elector.isMonitorLockNodePending()); + stat.setEphemeralOwner(1L); + elector.processResult(Code.OK.intValue(), ZK_LOCK_NAME, mockZK, stat); + Assert.assertFalse(elector.isMonitorLockNodePending()); // lock node deletion in active mode should enter neutral mode and create // znode again successful znode creation enters active state and sets @@ -538,6 +559,9 @@ public class TestActiveStandbyElector { ZK_LOCK_NAME); Mockito.verify(mockApp, Mockito.times(2)).becomeActive(); verifyExistCall(5); + Assert.assertTrue(elector.isMonitorLockNodePending()); + elector.processResult(Code.OK.intValue(), ZK_LOCK_NAME, mockZK, stat); + Assert.assertFalse(elector.isMonitorLockNodePending()); // bad path name results in fatal error Mockito.when(mockEvent.getPath()).thenReturn(null); @@ -570,6 +594,13 @@ public class TestActiveStandbyElector { ZK_LOCK_NAME); Mockito.verify(mockApp, Mockito.times(1)).becomeStandby(); verifyExistCall(1); + Assert.assertTrue(elector.isMonitorLockNodePending()); + + Stat stat = new Stat(); + stat.setEphemeralOwner(0L); + Mockito.when(mockZK.getSessionId()).thenReturn(1L); + elector.processResult(Code.OK.intValue(), ZK_LOCK_NAME, mockZK, stat); + Assert.assertFalse(elector.isMonitorLockNodePending()); WatchedEvent mockEvent = Mockito.mock(WatchedEvent.class); Mockito.when(mockEvent.getPath()).thenReturn(ZK_LOCK_NAME);