You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2014/04/03 23:34:32 UTC

svn commit: r1584408 - in /hbase/branches/0.98/hbase-server/src: main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperMainServer.java test/java/org/apache/hadoop/hbase/zookeeper/TestZooKeeperMainServer.java

Author: stack
Date: Thu Apr  3 21:34:31 2014
New Revision: 1584408

URL: http://svn.apache.org/r1584408
Log:
HBASE-10903 HBASE-10740 regression; cannot pass commands for zk to run

Modified:
    hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperMainServer.java
    hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZooKeeperMainServer.java

Modified: hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperMainServer.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperMainServer.java?rev=1584408&r1=1584407&r2=1584408&view=diff
==============================================================================
--- hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperMainServer.java (original)
+++ hbase/branches/0.98/hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperMainServer.java Thu Apr  3 21:34:31 2014
@@ -19,6 +19,7 @@
 
 package org.apache.hadoop.hbase.zookeeper;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map.Entry;
@@ -26,6 +27,7 @@ import java.util.Properties;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.ZooKeeperMain;
 
 /**
@@ -33,6 +35,8 @@ import org.apache.zookeeper.ZooKeeperMai
  * from HBase XML configuration.
  */
 public class ZooKeeperMainServer {
+  private static final String SERVER_ARG = "-server";
+
   public String parse(final Configuration c) {
     // Note that we do not simply grab the property
     // HConstants.ZOOKEEPER_QUORUM from the HBaseConfiguration because the
@@ -62,19 +66,71 @@ public class ZooKeeperMainServer {
   }
 
   /**
+   * ZooKeeper 3.4.6 broke being able to pass commands on command line.
+   * See ZOOKEEPER-1897.  This class is a hack to restore this faclity.
+   */
+  private static class HACK_UNTIL_ZOOKEEPER_1897_ZooKeeperMain extends ZooKeeperMain {
+    public HACK_UNTIL_ZOOKEEPER_1897_ZooKeeperMain(String[] args)
+    throws IOException, InterruptedException {
+      super(args);
+    }
+
+    /**
+     * Run the command-line args passed.  Calls System.exit when done.
+     * @throws KeeperException
+     * @throws IOException
+     * @throws InterruptedException
+     */
+    void runCmdLine() throws KeeperException, IOException, InterruptedException {
+      processCmd(this.cl);
+      System.exit(0);
+    }
+  }
+
+  /**
+   * @param args
+   * @return True if argument strings have a '-server' in them.
+   */
+  private static boolean hasServer(final String args[]) {
+    return args.length > 0 && args[0].equals(SERVER_ARG);
+  }
+
+  /**
+   * @param args
+   * @return True if command-line arguments were passed.
+   */
+  private static boolean hasCommandLineArguments(final String args[]) {
+    if (hasServer(args)) {
+      if (args.length < 2) throw new IllegalStateException("-server param but no value");
+      return args.length > 2;
+    }
+    return args.length > 0;
+  }
+
+  /**
    * Run the tool.
    * @param args Command line arguments. First arg is path to zookeepers file.
    */
   public static void main(String args[]) throws Exception {
-    Configuration conf = HBaseConfiguration.create();
-    String hostport = new ZooKeeperMainServer().parse(conf);
-    String[] newArgs = args;
-    if (hostport != null && hostport.length() > 0) {
-      newArgs = new String[args.length + 2];
-      System.arraycopy(args, 0, newArgs, 2, args.length);
-      newArgs[0] = "-server";
-      newArgs[1] = hostport;
+    String [] newArgs = args;
+    if (!hasServer(args)) {
+      // Add the zk ensemble from configuration if none passed on command-line.
+      Configuration conf = HBaseConfiguration.create();
+      String hostport = new ZooKeeperMainServer().parse(conf);
+      if (hostport != null && hostport.length() > 0) {
+        newArgs = new String[args.length + 2];
+        System.arraycopy(args, 0, newArgs, 2, args.length);
+        newArgs[0] = "-server";
+        newArgs[1] = hostport;
+      }
+    }
+    // If command-line arguments, run our hack so they are executed.
+    if (hasCommandLineArguments(args)) {
+      HACK_UNTIL_ZOOKEEPER_1897_ZooKeeperMain zkm =
+        new HACK_UNTIL_ZOOKEEPER_1897_ZooKeeperMain(newArgs);
+      zkm.runCmdLine();
+    } else {
+      ZooKeeperMain.main(newArgs);
     }
-    ZooKeeperMain.main(newArgs);
   }
 }
\ No newline at end of file

Modified: hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZooKeeperMainServer.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZooKeeperMainServer.java?rev=1584408&r1=1584407&r2=1584408&view=diff
==============================================================================
--- hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZooKeeperMainServer.java (original)
+++ hbase/branches/0.98/hbase-server/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZooKeeperMainServer.java Thu Apr  3 21:34:31 2014
@@ -21,6 +21,8 @@ package org.apache.hadoop.hbase.zookeepe
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import java.security.Permission;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.*;
 import org.junit.Test;
@@ -28,9 +30,69 @@ import org.junit.experimental.categories
 
 @Category(SmallTests.class)
 public class TestZooKeeperMainServer {
-  private final ZooKeeperMainServer parser = new ZooKeeperMainServer();
+  // ZKMS calls System.exit.  Catch the call and prevent exit using trick described up in
+  // http://stackoverflow.com/questions/309396/java-how-to-test-methods-that-call-system-exit
+  protected static class ExitException extends SecurityException {
+    private static final long serialVersionUID = 1L;
+    public final int status;
+    public ExitException(int status) {
+      super("There is no escape!");
+      this.status = status;
+    }
+  }
+
+  private static class NoExitSecurityManager extends SecurityManager {
+    @Override
+    public void checkPermission(Permission perm) {
+      // allow anything.
+    }
+
+    @Override
+    public void checkPermission(Permission perm, Object context) {
+      // allow anything.
+    }
+
+    @Override
+    public void checkExit(int status) {
+      super.checkExit(status);
+      throw new ExitException(status);
+    }
+  }
+
+  /**
+   * We need delete of a znode to work at least.
+   * @throws Exception
+   */
+  @Test
+  public void testCommandLineWorks() throws Exception {
+    System.setSecurityManager(new NoExitSecurityManager());
+    HBaseTestingUtility htu = new HBaseTestingUtility();
+    htu.getConfiguration().setInt(HConstants.ZK_SESSION_TIMEOUT, 1000);
+    htu.startMiniZKCluster();
+    try {
+      ZooKeeperWatcher zkw = htu.getZooKeeperWatcher();
+      String znode = "/testCommandLineWorks";
+      ZKUtil.createWithParents(zkw, znode, HConstants.EMPTY_BYTE_ARRAY);
+      ZKUtil.checkExists(zkw, znode);
+      boolean exception = false;
+      try {
+        ZooKeeperMainServer.main(new String [] {"-server",
+          "localhost:" + htu.getZkCluster().getClientPort(), "delete", znode});
+      } catch (ExitException ee) {
+        // ZKMS calls System.exit which should trigger this exception.
+        exception = true;
+      }
+      assertTrue(exception);
+      assertEquals(-1, ZKUtil.checkExists(zkw, znode));
+    } finally {
+      htu.shutdownMiniZKCluster();
+      System.setSecurityManager(null); // or save and restore original
+    }
+  }
 
-  @Test public void test() {
+  @Test
+  public void testHostPortParse() {
+    ZooKeeperMainServer parser = new ZooKeeperMainServer();
     Configuration c = HBaseConfiguration.create();
     assertEquals("localhost:" + c.get(HConstants.ZOOKEEPER_CLIENT_PORT), parser.parse(c));
     final String port = "1234";