From 23c416f30f4a1e69e76b70d71f6a9a7da4a020f1 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Thu, 10 Apr 2014 18:58:09 -0400 Subject: [PATCH] Hook-up comprensive command cleanup (destroy) --- src/main/java/com/gitblit/transport/ssh/commands/SshCommandFactory.java | 58 +++++++++++++++++++++++++++++++--------------------------- 1 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/gitblit/transport/ssh/commands/SshCommandFactory.java b/src/main/java/com/gitblit/transport/ssh/commands/SshCommandFactory.java index 3eefcae..8f7144d 100644 --- a/src/main/java/com/gitblit/transport/ssh/commands/SshCommandFactory.java +++ b/src/main/java/com/gitblit/transport/ssh/commands/SshCommandFactory.java @@ -20,6 +20,8 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.atomic.AtomicBoolean; @@ -39,6 +41,7 @@ import com.gitblit.utils.IdGenerator; import com.gitblit.utils.WorkQueue; import com.google.common.util.concurrent.Atomics; +import com.google.common.util.concurrent.ThreadFactoryBuilder; /** * @@ -50,6 +53,7 @@ private final IGitblit gitblit; private final ScheduledExecutorService startExecutor; + private final ExecutorService destroyExecutor; public SshCommandFactory(IGitblit gitblit, IdGenerator idGenerator) { this.gitblit = gitblit; @@ -57,6 +61,15 @@ int threads = 2;// cfg.getInt("sshd","commandStartThreads", 2); WorkQueue workQueue = new WorkQueue(idGenerator); startExecutor = workQueue.createQueue(threads, "SshCommandStart"); + destroyExecutor = Executors.newSingleThreadExecutor( + new ThreadFactoryBuilder() + .setNameFormat("SshCommandDestroy-%s") + .setDaemon(true) + .build()); + } + + public void stop() { + destroyExecutor.shutdownNow(); } public RootDispatcher createRootDispatcher(SshDaemonClient client, String commandLine) { @@ -166,27 +179,23 @@ } private int translateExit(final int rc) { - return rc; - // - // switch (rc) { - // case BaseCommand.STATUS_NOT_ADMIN: - // return 1; - // - // case BaseCommand.STATUS_CANCEL: - // return 15 /* SIGKILL */; - // - // case BaseCommand.STATUS_NOT_FOUND: - // return 127 /* POSIX not found */; - // - // default: - // return rc; - // } + switch (rc) { + case BaseCommand.STATUS_NOT_ADMIN: + return 1; + case BaseCommand.STATUS_CANCEL: + return 15 /* SIGKILL */; + + case BaseCommand.STATUS_NOT_FOUND: + return 127 /* POSIX not found */; + + default: + return rc; + } } private void log(final int rc) { if (logged.compareAndSet(false, true)) { - // log.onExecute(cmd, rc); logger.info("onExecute: {} exits with: {}", cmd.getClass().getSimpleName(), rc); } } @@ -196,27 +205,22 @@ Future<?> future = task.getAndSet(null); if (future != null) { future.cancel(true); - // destroyExecutor.execute(new Runnable() { - // @Override - // public void run() { - // onDestroy(); - // } - // }); + destroyExecutor.execute(new Runnable() { + @Override + public void run() { + onDestroy(); + } + }); } } - @SuppressWarnings("unused") private void onDestroy() { synchronized (this) { if (cmd != null) { - // final Context old = sshScope.set(ctx); try { cmd.destroy(); - // log(BaseCommand.STATUS_CANCEL); } finally { - // ctx = null; cmd = null; - // sshScope.set(old); } } } -- Gitblit v1.9.1