Merge "Merge branch 'stable-3.2'"
This commit is contained in:
@@ -62,7 +62,9 @@ import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import org.apache.mina.transport.socket.SocketSessionConfig;
|
||||
import org.apache.sshd.common.BaseBuilder;
|
||||
@@ -72,6 +74,8 @@ import org.apache.sshd.common.cipher.Cipher;
|
||||
import org.apache.sshd.common.compression.BuiltinCompressions;
|
||||
import org.apache.sshd.common.compression.Compression;
|
||||
import org.apache.sshd.common.forward.DefaultForwarderFactory;
|
||||
import org.apache.sshd.common.future.CloseFuture;
|
||||
import org.apache.sshd.common.future.SshFutureListener;
|
||||
import org.apache.sshd.common.io.AbstractIoServiceFactory;
|
||||
import org.apache.sshd.common.io.IoAcceptor;
|
||||
import org.apache.sshd.common.io.IoServiceFactory;
|
||||
@@ -142,6 +146,7 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
|
||||
private final List<HostKey> hostKeys;
|
||||
private volatile IoAcceptor daemonAcceptor;
|
||||
private final Config cfg;
|
||||
private final long gracefulStopTimeout;
|
||||
|
||||
@Inject
|
||||
SshDaemon(
|
||||
@@ -212,6 +217,8 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
|
||||
SshSessionBackend backend = cfg.getEnum("sshd", null, "backend", SshSessionBackend.NIO2);
|
||||
boolean channelIdTracking = cfg.getBoolean("sshd", "enableChannelIdTracking", true);
|
||||
|
||||
gracefulStopTimeout = cfg.getTimeUnit("sshd", null, "gracefulStopTimeout", 0, TimeUnit.SECONDS);
|
||||
|
||||
System.setProperty(
|
||||
IoServiceFactoryFactory.class.getName(),
|
||||
backend == SshSessionBackend.MINA
|
||||
@@ -341,6 +348,12 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
|
||||
public synchronized void stop() {
|
||||
if (daemonAcceptor != null) {
|
||||
try {
|
||||
if (gracefulStopTimeout > 0) {
|
||||
logger.atInfo().log(
|
||||
"Stopping SSHD sessions gracefully with %d seconds timeout.", gracefulStopTimeout);
|
||||
daemonAcceptor.unbind(daemonAcceptor.getBoundAddresses());
|
||||
waitForSessionClose();
|
||||
}
|
||||
daemonAcceptor.close(true).await();
|
||||
shutdownExecutors();
|
||||
logger.atInfo().log("Stopped Gerrit SSHD");
|
||||
@@ -352,6 +365,30 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
|
||||
}
|
||||
}
|
||||
|
||||
private void waitForSessionClose() {
|
||||
Collection<IoSession> ioSessions = daemonAcceptor.getManagedSessions().values();
|
||||
CountDownLatch allSessionsClosed = new CountDownLatch(ioSessions.size());
|
||||
for (IoSession io : ioSessions) {
|
||||
logger.atFine().log("Waiting for session %s to stop.", io.getId());
|
||||
io.addCloseFutureListener(
|
||||
new SshFutureListener<CloseFuture>() {
|
||||
@Override
|
||||
public void operationComplete(CloseFuture future) {
|
||||
allSessionsClosed.countDown();
|
||||
}
|
||||
});
|
||||
}
|
||||
try {
|
||||
if (!allSessionsClosed.await(gracefulStopTimeout, TimeUnit.SECONDS)) {
|
||||
logger.atWarning().log(
|
||||
"Timeout waiting for SSH session to close. SSHD will be shut down immediately.");
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
logger.atWarning().withCause(e).log(
|
||||
"Interrupted waiting for SSH-sessions to close. SSHD will be shut down immediately.");
|
||||
}
|
||||
}
|
||||
|
||||
private void shutdownExecutors() {
|
||||
if (executor != null) {
|
||||
executor.shutdownNow();
|
||||
|
||||
Reference in New Issue
Block a user