Merge "Enable plugins in BATCH mode"
This commit is contained in:
@@ -109,6 +109,24 @@ will be performed by scanning all classes in the plugin JAR for
|
|||||||
Gerrit-HttpModule: tld.example.project.HttpModuleClassName
|
Gerrit-HttpModule: tld.example.project.HttpModuleClassName
|
||||||
----
|
----
|
||||||
|
|
||||||
|
=== Batch runtime
|
||||||
|
|
||||||
|
Gerrit can be run as a server, serving HTTP or SSH requests, or as an
|
||||||
|
offline program. Plugins can contribute Guice modules to this batch
|
||||||
|
runtime by binding `Gerrit-BatchModule` to one of their classes.
|
||||||
|
The Guice injector is bound to less classes, and some Gerrit features
|
||||||
|
will be absent - on purpose.
|
||||||
|
|
||||||
|
This feature was originally introduced to support plugins during an
|
||||||
|
offline reindexing task.
|
||||||
|
|
||||||
|
----
|
||||||
|
Gerrit-BatchModule: tld.example.project.CoreModuleClassName
|
||||||
|
----
|
||||||
|
|
||||||
|
In this runtime, only the module designated by `Gerrit-BatchModule` is
|
||||||
|
enabled, not `Gerrit-SysModule`.
|
||||||
|
|
||||||
[[plugin_name]]
|
[[plugin_name]]
|
||||||
=== Plugin Name
|
=== Plugin Name
|
||||||
|
|
||||||
@@ -2840,6 +2858,9 @@ public class MyPluginModule extends AbstractModule {
|
|||||||
}
|
}
|
||||||
----
|
----
|
||||||
|
|
||||||
|
Plugin authors should also consider binding their SubmitRule using a `Gerrit-BatchModule`.
|
||||||
|
See link:dev-plugins.html[Batch runtime] for more informations.
|
||||||
|
|
||||||
== SEE ALSO
|
== SEE ALSO
|
||||||
|
|
||||||
* link:js-api.html[JavaScript API]
|
* link:js-api.html[JavaScript API]
|
||||||
|
@@ -34,6 +34,7 @@ import com.google.gerrit.server.index.DummyIndexModule;
|
|||||||
import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
|
import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
|
||||||
import com.google.gerrit.server.notedb.rebuild.GcAllUsers;
|
import com.google.gerrit.server.notedb.rebuild.GcAllUsers;
|
||||||
import com.google.gerrit.server.notedb.rebuild.NoteDbMigrator;
|
import com.google.gerrit.server.notedb.rebuild.NoteDbMigrator;
|
||||||
|
import com.google.gerrit.server.plugins.PluginGuiceEnvironment;
|
||||||
import com.google.gerrit.server.schema.DataSourceType;
|
import com.google.gerrit.server.schema.DataSourceType;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.google.inject.Injector;
|
import com.google.inject.Injector;
|
||||||
@@ -118,6 +119,9 @@ public class MigrateToNoteDb extends SiteProgram {
|
|||||||
sysInjector.injectMembers(this);
|
sysInjector.injectMembers(this);
|
||||||
sysManager = new LifecycleManager();
|
sysManager = new LifecycleManager();
|
||||||
sysManager.add(sysInjector);
|
sysManager.add(sysInjector);
|
||||||
|
sysInjector
|
||||||
|
.getInstance(PluginGuiceEnvironment.class)
|
||||||
|
.setDbCfgInjector(dbInjector, dbInjector);
|
||||||
sysManager.start();
|
sysManager.start();
|
||||||
|
|
||||||
try (NoteDbMigrator migrator =
|
try (NoteDbMigrator migrator =
|
||||||
|
@@ -35,6 +35,7 @@ import com.google.gerrit.server.config.GerritServerConfig;
|
|||||||
import com.google.gerrit.server.index.IndexModule;
|
import com.google.gerrit.server.index.IndexModule;
|
||||||
import com.google.gerrit.server.index.IndexModule.IndexType;
|
import com.google.gerrit.server.index.IndexModule.IndexType;
|
||||||
import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
|
import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
|
||||||
|
import com.google.gerrit.server.plugins.PluginGuiceEnvironment;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.google.inject.Injector;
|
import com.google.inject.Injector;
|
||||||
import com.google.inject.Key;
|
import com.google.inject.Key;
|
||||||
@@ -72,6 +73,7 @@ public class Reindex extends SiteProgram {
|
|||||||
|
|
||||||
private Injector dbInjector;
|
private Injector dbInjector;
|
||||||
private Injector sysInjector;
|
private Injector sysInjector;
|
||||||
|
private Injector cfgInjector;
|
||||||
private Config globalConfig;
|
private Config globalConfig;
|
||||||
|
|
||||||
@Inject private Collection<IndexDefinition<?, ?, ?>> indexDefs;
|
@Inject private Collection<IndexDefinition<?, ?, ?>> indexDefs;
|
||||||
@@ -80,6 +82,7 @@ public class Reindex extends SiteProgram {
|
|||||||
public int run() throws Exception {
|
public int run() throws Exception {
|
||||||
mustHaveValidSite();
|
mustHaveValidSite();
|
||||||
dbInjector = createDbInjector(MULTI_USER);
|
dbInjector = createDbInjector(MULTI_USER);
|
||||||
|
cfgInjector = dbInjector.createChildInjector();
|
||||||
globalConfig = dbInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
|
globalConfig = dbInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
|
||||||
threads = ThreadLimiter.limitThreads(dbInjector, threads);
|
threads = ThreadLimiter.limitThreads(dbInjector, threads);
|
||||||
overrideConfig();
|
overrideConfig();
|
||||||
@@ -88,9 +91,11 @@ public class Reindex extends SiteProgram {
|
|||||||
dbManager.start();
|
dbManager.start();
|
||||||
|
|
||||||
sysInjector = createSysInjector();
|
sysInjector = createSysInjector();
|
||||||
|
sysInjector.getInstance(PluginGuiceEnvironment.class).setDbCfgInjector(dbInjector, cfgInjector);
|
||||||
LifecycleManager sysManager = new LifecycleManager();
|
LifecycleManager sysManager = new LifecycleManager();
|
||||||
sysManager.add(sysInjector);
|
sysManager.add(sysInjector);
|
||||||
sysManager.start();
|
sysManager.start();
|
||||||
|
|
||||||
sysInjector.injectMembers(this);
|
sysInjector.injectMembers(this);
|
||||||
checkIndicesOption();
|
checkIndicesOption();
|
||||||
|
|
||||||
|
@@ -65,6 +65,7 @@ import com.google.gerrit.server.patch.DiffExecutorModule;
|
|||||||
import com.google.gerrit.server.patch.PatchListCacheImpl;
|
import com.google.gerrit.server.patch.PatchListCacheImpl;
|
||||||
import com.google.gerrit.server.permissions.DefaultPermissionBackendModule;
|
import com.google.gerrit.server.permissions.DefaultPermissionBackendModule;
|
||||||
import com.google.gerrit.server.permissions.SectionSortCache;
|
import com.google.gerrit.server.permissions.SectionSortCache;
|
||||||
|
import com.google.gerrit.server.plugins.PluginModule;
|
||||||
import com.google.gerrit.server.project.CommentLinkProvider;
|
import com.google.gerrit.server.project.CommentLinkProvider;
|
||||||
import com.google.gerrit.server.project.CommitResource;
|
import com.google.gerrit.server.project.CommitResource;
|
||||||
import com.google.gerrit.server.project.ProjectCacheImpl;
|
import com.google.gerrit.server.project.ProjectCacheImpl;
|
||||||
@@ -111,7 +112,16 @@ public class BatchProgramModule extends FactoryModule {
|
|||||||
install(BatchUpdate.module());
|
install(BatchUpdate.module());
|
||||||
install(PatchListCacheImpl.module());
|
install(PatchListCacheImpl.module());
|
||||||
|
|
||||||
// Plugins are not loaded and we're just running through each change
|
// There is the concept of LifecycleModule, in Gerrit's own extension to Guice, which has these:
|
||||||
|
// listener().to(SomeClassImplementingLifecycleListener.class);
|
||||||
|
// and the start() methods of each such listener are executed in the order they are declared.
|
||||||
|
// Makes sure that PluginLoader.start() is executed before the LuceneIndexModule.start() so that
|
||||||
|
// plugins get loaded and the respective Guice modules installed so that the on-line reindexing
|
||||||
|
// will happen with the proper classes (e.g. group backends, custom Prolog predicates) and the
|
||||||
|
// associated rules ready to be evaluated.
|
||||||
|
install(new PluginModule());
|
||||||
|
|
||||||
|
// We're just running through each change
|
||||||
// once, so don't worry about cache removal.
|
// once, so don't worry about cache removal.
|
||||||
bind(new TypeLiteral<DynamicSet<CacheRemovalListener>>() {})
|
bind(new TypeLiteral<DynamicSet<CacheRemovalListener>>() {})
|
||||||
.toInstance(DynamicSet.<CacheRemovalListener>emptySet());
|
.toInstance(DynamicSet.<CacheRemovalListener>emptySet());
|
||||||
|
@@ -46,6 +46,7 @@ public class ServerPlugin extends Plugin {
|
|||||||
private final String metricsPrefix;
|
private final String metricsPrefix;
|
||||||
private final GerritRuntime gerritRuntime;
|
private final GerritRuntime gerritRuntime;
|
||||||
protected Class<? extends Module> sysModule;
|
protected Class<? extends Module> sysModule;
|
||||||
|
protected Class<? extends Module> batchModule;
|
||||||
protected Class<? extends Module> sshModule;
|
protected Class<? extends Module> sshModule;
|
||||||
protected Class<? extends Module> httpModule;
|
protected Class<? extends Module> httpModule;
|
||||||
|
|
||||||
@@ -91,6 +92,7 @@ public class ServerPlugin extends Plugin {
|
|||||||
String sysName = main.getValue("Gerrit-Module");
|
String sysName = main.getValue("Gerrit-Module");
|
||||||
String sshName = main.getValue("Gerrit-SshModule");
|
String sshName = main.getValue("Gerrit-SshModule");
|
||||||
String httpName = main.getValue("Gerrit-HttpModule");
|
String httpName = main.getValue("Gerrit-HttpModule");
|
||||||
|
String batchName = main.getValue("Gerrit-BatchModule");
|
||||||
|
|
||||||
if (!Strings.isNullOrEmpty(sshName) && getApiType() != Plugin.ApiType.PLUGIN) {
|
if (!Strings.isNullOrEmpty(sshName) && getApiType() != Plugin.ApiType.PLUGIN) {
|
||||||
throw new InvalidPluginException(
|
throw new InvalidPluginException(
|
||||||
@@ -99,6 +101,7 @@ public class ServerPlugin extends Plugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
this.batchModule = load(batchName, classLoader);
|
||||||
this.sysModule = load(sysName, classLoader);
|
this.sysModule = load(sysName, classLoader);
|
||||||
this.sshModule = load(sshName, classLoader);
|
this.sshModule = load(sshName, classLoader);
|
||||||
this.httpModule = load(httpName, classLoader);
|
this.httpModule = load(httpName, classLoader);
|
||||||
@@ -108,7 +111,7 @@ public class ServerPlugin extends Plugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
protected static Class<? extends Module> load(String name, ClassLoader pluginLoader)
|
protected static Class<? extends Module> load(@Nullable String name, ClassLoader pluginLoader)
|
||||||
throws ClassNotFoundException {
|
throws ClassNotFoundException {
|
||||||
if (Strings.isNullOrEmpty(name)) {
|
if (Strings.isNullOrEmpty(name)) {
|
||||||
return null;
|
return null;
|
||||||
@@ -180,6 +183,18 @@ public class ServerPlugin extends Plugin {
|
|||||||
serverManager = new LifecycleManager();
|
serverManager = new LifecycleManager();
|
||||||
serverManager.add(root);
|
serverManager.add(root);
|
||||||
|
|
||||||
|
if (gerritRuntime == GerritRuntime.BATCH) {
|
||||||
|
if (batchModule != null) {
|
||||||
|
sysInjector = root.createChildInjector(root.getInstance(batchModule));
|
||||||
|
serverManager.add(sysInjector);
|
||||||
|
} else {
|
||||||
|
sysInjector = root;
|
||||||
|
}
|
||||||
|
|
||||||
|
serverManager.start();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
AutoRegisterModules auto = null;
|
AutoRegisterModules auto = null;
|
||||||
if (sysModule == null && sshModule == null && httpModule == null) {
|
if (sysModule == null && sshModule == null && httpModule == null) {
|
||||||
auto = new AutoRegisterModules(getName(), env, scanner, classLoader);
|
auto = new AutoRegisterModules(getName(), env, scanner, classLoader);
|
||||||
|
Reference in New Issue
Block a user