Assume labels are correct in ListChanges
To reduce end-user latency when displaying changes in a search result
or user dashboard, assume the labels are accurate in the database at
display time and don't recompute the access privileges of a reviewer.
Change-Id: I1316adf627e88fdcde1cd845444d56da9abaeb57
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java
index 144fb07..7652bed 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java
@@ -292,11 +292,11 @@
}
public List<SubmitRecord> canSubmit(ReviewDb db, PatchSet patchSet) {
- return canSubmit(db, patchSet, null);
+ return canSubmit(db, patchSet, null, false);
}
public List<SubmitRecord> canSubmit(ReviewDb db, PatchSet patchSet,
- @Nullable ChangeData cd) {
+ @Nullable ChangeData cd, boolean fastEvalLabels) {
if (change.getStatus().isClosed()) {
SubmitRecord rec = new SubmitRecord();
rec.status = SubmitRecord.Status.CLOSED;
@@ -353,6 +353,10 @@
+ getProject().getName());
}
+ if (fastEvalLabels) {
+ env.once("gerrit", "assume_range_from_label");
+ }
+
try {
for (Term[] template : env.all(
"gerrit", "can_submit",
@@ -391,6 +395,10 @@
parentEnv.once("gerrit", "locate_submit_filter", new VariableTerm());
if (filterRule != null) {
try {
+ if (fastEvalLabels) {
+ env.once("gerrit", "assume_range_from_label");
+ }
+
Term resultsTerm = toListTerm(results);
results.clear();
Term[] template = parentEnv.once(
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ListChanges.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ListChanges.java
index 11b7b54..6f9094a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ListChanges.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ListChanges.java
@@ -226,7 +226,7 @@
PatchSet ps = cd.currentPatchSet(db);
Map<String, LabelInfo> labels = Maps.newLinkedHashMap();
- for (SubmitRecord rec : ctl.canSubmit(db.get(), ps, cd)) {
+ for (SubmitRecord rec : ctl.canSubmit(db.get(), ps, cd, true)) {
if (rec.labels == null) {
continue;
}
diff --git a/gerrit-server/src/main/prolog/gerrit_common.pl b/gerrit-server/src/main/prolog/gerrit_common.pl
index 3313162..5acc831 100644
--- a/gerrit-server/src/main/prolog/gerrit_common.pl
+++ b/gerrit-server/src/main/prolog/gerrit_common.pl
@@ -25,8 +25,7 @@
%% predicate that needs to obtain it.
%%
init :-
- define_hash(commit_labels),
- define_hash(current_user).
+ define_hash(commit_labels).
define_hash(A) :- hash_exists(A), !, hash_clear(A).
define_hash(A) :- atom(A), !, new_hash(_, [alias(A)]).
@@ -98,6 +97,10 @@
%% Lookup the range allowed to be used.
%%
user_label_range(Label, Who, Min, Max) :-
+ hash_get(commit_labels, '$fast_range', true), !,
+ atom(Label),
+ assume_range_from_label(Label, Who, Min, Max).
+user_label_range(Label, Who, Min, Max) :-
Who = user(_), !,
atom(Label),
current_user(Who, User),
@@ -106,6 +109,14 @@
clause(user:test_grant(Label, test_user(Name), range(Min, Max)), _)
.
+assume_range_from_label :-
+ hash_put(commit_labels, '$fast_range', true).
+
+assume_range_from_label(Label, Who, Min, Max) :-
+ commit_label(label(Label, Value), Who), !,
+ Min = Value, Max = Value.
+assume_range_from_label(_, _, 0, 0).
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%