HDFS-4146. Use getter and setter in INodeFileWithLink to access blocks and initialize root directory as snapshottable.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/HDFS-2802@1405648 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Tsz-wo Sze 2012-11-04 22:00:13 +00:00
parent 554fb4d2b2
commit deaf979d41
4 changed files with 24 additions and 17 deletions

View File

@ -47,3 +47,6 @@ Branch-2802 Snapshot (Unreleased)
HDFS-4141. Support directory diff - the difference between the current state HDFS-4141. Support directory diff - the difference between the current state
and a previous snapshot of an INodeDirectory. (szetszwo) and a previous snapshot of an INodeDirectory. (szetszwo)
HDFS-4146. Use getter and setter in INodeFileWithLink to access blocks and
initialize root directory as snapshottable. (szetszwo)

View File

@ -58,6 +58,7 @@ import org.apache.hadoop.hdfs.server.blockmanagement.BlockManager;
import org.apache.hadoop.hdfs.server.blockmanagement.DatanodeDescriptor; import org.apache.hadoop.hdfs.server.blockmanagement.DatanodeDescriptor;
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.BlockUCState; import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.BlockUCState;
import org.apache.hadoop.hdfs.server.namenode.INodeDirectory.INodesInPath; import org.apache.hadoop.hdfs.server.namenode.INodeDirectory.INodesInPath;
import org.apache.hadoop.hdfs.server.namenode.snapshot.INodeDirectorySnapshottable;
import org.apache.hadoop.hdfs.util.ByteArray; import org.apache.hadoop.hdfs.util.ByteArray;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
@ -120,9 +121,10 @@ public class FSDirectory implements Closeable {
FSDirectory(FSImage fsImage, FSNamesystem ns, Configuration conf) { FSDirectory(FSImage fsImage, FSNamesystem ns, Configuration conf) {
this.dirLock = new ReentrantReadWriteLock(true); // fair this.dirLock = new ReentrantReadWriteLock(true); // fair
this.cond = dirLock.writeLock().newCondition(); this.cond = dirLock.writeLock().newCondition();
rootDir = new INodeDirectoryWithQuota(INodeDirectory.ROOT_NAME,
ns.createFsOwnerPermissions(new FsPermission((short)0755)), this.namesystem = ns;
Long.MAX_VALUE, UNKNOWN_DISK_SPACE); reset();
this.fsImage = fsImage; this.fsImage = fsImage;
int configuredLimit = conf.getInt( int configuredLimit = conf.getInt(
DFSConfigKeys.DFS_LIST_LIMIT, DFSConfigKeys.DFS_LIST_LIMIT_DEFAULT); DFSConfigKeys.DFS_LIST_LIMIT, DFSConfigKeys.DFS_LIST_LIMIT_DEFAULT);
@ -143,7 +145,6 @@ public class FSDirectory implements Closeable {
NameNode.LOG.info("Caching file names occuring more than " + threshold NameNode.LOG.info("Caching file names occuring more than " + threshold
+ " times"); + " times");
nameCache = new NameCache<ByteArray>(threshold); nameCache = new NameCache<ByteArray>(threshold);
namesystem = ns;
} }
private FSNamesystem getFSNamesystem() { private FSNamesystem getFSNamesystem() {
@ -2030,9 +2031,11 @@ public class FSDirectory implements Closeable {
* Reset the entire namespace tree. * Reset the entire namespace tree.
*/ */
void reset() { void reset() {
rootDir = new INodeDirectoryWithQuota(INodeDirectory.ROOT_NAME, final INodeDirectoryWithQuota r = new INodeDirectoryWithQuota(
INodeDirectory.ROOT_NAME,
getFSNamesystem().createFsOwnerPermissions(new FsPermission((short)0755)), getFSNamesystem().createFsOwnerPermissions(new FsPermission((short)0755)),
Integer.MAX_VALUE, -1); Long.MAX_VALUE, UNKNOWN_DISK_SPACE);
rootDir = INodeDirectorySnapshottable.newInstance(r, 0);
} }
/** /**

View File

@ -55,7 +55,7 @@ public class INodeFile extends INode implements BlockCollection {
private long header; private long header;
protected BlockInfo[] blocks; private BlockInfo[] blocks;
INodeFile(PermissionStatus permissions, BlockInfo[] blklist, INodeFile(PermissionStatus permissions, BlockInfo[] blklist,
short replication, long modificationTime, short replication, long modificationTime,

View File

@ -107,35 +107,36 @@ public class INodeFileWithLink extends INodeFile {
} }
private void collectBlocksBeyondMaxAndClear(final long max, final List<Block> v) { private void collectBlocksBeyondMaxAndClear(final long max, final List<Block> v) {
if (blocks != null) { final BlockInfo[] oldBlocks = getBlocks();
if (oldBlocks != null) {
//find the minimum n such that the size of the first n blocks > max //find the minimum n such that the size of the first n blocks > max
int n = 0; int n = 0;
for(long size = 0; n < blocks.length && max > size; n++) { for(long size = 0; n < oldBlocks.length && max > size; n++) {
size += blocks[n].getNumBytes(); size += oldBlocks[n].getNumBytes();
} }
//starting from block[n], the data is beyond max. //starting from block n, the data is beyond max.
if (n < blocks.length) { if (n < oldBlocks.length) {
//resize the array. //resize the array.
final BlockInfo[] newBlocks; final BlockInfo[] newBlocks;
if (n == 0) { if (n == 0) {
newBlocks = null; newBlocks = null;
} else { } else {
newBlocks = new BlockInfo[n]; newBlocks = new BlockInfo[n];
System.arraycopy(blocks, 0, newBlocks, 0, n); System.arraycopy(oldBlocks, 0, newBlocks, 0, n);
} }
for(INodeFileWithLink i = next; i != this; i = i.getNext()) { for(INodeFileWithLink i = next; i != this; i = i.getNext()) {
i.blocks = newBlocks; i.setBlocks(newBlocks);
} }
//collect the blocks beyond max. //collect the blocks beyond max.
if (v != null) { if (v != null) {
for(; n < blocks.length; n++) { for(; n < oldBlocks.length; n++) {
v.add(blocks[n]); v.add(oldBlocks[n]);
} }
} }
} }
blocks = null; setBlocks(null);
} }
} }
} }