You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by Doron Fediuck <do...@redhat.com> on 2010/06/01 10:14:53 UTC

Re: Client pipe problem (bug)

On Sunday 30 May 2010 10:04:37 Doron Fediuck wrote:
> Hi !
> I'm implementing some basic client functionality using sshd client.
> I found a case where I need to implement something of this concept:
> "gzip /tmp/sample.txt | ssh user@some.host.com gunzip -c > /tmp/sample.txt"
> 
> On my implementation the code (using sshd client) is running an exec channel
> of the gzip command into stdout. Then I should be able to use the stdout stream
> and use it to unzip the file locally.
> 
> Here's a snip of my implementation:
> 
>            // Create the GZIP output stream
>            ByteArrayOutputStream baosGZipped = new ByteArrayOutputStream ();
>            GZIPOutputStream gzOut = new GZIPOutputStream(baosGZipped);
> 
>            // Open the input file
>            FileInputStream src = new FileInputStream(sourceFileName);
> 
>            byte[] buf = new byte[1024];
>            int len;
>            while ((len = src.read(buf)) > 0) {
>                     gzOut.write(buf, 0, len);
>            }
>            src.close();
> 
>            // Complete the GZIP file
>            gzOut.finish();
>            gzOut.flush();
>            gzOut.close();
> 
>          //create channel
>         ClientChannel channel = session.createExecChannel("gunzip -c >" + destFile);
> 
>         ByteArrayInputStream in = new ByteArrayInputStream(baosGZipped.toByteArray());
>         channel.setIn(in);
>         ByteArrayOutputStream out = new ByteArrayOutputStream();
>         channel.setOut(out);
>         ByteArrayOutputStream err = new ByteArrayOutputStream();
>         channel.setErr(err);
> 
>         //open channel
>         channel.open();
> 
>         //wait close
>         channel.waitFor(ClientChannel.CLOSED, 0);
> 
> 
> What I discovered is that this will never end !!!
> The problem is, that there's a pumpInputStream thread in (org/apache/sshd/client/channel/ChannelSession.java),
> that will never end until closeFuture.isClosed. Since this does not happen, the unzip in the remote host doesn't end,
> and the channel will never close. This prevents the client from a proper pipe implementation.
> 
> There should be a method to properly end this while-loop thus the remote side will be able to finish and close.
> Can you please open a bug for this issue ?
> 
> Thanks !
> Doron.
> 
Anyone ?

Re: Client pipe problem (bug)

Posted by Emmanuel Lecharny <el...@gmail.com>.
On 6/1/10 10:14 AM, Doron Fediuck wrote:
> On Sunday 30 May 2010 10:04:37 Doron Fediuck wrote:
>    
>> Hi !
>> I'm implementing some basic client functionality using sshd client.
>> I found a case where I need to implement something of this concept:
>> "gzip /tmp/sample.txt | ssh user@some.host.com gunzip -c>  /tmp/sample.txt"
>>
>> On my implementation the code (using sshd client) is running an exec channel
>> of the gzip command into stdout. Then I should be able to use the stdout stream
>> and use it to unzip the file locally.
>>
>> Here's a snip of my implementation:
>>
>>             // Create the GZIP output stream
>>             ByteArrayOutputStream baosGZipped = new ByteArrayOutputStream ();
>>             GZIPOutputStream gzOut = new GZIPOutputStream(baosGZipped);
>>
>>             // Open the input file
>>             FileInputStream src = new FileInputStream(sourceFileName);
>>
>>             byte[] buf = new byte[1024];
>>             int len;
>>             while ((len = src.read(buf))>  0) {
>>                      gzOut.write(buf, 0, len);
>>             }
>>             src.close();
>>
>>             // Complete the GZIP file
>>             gzOut.finish();
>>             gzOut.flush();
>>             gzOut.close();
>>
>>           //create channel
>>          ClientChannel channel = session.createExecChannel("gunzip -c>" + destFile);
>>
>>          ByteArrayInputStream in = new ByteArrayInputStream(baosGZipped.toByteArray());
>>          channel.setIn(in);
>>          ByteArrayOutputStream out = new ByteArrayOutputStream();
>>          channel.setOut(out);
>>          ByteArrayOutputStream err = new ByteArrayOutputStream();
>>          channel.setErr(err);
>>
>>          //open channel
>>          channel.open();
>>
>>          //wait close
>>          channel.waitFor(ClientChannel.CLOSED, 0);
>>
>>
>> What I discovered is that this will never end !!!
>> The problem is, that there's a pumpInputStream thread in (org/apache/sshd/client/channel/ChannelSession.java),
>> that will never end until closeFuture.isClosed. Since this does not happen, the unzip in the remote host doesn't end,
>> and the channel will never close. This prevents the client from a proper pipe implementation.
>>
>> There should be a method to properly end this while-loop thus the remote side will be able to finish and close.
>> Can you please open a bug for this issue ?
>>
>> Thanks !
>> Doron.
>>
>>      
> Anyone ?
>    
Can you open a JIRA ? Sounds like a bug... (see 
http://mina.apache.org/issue-tracking.html)`


Thanks !


-- 
Regards,
Cordialement,
Emmanuel Lécharny
www.nextury.com