summaryrefslogtreecommitdiffstats
path: root/tools/maven/gerrit-acceptance-framework_pom.xml
diff options
context:
space:
mode:
authorEdwin Kempin <ekempin@google.com>2024-02-19 16:14:03 +0000
committerEdwin Kempin <ekempin@google.com>2024-04-12 07:00:03 +0000
commitfb8b4fd0e619c5494bd5ec1be43f1e7172a1c405 (patch)
treee2832b4df516b35feaf85b53c9e9ed8107d08830 /tools/maven/gerrit-acceptance-framework_pom.xml
parent6869130f5e502c742cb38719bc05df6ce3d80881 (diff)
Fix endless loop when using "is:watched" in project watches
The "is:watched" predicate matches changes that are being watched. To match changes that are being watched the "is:watched" predicate is expanded to an OR query that has one "project:<watched-project> <project-watch-filter>" predicate per project watch ("project:<watched-project>" is omitted if the project watch is the All-Projects project, "<project-watch-filter>" is omitted if the project watch doesn't set a filter). This expansion happens when the IsWatchedByPredicate is instantiated. Expanding the query requires loading the project watches of the user and parsing the filter (to convert the filter string into Predicates). If the filter of a project watch used the "is:watched" predicate, querying changes by "is:watched" or checking whether a change matches the project watch triggered an endless loop: If "is:watched" is used ChangeQueryBuilder.parse creates an IsWatchedByPredicate instance (in the is(String) method), which is expanded to the OR query (in the IsWatchedByPredicate constructor), which requires parsing the project watch filters. Parsing the project watch filters was done by ChangeQueryBuilder.parse which creates another IsWatchedByPredicate instance (in the is(String) method), which is again expanded to the OR query (in the IsWatchedByPredicate constructor), which again requires parsing the project watch filters, starting the loop anew. To fix this we: 1. Disallow using "is:watched" in ProjectWatch.WatcherChangeQueryBuilder which is a subclass of ChangeQueryBuilder.parse used to check whether a change matches a project watch. 2. Change IsWatchedByPredicate to use ProjectWatch.WatcherChangeQueryBuilder to parse the project watch filters instead of ChangeQueryBuilder. Using ProjectWatch.WatcherChangeQueryBuilder in IsWatchedByPredicate makes the matching logic for project watches when a change is updated consistent with the matching logic for project watches when "is:watched" is used in a regular change query. By disallowing "is:watched" in ProjectWatch.WatcherChangeQueryBuilder project watches that use "is:watched" in their filter do not match any change now. Before this change they triggered an endless loop, affecting the stability of the service. Note, IsWatchedByPredicate did have a check to prevent an endless loop in this case, but it didn't work since the endless loop happened before this check was reached. Bug: Issue 321784734 Release-Notes: Fix endless loop when using "is:watched" in project watches Change-Id: Ie38535b2df123a62dfd6a6e4b4ee60a80b0254f3 Signed-off-by: Edwin Kempin <ekempin@google.com>
Diffstat (limited to 'tools/maven/gerrit-acceptance-framework_pom.xml')
0 files changed, 0 insertions, 0 deletions