diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperMainServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperMainServer.java index 0800335..a2e43c4 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperMainServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperMainServer.java @@ -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.ZooKeeperMain; * 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