HDFS-7789. DFSck should resolve the path to support cross-FS symlinks. (gera)
(cherry picked from commit cbb492578e
)
This commit is contained in:
parent
a5f3156b30
commit
52d0724a20
|
@ -396,6 +396,9 @@ Release 2.7.0 - UNRELEASED
|
|||
HDFS-7439. Add BlockOpResponseProto's message to the exception messages.
|
||||
(Takanobu Asanuma via szetszwo)
|
||||
|
||||
HDFS-7789. DFSck should resolve the path to support cross-FS symlinks.
|
||||
(gera)
|
||||
|
||||
OPTIMIZATIONS
|
||||
|
||||
HDFS-7454. Reduce memory footprint for AclEntries in NameNode.
|
||||
|
|
|
@ -223,6 +223,14 @@ public class DFSck extends Configured implements Tool {
|
|||
return errCode;
|
||||
}
|
||||
|
||||
|
||||
private Path getResolvedPath(String dir) throws IOException {
|
||||
Configuration conf = getConf();
|
||||
Path dirPath = new Path(dir);
|
||||
FileSystem fs = dirPath.getFileSystem(conf);
|
||||
return fs.resolvePath(dirPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Derive the namenode http address from the current file system,
|
||||
* either default or as set by "-fs" in the generic options.
|
||||
|
@ -234,19 +242,12 @@ public class DFSck extends Configured implements Tool {
|
|||
Configuration conf = getConf();
|
||||
|
||||
//get the filesystem object to verify it is an HDFS system
|
||||
final FileSystem fs;
|
||||
try {
|
||||
fs = target.getFileSystem(conf);
|
||||
} catch (IOException ioe) {
|
||||
System.err.println("FileSystem is inaccessible due to:\n"
|
||||
+ StringUtils.stringifyException(ioe));
|
||||
return null;
|
||||
}
|
||||
final FileSystem fs = target.getFileSystem(conf);
|
||||
if (!(fs instanceof DistributedFileSystem)) {
|
||||
System.err.println("FileSystem is " + fs.getUri());
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
return DFSUtil.getInfoServer(HAUtil.getAddressOfActive(fs), conf,
|
||||
DFSUtil.getHttpClientScheme(conf));
|
||||
}
|
||||
|
@ -300,8 +301,16 @@ public class DFSck extends Configured implements Tool {
|
|||
dir = "/";
|
||||
}
|
||||
|
||||
final Path dirpath = new Path(dir);
|
||||
final URI namenodeAddress = getCurrentNamenodeAddress(dirpath);
|
||||
Path dirpath = null;
|
||||
URI namenodeAddress = null;
|
||||
try {
|
||||
dirpath = getResolvedPath(dir);
|
||||
namenodeAddress = getCurrentNamenodeAddress(dirpath);
|
||||
} catch (IOException ioe) {
|
||||
System.err.println("FileSystem is inaccessible due to:\n"
|
||||
+ StringUtils.stringifyException(ioe));
|
||||
}
|
||||
|
||||
if (namenodeAddress == null) {
|
||||
//Error message already output in {@link #getCurrentNamenodeAddress()}
|
||||
System.err.println("DFSck exiting.");
|
||||
|
|
|
@ -211,10 +211,16 @@ public class TestFsck {
|
|||
try {
|
||||
// Audit log should contain one getfileinfo and one fsck
|
||||
reader = new BufferedReader(new FileReader(auditLogFile));
|
||||
String line = reader.readLine();
|
||||
assertNotNull(line);
|
||||
assertTrue("Expected getfileinfo event not found in audit log",
|
||||
getfileinfoPattern.matcher(line).matches());
|
||||
String line;
|
||||
|
||||
// one extra getfileinfo stems from resolving the path
|
||||
//
|
||||
for (int i = 0; i < 2; i++) {
|
||||
line = reader.readLine();
|
||||
assertNotNull(line);
|
||||
assertTrue("Expected getfileinfo event not found in audit log",
|
||||
getfileinfoPattern.matcher(line).matches());
|
||||
}
|
||||
line = reader.readLine();
|
||||
assertNotNull(line);
|
||||
assertTrue("Expected fsck event not found in audit log", fsckPattern
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
package org.apache.hadoop.hdfs.server.namenode;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
|
@ -26,6 +27,8 @@ import org.apache.commons.logging.LogFactory;
|
|||
import org.apache.hadoop.conf.Configuration;
|
||||
import org.apache.hadoop.fs.FileSystem;
|
||||
import org.apache.hadoop.fs.Path;
|
||||
import org.apache.hadoop.fs.viewfs.ConfigUtil;
|
||||
import org.apache.hadoop.fs.viewfs.ViewFileSystem;
|
||||
import org.apache.hadoop.hdfs.DFSConfigKeys;
|
||||
import org.apache.hadoop.hdfs.DFSTestUtil;
|
||||
import org.apache.hadoop.hdfs.HdfsConfiguration;
|
||||
|
@ -119,6 +122,23 @@ public class TestFsckWithMultipleNameNodes {
|
|||
LOG.info("result=" + result);
|
||||
Assert.assertTrue(result.contains("Status: HEALTHY"));
|
||||
}
|
||||
|
||||
// Test viewfs
|
||||
//
|
||||
LOG.info("RUN_TEST 3");
|
||||
final String[] vurls = new String[nNameNodes];
|
||||
for (int i = 0; i < vurls.length; i++) {
|
||||
String link = "/mount/nn_" + i + FILE_NAME;
|
||||
ConfigUtil.addLink(conf, link, new URI(urls[i]));
|
||||
vurls[i] = "viewfs:" + link;
|
||||
}
|
||||
|
||||
for(int i = 0; i < vurls.length; i++) {
|
||||
LOG.info("vurls[" + i + "]=" + vurls[i]);
|
||||
final String result = TestFsck.runFsck(conf, 0, false, vurls[i]);
|
||||
LOG.info("result=" + result);
|
||||
Assert.assertTrue(result.contains("Status: HEALTHY"));
|
||||
}
|
||||
} finally {
|
||||
cluster.shutdown();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue