Allow to inherit receive.maxObjectSizeLimit from parent project

In the current implementation it is possible to set the limit per
project in the project.config on refs/meta/config, and at global
level in $site/etc/gerrit.config. The project setting may override
the global setting if it is lower. Changing the global setting
requires a server restart.

A limitation of this implementation is that we cannot set the limit
at a project level and have it inherited to its child projects; it
is necessary to explicitly set the limit on each child project.

This limitation causes a lot of extra work in the case where for
example we have a project hierarchy like:

  |- All-Projects
     |
     -- Namespace-A
     |  |
     |  |-- Project-A
     |  |-- Project-B
     .  .   ..
     .  .   ..
     |  |-- Project-X
     |
     |
     -- Namespace-B

Where the Namespace-X projects are assumed to be "parent only"
projects, if we want to set a limit for all the projects under a
namespace hierarchy, we need to set it explicitly on all those
projects individually rather than only on the "Namespace-X".

With this change the limit is inherited from the parent project.

The global limit is still respected, and the project still can't
set a higher value than the global, either explicitly per project
or via inheritance.

Similarly, if no global limit is specified, a child project still
may not set a limit higher than its parent.

The inheritedValue is removed from the config info and replaced
by a summary string describing how the effective value was
inherited or overridden from the parent project or the global
config. This string is used as the tooltip on the effective
value in the UI.

As a side effect of this change, it is now possible to effectively
change the global limit without having to restart the server, by
setting it on the All-Projects project. Note that this only works
if the new limit is lower than what is already configured in the
actual global limit in gerrit.config.

Bug: Issue 9528
Change-Id: I5f8b333e905ed0a147526ae33ff2bab2cbe222ef
This commit is contained in:
David Pursehouse
2018-08-23 14:44:14 +09:00
parent dae9b02efe
commit 81f2b5c6f6
12 changed files with 167 additions and 50 deletions

View File

@@ -36,8 +36,6 @@ public interface AdminMessages extends Messages {
String effectiveMaxObjectSizeLimit(String effectiveMaxObjectSizeLimit);
String globalMaxObjectSizeLimit(String globalMaxObjectSizeLimit);
String noMaxObjectSizeLimit();
String pluginProjectOptionsTitle(String pluginName);

View File

@@ -6,7 +6,6 @@ deletedGroup = Deleted Group {0}
deletedReference = Reference {0} was deleted
deletedSection = Section {0} was deleted
effectiveMaxObjectSizeLimit = effective: {0} bytes
globalMaxObjectSizeLimit = The global max object size limit is set to {0}. The limit cannot be increased on project level.
noMaxObjectSizeLimit = No max object size limit is set.
pluginProjectOptionsTitle = {0} Plugin Options
pluginProjectOptionsTitle = {0} Plugin

View File

@@ -404,9 +404,8 @@ public class ProjectInfoScreen extends ProjectScreen {
if (result.maxObjectSizeLimit().value() != null) {
effectiveMaxObjectSizeLimit.setText(
AdminMessages.I.effectiveMaxObjectSizeLimit(result.maxObjectSizeLimit().value()));
if (result.maxObjectSizeLimit().inheritedValue() != null) {
effectiveMaxObjectSizeLimit.setTitle(
AdminMessages.I.globalMaxObjectSizeLimit(result.maxObjectSizeLimit().inheritedValue()));
if (result.maxObjectSizeLimit().summary() != null) {
effectiveMaxObjectSizeLimit.setTitle(result.maxObjectSizeLimit().summary());
}
} else {
effectiveMaxObjectSizeLimit.setText(AdminMessages.I.noMaxObjectSizeLimit());

View File

@@ -158,10 +158,10 @@ public class ConfigInfo extends JavaScriptObject {
public static class MaxObjectSizeLimitInfo extends JavaScriptObject {
public final native String value() /*-{ return this.value; }-*/;
public final native String inheritedValue() /*-{ return this.inherited_value; }-*/;
public final native String configuredValue() /*-{ return this.configured_value }-*/;
public final native String summary() /*-{ return this.summary; }-*/;
protected MaxObjectSizeLimitInfo() {}
}