You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by dh...@apache.org on 2007/08/30 19:47:09 UTC
svn commit: r571256 - in /lucene/hadoop/trunk: CHANGES.txt
src/java/org/apache/hadoop/dfs/INode.java
Author: dhruba
Date: Thu Aug 30 10:47:08 2007
New Revision: 571256
URL: http://svn.apache.org/viewvc?rev=571256&view=rev
Log:
HADOOP-1779. Replace INodeDirectory.getINode() by a getExistingPathINodes()
to allow the retrieval of all existing INodes along a given path in a
single lookup. This facilitates removal of the 'parent' field in the
inode. (Christophe Taton via dhruba)
Modified:
lucene/hadoop/trunk/CHANGES.txt
lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/INode.java
Modified: lucene/hadoop/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/CHANGES.txt?rev=571256&r1=571255&r2=571256&view=diff
==============================================================================
--- lucene/hadoop/trunk/CHANGES.txt (original)
+++ lucene/hadoop/trunk/CHANGES.txt Thu Aug 30 10:47:08 2007
@@ -78,6 +78,11 @@
IMPROVEMENTS
+ HADOOP-1779. Replace INodeDirectory.getINode() by a getExistingPathINodes()
+ to allow the retrieval of all existing INodes along a given path in a
+ single lookup. This facilitates removal of the 'parent' field in the
+ inode. (Christophe Taton via dhruba)
+
HADOOP-1756. Add toString() to some Writable-s. (ab)
HADOOP-1727. New classes: MapWritable and SortedMapWritable.
Modified: lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/INode.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/INode.java?rev=571256&r1=571255&r2=571256&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/INode.java (original)
+++ lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/INode.java Thu Aug 30 10:47:08 2007
@@ -265,40 +265,92 @@
/**
*/
private INode getNode(byte[][] components) {
- return getINode(components, components.length-1);
+ INode[] inode = new INode[1];
+ getExistingPathINodes(components, inode);
+ return inode[0];
}
/**
- * Find INode in the directory tree.
+ * This is the external interface
+ */
+ INode getNode(String path) {
+ return getNode(getPathComponents(path));
+ }
+
+ /**
+ * Retrieve existing INodes from a path. If existing is big enough to store
+ * all path components (existing and non-existing), then existing INodes
+ * will be stored starting from the root INode into existing[0]; if
+ * existing is not big enough to store all path components, then only the
+ * last existing and non existing INodes will be stored so that
+ * existing[existing.length-1] refers to the target INode.
+ *
+ * <p>
+ * Example: <br>
+ * Given the path /c1/c2/c3 where only /c1/c2 exists, resulting in the
+ * following path components: ["","c1","c2","c3"],
+ *
+ * <p>
+ * {@link #getExistingPathINodes(["","c1","c2"], [?])} should fill the
+ * array with [c2] <br>
+ * {@link #getExistingPathINodes(["","c1","c2","c3"], [?])} should fill the
+ * array with [null]
*
- * @param components array of path name components
- * @param end the end component of the path
- * @return found INode or null otherwise
+ * <p>
+ * {@link #getExistingPathINodes(["","c1","c2"], [?,?])} should fill the
+ * array with [c1,c2] <br>
+ * {@link #getExistingPathINodes(["","c1","c2","c3"], [?,?])} should fill
+ * the array with [c2,null]
+ *
+ * <p>
+ * {@link #getExistingPathINodes(["","c1","c2"], [?,?,?,?])} should fill
+ * the array with [rootINode,c1,c2,null], <br>
+ * {@link #getExistingPathINodes(["","c1","c2","c3"], [?,?,?,?])} should
+ * fill the array with [rootINode,c1,c2,null]
+ * @param components array of path component name
+ * @param existing INode array to fill with existing INodes
+ * @return number of existing INodes in the path
*/
- private INode getINode(byte[][] components, int end) {
+ private int getExistingPathINodes(byte[][] components, INode[] existing) {
assert compareBytes(this.name, components[0]) == 0 :
"Incorrect name " + getLocalName() + " expected " + components[0];
- if (end >= components.length)
- end = components.length-1;
- if (end < 0)
- return null;
+
INode curNode = this;
- for(int start = 0; start < end; start++) {
- if(!curNode.isDirectory()) // file is not expected here
- return null; // because there is more components in the path
- INodeDirectory parentDir = (INodeDirectory)curNode;
- curNode = parentDir.getChildINode(components[start+1]);
- if(curNode == null) // not found
- return null;
+ int count = 0;
+ int index = existing.length - components.length;
+ if (index > 0)
+ index = 0;
+ while ((count < components.length) && (curNode != null)) {
+ if (index >= 0)
+ existing[index] = curNode;
+ if (!curNode.isDirectory() || (count == components.length - 1))
+ break; // no more child, stop here
+ INodeDirectory parentDir = (INodeDirectory) curNode;
+ curNode = parentDir.getChildINode(components[count + 1]);
+ count += 1;
+ index += 1;
}
- return curNode;
+ return count;
}
/**
- * This is the external interface
+ * Retrieve the existing INodes along the given path. The first INode
+ * always exist and is this INode.
+ *
+ * @param path the path to explore
+ * @return INodes array containing the existing INodes in the order they
+ * appear when following the path from the root INode to the
+ * deepest INodes. The array size will be the number of expected
+ * components in the path, and non existing components will be
+ * filled with null
*/
- INode getNode(String path) {
- return getNode(getPathComponents(path));
+ INode[] getExistingPathINodes(String path) {
+ byte[][] components = getPathComponents(path);
+ INode[] inodes = new INode[components.length];
+
+ this.getExistingPathINodes(components, inodes);
+
+ return inodes;
}
/**
@@ -337,7 +389,10 @@
int pathLen = pathComponents.length;
if (pathLen < 2) // add root
return null;
- INode node = getINode(pathComponents, pathLen-2);
+ // Gets the parent INode
+ INode[] inode = new INode[2];
+ getExistingPathINodes(pathComponents, inode);
+ INode node = inode[0];
if (node == null) {
throw new FileNotFoundException("Parent path does not exist: "+path);
}