HDFS-13388. RequestHedgingProxyProvider calls multiple configured NNs all the time. Contributed by Jinglun.
(cherry picked from commit ac32b3576da4cc463dff85118163ccfff02215fc) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/3d2e327e Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/3d2e327e Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/3d2e327e Branch: refs/heads/branch-2.9 Commit: 3d2e327e2f99bac161fa8f00e93b5b6edece2a65 Parents: b46e9bb Author: Inigo Goiri <inigo...@apache.org> Authored: Mon Apr 9 09:16:48 2018 -0700 Committer: Inigo Goiri <inigo...@apache.org> Committed: Mon Apr 9 09:19:04 2018 -0700 ---------------------------------------------------------------------- .../ha/RequestHedgingProxyProvider.java | 3 ++ .../ha/TestRequestHedgingProxyProvider.java | 34 ++++++++++++++++++++ 2 files changed, 37 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/3d2e327e/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/RequestHedgingProxyProvider.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/RequestHedgingProxyProvider.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/RequestHedgingProxyProvider.java index 49fe4be..b9f213e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/RequestHedgingProxyProvider.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/RequestHedgingProxyProvider.java @@ -76,6 +76,9 @@ public class RequestHedgingProxyProvider<T> extends public Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable { + if (currentUsedProxy != null) { + return method.invoke(currentUsedProxy.proxy, args); + } Map<Future<Object>, ProxyInfo<T>> proxyMap = new HashMap<>(); int numAttempts = 0; http://git-wip-us.apache.org/repos/asf/hadoop/blob/3d2e327e/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestRequestHedgingProxyProvider.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestRequestHedgingProxyProvider.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestRequestHedgingProxyProvider.java index 04e77ad..3c46f52 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestRequestHedgingProxyProvider.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestRequestHedgingProxyProvider.java @@ -42,10 +42,13 @@ import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import static org.junit.Assert.assertEquals; import org.mockito.Matchers; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import static org.mockito.Mockito.when; +import static org.mockito.Mockito.mock; import com.google.common.collect.Lists; @@ -99,6 +102,37 @@ public class TestRequestHedgingProxyProvider { } @Test + public void testRequestNNAfterOneSuccess() throws Exception { + final AtomicInteger count = new AtomicInteger(0); + final ClientProtocol goodMock = mock(ClientProtocol.class); + when(goodMock.getStats()).thenAnswer(new Answer<long[]>() { + @Override + public long[] answer(InvocationOnMock invocation) throws Throwable { + count.incrementAndGet(); + Thread.sleep(1000); + return new long[]{1}; + } + }); + final ClientProtocol badMock = mock(ClientProtocol.class); + when(badMock.getStats()).thenAnswer(new Answer<long[]>() { + @Override + public long[] answer(InvocationOnMock invocation) throws Throwable { + count.incrementAndGet(); + throw new IOException("Bad mock !!"); + } + }); + + RequestHedgingProxyProvider<ClientProtocol> provider = + new RequestHedgingProxyProvider<>(conf, nnUri, ClientProtocol.class, + createFactory(badMock, goodMock, goodMock, badMock)); + ClientProtocol proxy = provider.getProxy().proxy; + proxy.getStats(); + assertEquals(2, count.get()); + proxy.getStats(); + assertEquals(3, count.get()); + } + + @Test public void testHedgingWhenOneIsSlow() throws Exception { final ClientProtocol goodMock = Mockito.mock(ClientProtocol.class); Mockito.when(goodMock.getStats()).thenAnswer(new Answer<long[]>() { --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org