HDFS-12171. Reduce IIP object allocations for inode lookup. Contributed by Daryn Sharp.

This commit is contained in:
Kihwal Lee 2017-07-25 11:03:09 -05:00
parent 6d983cca52
commit a68b5b31cf
4 changed files with 8 additions and 26 deletions

View File

@ -209,9 +209,8 @@ public class EncryptionZoneManager {
if (!hasCreatedEncryptionZone()) { if (!hasCreatedEncryptionZone()) {
return null; return null;
} }
List<INode> inodes = iip.getReadOnlyINodes(); for (int i = iip.length() - 1; i >= 0; i--) {
for (int i = inodes.size() - 1; i >= 0; i--) { final INode inode = iip.getINode(i);
final INode inode = inodes.get(i);
if (inode != null) { if (inode != null) {
final EncryptionZoneInt ezi = encryptionZones.get(inode.getId()); final EncryptionZoneInt ezi = encryptionZones.get(inode.getId());
if (ezi != null) { if (ezi != null) {

View File

@ -355,9 +355,8 @@ final class FSDirErasureCodingOp {
Preconditions.checkNotNull(iip, "INodes cannot be null"); Preconditions.checkNotNull(iip, "INodes cannot be null");
fsd.readLock(); fsd.readLock();
try { try {
List<INode> inodes = iip.getReadOnlyINodes(); for (int i = iip.length() - 1; i >= 0; i--) {
for (int i = inodes.size() - 1; i >= 0; i--) { final INode inode = iip.getINode(i);
final INode inode = inodes.get(i);
if (inode == null) { if (inode == null) {
continue; continue;
} }

View File

@ -18,9 +18,6 @@
package org.apache.hadoop.hdfs.server.namenode; package org.apache.hadoop.hdfs.server.namenode;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.NoSuchElementException;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@ -336,17 +333,9 @@ public class INodesInPath {
* otherwise, i < 0, return the (length + i)-th inode. * otherwise, i < 0, return the (length + i)-th inode.
*/ */
public INode getINode(int i) { public INode getINode(int i) {
if (inodes == null || inodes.length == 0) { return inodes[(i < 0) ? inodes.length + i : i];
throw new NoSuchElementException("inodes is null or empty");
}
int index = i >= 0 ? i : inodes.length + i;
if (index < inodes.length && index >= 0) {
return inodes[index];
} else {
throw new NoSuchElementException("inodes.length == " + inodes.length);
}
} }
/** @return the last inode. */ /** @return the last inode. */
public INode getLastINode() { public INode getLastINode() {
return getINode(-1); return getINode(-1);
@ -384,10 +373,6 @@ public class INodesInPath {
return inodes.length; return inodes.length;
} }
public List<INode> getReadOnlyINodes() {
return Collections.unmodifiableList(Arrays.asList(inodes));
}
public INode[] getINodesArray() { public INode[] getINodesArray() {
INode[] retArr = new INode[inodes.length]; INode[] retArr = new INode[inodes.length];
System.arraycopy(inodes, 0, retArr, 0, inodes.length); System.arraycopy(inodes, 0, retArr, 0, inodes.length);

View File

@ -310,9 +310,8 @@ public class TestSnapshotPathINodes {
} }
private int getNumNonNull(INodesInPath iip) { private int getNumNonNull(INodesInPath iip) {
List<INode> inodes = iip.getReadOnlyINodes(); for (int i = iip.length() - 1; i >= 0; i--) {
for (int i = inodes.size() - 1; i >= 0; i--) { if (iip.getINode(i) != null) {
if (inodes.get(i) != null) {
return i+1; return i+1;
} }
} }