You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Sebb (JIRA)" <ji...@apache.org> on 2012/04/23 14:27:34 UTC

[jira] [Commented] (NET-460) _retrieveFile() blocks calling thread, on FTP I/O till the time file transfer is complete

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

Sebb commented on NET-460:
--------------------------

The abort() method sends an ABOR command to the server; that is its only function.
If the server fails to honour the ABOR command, that is not the fault of Commons NET.
Unfortunately, many FTP servers seem to stop processing the control channel whilst data transfer is in use.

The abort() method cannot be extended as suggested.

However, it might be possible to provide a new method which allows the data socket to be closed as suggested.
This is covered under NET-419.
                
> _retrieveFile() blocks calling thread, on FTP I/O till the time file transfer is complete
> -----------------------------------------------------------------------------------------
>
>                 Key: NET-460
>                 URL: https://issues.apache.org/jira/browse/NET-460
>             Project: Commons Net
>          Issue Type: Improvement
>          Components: FTP
>    Affects Versions: 3.1
>         Environment: linux/windows
>            Reporter: Agent Vinod
>              Labels: newbie, patch
>
> The Function _retrieveFile in file: FTPClient.java , does not respond to interrupts from calling thread.
> For Example:
> A Basic FTP Client Application has 1 Main (Parent) Thread and 1 Child Thread.
> Main (Parent) thread handles all functions except the FtpClient download/upload.
> Child Thread handles only FtpClient related functions mainly (_retrieveFile()) etc.
> Steps to reproduce:
> 1) Main Thread has initiated child Thread .
> 2) Child thread is presently downloading a file using _retrieveFile(String command, String remote, OutputStream local) . 
> 3) After some time, Main Thread fires Interrupt on child Thread to stop( Abort) download.
> Expected behavior:
> Child Thread immediately aborts download and dies.
> Observed behavior:
> Child Thread blocks on retrieveFile(String command, String remote, OutputStream local) till the file finishes download. 
> Only after this ,does the Child thread respond to any interrupt from Parent Thread.
> My Workaround:
> file:  FTPClient.java
> Class: FTPClient    
> Step 1: declare private Socket mySocket;
> Step 2: In the function : protected boolean _retrieveFile(String command, String remote, OutputStream local) throws IOException{}
> Comment out:  Socket socket;
> and instead use:  mySocket ( declared as global in step1)
> Step 3:  In the function : public boolean abort() throws IOException
> Add a statement: Util.closeQuietly(mySocket);
> before the statement: return FTPReply.isPositiveCompletion(abor());
> This way, every time the Main Thread calls abort(), the download active and blocked on mySocket in _retrieveFile() is immediately interrupted and stopped.
> raising an immediate Exception and thus stopping the Child thread (of course one needs to catch this exception properly).
> I am not sure if this is the right way of doing it and am afraid if this breaks something else.
> Requesting the core developers to look into a better solution to this workaround.
> thank

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira