Move PushQueue and ReplicationQueue to singletons managed by Guice

Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
Shawn O. Pearce
2009-07-28 11:18:50 -07:00
parent f722b5ca86
commit 20fe732921
16 changed files with 412 additions and 303 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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 {

View File

@@ -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 =

View File

@@ -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");
}

View File

@@ -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 {