HDFS-4205. fsck fails with symlinks. Contributed by Jason Lowe
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1495648 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
ba44df9166
commit
1087be1df4
|
@ -611,6 +611,8 @@ Release 2.1.0-beta - UNRELEASED
|
||||||
HDFS-4917. Start-dfs.sh cannot pass the parameters correctly.
|
HDFS-4917. Start-dfs.sh cannot pass the parameters correctly.
|
||||||
(Fengdong Yu via suresh)
|
(Fengdong Yu via suresh)
|
||||||
|
|
||||||
|
HDFS-4205. fsck fails with symlinks. (jlowe)
|
||||||
|
|
||||||
BREAKDOWN OF HDFS-347 SUBTASKS AND RELATED JIRAS
|
BREAKDOWN OF HDFS-347 SUBTASKS AND RELATED JIRAS
|
||||||
|
|
||||||
HDFS-4353. Encapsulate connections to peers in Peer and PeerServer classes.
|
HDFS-4353. Encapsulate connections to peers in Peer and PeerServer classes.
|
||||||
|
@ -3194,6 +3196,8 @@ Release 0.23.9 - UNRELEASED
|
||||||
HDFS-4878. On Remove Block, block is not removed from neededReplications
|
HDFS-4878. On Remove Block, block is not removed from neededReplications
|
||||||
queue. (Tao Luo via shv)
|
queue. (Tao Luo via shv)
|
||||||
|
|
||||||
|
HDFS-4205. fsck fails with symlinks. (jlowe)
|
||||||
|
|
||||||
Release 0.23.8 - 2013-06-05
|
Release 0.23.8 - 2013-06-05
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -291,6 +291,13 @@ public class NamenodeFsck {
|
||||||
} while (thisListing.hasMore());
|
} while (thisListing.hasMore());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (file.isSymlink()) {
|
||||||
|
if (showFiles) {
|
||||||
|
out.println(path + " <symlink>");
|
||||||
|
}
|
||||||
|
res.totalSymlinks++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
long fileLen = file.getLen();
|
long fileLen = file.getLen();
|
||||||
// Get block locations without updating the file access time
|
// Get block locations without updating the file access time
|
||||||
// and without block access tokens
|
// and without block access tokens
|
||||||
|
@ -671,6 +678,7 @@ public class NamenodeFsck {
|
||||||
long totalFiles = 0L;
|
long totalFiles = 0L;
|
||||||
long totalOpenFiles = 0L;
|
long totalOpenFiles = 0L;
|
||||||
long totalDirs = 0L;
|
long totalDirs = 0L;
|
||||||
|
long totalSymlinks = 0L;
|
||||||
long totalSize = 0L;
|
long totalSize = 0L;
|
||||||
long totalOpenFilesSize = 0L;
|
long totalOpenFilesSize = 0L;
|
||||||
long totalReplicas = 0L;
|
long totalReplicas = 0L;
|
||||||
|
@ -713,6 +721,7 @@ public class NamenodeFsck {
|
||||||
}
|
}
|
||||||
res.append("\n Total dirs:\t").append(totalDirs).append(
|
res.append("\n Total dirs:\t").append(totalDirs).append(
|
||||||
"\n Total files:\t").append(totalFiles);
|
"\n Total files:\t").append(totalFiles);
|
||||||
|
res.append("\n Total symlinks:\t\t").append(totalSymlinks);
|
||||||
if (totalOpenFiles != 0) {
|
if (totalOpenFiles != 0) {
|
||||||
res.append(" (Files currently being written: ").append(totalOpenFiles)
|
res.append(" (Files currently being written: ").append(totalOpenFiles)
|
||||||
.append(")");
|
.append(")");
|
||||||
|
|
|
@ -49,6 +49,7 @@ import java.util.regex.Pattern;
|
||||||
import org.apache.commons.logging.impl.Log4JLogger;
|
import org.apache.commons.logging.impl.Log4JLogger;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.FSDataOutputStream;
|
import org.apache.hadoop.fs.FSDataOutputStream;
|
||||||
|
import org.apache.hadoop.fs.FileContext;
|
||||||
import org.apache.hadoop.fs.FileSystem;
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hadoop.fs.UnresolvedLinkException;
|
import org.apache.hadoop.fs.UnresolvedLinkException;
|
||||||
|
@ -874,4 +875,44 @@ public class TestFsck {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Test fsck with symlinks in the filesystem */
|
||||||
|
@Test
|
||||||
|
public void testFsckSymlink() throws Exception {
|
||||||
|
final DFSTestUtil util = new DFSTestUtil.Builder().
|
||||||
|
setName(getClass().getSimpleName()).setNumFiles(1).build();
|
||||||
|
final Configuration conf = new HdfsConfiguration();
|
||||||
|
conf.setLong(DFSConfigKeys.DFS_BLOCKREPORT_INTERVAL_MSEC_KEY, 10000L);
|
||||||
|
|
||||||
|
MiniDFSCluster cluster = null;
|
||||||
|
FileSystem fs = null;
|
||||||
|
try {
|
||||||
|
final long precision = 1L;
|
||||||
|
conf.setLong(DFSConfigKeys.DFS_NAMENODE_ACCESSTIME_PRECISION_KEY, precision);
|
||||||
|
conf.setLong(DFSConfigKeys.DFS_BLOCKREPORT_INTERVAL_MSEC_KEY, 10000L);
|
||||||
|
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(4).build();
|
||||||
|
fs = cluster.getFileSystem();
|
||||||
|
final String fileName = "/srcdat";
|
||||||
|
util.createFiles(fs, fileName);
|
||||||
|
final FileContext fc = FileContext.getFileContext(
|
||||||
|
cluster.getConfiguration(0));
|
||||||
|
final Path file = new Path(fileName);
|
||||||
|
final Path symlink = new Path("/srcdat-symlink");
|
||||||
|
fc.createSymlink(file, symlink, false);
|
||||||
|
util.waitReplication(fs, fileName, (short)3);
|
||||||
|
long aTime = fc.getFileStatus(symlink).getAccessTime();
|
||||||
|
Thread.sleep(precision);
|
||||||
|
setupAuditLogs();
|
||||||
|
String outStr = runFsck(conf, 0, true, "/");
|
||||||
|
verifyAuditLogs();
|
||||||
|
assertEquals(aTime, fc.getFileStatus(symlink).getAccessTime());
|
||||||
|
assertTrue(outStr.contains(NamenodeFsck.HEALTHY_STATUS));
|
||||||
|
assertTrue(outStr.contains("Total symlinks:\t\t1\n"));
|
||||||
|
System.out.println(outStr);
|
||||||
|
util.cleanup(fs, fileName);
|
||||||
|
} finally {
|
||||||
|
if (fs != null) {try{fs.close();} catch(Exception e){}}
|
||||||
|
if (cluster != null) { cluster.shutdown(); }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue