Merge "Fix caching for SubmitRecords in ChangeData"
diff --git a/java/com/google/gerrit/server/query/change/ChangeData.java b/java/com/google/gerrit/server/query/change/ChangeData.java
index f047543..bf56000 100644
--- a/java/com/google/gerrit/server/query/change/ChangeData.java
+++ b/java/com/google/gerrit/server/query/change/ChangeData.java
@@ -872,36 +872,25 @@
}
public List<SubmitRecord> submitRecords(SubmitRuleOptions options) {
- List<SubmitRecord> records = getCachedSubmitRecord(options);
+ // If the change is not submitted yet, 'strict' and 'lenient' both have the same result. If the
+ // change is submitted, SubmitRecord requested with 'strict' will contain just a single entry
+ // that with status=CLOSED. The latter is cheap to evaluate as we don't have to run any actual
+ // evaluation.
+ List<SubmitRecord> records = submitRecords.get(options);
if (records == null) {
if (!lazyLoad) {
return Collections.emptyList();
}
records = submitRuleEvaluatorFactory.create(options).evaluate(this);
submitRecords.put(options, records);
+ if (!change().isClosed() && submitRecords.size() == 1) {
+ // Cache the SubmitRecord with allowClosed = !allowClosed as the SubmitRecord are the same.
+ submitRecords.put(options.toBuilder().allowClosed(!options.allowClosed()).build(), records);
+ }
}
return records;
}
- @Nullable
- public List<SubmitRecord> getSubmitRecords(SubmitRuleOptions options) {
- return getCachedSubmitRecord(options);
- }
-
- private List<SubmitRecord> getCachedSubmitRecord(SubmitRuleOptions options) {
- List<SubmitRecord> records = submitRecords.get(options);
- if (records != null) {
- return records;
- }
-
- if (options.allowClosed() && change != null && change.getStatus().isOpen()) {
- SubmitRuleOptions openSubmitRuleOptions = options.toBuilder().allowClosed(false).build();
- return submitRecords.get(openSubmitRuleOptions);
- }
-
- return null;
- }
-
public void setSubmitRecords(SubmitRuleOptions options, List<SubmitRecord> records) {
submitRecords.put(options, records);
}
diff --git a/java/com/google/gerrit/server/submit/MergeOp.java b/java/com/google/gerrit/server/submit/MergeOp.java
index 4e732a4..f486650 100644
--- a/java/com/google/gerrit/server/submit/MergeOp.java
+++ b/java/com/google/gerrit/server/submit/MergeOp.java
@@ -189,7 +189,7 @@
// date by this point.
ChangeData cd = requireNonNull(changes.get(id), () -> String.format("ChangeData for %s", id));
return requireNonNull(
- cd.getSubmitRecords(submitRuleOptions(allowClosed)),
+ cd.submitRecords(submitRuleOptions(allowClosed)),
"getSubmitRecord only valid after submit rules are evalutated");
}