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

Markus Spann commented on SSHD-1058:
------------------------------------

Thanks for pointing out issue SSHD-977 which I was not aware of.

I utilize sshd to offer an administrative rmi console in an application. RMI 
commands also get executed by scripts e.g. checking system health/status 
periodically.
Every such invocation causes an error log now.
We are being called in destroy(ChannelSession) by 
ChannelSession#closeImmediately0. We then go on by calling 
AbstractTerminal#close which ultimately gets the WindowClosedException in 
Window#waitForCondition.


I am wondering whether the solution is to NOT close the terminal after #destroy 
was called?
(Our stackframes start with my.app.rmi)

 
{noformat}
2020-08-17 11:22:43,969 ERROR [sshd-pool-thread-10] 
server.channel.ChannelSession - flush(ChannelOutputStream[ChannelSession[id=0, 
recipient=0]-ServerSessionImpl[rmiadmin@/0:0:0:0:0:0:0:1:58844]] 
SSH_MSG_CHANNEL_DATA) wait for space len=1 exception details
org.apache.sshd.common.channel.WindowClosedException: Already closed: 
Window[server/remote](ChannelSession[id=0, 
recipient=0]-ServerSessionImpl[rmiadmin@/0:0:0:0:0:0:0:1:58844])
  at org.apache.sshd.common.channel.Window.waitForCondition(Window.java:304)
  at org.apache.sshd.common.channel.Window.waitForSpace(Window.java:255)
  at 
org.apache.sshd.common.channel.ChannelOutputStream.flush(ChannelOutputStream.java:197)
  at 
org.apache.sshd.common.channel.ChannelOutputStream.close(ChannelOutputStream.java:271)
  at 
org.jline.terminal.impl.LineDisciplineTerminal$FilteringOutputStream.close(LineDisciplineTerminal.java:306)
  at java.base/sun.nio.cs.StreamEncoder.implClose(StreamEncoder.java:341)
  at java.base/sun.nio.cs.StreamEncoder.close(StreamEncoder.java:161)
  at java.base/java.io.OutputStreamWriter.close(OutputStreamWriter.java:258)
  at java.base/java.io.PrintWriter.close(PrintWriter.java:415)
  at 
org.jline.terminal.impl.LineDisciplineTerminal.doClose(LineDisciplineTerminal.java:270)
  at org.jline.terminal.impl.ExternalTerminal.doClose(ExternalTerminal.java:89)
  at org.jline.terminal.impl.AbstractTerminal.close(AbstractTerminal.java:95)
      at 
my.app.rmi.server.ssh.AbstractEmbeddedShell.close(AbstractEmbeddedShell.java:569)
      at my.app.rmi.server.ssh.EmbeddedShell.close(EmbeddedShell.java:270)
      at 
my.app.rmi.server.ssh.AbstractEmbeddedShell.destroy(AbstractEmbeddedShell.java:515)
  at 
org.apache.sshd.server.channel.ChannelSession.closeImmediately0(ChannelSession.java:213)
  at 
org.apache.sshd.common.util.closeable.Builder$1.doClose(Builder.java:47){noformat}
 

 

> ChannelOutputStream#flush should not log at error level
> -------------------------------------------------------
>
>                 Key: SSHD-1058
>                 URL: https://issues.apache.org/jira/browse/SSHD-1058
>             Project: MINA SSHD
>          Issue Type: Bug
>    Affects Versions: 2.5.0, 2.5.1
>         Environment: Linux, Java 11
>            Reporter: Markus Spann
>            Assignee: Lyor Goldstein
>            Priority: Minor
>
> When calling flush on ChannelOutputStream, Window.waitForSpace may throw a 
> WindowClosedException. This exception is always logged at error level, then 
> rethrown. If Debug is enabled on the logger, the error log is issued twice 
> (second time with stacktrace).
> During deinitialization it is common practice to call flush on output 
> streams. Due to the asynchronous nature of the code in this library, the call 
> may fail. The caller should decide how to deal with the exception and log at 
> error level if needed.
> The implementation should not log at error level regardless.
> I would suggest INFO level instead (if logging at all).
>  
> {code:java}
> // lines 202 ff.
> if (log.isDebugEnabled()) {
>     log.info("flush({}) failed ({}) to wait for space of len={}: {}: ", this, 
> e.getClass().getSimpleName(), total, e.getMessage(), e); // with stacktrace
> } else {
>     log.info("flush({}) failed ({}) to wait for space of len={}: {}",
>  this, e.getClass().getSimpleName(), total, e.getMessage());
> }
> throw e;
> {code}
> Thanks,
> Markus
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@mina.apache.org
For additional commands, e-mail: dev-h...@mina.apache.org

Reply via email to