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