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] [Resolved] (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:all-tabpanel ]

Sebb resolved NET-460.
----------------------

    Resolution: Duplicate
    
> _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