Move PushQueue and ReplicationQueue to singletons managed by Guice
Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
@@ -40,9 +40,12 @@ import java.util.List;
|
||||
|
||||
class ChangeManageServiceImpl extends BaseServiceImplementation implements
|
||||
ChangeManageService {
|
||||
private final MergeQueue merger;
|
||||
|
||||
@Inject
|
||||
ChangeManageServiceImpl(final GerritServer gs) {
|
||||
ChangeManageServiceImpl(final GerritServer gs, final MergeQueue mq) {
|
||||
super(gs);
|
||||
merger = mq;
|
||||
}
|
||||
|
||||
public void patchSetAction(final ApprovalCategoryValue.Id value,
|
||||
@@ -135,7 +138,7 @@ class ChangeManageServiceImpl extends BaseServiceImplementation implements
|
||||
txn.commit();
|
||||
|
||||
if (change.getStatus() == Change.Status.SUBMITTED) {
|
||||
MergeQueue.merge(change.getDest());
|
||||
merger.merge(change.getDest());
|
||||
}
|
||||
|
||||
return VoidResult.INSTANCE;
|
||||
|
@@ -20,8 +20,6 @@ import com.google.gerrit.client.data.ProjectCache;
|
||||
import com.google.gerrit.client.reviewdb.AccountGroup;
|
||||
import com.google.gerrit.client.reviewdb.ApprovalCategory;
|
||||
import com.google.gerrit.client.reviewdb.ApprovalCategoryValue;
|
||||
import com.google.gerrit.client.reviewdb.Branch;
|
||||
import com.google.gerrit.client.reviewdb.Change;
|
||||
import com.google.gerrit.client.reviewdb.Project;
|
||||
import com.google.gerrit.client.reviewdb.ProjectRight;
|
||||
import com.google.gerrit.client.reviewdb.ReviewDb;
|
||||
@@ -30,10 +28,6 @@ import com.google.gerrit.client.reviewdb.SystemConfig;
|
||||
import com.google.gerrit.client.reviewdb.TrustedExternalId;
|
||||
import com.google.gerrit.client.reviewdb.SystemConfig.LoginType;
|
||||
import com.google.gerrit.client.rpc.Common;
|
||||
import com.google.gerrit.git.MergeQueue;
|
||||
import com.google.gerrit.git.PushAllProjectsOp;
|
||||
import com.google.gerrit.git.PushQueue;
|
||||
import com.google.gerrit.git.WorkQueue;
|
||||
import com.google.gerrit.server.mail.EmailException;
|
||||
import com.google.gerrit.server.patch.DiffCacheEntryFactory;
|
||||
import com.google.gerrit.server.ssh.SshKeyCacheEntryFactory;
|
||||
@@ -82,11 +76,9 @@ import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import javax.naming.InitialContext;
|
||||
import javax.naming.NamingException;
|
||||
@@ -139,20 +131,9 @@ public class GerritServer {
|
||||
*/
|
||||
public static synchronized GerritServer getInstance() throws OrmException,
|
||||
XsrfException {
|
||||
return getInstance(true);
|
||||
}
|
||||
|
||||
public static synchronized GerritServer getInstance(final boolean startQueues)
|
||||
throws OrmException, XsrfException {
|
||||
if (impl == null) {
|
||||
try {
|
||||
impl = new GerritServer();
|
||||
if (startQueues) {
|
||||
impl.reloadSubmitQueue();
|
||||
if (PushQueue.isReplicationEnabled()) {
|
||||
WorkQueue.schedule(new PushAllProjectsOp(impl), 30, TimeUnit.SECONDS);
|
||||
}
|
||||
}
|
||||
} catch (OrmException e) {
|
||||
closeDataSource();
|
||||
log.error("GerritServer ORM is unavailable", e);
|
||||
@@ -744,35 +725,6 @@ public class GerritServer {
|
||||
WindowCache.reconfigure(c);
|
||||
}
|
||||
|
||||
private void reloadSubmitQueue() {
|
||||
WorkQueue.schedule(new Runnable() {
|
||||
public void run() {
|
||||
final HashSet<Branch.NameKey> pending = new HashSet<Branch.NameKey>();
|
||||
try {
|
||||
final ReviewDb c = db.open();
|
||||
try {
|
||||
for (final Change change : c.changes().allSubmitted()) {
|
||||
pending.add(change.getDest());
|
||||
}
|
||||
} finally {
|
||||
c.close();
|
||||
}
|
||||
} catch (OrmException e) {
|
||||
log.error("Cannot reload MergeQueue", e);
|
||||
}
|
||||
|
||||
for (final Branch.NameKey branch : pending) {
|
||||
MergeQueue.schedule(branch);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Reload Submit Queue";
|
||||
}
|
||||
}, 15, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
/** Time (in seconds) that user sessions stay "signed in". */
|
||||
public int getSessionAge() {
|
||||
return sessionAge;
|
||||
|
@@ -15,17 +15,21 @@
|
||||
package com.google.gerrit.server;
|
||||
|
||||
import com.google.gerrit.client.data.GerritConfig;
|
||||
import com.google.gerrit.git.ChangeMergeQueue;
|
||||
import com.google.gerrit.git.MergeQueue;
|
||||
import com.google.gerrit.git.PushReplication;
|
||||
import com.google.gerrit.git.ReplicationQueue;
|
||||
import com.google.gwtjsonrpc.server.XsrfException;
|
||||
import com.google.gwtorm.client.OrmException;
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Scopes;
|
||||
import static com.google.inject.Scopes.SINGLETON;
|
||||
|
||||
/** Starts {@link GerritServer} with standard dependencies. */
|
||||
public class GerritServerModule extends AbstractModule {
|
||||
@Override
|
||||
protected void configure() {
|
||||
try {
|
||||
bind(GerritServer.class).toInstance(GerritServer.getInstance(true));
|
||||
bind(GerritServer.class).toInstance(GerritServer.getInstance());
|
||||
} catch (OrmException e) {
|
||||
addError(e);
|
||||
} catch (XsrfException e) {
|
||||
@@ -34,7 +38,9 @@ public class GerritServerModule extends AbstractModule {
|
||||
|
||||
bind(ContactStore.class).toProvider(EncryptedContactStoreProvider.class);
|
||||
bind(FileTypeRegistry.class).to(MimeUtilFileTypeRegistry.class);
|
||||
bind(ReplicationQueue.class).to(PushReplication.class).in(SINGLETON);
|
||||
bind(MergeQueue.class).to(ChangeMergeQueue.class).in(SINGLETON);
|
||||
bind(GerritConfig.class).toProvider(GerritConfigProvider.class).in(
|
||||
Scopes.SINGLETON);
|
||||
SINGLETON);
|
||||
}
|
||||
}
|
||||
|
@@ -14,6 +14,12 @@
|
||||
|
||||
package com.google.gerrit.server;
|
||||
|
||||
import com.google.gerrit.client.reviewdb.Branch;
|
||||
import com.google.gerrit.client.reviewdb.Change;
|
||||
import com.google.gerrit.client.reviewdb.ReviewDb;
|
||||
import com.google.gerrit.git.MergeQueue;
|
||||
import com.google.gerrit.git.PushAllProjectsOp;
|
||||
import com.google.gerrit.git.ReplicationQueue;
|
||||
import com.google.gerrit.git.WorkQueue;
|
||||
import com.google.gerrit.server.patch.PatchDetailServiceImpl;
|
||||
import com.google.gerrit.server.ssh.GerritSshDaemon;
|
||||
@@ -21,6 +27,7 @@ import com.google.gerrit.server.ssh.SshDaemonModule;
|
||||
import com.google.gerrit.server.ssh.SshServlet;
|
||||
import com.google.gwtexpui.server.CacheControlFilter;
|
||||
import com.google.gwtjsonrpc.client.RemoteJsonService;
|
||||
import com.google.gwtorm.client.OrmException;
|
||||
import com.google.inject.BindingAnnotation;
|
||||
import com.google.inject.ConfigurationException;
|
||||
import com.google.inject.Guice;
|
||||
@@ -31,16 +38,24 @@ import com.google.inject.Scopes;
|
||||
import com.google.inject.servlet.GuiceServletContextListener;
|
||||
import com.google.inject.servlet.ServletModule;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.security.ProviderException;
|
||||
import java.util.HashSet;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import javax.servlet.ServletContextEvent;
|
||||
|
||||
/** Configures the web application environment for Gerrit Code Review. */
|
||||
public class GerritServletConfig extends GuiceServletContextListener {
|
||||
private static final Logger log =
|
||||
LoggerFactory.getLogger(GerritServletConfig.class);
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@BindingAnnotation
|
||||
private static @interface ServletName {
|
||||
@@ -124,8 +139,7 @@ public class GerritServletConfig extends GuiceServletContextListener {
|
||||
}
|
||||
|
||||
private final Injector injector =
|
||||
Guice.createInjector(createServletModule(),
|
||||
new GerritServerModule(),
|
||||
Guice.createInjector(createServletModule(), new GerritServerModule(),
|
||||
new SshDaemonModule());
|
||||
|
||||
@Override
|
||||
@@ -137,17 +151,72 @@ public class GerritServletConfig extends GuiceServletContextListener {
|
||||
public void contextInitialized(final ServletContextEvent event) {
|
||||
super.contextInitialized(event);
|
||||
|
||||
try {
|
||||
startReplication();
|
||||
} catch (ConfigurationException e) {
|
||||
log.error("Unable to restart replication queue", e);
|
||||
} catch (ProviderException e) {
|
||||
log.error("Unable to restart replication queue", e);
|
||||
}
|
||||
|
||||
try {
|
||||
restartPendingMerges();
|
||||
} catch (ConfigurationException e) {
|
||||
log.error("Unable to restart merge queue", e);
|
||||
} catch (ProviderException e) {
|
||||
log.error("Unable to restart merge queue", e);
|
||||
}
|
||||
|
||||
try {
|
||||
injector.getInstance(GerritSshDaemon.class).start();
|
||||
} catch (ConfigurationException e) {
|
||||
event.getServletContext().log("Unable to start SSHD", e);
|
||||
log.error("Unable to start SSHD", e);
|
||||
} catch (ProviderException e) {
|
||||
event.getServletContext().log("Unable to start SSHD", e);
|
||||
log.error("Unable to start SSHD", e);
|
||||
} catch (IOException e) {
|
||||
event.getServletContext().log("Unable to start SSHD", e);
|
||||
log.error("Unable to start SSHD", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void startReplication() {
|
||||
final ReplicationQueue rq = injector.getInstance(ReplicationQueue.class);
|
||||
if (rq.isEnabled()) {
|
||||
final GerritServer gs = injector.getInstance(GerritServer.class);
|
||||
WorkQueue.schedule(new PushAllProjectsOp(gs, rq), 30, TimeUnit.SECONDS);
|
||||
}
|
||||
}
|
||||
|
||||
private void restartPendingMerges() {
|
||||
final MergeQueue mq = injector.getInstance(MergeQueue.class);
|
||||
final GerritServer gs = injector.getInstance(GerritServer.class);
|
||||
WorkQueue.schedule(new Runnable() {
|
||||
public void run() {
|
||||
final HashSet<Branch.NameKey> pending = new HashSet<Branch.NameKey>();
|
||||
try {
|
||||
final ReviewDb c = gs.getSchemaFactory().open();
|
||||
try {
|
||||
for (final Change change : c.changes().allSubmitted()) {
|
||||
pending.add(change.getDest());
|
||||
}
|
||||
} finally {
|
||||
c.close();
|
||||
}
|
||||
} catch (OrmException e) {
|
||||
log.error("Cannot reload MergeQueue", e);
|
||||
}
|
||||
|
||||
for (final Branch.NameKey branch : pending) {
|
||||
mq.schedule(branch);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Reload Submit Queue";
|
||||
}
|
||||
}, 15, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void contextDestroyed(final ServletContextEvent event) {
|
||||
try {
|
||||
|
@@ -30,7 +30,7 @@ import com.google.gerrit.client.rpc.Common;
|
||||
import com.google.gerrit.client.rpc.InvalidNameException;
|
||||
import com.google.gerrit.client.rpc.InvalidRevisionException;
|
||||
import com.google.gerrit.client.rpc.NoSuchEntityException;
|
||||
import com.google.gerrit.git.PushQueue;
|
||||
import com.google.gerrit.git.ReplicationQueue;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwtjsonrpc.client.VoidResult;
|
||||
import com.google.gwtorm.client.OrmException;
|
||||
@@ -67,9 +67,12 @@ class ProjectAdminServiceImpl extends BaseServiceImplementation implements
|
||||
ProjectAdminService {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
|
||||
private final ReplicationQueue replication;
|
||||
|
||||
@Inject
|
||||
ProjectAdminServiceImpl(final GerritServer gs) {
|
||||
ProjectAdminServiceImpl(final GerritServer gs, final ReplicationQueue rq) {
|
||||
super(gs);
|
||||
replication = rq;
|
||||
}
|
||||
|
||||
public void ownedProjects(final AsyncCallback<List<Project>> callback) {
|
||||
@@ -313,7 +316,7 @@ class ProjectAdminServiceImpl extends BaseServiceImplementation implements
|
||||
case FORCED:
|
||||
db.branches().delete(Collections.singleton(m));
|
||||
deleted.add(mKey);
|
||||
PushQueue.scheduleUpdate(mKey.getParentKey(), m.getName());
|
||||
replication.scheduleUpdate(mKey.getParentKey(), m.getName());
|
||||
break;
|
||||
|
||||
case REJECTED_CURRENT_BRANCH:
|
||||
@@ -423,7 +426,7 @@ class ProjectAdminServiceImpl extends BaseServiceImplementation implements
|
||||
case FAST_FORWARD:
|
||||
case NEW:
|
||||
case NO_CHANGE:
|
||||
PushQueue.scheduleUpdate(name.getParentKey(), refname);
|
||||
replication.scheduleUpdate(name.getParentKey(), refname);
|
||||
break;
|
||||
default: {
|
||||
final String msg =
|
||||
|
@@ -17,8 +17,9 @@ package com.google.gerrit.server.ssh;
|
||||
import com.google.gerrit.client.reviewdb.Project;
|
||||
import com.google.gerrit.client.rpc.Common;
|
||||
import com.google.gerrit.git.PushAllProjectsOp;
|
||||
import com.google.gerrit.git.PushQueue;
|
||||
import com.google.gerrit.git.ReplicationQueue;
|
||||
import com.google.gerrit.git.WorkQueue;
|
||||
import com.google.inject.Inject;
|
||||
|
||||
import org.kohsuke.args4j.Argument;
|
||||
import org.kohsuke.args4j.Option;
|
||||
@@ -38,6 +39,9 @@ class AdminReplicate extends AbstractCommand {
|
||||
@Argument(index = 0, multiValued = true, metaVar = "PROJECT", usage = "project name")
|
||||
private List<String> projectNames = new ArrayList<String>(2);
|
||||
|
||||
@Inject
|
||||
private ReplicationQueue replication;
|
||||
|
||||
@Override
|
||||
protected void run() throws Failure {
|
||||
assertIsAdministrator();
|
||||
@@ -46,19 +50,19 @@ class AdminReplicate extends AbstractCommand {
|
||||
throw new Failure(1, "error: cannot combine --all and PROJECT");
|
||||
}
|
||||
|
||||
if (!PushQueue.isReplicationEnabled()) {
|
||||
if (!replication.isEnabled()) {
|
||||
throw new Failure(1, "error: replication not enabled");
|
||||
}
|
||||
|
||||
if (all) {
|
||||
WorkQueue.schedule(new PushAllProjectsOp(getGerritServer(), urlMatch), 0,
|
||||
TimeUnit.SECONDS);
|
||||
WorkQueue.schedule(new PushAllProjectsOp(server, replication, urlMatch),
|
||||
0, TimeUnit.SECONDS);
|
||||
|
||||
} else {
|
||||
for (final String name : projectNames) {
|
||||
final Project.NameKey key = new Project.NameKey(name);
|
||||
if (Common.getProjectCache().get(key) != null) {
|
||||
PushQueue.scheduleFullSync(key, urlMatch);
|
||||
replication.scheduleFullSync(key, urlMatch);
|
||||
} else {
|
||||
throw new Failure(1, "error: '" + name + "': not a Gerrit project");
|
||||
}
|
||||
|
@@ -41,7 +41,7 @@ import com.google.gerrit.client.reviewdb.PatchSetInfo;
|
||||
import com.google.gerrit.client.reviewdb.ReviewDb;
|
||||
import com.google.gerrit.client.rpc.Common;
|
||||
import com.google.gerrit.git.PatchSetImporter;
|
||||
import com.google.gerrit.git.PushQueue;
|
||||
import com.google.gerrit.git.ReplicationQueue;
|
||||
import com.google.gerrit.server.ChangeUtil;
|
||||
import com.google.gerrit.server.mail.CreateChangeSender;
|
||||
import com.google.gerrit.server.mail.EmailException;
|
||||
@@ -50,6 +50,7 @@ import com.google.gerrit.server.mail.ReplacePatchSetSender;
|
||||
import com.google.gwtorm.client.OrmException;
|
||||
import com.google.gwtorm.client.OrmRunnable;
|
||||
import com.google.gwtorm.client.Transaction;
|
||||
import com.google.inject.Inject;
|
||||
|
||||
import org.kohsuke.args4j.CmdLineException;
|
||||
import org.kohsuke.args4j.Option;
|
||||
@@ -127,6 +128,9 @@ class Receive extends AbstractGitCommand {
|
||||
}
|
||||
}
|
||||
|
||||
@Inject
|
||||
private ReplicationQueue replication;
|
||||
|
||||
private ReceivePack rp;
|
||||
private PersonIdent refLogIdent;
|
||||
private ReceiveCommand newChange;
|
||||
@@ -192,7 +196,7 @@ class Receive extends AbstractGitCommand {
|
||||
// We only schedule heads and tags for replication.
|
||||
// Change refs are scheduled when they are created.
|
||||
//
|
||||
PushQueue.scheduleUpdate(proj.getNameKey(), c.getRefName());
|
||||
replication.scheduleUpdate(proj.getNameKey(), c.getRefName());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -755,7 +759,7 @@ class Receive extends AbstractGitCommand {
|
||||
throw new IOException("Failed to create ref " + ps.getRefName() + " in "
|
||||
+ repo.getDirectory() + ": " + ru.getResult());
|
||||
}
|
||||
PushQueue.scheduleUpdate(proj.getNameKey(), ru.getName());
|
||||
replication.scheduleUpdate(proj.getNameKey(), ru.getName());
|
||||
|
||||
allNewChanges.add(change.getId());
|
||||
|
||||
@@ -1015,7 +1019,7 @@ class Receive extends AbstractGitCommand {
|
||||
throw new IOException("Failed to create ref " + ps.getRefName()
|
||||
+ " in " + repo.getDirectory() + ": " + ru.getResult());
|
||||
}
|
||||
PushQueue.scheduleUpdate(proj.getNameKey(), ru.getName());
|
||||
replication.scheduleUpdate(proj.getNameKey(), ru.getName());
|
||||
cmd.setResult(ReceiveCommand.Result.OK);
|
||||
|
||||
try {
|
||||
|
Reference in New Issue
Block a user