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