package org.apache.hadoop.hdfs.tools;
import org.apache.hadoop.hdfs.AvatarShell;
import org.apache.hadoop.hdfs.CachingAvatarZooKeeperClient;
import org.apache.hadoop.hdfs.DFSUtil;
import org.apache.hadoop.hdfs.server.namenode.AvatarNode;
import org.apache.hadoop.hdfs.server.namenode.NameNode;
import org.apache.hadoop.util.ToolRunner;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
import java.io.PrintStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
public class AvatarDFSck extends DFSck {
static {
Configuration.addDefaultResource("avatar-default.xml");
Configuration.addDefaultResource("avatar-site.xml");
}
private final CachingAvatarZooKeeperClient zk;
public AvatarDFSck(Configuration conf) throws Exception {
this(conf, System.out);
}
public AvatarDFSck(Configuration conf, PrintStream out) throws IOException {
super(conf, out);
zk = new CachingAvatarZooKeeperClient(conf, null);
}
@Override
protected String getInfoServer() throws Exception {
Configuration conf = getConf();
Stat stat = new Stat();
String primaryAddr = zk.getPrimaryAvatarAddress(
new URI(conf.get("fs.default.name")), stat, true, false);
String uri0 = new URI(conf.get("fs.default.name0", "")).getAuthority();
if (uri0.equals(primaryAddr)) {
return conf.get("dfs.http.address0", "");
} else {
return conf.get("dfs.http.address1", "");
}
}
/**
* Adjust configuration for nameservice keys.
*/
public static String[] adjustConf(String[] argv, Configuration conf) {
String[] serviceId = new String[] { "" };
String[] filteredArgv = DFSUtil.getServiceName(argv, serviceId);
if (!serviceId[0].equals("")) {
NameNode.checkServiceName(conf, serviceId[0]);
DFSUtil.setGenericConf(conf, serviceId[0],
AvatarNode.AVATARSERVICE_SPECIFIC_KEYS);
NameNode.setupDefaultURI(conf);
}
return filteredArgv;
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
// enforce to specify service if configured
if (!AvatarShell.isServiceSpecified("AvatarFsck", conf, args)) {
System.exit(-1);
}
// make it service aware
try {
args = adjustConf(args, conf);
} catch (IllegalArgumentException e) {
System.err.println(e.getMessage());
printUsage();
System.exit(-1);
}
// -files option is also used by GenericOptionsParser
// Make sure that is not the first argument for fsck
int res = -1;
if ((args.length == 0) || ("-files".equals(args[0])))
printUsage();
else
res = ToolRunner.run(new AvatarDFSck(conf), args);
System.exit(res);
}
}