[
https://issues.apache.org/jira/browse/VFS-832?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Gary D. Gregory resolved VFS-832.
---------------------------------
Fix Version/s: 2.10.0
Resolution: Fixed
[~wangerry]
Thank you for your report and PR. Please verify git master.
> Sftp channel not put back in doGetInputStream
> ---------------------------------------------
>
> Key: VFS-832
> URL: https://issues.apache.org/jira/browse/VFS-832
> Project: Commons VFS
> Issue Type: Bug
> Affects Versions: 2.9.0
> Reporter: wangerry
> Priority: Major
> Fix For: 2.10.0
>
> Original Estimate: 1h
> Remaining Estimate: 1h
>
> *since VFS-210 added this in SftpFileObject.java:*
>
> {code:java}
> InputStream is;
> try
> {
> // VFS-210: sftp allows to gather an input stream even from a directory
> and will
> // fail on first read. So we need to check the type anyway
> if (!getType().hasContent())
> {
> throw new FileSystemException("vfs.provider/read-not-file.error",
> getName());
> }
> is = channel.get(relPath);
> }
> catch (SftpException e)
> {
> if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE)
> {
> throw new FileNotFoundException(getName());
> }
> throw new FileSystemException(e);
> }{code}
> when throw an exception(such as file not exists or get input stream from a
> directory), the channel is not called with putChannel() and not be closed.
> when this happen several times (normally 10 times due to sshd default
> MaxSession is 10), getChannel() will always throws exception(Channel is not
> opened), because server will not response the open request.
>
> *It can be reproduced in this way:*
>
> {code:java}
> //Setup our SFTP configuration
> FileSystemOptions opts = new FileSystemOptions();
> SftpFileSystemConfigBuilder instance =
> SftpFileSystemConfigBuilder.getInstance();
> instance.setStrictHostKeyChecking(opts, "no");
> instance.setUserDirIsRoot(opts, true);
> instance.setConnectTimeout(opts, Duration.ofSeconds(30));
> instance.setSessionTimeout(opts, Duration.ofSeconds(30));
> instance.setDisableDetectExecChannel(opts, true);
> for (int i = 0; i < 15; i++) {
> try {
> try (FileObject fileObject =
> VFS.getManager().resolveFile("sftp://[email protected]/path_not_exists.txt",
> opts)) {
> try (InputStream inputStream =
> fileObject.getContent().getInputStream()) {
> // do something
> }
> }
> } catch (Exception e) {
> e.printStackTrace();
> }
> } {code}
> first 10 times will be "Could not read from "xxx" because it is not a file."
>
> then will be
>
> {code:java}
> Caused by: com.jcraft.jsch.JSchException: channel is not opened.
> at com.jcraft.jsch.Channel.sendChannelOpen(Channel.java:768)
> at com.jcraft.jsch.Channel.connect(Channel.java:151)
> at
> org.apache.commons.vfs2.provider.sftp.SftpFileSystem.getChannel(SftpFileSystem.java:213)
> ... 6 more {code}
>
> I will commit a pr to fix this
>
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)