You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by pr...@apache.org on 2018/04/15 14:59:27 UTC

hive git commit: HIVE-19193: TestActivePassiveHA fails (Prasanth Jayachandran reviewed by Ashutosh Chauhan)

Repository: hive
Updated Branches:
  refs/heads/master b153a6b1e -> 185173237


HIVE-19193: TestActivePassiveHA fails (Prasanth Jayachandran reviewed by Ashutosh Chauhan)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/18517323
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/18517323
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/18517323

Branch: refs/heads/master
Commit: 185173237ddc190ea661bc1af5f1a4933f7c9124
Parents: b153a6b
Author: Prasanth Jayachandran <pr...@apache.org>
Authored: Sun Apr 15 07:58:54 2018 -0700
Committer: Prasanth Jayachandran <pr...@apache.org>
Committed: Sun Apr 15 07:58:54 2018 -0700

----------------------------------------------------------------------
 .../apache/hive/jdbc/TestActivePassiveHA.java   | 20 ++++++++++++
 .../org/apache/hive/jdbc/miniHS2/MiniHS2.java   | 10 ++++++
 .../apache/hive/service/server/HiveServer2.java | 34 ++++++++++++++++++++
 3 files changed, 64 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/18517323/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestActivePassiveHA.java
----------------------------------------------------------------------
diff --git a/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestActivePassiveHA.java b/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestActivePassiveHA.java
index c94c0e1..fb846b4 100644
--- a/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestActivePassiveHA.java
+++ b/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestActivePassiveHA.java
@@ -134,6 +134,7 @@ public class TestActivePassiveHA {
     String instanceId2 = UUID.randomUUID().toString();
     miniHS2_2.start(getConfOverlay(instanceId2));
 
+    assertEquals(true, miniHS2_1.getIsLeaderTestFuture().get());
     assertEquals(true, miniHS2_1.isLeader());
     String url = "http://localhost:" + hiveConf1.get(ConfVars.HIVE_SERVER2_WEBUI_PORT.varname) + "/leader";
     assertEquals("true", sendGet(url));
@@ -175,6 +176,7 @@ public class TestActivePassiveHA {
 
     miniHS2_1.stop();
 
+    assertEquals(true, miniHS2_2.getIsLeaderTestFuture().get());
     assertEquals(true, miniHS2_2.isLeader());
     url = "http://localhost:" + hiveConf2.get(ConfVars.HIVE_SERVER2_WEBUI_PORT.varname) + "/leader";
     assertEquals("true", sendGet(url));
@@ -264,6 +266,7 @@ public class TestActivePassiveHA {
     confOverlay.put(ConfVars.HIVE_SERVER2_THRIFT_HTTP_PATH.varname, "clidriverTest");
     miniHS2_2.start(confOverlay);
 
+    assertEquals(true, miniHS2_1.getIsLeaderTestFuture().get());
     assertEquals(true, miniHS2_1.isLeader());
     String url = "http://localhost:" + hiveConf1.get(ConfVars.HIVE_SERVER2_WEBUI_PORT.varname) + "/leader";
     assertEquals("true", sendGet(url));
@@ -285,6 +288,7 @@ public class TestActivePassiveHA {
 
     // miniHS2_2 will become leader
     miniHS2_1.stop();
+    assertEquals(true, miniHS2_2.getIsLeaderTestFuture().get());
     parsedUrl = HiveConnection.getAllUrls(zkJdbcUrl).get(0).getJdbcUriString();
     String hs2_2_directUrl = "jdbc:hive2://" + miniHS2_2.getHost() + ":" + miniHS2_2.getHttpPort() +
       "/default;serviceDiscoveryMode=" + serviceDiscoveryMode + ";zooKeeperNamespace=" + zkHANamespace + ";";
@@ -302,6 +306,7 @@ public class TestActivePassiveHA {
 
     // miniHS2_1 will become leader
     miniHS2_2.stop();
+    assertEquals(true, miniHS2_1.getIsLeaderTestFuture().get());
     parsedUrl = HiveConnection.getAllUrls(zkJdbcUrl).get(0).getJdbcUriString();
     hs2_1_directUrl = "jdbc:hive2://" + miniHS2_1.getHost() + ":" + miniHS2_1.getBinaryPort() +
       "/default;serviceDiscoveryMode=" + serviceDiscoveryMode + ";zooKeeperNamespace=" + zkHANamespace + ";";
@@ -330,6 +335,7 @@ public class TestActivePassiveHA {
       String url2 = "http://localhost:" + hiveConf2.get(ConfVars.HIVE_SERVER2_WEBUI_PORT.varname) + "/leader";
 
       // when we start miniHS2_1 will be leader (sequential start)
+      assertEquals(true, miniHS2_1.getIsLeaderTestFuture().get());
       assertEquals(true, miniHS2_1.isLeader());
       assertEquals("true", sendGet(url1, true));
 
@@ -338,23 +344,28 @@ public class TestActivePassiveHA {
       assertTrue(resp.contains("Failover successful!"));
 
       // make sure miniHS2_1 is not leader
+      assertEquals(true, miniHS2_1.getNotLeaderTestFuture().get());
       assertEquals(false, miniHS2_1.isLeader());
       assertEquals("false", sendGet(url1, true));
 
       // make sure miniHS2_2 is the new leader
+      assertEquals(true, miniHS2_2.getIsLeaderTestFuture().get());
       assertEquals(true, miniHS2_2.isLeader());
       assertEquals("true", sendGet(url2, true));
 
       // send failover request again to miniHS2_1 and get a failure
       resp = sendDelete(url1, true);
       assertTrue(resp.contains("Cannot failover an instance that is not a leader"));
+      assertEquals(true, miniHS2_1.getNotLeaderTestFuture().get());
       assertEquals(false, miniHS2_1.isLeader());
 
       // send failover request to miniHS2_2 and make sure miniHS2_1 takes over (returning back to leader, test listeners)
       resp = sendDelete(url2, true);
       assertTrue(resp.contains("Failover successful!"));
+      assertEquals(true, miniHS2_1.getIsLeaderTestFuture().get());
       assertEquals(true, miniHS2_1.isLeader());
       assertEquals("true", sendGet(url1, true));
+      assertEquals(true, miniHS2_2.getNotLeaderTestFuture().get());
       assertEquals("false", sendGet(url2, true));
       assertEquals(false, miniHS2_2.isLeader());
     } finally {
@@ -382,13 +393,16 @@ public class TestActivePassiveHA {
 
       String url1 = "http://localhost:" + hiveConf1.get(ConfVars.HIVE_SERVER2_WEBUI_PORT.varname) + "/leader";
       // when we start miniHS2_1 will be leader (sequential start)
+      assertEquals(true, miniHS2_1.getIsLeaderTestFuture().get());
       assertEquals(true, miniHS2_1.isLeader());
       assertEquals("true", sendGet(url1, true));
 
       // trigger failover on miniHS2_1 without authorization header
       assertEquals("Unauthorized", sendDelete(url1, false));
       assertTrue(sendDelete(url1, true).contains("Failover successful!"));
+      assertEquals(true, miniHS2_1.getNotLeaderTestFuture().get());
       assertEquals(false, miniHS2_1.isLeader());
+      assertEquals(true, miniHS2_2.getIsLeaderTestFuture().get());
       assertEquals(true, miniHS2_2.isLeader());
     } finally {
       // revert configs to not affect other tests
@@ -419,6 +433,7 @@ public class TestActivePassiveHA {
       assertTrue(zkJdbcUrl.contains(zkConnectString));
 
       // when we start miniHS2_1 will be leader (sequential start)
+      assertEquals(true, miniHS2_1.getIsLeaderTestFuture().get());
       assertEquals(true, miniHS2_1.isLeader());
       assertEquals("true", sendGet(url1, true));
 
@@ -441,10 +456,12 @@ public class TestActivePassiveHA {
       }
 
       // make sure miniHS2_1 is not leader
+      assertEquals(true, miniHS2_1.getNotLeaderTestFuture().get());
       assertEquals(false, miniHS2_1.isLeader());
       assertEquals("false", sendGet(url1, true));
 
       // make sure miniHS2_2 is the new leader
+      assertEquals(true, miniHS2_2.getIsLeaderTestFuture().get());
       assertEquals(true, miniHS2_2.isLeader());
       assertEquals("true", sendGet(url2, true));
 
@@ -461,13 +478,16 @@ public class TestActivePassiveHA {
       // send failover request again to miniHS2_1 and get a failure
       resp = sendDelete(url1, true);
       assertTrue(resp.contains("Cannot failover an instance that is not a leader"));
+      assertEquals(true, miniHS2_1.getNotLeaderTestFuture().get());
       assertEquals(false, miniHS2_1.isLeader());
 
       // send failover request to miniHS2_2 and make sure miniHS2_1 takes over (returning back to leader, test listeners)
       resp = sendDelete(url2, true);
       assertTrue(resp.contains("Failover successful!"));
+      assertEquals(true, miniHS2_1.getIsLeaderTestFuture().get());
       assertEquals(true, miniHS2_1.isLeader());
       assertEquals("true", sendGet(url1, true));
+      assertEquals(true, miniHS2_2.getNotLeaderTestFuture().get());
       assertEquals("false", sendGet(url2, true));
       assertEquals(false, miniHS2_2.isLeader());
       // make sure miniHS2_2 closes all its connections

http://git-wip-us.apache.org/repos/asf/hive/blob/18517323/itests/util/src/main/java/org/apache/hive/jdbc/miniHS2/MiniHS2.java
----------------------------------------------------------------------
diff --git a/itests/util/src/main/java/org/apache/hive/jdbc/miniHS2/MiniHS2.java b/itests/util/src/main/java/org/apache/hive/jdbc/miniHS2/MiniHS2.java
index 23fcbe8..cafdb98 100644
--- a/itests/util/src/main/java/org/apache/hive/jdbc/miniHS2/MiniHS2.java
+++ b/itests/util/src/main/java/org/apache/hive/jdbc/miniHS2/MiniHS2.java
@@ -27,6 +27,8 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
 import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.SettableFuture;
+
 import org.apache.commons.io.FileUtils;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
@@ -416,6 +418,14 @@ public class MiniHS2 extends AbstractHiveService {
     return hiveServer2.isLeader();
   }
 
+  public SettableFuture<Boolean> getIsLeaderTestFuture() {
+    return hiveServer2.getIsLeaderTestFuture();
+  }
+
+  public SettableFuture<Boolean> getNotLeaderTestFuture() {
+    return hiveServer2.getNotLeaderTestFuture();
+  }
+
   public void setPamAuthenticator(final PamAuthenticator pamAuthenticator) {
     this.pamAuthenticator = pamAuthenticator;
   }

http://git-wip-us.apache.org/repos/asf/hive/blob/18517323/service/src/java/org/apache/hive/service/server/HiveServer2.java
----------------------------------------------------------------------
diff --git a/service/src/java/org/apache/hive/service/server/HiveServer2.java b/service/src/java/org/apache/hive/service/server/HiveServer2.java
index 47f84b5..4e88565 100644
--- a/service/src/java/org/apache/hive/service/server/HiveServer2.java
+++ b/service/src/java/org/apache/hive/service/server/HiveServer2.java
@@ -119,6 +119,7 @@ import org.slf4j.LoggerFactory;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Joiner;
 import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.SettableFuture;
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
 
 /**
@@ -149,6 +150,9 @@ public class HiveServer2 extends CompositeService {
   private Hive sessionHive;
   private String wmQueue;
   private AtomicBoolean isLeader = new AtomicBoolean(false);
+  // used for testing
+  private SettableFuture<Boolean> isLeaderTestFuture = SettableFuture.create();
+  private SettableFuture<Boolean> notLeaderTestFuture = SettableFuture.create();
 
   public HiveServer2() {
     super(HiveServer2.class.getSimpleName());
@@ -167,6 +171,24 @@ public class HiveServer2 extends CompositeService {
     this.pamAuthenticator = pamAuthenticator;
   }
 
+  @VisibleForTesting
+  public SettableFuture<Boolean> getIsLeaderTestFuture() {
+    return isLeaderTestFuture;
+  }
+
+  @VisibleForTesting
+  public SettableFuture<Boolean> getNotLeaderTestFuture() {
+    return notLeaderTestFuture;
+  }
+
+  private void resetIsLeaderTestFuture() {
+    isLeaderTestFuture = SettableFuture.create();
+  }
+
+  private void resetNotLeaderTestFuture() {
+    notLeaderTestFuture = SettableFuture.create();
+  }
+
   @Override
   public synchronized void init(HiveConf hiveConf) {
     //Initialize metrics first, as some metrics are for initialization stuff.
@@ -698,6 +720,12 @@ public class HiveServer2 extends CompositeService {
       }
       hiveServer2.startOrReconnectTezSessions();
       LOG.info("Started/Reconnected tez sessions.");
+
+      // resolve futures used for testing
+      if (HiveConf.getBoolVar(hiveServer2.hiveConf, ConfVars.HIVE_IN_TEST)) {
+        hiveServer2.isLeaderTestFuture.set(true);
+        hiveServer2.resetNotLeaderTestFuture();
+      }
     }
 
     @Override
@@ -707,6 +735,12 @@ public class HiveServer2 extends CompositeService {
       hiveServer2.closeHiveSessions();
       hiveServer2.stopOrDisconnectTezSessions();
       LOG.info("Stopped/Disconnected tez sessions.");
+
+      // resolve futures used for testing
+      if (HiveConf.getBoolVar(hiveServer2.hiveConf, ConfVars.HIVE_IN_TEST)) {
+        hiveServer2.notLeaderTestFuture.set(true);
+        hiveServer2.resetIsLeaderTestFuture();
+      }
     }
   }