You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by el...@apache.org on 2016/08/17 20:28:20 UTC

[3/6] accumulo git commit: ACCUMULO-4412 Check proxy process when client fails to connect

ACCUMULO-4412 Check proxy process when client fails to connect


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

Branch: refs/heads/master
Commit: a226233d7eb0287f8c5b61e1727d73fc13f85be1
Parents: 7eb4a09
Author: Josh Elser <el...@apache.org>
Authored: Wed Aug 17 16:19:53 2016 -0400
Committer: Josh Elser <el...@apache.org>
Committed: Wed Aug 17 16:19:53 2016 -0400

----------------------------------------------------------------------
 .../test/functional/KerberosProxyIT.java        | 107 ++++++++++++++-----
 1 file changed, 83 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/accumulo/blob/a226233d/test/src/test/java/org/apache/accumulo/test/functional/KerberosProxyIT.java
----------------------------------------------------------------------
diff --git a/test/src/test/java/org/apache/accumulo/test/functional/KerberosProxyIT.java b/test/src/test/java/org/apache/accumulo/test/functional/KerberosProxyIT.java
index b9274e0..af6310c 100644
--- a/test/src/test/java/org/apache/accumulo/test/functional/KerberosProxyIT.java
+++ b/test/src/test/java/org/apache/accumulo/test/functional/KerberosProxyIT.java
@@ -149,28 +149,8 @@ public class KerberosProxyIT extends AccumuloIT {
     mac.start();
     MiniAccumuloConfigImpl cfg = mac.getConfig();
 
-    // Proxy configuration
-    proxyPort = PortUtils.getRandomFreePort();
-    File proxyPropertiesFile = new File(cfg.getConfDir(), "proxy.properties");
-    Properties proxyProperties = new Properties();
-    proxyProperties.setProperty("useMockInstance", "false");
-    proxyProperties.setProperty("useMiniAccumulo", "false");
-    proxyProperties.setProperty("protocolFactory", TCompactProtocol.Factory.class.getName());
-    proxyProperties.setProperty("tokenClass", KerberosToken.class.getName());
-    proxyProperties.setProperty("port", Integer.toString(proxyPort));
-    proxyProperties.setProperty("maxFrameSize", "16M");
-    proxyProperties.setProperty("instance", mac.getInstanceName());
-    proxyProperties.setProperty("zookeepers", mac.getZooKeepers());
-    proxyProperties.setProperty("thriftServerType", "sasl");
-    proxyProperties.setProperty("kerberosPrincipal", proxyPrincipal);
-    proxyProperties.setProperty("kerberosKeytab", proxyKeytab.getCanonicalPath());
-
-    // Write out the proxy.properties file
-    FileWriter writer = new FileWriter(proxyPropertiesFile);
-    proxyProperties.store(writer, "Configuration for Accumulo proxy");
-    writer.close();
-
-    proxyProcess = mac.exec(Proxy.class, "-p", proxyPropertiesFile.getCanonicalPath());
+    // Generate Proxy configuration and start the proxy
+    proxyProcess = startProxy(cfg);
 
     // Enabled kerberos auth
     Configuration conf = new Configuration(false);
@@ -179,8 +159,8 @@ public class KerberosProxyIT extends AccumuloIT {
 
     boolean success = false;
     ClusterUser rootUser = kdc.getRootUser();
-    for (int i = 0; i < 10 && !success; i++) {
-
+    // Rely on the junit timeout rule
+    while (!success) {
       UserGroupInformation ugi;
       try {
         UserGroupInformation.loginUserFromKeytab(rootUser.getPrincipal(), rootUser.getKeytab().getAbsolutePath());
@@ -207,6 +187,7 @@ public class KerberosProxyIT extends AccumuloIT {
         if (null != cause && cause instanceof ConnectException) {
           log.info("Proxy not yet up, waiting");
           Thread.sleep(3000);
+          proxyProcess = checkProxyAndRestart(proxyProcess, cfg);
           continue;
         }
       } finally {
@@ -219,6 +200,84 @@ public class KerberosProxyIT extends AccumuloIT {
     assertTrue("Failed to connect to the proxy repeatedly", success);
   }
 
+  /**
+   * Starts the thrift proxy using the given MAConfig.
+   *
+   * @param cfg
+   *          configuration for MAC
+   * @return Process for the thrift proxy
+   */
+  private Process startProxy(MiniAccumuloConfigImpl cfg) throws IOException {
+    File proxyPropertiesFile = generateNewProxyConfiguration(cfg);
+    return mac.exec(Proxy.class, "-p", proxyPropertiesFile.getCanonicalPath());
+  }
+
+  /**
+   * Generates a proxy configuration file for the MAC instance. Implicitly updates {@link #proxyPort} when choosing the port the proxy will listen on.
+   *
+   * @param cfg
+   *          The MAC configuration
+   * @return The proxy's configuration file
+   */
+  private File generateNewProxyConfiguration(MiniAccumuloConfigImpl cfg) throws IOException {
+    // Chooses a new port for the proxy as side-effect
+    proxyPort = PortUtils.getRandomFreePort();
+
+    // Proxy configuration
+    File proxyPropertiesFile = new File(cfg.getConfDir(), "proxy.properties");
+    if (proxyPropertiesFile.exists()) {
+      assertTrue("Failed to delete proxy.properties file", proxyPropertiesFile.delete());
+    }
+    Properties proxyProperties = new Properties();
+    proxyProperties.setProperty("useMockInstance", "false");
+    proxyProperties.setProperty("useMiniAccumulo", "false");
+    proxyProperties.setProperty("protocolFactory", TCompactProtocol.Factory.class.getName());
+    proxyProperties.setProperty("tokenClass", KerberosToken.class.getName());
+    proxyProperties.setProperty("port", Integer.toString(proxyPort));
+    proxyProperties.setProperty("maxFrameSize", "16M");
+    proxyProperties.setProperty("instance", mac.getInstanceName());
+    proxyProperties.setProperty("zookeepers", mac.getZooKeepers());
+    proxyProperties.setProperty("thriftServerType", "sasl");
+    proxyProperties.setProperty("kerberosPrincipal", proxyPrincipal);
+    proxyProperties.setProperty("kerberosKeytab", proxyKeytab.getCanonicalPath());
+
+    // Write out the proxy.properties file
+    FileWriter writer = new FileWriter(proxyPropertiesFile);
+    proxyProperties.store(writer, "Configuration for Accumulo proxy");
+    writer.close();
+
+    log.info("Created configuration for proxy listening on {}", proxyPort);
+
+    return proxyPropertiesFile;
+  }
+
+  /**
+   * Restarts the thrift proxy if the previous instance is no longer running. If the proxy is still running, this method does nothing.
+   *
+   * @param proxy
+   *          The thrift proxy process
+   * @param cfg
+   *          The MAC configuration
+   * @return The process for the Proxy, either the previous instance or a new instance.
+   */
+  private Process checkProxyAndRestart(Process proxy, MiniAccumuloConfigImpl cfg) throws IOException {
+    try {
+      // Get the return code
+      proxy.exitValue();
+    } catch (IllegalThreadStateException e) {
+      log.info("Proxy is still running");
+      // OK, process is still running, don't restart
+      return proxy;
+    }
+
+    log.info("Restarting proxy because it is no longer alive");
+
+    // We got a return code which means the proxy exited. We'll assume this is because it failed
+    // to bind the port due to the known race condition between choosing a port and having the
+    // proxy bind it.
+    return startProxy(cfg);
+  }
+
   @After
   public void stopMac() throws Exception {
     if (null != proxyProcess) {