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/12/14 00:08:52 UTC

svn commit: r604059 - in /lucene/hadoop/branches/branch-0.15: CHANGES.txt src/c++/libhdfs/hdfs.c

Author: dhruba
Date: Thu Dec 13 15:08:50 2007
New Revision: 604059

URL: http://svn.apache.org/viewvc?rev=604059&view=rev
Log:
HADOOP-2158. hdfsListDirectory calls FileSystem.listStatus instead
of FileSystem.listPaths. This reduces the number of RPC calls on the
namenode, thereby improving scalability.  (Christian Kunz via dhruba)

svn merge -c 603000 from trunk.


Modified:
    lucene/hadoop/branches/branch-0.15/CHANGES.txt
    lucene/hadoop/branches/branch-0.15/src/c++/libhdfs/hdfs.c

Modified: lucene/hadoop/branches/branch-0.15/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/hadoop/branches/branch-0.15/CHANGES.txt?rev=604059&r1=604058&r2=604059&view=diff
==============================================================================
--- lucene/hadoop/branches/branch-0.15/CHANGES.txt (original)
+++ lucene/hadoop/branches/branch-0.15/CHANGES.txt Thu Dec 13 15:08:50 2007
@@ -24,6 +24,9 @@
 
     HADOOP-2382.  Add hadoop-default.html to subversion. (cutting)
 
+    HADOOP-2158. hdfsListDirectory calls FileSystem.listStatus instead
+    of FileSystem.listPaths. This reduces the number of RPC calls on the
+    namenode, thereby improving scalability.  (Christian Kunz via dhruba)
 
 Release 0.15.1 - 2007-11-27
 

Modified: lucene/hadoop/branches/branch-0.15/src/c++/libhdfs/hdfs.c
URL: http://svn.apache.org/viewvc/lucene/hadoop/branches/branch-0.15/src/c%2B%2B/libhdfs/hdfs.c?rev=604059&r1=604058&r2=604059&view=diff
==============================================================================
--- lucene/hadoop/branches/branch-0.15/src/c++/libhdfs/hdfs.c (original)
+++ lucene/hadoop/branches/branch-0.15/src/c++/libhdfs/hdfs.c Thu Dec 13 15:08:50 2007
@@ -1316,41 +1316,9 @@
 
  
 static int
