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,