HDFS-3350. In INode, add final to compareTo(..), equals(..) and hashCode(), and remove synchronized from updatePermissionStatus(..).

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1333679 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Tsz-wo Sze 2012-05-03 23:33:44 +00:00
parent 6b58fa6494
commit dd8b7ae9d8
3 changed files with 26 additions and 41 deletions

View File

@ -594,6 +594,9 @@ Release 2.0.0 - UNRELEASED
HDFS-3359. DFSClient.close should close cached sockets. (todd) HDFS-3359. DFSClient.close should close cached sockets. (todd)
HDFS-3350. In INode, add final to compareTo(..), equals(..) and hashCode(),
and remove synchronized from updatePermissionStatus(..). (szetszwo)
BREAKDOWN OF HDFS-1623 SUBTASKS BREAKDOWN OF HDFS-1623 SUBTASKS
HDFS-2179. Add fencing framework and mechanisms for NameNode HA. (todd) HDFS-2179. Add fencing framework and mechanisms for NameNode HA. (todd)

View File

@ -30,6 +30,8 @@ import org.apache.hadoop.hdfs.protocol.Block;
import org.apache.hadoop.hdfs.server.blockmanagement.BlockInfo; import org.apache.hadoop.hdfs.server.blockmanagement.BlockInfo;
import org.apache.hadoop.util.StringUtils; import org.apache.hadoop.util.StringUtils;
import com.google.common.primitives.SignedBytes;
/** /**
* We keep an in-memory representation of the file/block hierarchy. * We keep an in-memory representation of the file/block hierarchy.
* This is a base INode class containing common fields for file and * This is a base INode class containing common fields for file and
@ -143,8 +145,7 @@ abstract class INode implements Comparable<byte[]>, FSInodeInfo {
protected PermissionStatus getPermissionStatus() { protected PermissionStatus getPermissionStatus() {
return new PermissionStatus(getUserName(),getGroupName(),getFsPermission()); return new PermissionStatus(getUserName(),getGroupName(),getFsPermission());
} }
private synchronized void updatePermissionStatus( private void updatePermissionStatus(PermissionStatusFormat f, long n) {
PermissionStatusFormat f, long n) {
permission = f.combine(n, permission); permission = f.combine(n, permission);
} }
/** Get user name */ /** Get user name */
@ -400,48 +401,30 @@ abstract class INode implements Comparable<byte[]>, FSInodeInfo {
} }
} }
// private static final byte[] EMPTY_BYTES = {};
// Comparable interface
// @Override
public int compareTo(byte[] o) { public final int compareTo(byte[] bytes) {
return compareBytes(name, o); final byte[] left = name == null? EMPTY_BYTES: name;
final byte[] right = bytes == null? EMPTY_BYTES: bytes;
return SignedBytes.lexicographicalComparator().compare(left, right);
} }
public boolean equals(Object o) { @Override
if (!(o instanceof INode)) { public final boolean equals(Object that) {
if (this == that) {
return true;
}
if (that == null || !(that instanceof INode)) {
return false; return false;
} }
return Arrays.equals(this.name, ((INode)o).name); return Arrays.equals(this.name, ((INode)that).name);
} }
public int hashCode() { @Override
public final int hashCode() {
return Arrays.hashCode(this.name); return Arrays.hashCode(this.name);
} }
//
// static methods
//
/**
* Compare two byte arrays.
*
* @return a negative integer, zero, or a positive integer
* as defined by {@link #compareTo(byte[])}.
*/
static int compareBytes(byte[] a1, byte[] a2) {
if (a1==a2)
return 0;
int len1 = (a1==null ? 0 : a1.length);
int len2 = (a2==null ? 0 : a2.length);
int n = Math.min(len1, len2);
byte b1, b2;
for (int i=0; i<n; i++) {
b1 = a1[i];
b2 = a2[i];
if (b1 != b2)
return b1 - b2;
}
return len1 - len2;
}
/** /**
* Create an INode; the inode's name is not set yet * Create an INode; the inode's name is not set yet

View File

@ -173,9 +173,9 @@ class INodeDirectory extends INode {
*/ */
int getExistingPathINodes(byte[][] components, INode[] existing, int getExistingPathINodes(byte[][] components, INode[] existing,
boolean resolveLink) throws UnresolvedLinkException { boolean resolveLink) throws UnresolvedLinkException {
assert compareBytes(this.name, components[0]) == 0 : assert this.compareTo(components[0]) == 0 :
"Incorrect name " + getLocalName() + " expected " + "Incorrect name " + getLocalName() + " expected "
DFSUtil.bytes2String(components[0]); + (components[0] == null? null: DFSUtil.bytes2String(components[0]));
INode curNode = this; INode curNode = this;
int count = 0; int count = 0;
@ -317,8 +317,7 @@ class INodeDirectory extends INode {
INode newNode, INode newNode,
INodeDirectory parent, INodeDirectory parent,
boolean propagateModTime boolean propagateModTime
) throws FileNotFoundException, ) throws FileNotFoundException {
UnresolvedLinkException {
// insert into the parent children list // insert into the parent children list
newNode.name = localname; newNode.name = localname;
if(parent.addChild(newNode, propagateModTime) == null) if(parent.addChild(newNode, propagateModTime) == null)