-getFileInfo(JNIEnv *env, jobject jFS, jobject jPath, hdfsFileInfo *fileInfo)
+getFileInfoFromStat(JNIEnv *env, jobject jStat, hdfsFileInfo *fileInfo)
 {
-    // JAVA EQUIVALENT:
-    //  fs.isDirectory(f)
-    //  fs.lastModified() ??
-    //  fs.getLength(f)
-    //  f.getPath()
-
-    jobject jStat;
-    jvalue  jVal;
-
-    if (invokeMethod(env, &jVal, INSTANCE, jFS, HADOOP_FS,
-                     "exists", JMETHOD1(JPARAM(HADOOP_PATH), "Z"),
-                     jPath) != 0) {
-        fprintf(stderr, "Call to org.apache.hadoop.fs."
-                "FileSystem::exists failed!\n");
-        errno = EINTERNAL;
-        return -1;
-    }
-
-    if (jVal.z == 0) {
-      errno = ENOENT;
-      return -1;
-    }
-
-    if (invokeMethod(env, &jVal, INSTANCE, jFS, HADOOP_FS,
-                     "getFileStatus", JMETHOD1(JPARAM(HADOOP_PATH), JPARAM(HADOOP_STAT)),
-                     jPath) != 0) {
-        fprintf(stderr, "Call to org.apache.hadoop.fs."
-                "FileSystem::getFileStatus failed!\n");
-        errno = EINTERNAL;
-        return -1;
-    }
-    jStat = jVal.l;
-
+    jvalue jVal;
     if (invokeMethod(env, &jVal, INSTANCE, jStat,
                      HADOOP_STAT, "isDir", "()Z") != 0) {
         fprintf(stderr, "Call to org.apache.hadoop.fs."
@@ -1398,6 +1366,17 @@
         fileInfo->mSize = jVal.j;
     }
 
+    jobject jPath;
+    if (invokeMethod(env, &jVal, INSTANCE, jStat, HADOOP_STAT,
+                     "getPath", "()Lorg/apache/hadoop/fs/Path;") ||
+            jVal.l == NULL) { 
+        fprintf(stderr, "Call to org.apache.hadoop.fs."
+                "FileStatus::getPath failed!\n");
+        errno = EINTERNAL;
+        return -1;
+    }
+    jPath = jVal.l;
+
     jstring     jPathName;
     const char *cPathName;
     if (invokeMethod(env, &jVal, INSTANCE, jPath, HADOOP_PATH,
@@ -1405,17 +1384,59 @@
         fprintf(stderr, "Call to org.apache.hadoop.fs."
                 "Path::toString failed!\n");
         errno = EINTERNAL;
+        destroyLocalReference(env, jPath);
         return -1;
     }
     jPathName = jVal.l;
     cPathName = (const char*) ((*env)->GetStringUTFChars(env, jPathName, NULL));
     fileInfo->mName = strdup(cPathName);
     (*env)->ReleaseStringUTFChars(env, jPathName, cPathName);
+    destroyLocalReference(env, jPath);
     destroyLocalReference(env, jPathName);
 
     return 0;
 }
 
+static int
+getFileInfo(JNIEnv *env, jobject jFS, jobject jPath, hdfsFileInfo *fileInfo)
+{
+    // JAVA EQUIVALENT:
+    //  fs.isDirectory(f)
+    //  fs.lastModified() ??
+    //  fs.getLength(f)
+    //  f.getPath()
+
+    jobject jStat;
+    jvalue  jVal;
+
+    if (invokeMethod(env, &jVal, INSTANCE, jFS, HADOOP_FS,
+                     "exists", JMETHOD1(JPARAM(HADOOP_PATH), "Z"),
+                     jPath) != 0) {
+        fprintf(stderr, "Call to org.apache.hadoop.fs."
+                "FileSystem::exists failed!\n");
+        errno = EINTERNAL;
+        return -1;
+    }
+
+    if (jVal.z == 0) {
+      errno = ENOENT;
+      return -1;
+    }
+
+    if (invokeMethod(env, &jVal, INSTANCE, jFS, HADOOP_FS,
+                     "getFileStatus", JMETHOD1(JPARAM(HADOOP_PATH), JPARAM(HADOOP_STAT)),
+                     jPath) != 0) {
+        fprintf(stderr, "Call to org.apache.hadoop.fs."
+                "FileSystem::getFileStatus failed!\n");
+        errno = EINTERNAL;
+        return -1;
+    }
+    jStat = jVal.l;
+    int ret =  getFileInfoFromStat(env, jStat, fileInfo); 
+    destroyLocalReference(env, jStat);
+    return ret;
+}
+
 
 
 hdfsFileInfo* hdfsListDirectory(hdfsFS fs, const char* path, int *numEntries)
@@ -1441,11 +1462,11 @@
 
     jobjectArray jPathList = NULL;
     jvalue jVal;
-    if (invokeMethod(env, &jVal, INSTANCE, jFS, HADOOP_FS, "listPaths",
-                     JMETHOD1(JPARAM(HADOOP_PATH), JARRPARAM(HADOOP_PATH)),
+    if (invokeMethod(env, &jVal, INSTANCE, jFS, HADOOP_DFS, "listStatus",
+                     JMETHOD1(JPARAM(HADOOP_PATH), JARRPARAM(HADOOP_STAT)),
                      jPath) != 0) {
         fprintf(stderr, "Call to org.apache.hadoop.fs."
-                "FileSystem::listPaths failed!\n");
+                "FileSystem::listStatus failed!\n");
         errno = EINTERNAL;
         destroyLocalReference(env, jPath);
         return NULL;
@@ -1469,17 +1490,17 @@
 
     //Save path information in pathList
     jsize i;
-    jobject tmpPath;
+    jobject tmpStat;
     for (i=0; i < jPathListSize; ++i) {
-        tmpPath = (*env)->GetObjectArrayElement(env, jPathList, i);
-        if (getFileInfo(env, jFS, tmpPath, &pathList[i])) {
+        tmpStat = (*env)->GetObjectArrayElement(env, jPathList, i);
+        if (getFileInfoFromStat(env, tmpStat, &pathList[i])) {
             errno = EINTERNAL;
             hdfsFreeFileInfo(pathList, jPathListSize);
-            destroyLocalReference(env, tmpPath);
+            destroyLocalReference(env, tmpStat);
             pathList = NULL;
             goto done;
         }
-        destroyLocalReference(env, tmpPath);
+        destroyLocalReference(env, tmpStat);
     }
 
     done: