You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by mw...@apache.org on 2018/12/27 18:40:49 UTC
[accumulo] branch master updated: Updates to DumpZookeeper utility
(#857)
This is an automated email from the ASF dual-hosted git repository.
mwalch pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/master by this push:
new 22b0bf5 Updates to DumpZookeeper utility (#857)
22b0bf5 is described below
commit 22b0bf59bc8186f7ca29f769f459c3ecd8c46d78
Author: Mike Walch <mw...@apache.org>
AuthorDate: Thu Dec 27 13:40:44 2018 -0500
Updates to DumpZookeeper utility (#857)
* Created human readable option which is now default
* Xml can still be output by passing --xml argument
* Utility can now be called using 'accumulo-util dump-zoo'
---
assemble/bin/accumulo-util | 4 ++
.../apache/accumulo/server/util/DumpZookeeper.java | 73 +++++++++++++++++-----
2 files changed, 62 insertions(+), 15 deletions(-)
diff --git a/assemble/bin/accumulo-util b/assemble/bin/accumulo-util
index 4a8b9ba..b5827da 100755
--- a/assemble/bin/accumulo-util
+++ b/assemble/bin/accumulo-util
@@ -21,6 +21,7 @@ Usage: accumulo-util <command> (<argument> ...)
Commands:
build-native Builds Accumulo native libraries
+ dump-zoo Dumps data in ZooKeeper
hadoop-jar Runs 'hadoop jar' command with Accumulo jars
gen-monitor-cert Generates Accumulo monitor certficate
load-jars-hdfs Loads Accumulo jars in lib/ to HDFS for VFS classloader
@@ -263,6 +264,9 @@ function main() {
build-native)
build_native "${@:2}"
;;
+ dump-zoo)
+ "$bin"/accumulo org.apache.accumulo.server.util.DumpZookeeper "${@:2}"
+ ;;
hadoop-jar)
hadoop_jar "${@:2}"
;;
diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/DumpZookeeper.java b/server/base/src/main/java/org/apache/accumulo/server/util/DumpZookeeper.java
index 24329ff..7fe7a8c 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/util/DumpZookeeper.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/util/DumpZookeeper.java
@@ -21,8 +21,7 @@ import static java.nio.charset.StandardCharsets.UTF_8;
import java.io.PrintStream;
import java.util.Base64;
-import org.apache.accumulo.core.cli.Help;
-import org.apache.accumulo.core.conf.SiteConfiguration;
+import org.apache.accumulo.core.cli.ConfigOpts;
import org.apache.accumulo.fate.zookeeper.IZooReaderWriter;
import org.apache.accumulo.fate.zookeeper.ZooReaderWriter;
import org.apache.log4j.Level;
@@ -34,7 +33,7 @@ import com.beust.jcommander.Parameter;
public class DumpZookeeper {
- static IZooReaderWriter zk = null;
+ private static IZooReaderWriter zk = null;
private static final Logger log = Logger.getLogger(DumpZookeeper.class);
@@ -48,9 +47,13 @@ public class DumpZookeeper {
}
}
- static class Opts extends Help {
- @Parameter(names = "--root", description = "the root of the znode tree to dump")
+ static class Opts extends ConfigOpts {
+ @Parameter(names = {"-r", "-root", "--root"},
+ description = "Root ZooKeeper directory to start dump at")
String root = "/";
+ @Parameter(names = {"-x", "-xml", "--xml"},
+ description = "Output dump as XML (instead of human readable")
+ boolean xml = false;
}
public static void main(String[] args) {
@@ -60,19 +63,27 @@ public class DumpZookeeper {
Logger.getRootLogger().setLevel(Level.WARN);
PrintStream out = System.out;
try {
- zk = new ZooReaderWriter(new SiteConfiguration());
-
- write(out, 0, "<dump root='%s'>", opts.root);
- for (String child : zk.getChildren(opts.root, null))
- if (!child.equals("zookeeper"))
- dump(out, opts.root, child, 1);
- write(out, 0, "</dump>");
+ zk = new ZooReaderWriter(opts.getSiteConfiguration());
+ if (opts.xml) {
+ writeXml(out, opts.root);
+ } else {
+ writeHumanReadable(out, opts.root);
+ }
} catch (Exception ex) {
log.error(ex, ex);
}
}
- private static void dump(PrintStream out, String root, String child, int indent)
+ private static void writeXml(PrintStream out, String root)
+ throws KeeperException, InterruptedException {
+ write(out, 0, "<dump root='%s'>", root);
+ for (String child : zk.getChildren(root, null))
+ if (!child.equals("zookeeper"))
+ childXml(out, root, child, 1);
+ write(out, 0, "</dump>");
+ }
+
+ private static void childXml(PrintStream out, String root, String child, int indent)
throws KeeperException, InterruptedException {
String path = root + "/" + child;
if (root.endsWith("/"))
@@ -101,7 +112,7 @@ public class DumpZookeeper {
value.value);
}
for (String c : zk.getChildren(path, null)) {
- dump(out, path, c, indent + 1);
+ childXml(out, path, c, indent + 1);
}
write(out, indent, "</node>");
}
@@ -119,7 +130,39 @@ public class DumpZookeeper {
private static void write(PrintStream out, int indent, String fmt, Object... args) {
for (int i = 0; i < indent; i++)
- out.print(" ");
+ out.print(" ");
out.println(String.format(fmt, args));
}
+
+ private static void writeHumanReadable(PrintStream out, String root)
+ throws KeeperException, InterruptedException {
+ write(out, 0, "%s:", root);
+ for (String child : zk.getChildren(root, null))
+ if (!child.equals("zookeeper"))
+ childHumanReadable(out, root, child, 1);
+ }
+
+ private static void childHumanReadable(PrintStream out, String root, String child, int indent)
+ throws KeeperException, InterruptedException {
+ String path = root + "/" + child;
+ if (root.endsWith("/"))
+ path = root + child;
+ Stat stat = zk.getStatus(path);
+ if (stat == null)
+ return;
+ String node = child;
+ if (stat.getEphemeralOwner() != 0) {
+ node = "*" + child + "*";
+ }
+ if (stat.getDataLength() == 0) {
+ write(out, indent, "%s:", node);
+ } else {
+ write(out, indent, "%s: %s", node, value(path).value);
+ }
+ if (stat.getNumChildren() > 0) {
+ for (String c : zk.getChildren(path, null)) {
+ childHumanReadable(out, path, c, indent + 1);
+ }
+ }
+ }
}