Author: gnodet Date: Mon Jul 27 14:00:38 2009 New Revision: 798139 URL: http://svn.apache.org/viewvc?rev=798139&view=rev Log: SSHD-28: Deadlock between execute thread and NioProcessor thread
Added: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/WindowClosedException.java Modified: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java Modified: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java?rev=798139&r1=798138&r2=798139&view=diff ============================================================================== --- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java (original) +++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java Mon Jul 27 14:00:38 2009 @@ -89,6 +89,9 @@ remoteWindow.waitAndConsume(bufferLength); log.debug("Send {} on channel {}", cmd, channel.getId()); channel.getSession().writePacket(buffer); + } catch (WindowClosedException e) { + closed = true; + throw e; } catch (SshException e) { throw e; } catch (Exception e) { Modified: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java?rev=798139&r1=798138&r2=798139&view=diff ============================================================================== --- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java (original) +++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java Mon Jul 27 14:00:38 2009 @@ -20,6 +20,7 @@ import java.io.IOException; +import org.apache.sshd.common.SshException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,6 +45,7 @@ private int maxSize; private int packetSize; private boolean waiting; + private boolean closed; public Window(AbstractChannel channel, Object lock, boolean client, boolean local) { this.channel = channel; @@ -114,9 +116,9 @@ } } - public void waitAndConsume(int len) throws InterruptedException { + public void waitAndConsume(int len) throws InterruptedException, WindowClosedException { synchronized (lock) { - while (size < len) { + while (size < len && !closed) { log.debug("Waiting for {} bytes on {}", len, name); waiting = true; lock.wait(); @@ -125,6 +127,9 @@ log.debug("Space available for {}", name); waiting = false; } + if (closed) { + throw new WindowClosedException(); + } size -= len; if (log.isTraceEnabled()) { log.trace("Consume " + name + " by " + len + " down to " + size); @@ -132,4 +137,12 @@ } } + public void notifyClosed() { + synchronized (lock) { + closed = true; + if (waiting) { + lock.notifyAll(); + } + } + } } Added: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/WindowClosedException.java URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/WindowClosedException.java?rev=798139&view=auto ============================================================================== --- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/WindowClosedException.java (added) +++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/WindowClosedException.java Mon Jul 27 14:00:38 2009 @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.sshd.common.channel; + +import org.apache.sshd.common.SshException; + +/** + * Indicates a {...@link Window} has been closed. + * + * @author <a href="mailto:d...@mina.apache.org">Apache MINA SSHD Project</a> + */ +public class WindowClosedException extends SshException { + public WindowClosedException() { + super("Already closed"); + } +} Modified: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java?rev=798139&r1=798138&r2=798139&view=diff ============================================================================== --- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java (original) +++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java Mon Jul 27 14:00:38 2009 @@ -233,6 +233,7 @@ shell.destroy(); shell = null; } + remoteWindow.notifyClosed(); IoUtils.closeQuietly(in, out, err, shellIn, shellOut, shellErr); } });