IndexConfig: Configure maxLimit from Config An index implementation may not have an inherent upper bound to the limit, but administrators may nonetheless want to restrict the maximum query size at the server level for performance reasons. Change-Id: Ic1f506e9857413ec860fe97785bff9e76b817db0
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt index 61c764a..797178b 100644 --- a/Documentation/config-gerrit.txt +++ b/Documentation/config-gerrit.txt
@@ -2205,6 +2205,14 @@ + Defaults to true. +[[index.maxLimit]]index.maxLimit:: ++ +Maximum limit to allow for search queries. Requesting results above this +limit will truncate the list (but will still set `_more_changes` on +result lists). Set to 0 for no limit. ++ +Defaults to no limit. + ==== Lucene configuration Open and closed changes are indexed in separate indexes named
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java index 0fc11d9..35d6636 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java
@@ -16,6 +16,7 @@ import com.google.gerrit.extensions.events.LifecycleListener; import com.google.gerrit.lifecycle.LifecycleModule; +import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.index.ChangeSchemas; import com.google.gerrit.server.index.IndexCollection; import com.google.gerrit.server.index.IndexConfig; @@ -26,6 +27,8 @@ import com.google.inject.Provides; import com.google.inject.Singleton; +import org.eclipse.jgit.lib.Config; + public class LuceneIndexModule extends LifecycleModule { private final Integer singleVersion; private final int threads; @@ -44,7 +47,6 @@ @Override protected void configure() { - bind(IndexConfig.class).toInstance(IndexConfig.createDefault()); factory(LuceneChangeIndex.Factory.class); install(new IndexModule(threads)); if (singleVersion == null && base == null) { @@ -54,6 +56,12 @@ } } + @Provides + @Singleton + IndexConfig getIndexConfig(@GerritServerConfig Config cfg) { + return IndexConfig.fromConfig(cfg); + } + private static class MultiVersionModule extends LifecycleModule { @Override public void configure() {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexConfig.java index 1857e55..5a22bc7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexConfig.java
@@ -18,6 +18,8 @@ import com.google.auto.value.AutoValue; +import org.eclipse.jgit.lib.Config; + /** * Implementation-specific configuration for secondary indexes. * <p> @@ -28,11 +30,19 @@ @AutoValue public abstract class IndexConfig { public static IndexConfig createDefault() { - return create(Integer.MAX_VALUE); + return create(0); + } + + public static IndexConfig fromConfig(Config cfg) { + return create(cfg.getInt("index", null, "maxLimit", 0)); } public static IndexConfig create(int maxLimit) { - checkArgument(maxLimit > 0, "maxLimit must be positive: %s", maxLimit); + if (maxLimit == 0) { + maxLimit = Integer.MAX_VALUE; + } else { + checkArgument(maxLimit > 0, "maxLimit must be positive: %s", maxLimit); + } return new AutoValue_IndexConfig(maxLimit); }
diff --git a/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrIndexModule.java b/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrIndexModule.java index 38de6ee..0133e33 100644 --- a/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrIndexModule.java +++ b/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrIndexModule.java
@@ -50,7 +50,6 @@ @Override protected void configure() { - bind(IndexConfig.class).toInstance(IndexConfig.createDefault()); install(new IndexModule(threads)); bind(ChangeIndex.class).to(SolrChangeIndex.class); listener().to(SolrChangeIndex.class); @@ -61,6 +60,12 @@ @Provides @Singleton + IndexConfig getIndexConfig(@GerritServerConfig Config cfg) { + return IndexConfig.fromConfig(cfg); + } + + @Provides + @Singleton public SolrChangeIndex getChangeIndex(@GerritServerConfig Config cfg, Provider<ReviewDb> db, ChangeData.Factory changeDataFactory,