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

David Septimus commented on VFS-698:
------------------------------------

This issue is cause by a call to {{getType()}} inside from {{SftpFileObject}}'s 
implementation of {{FileObject.refresh()}}. This forces a {{stat}} call to the 
SFTP server to refresh the instance's {{FileType}}.

Based on my understanding of the refresh process, the primary purpose of 
{{refresh()}} is to clear the internal state of the {{FileObject}} instance, so 
the next operation called on the instance is forced to refresh its state from 
the underlying file sytstem. {{SftpFileObject.refresh()}} is the only 
implementation that  actually makes a file system call.

> SFTP file attributes are fetched multiple times leading to very slow 
> directory listing
> --------------------------------------------------------------------------------------
>
>                 Key: VFS-698
>                 URL: https://issues.apache.org/jira/browse/VFS-698
>             Project: Commons VFS
>          Issue Type: Bug
>    Affects Versions: 2.3
>            Reporter: krishnan
>            Priority: Major
>
> getChildren() applied on SftpFileObject is very slow compared to JSCH 
> implementation. This is because, the SftpATTRS which is readily available for 
> the children after an "ls" call is again fetched for each child file since 
> they are independently resolved. So if a directory contains 10 files, it 
> results in 1 (ls) + 10 (stat) calls to server.
> For a folder with 100 files (AWS), it took about 35 secs instead of 1.5 secs 
> to  getChildren().
>  
> *doListChildrenResolved:*
> {{final FileObject fo = 
> getFileSystem().resolveFile(getFileSystem().getFileSystemManager()}}
>  \{{ .resolveName(getName(), UriParser.encode(name), NameScope.CHILD));}}
> {{{color:#ff0000}((SftpFileObject) 
> FileObjectUtils.getAbstractFileObject(fo)).setStat(stat.getAttrs());{color}}}
>  
> The resolveFile call, creates a SftpFileObject and calls its resolve method, 
> which results in getting the (stats) SftpATTRS for each child file. This stat 
> is already available as part of the 'ls' call we made. The setStat call above 
> (highlighted is red) is redundant, since stat for each child file is already 
> fetched one at a time.
> The solution would be to avoid getting the stat for each child file after an 
> 'ls' call. May be, the framework makes it difficult to do this easily.
>  
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to