[ 
https://issues.apache.org/jira/browse/HADOOP-10987?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14190930#comment-14190930
 ] 

Colin Patrick McCabe commented on HADOOP-10987:
-----------------------------------------------

Thanks for working on this!

{code}
1703      /**
1704       * Returns a remote iterator so that followup calls are made on demand
1705       * while consuming the entries. This reduces memory consumption during
1706       * listing of a large directory.
1707       *
1708       * @param p target path
1709       * @return remote iterator
1710       */
1711      public RemoteIterator<FileStatus> listStatusIterator(final Path p)
{code}

This JavaDoc seems misleading because it implies that the function below 
"reduces memory consumption."  But actually that function 
{{FileSystem#listStatusIterator}} uses just as much memory as {{listStatus}} 
(since it just calls listStatus).  The memory consumption is only reduced if 
the subclass overrides this method with a more efficient implementation.

What happened to this comment from the earlier version?
{code}
    // Each file system implementation should override this method and 
    // provide more efficient implementation, if possible.
{code}

It seems like that belongs in the JavaDoc for this function.

{code}
777           @Override
778           public RemoteIterator<LocatedFileStatus> next(final FileSystem 
fs, final Path p)
779               throws IOException {
780             if (fs instanceof DistributedFileSystem) {
781               return ((DistributedFileSystem)fs).listLocatedStatus(p, 
filter);
785             }       782             }
783             // symlink resolution for this methos does not work cross file 
systems
784             // because it is a protected method.
785             throw new IOException("Link resolution does not work with 
multiple " +
786                 "file systems for listLocatedStatus(): " + p);
787           }
788         }.resolve(this, absF);
789       }
{code}
As I commented above, it's not OK to break cross-filesystem symlinks.  What I 
was suggesting is not changing {{DistributedFileSystem#listLocatedStatus}} at 
all.  We don't need to change this function to introduce the 
{{listStatusIterator}} function.

> Provide an iterator-based listing API for FileSystem
> ----------------------------------------------------
>
>                 Key: HADOOP-10987
>                 URL: https://issues.apache.org/jira/browse/HADOOP-10987
>             Project: Hadoop Common
>          Issue Type: Improvement
>            Reporter: Kihwal Lee
>            Assignee: Kihwal Lee
>         Attachments: HADOOP-10987.patch, HADOOP-10987.v2.patch, 
> HADOOP-10987.v3.patch, HADOOP-10987.v4.branch-2.patch, HADOOP-10987.v4.patch
>
>
> Iterator based listing methods already exist in {{FileContext}} for both 
> simple listing and listing with locations. However, {{FileSystem}} lacks the 
> former.  From what I understand, it wasn't added to {{FileSystem}} because it 
> was believed to be phased out soon. Since {{FileSystem}} is very well alive 
> today and new features are getting added frequently, I propose adding an 
> iterator based {{listStatus}} method. As for the name of the new method, we 
> can use the same name used in {{FileContext}} : {{listStatusIterator()}}.
> It will be particularly useful when listing giant directories. Without this, 
> the client has to build up a huge data structure and hold it in memory. We've 
> seen client JVMs running out of memory because of this.
> Once this change is made, we can modify FsShell, etc. in followup jiras.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to