Merge "Merge branch 'stable-2.15'"
This commit is contained in:
commit
2312622948
@ -32,6 +32,8 @@ public abstract class AbstractGitCommand extends BaseCommand {
|
||||
@Argument(index = 0, metaVar = "PROJECT.git", required = true, usage = "project name")
|
||||
protected ProjectState projectState;
|
||||
|
||||
@Inject private SshScope sshScope;
|
||||
|
||||
@Inject private GitRepositoryManager repoManager;
|
||||
|
||||
@Inject private SshSession session;
|
||||
@ -47,24 +49,30 @@ public abstract class AbstractGitCommand extends BaseCommand {
|
||||
@Override
|
||||
public void start(Environment env) {
|
||||
Context ctx = context.subContext(newSession(), context.getCommandLine());
|
||||
startThreadWithContext(
|
||||
ctx,
|
||||
new ProjectCommandRunnable() {
|
||||
@Override
|
||||
public void executeParseCommand() throws Exception {
|
||||
parseCommandLine();
|
||||
}
|
||||
final Context old = sshScope.set(ctx);
|
||||
try {
|
||||
startThread(
|
||||
new ProjectCommandRunnable() {
|
||||
@Override
|
||||
public void executeParseCommand() throws Exception {
|
||||
parseCommandLine();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() throws Exception {
|
||||
AbstractGitCommand.this.service();
|
||||
}
|
||||
@Override
|
||||
public void run() throws Exception {
|
||||
AbstractGitCommand.this.service();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project.NameKey getProjectName() {
|
||||
return projectState.getNameKey();
|
||||
}
|
||||
});
|
||||
@Override
|
||||
public Project.NameKey getProjectName() {
|
||||
Project project = projectState.getProject();
|
||||
return project.getNameKey();
|
||||
}
|
||||
},
|
||||
AccessPath.GIT);
|
||||
} finally {
|
||||
sshScope.set(old);
|
||||
}
|
||||
}
|
||||
|
||||
private SshSession newSession() {
|
||||
@ -73,7 +81,6 @@ public abstract class AbstractGitCommand extends BaseCommand {
|
||||
session,
|
||||
session.getRemoteAddress(),
|
||||
userFactory.create(session.getRemoteAddress(), user.getAccountId()));
|
||||
n.setAccessPath(AccessPath.GIT);
|
||||
return n;
|
||||
}
|
||||
|
||||
|
@ -24,6 +24,7 @@ import com.google.gerrit.extensions.annotations.PluginName;
|
||||
import com.google.gerrit.extensions.registration.DynamicMap;
|
||||
import com.google.gerrit.extensions.restapi.AuthException;
|
||||
import com.google.gerrit.reviewdb.client.Project;
|
||||
import com.google.gerrit.server.AccessPath;
|
||||
import com.google.gerrit.server.CurrentUser;
|
||||
import com.google.gerrit.server.DynamicOptions;
|
||||
import com.google.gerrit.server.IdentifiedUser;
|
||||
@ -50,7 +51,6 @@ import java.io.OutputStreamWriter;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
@ -262,25 +262,27 @@ public abstract class BaseCommand implements Command {
|
||||
}
|
||||
|
||||
/**
|
||||
* Spawn a function into its own thread with the provided context.
|
||||
* Spawn a function into its own thread.
|
||||
*
|
||||
* <p>Typically this should be invoked within {@link Command#start(Environment)}, such as:
|
||||
*
|
||||
* <pre>
|
||||
* startThreadWithContext(SshScope.Context context, new CommandRunnable() {
|
||||
* startThread(new CommandRunnable() {
|
||||
* public void run() throws Exception {
|
||||
* runImp();
|
||||
* }
|
||||
* });
|
||||
* },
|
||||
* accessPath);
|
||||
* </pre>
|
||||
*
|
||||
* <p>If the function throws an exception, it is translated to a simple message for the client, a
|
||||
* non-zero exit code, and the stack trace is logged.
|
||||
*
|
||||
* @param thunk the runnable to execute on the thread, performing the command's logic.
|
||||
* @param accessPath the path used by the end user for running the SSH command
|
||||
*/
|
||||
protected void startThreadWithContext(SshScope.Context context, CommandRunnable thunk) {
|
||||
final TaskThunk tt = new TaskThunk(thunk, Optional.ofNullable(context));
|
||||
protected void startThread(final CommandRunnable thunk, AccessPath accessPath) {
|
||||
final TaskThunk tt = new TaskThunk(thunk, accessPath);
|
||||
|
||||
if (isAdminHighPriorityCommand()) {
|
||||
// Admin commands should not block the main work threads (there
|
||||
@ -293,28 +295,6 @@ public abstract class BaseCommand implements Command {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Spawn a function into its own thread.
|
||||
*
|
||||
* <p>Typically this should be invoked within {@link Command#start(Environment)}, such as:
|
||||
*
|
||||
* <pre>
|
||||
* startThread(new CommandRunnable() {
|
||||
* public void run() throws Exception {
|
||||
* runImp();
|
||||
* }
|
||||
* });
|
||||
* </pre>
|
||||
*
|
||||
* <p>If the function throws an exception, it is translated to a simple message for the client, a
|
||||
* non-zero exit code, and the stack trace is logged.
|
||||
*
|
||||
* @param thunk the runnable to execute on the thread, performing the command's logic.
|
||||
*/
|
||||
protected void startThread(final CommandRunnable thunk) {
|
||||
startThreadWithContext(null, thunk);
|
||||
}
|
||||
|
||||
private boolean isAdminHighPriorityCommand() {
|
||||
if (getClass().getAnnotation(AdminHighPriorityCommand.class) != null) {
|
||||
try {
|
||||
@ -439,21 +419,21 @@ public abstract class BaseCommand implements Command {
|
||||
|
||||
private final class TaskThunk implements CancelableRunnable, ProjectRunnable {
|
||||
private final CommandRunnable thunk;
|
||||
private final Context taskContext;
|
||||
private final String taskName;
|
||||
private final AccessPath accessPath;
|
||||
|
||||
private Project.NameKey projectName;
|
||||
|
||||
private TaskThunk(CommandRunnable thunk, Optional<Context> oneOffContext) {
|
||||
private TaskThunk(final CommandRunnable thunk, AccessPath accessPath) {
|
||||
this.thunk = thunk;
|
||||
this.taskName = getTaskName();
|
||||
this.taskContext = oneOffContext.orElse(context);
|
||||
this.accessPath = accessPath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel() {
|
||||
synchronized (this) {
|
||||
final Context old = sshScope.set(taskContext);
|
||||
final Context old = sshScope.set(context);
|
||||
try {
|
||||
onExit(STATUS_CANCEL);
|
||||
} finally {
|
||||
@ -468,7 +448,8 @@ public abstract class BaseCommand implements Command {
|
||||
final Thread thisThread = Thread.currentThread();
|
||||
final String thisName = thisThread.getName();
|
||||
int rc = 0;
|
||||
final Context old = sshScope.set(taskContext);
|
||||
context.getSession().setAccessPath(accessPath);
|
||||
final Context old = sshScope.set(context);
|
||||
try {
|
||||
context.started = TimeUtil.nowMs();
|
||||
thisThread.setName("SSH " + taskName);
|
||||
|
@ -14,6 +14,7 @@
|
||||
|
||||
package com.google.gerrit.sshd;
|
||||
|
||||
import com.google.gerrit.server.AccessPath;
|
||||
import com.google.gerrit.server.logging.TraceContext;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
@ -46,7 +47,8 @@ public abstract class SshCommand extends BaseCommand {
|
||||
stderr.flush();
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
AccessPath.SSH_COMMAND);
|
||||
}
|
||||
|
||||
protected abstract void run() throws UnloggedFailure, Failure, Exception;
|
||||
|
@ -25,6 +25,7 @@ package com.google.gerrit.sshd.commands;
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
|
||||
import com.google.common.flogger.FluentLogger;
|
||||
import com.google.gerrit.server.AccessPath;
|
||||
import com.google.gerrit.server.tools.ToolsCatalog;
|
||||
import com.google.gerrit.server.tools.ToolsCatalog.Entry;
|
||||
import com.google.gerrit.sshd.BaseCommand;
|
||||
@ -82,7 +83,7 @@ final class ScpCommand extends BaseCommand {
|
||||
|
||||
@Override
|
||||
public void start(Environment env) {
|
||||
startThread(this::runImp);
|
||||
startThread(this::runImp, AccessPath.SSH_COMMAND);
|
||||
}
|
||||
|
||||
private void runImp() {
|
||||
|
Loading…
Reference in New Issue
Block a user