summaryrefslogtreecommitdiffstats
path: root/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java')
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java81
1 files changed, 11 insertions, 70 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java
index a7a969f5ed..86e0740d18 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java
@@ -17,21 +17,20 @@ package com.google.gerrit.server.git;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
-import com.google.gerrit.reviewdb.Branch;
-import com.google.gerrit.reviewdb.Project;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.RemotePeer;
-import com.google.gerrit.server.RequestCleanup;
import com.google.gerrit.server.config.GerritRequestModule;
import com.google.gerrit.server.ssh.SshInfo;
+import com.google.gerrit.server.util.RequestScopePropagator;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Injector;
-import com.google.inject.Key;
import com.google.inject.OutOfScopeException;
import com.google.inject.Provider;
-import com.google.inject.Scope;
+import com.google.inject.Singleton;
import com.google.inject.servlet.RequestScoped;
import com.jcraft.jsch.HostKey;
@@ -46,6 +45,7 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
+@Singleton
public class ChangeMergeQueue implements MergeQueue {
private static final Logger log =
LoggerFactory.getLogger(ChangeMergeQueue.class);
@@ -65,7 +65,9 @@ public class ChangeMergeQueue implements MergeQueue {
Injector child = parent.createChildInjector(new AbstractModule() {
@Override
protected void configure() {
- bindScope(RequestScoped.class, MyScope.REQUEST);
+ bindScope(RequestScoped.class, PerThreadRequestScope.REQUEST);
+ bind(RequestScopePropagator.class)
+ .to(PerThreadRequestScope.Propagator.class);
install(new GerritRequestModule());
bind(CurrentUser.class).to(IdentifiedUser.class);
@@ -186,8 +188,8 @@ public class ChangeMergeQueue implements MergeQueue {
private void mergeImpl(Branch.NameKey branch) {
try {
- MyScope ctx = new MyScope();
- MyScope old = MyScope.set(ctx);
+ PerThreadRequestScope ctx = new PerThreadRequestScope();
+ PerThreadRequestScope old = PerThreadRequestScope.set(ctx);
try {
try {
bgFactory.get().create(branch).merge();
@@ -195,7 +197,7 @@ public class ChangeMergeQueue implements MergeQueue {
ctx.cleanup.run();
}
} finally {
- MyScope.set(old);
+ PerThreadRequestScope.set(old);
}
} catch (Throwable e) {
log.error("Merge attempt for " + branch + " failed", e);
@@ -261,65 +263,4 @@ public class ChangeMergeQueue implements MergeQueue {
return "recheck " + project.get() + " " + dest.getShortName();
}
}
-
- private static class MyScope {
- private static final ThreadLocal<MyScope> current =
- new ThreadLocal<MyScope>();
-
- private static MyScope getContext() {
- final MyScope ctx = current.get();
- if (ctx == null) {
- throw new OutOfScopeException("Not in command/request");
- }
- return ctx;
- }
-
- static MyScope set(MyScope ctx) {
- MyScope old = current.get();
- current.set(ctx);
- return old;
- }
-
- static final Scope REQUEST = new Scope() {
- public <T> Provider<T> scope(final Key<T> key, final Provider<T> creator) {
- return new Provider<T>() {
- public T get() {
- return getContext().get(key, creator);
- }
-
- @Override
- public String toString() {
- return String.format("%s[%s]", creator, REQUEST);
- }
- };
- }
-
- @Override
- public String toString() {
- return "MergeQueue.REQUEST";
- }
- };
-
- private static final Key<RequestCleanup> RC_KEY =
- Key.get(RequestCleanup.class);
-
- private final RequestCleanup cleanup;
- private final Map<Key<?>, Object> map;
-
- MyScope() {
- cleanup = new RequestCleanup();
- map = new HashMap<Key<?>, Object>();
- map.put(RC_KEY, cleanup);
- }
-
- synchronized <T> T get(Key<T> key, Provider<T> creator) {
- @SuppressWarnings("unchecked")
- T t = (T) map.get(key);
- if (t == null) {
- t = creator.get();
- map.put(key, t);
- }
- return t;
- }
- }
}