summaryrefslogtreecommitdiffstats
path: root/tools/maven/gerrit-extension-api_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:16:28 +0000
commit538beca650cdbd1d4df6684fea8d6fcefa5964ce (patch)
tree45c94e8766ee0b6035480b7f3f452f310c6fd0e1 /tools/maven/gerrit-extension-api_pom.xml
parent3e6ed81a073b08b609fcfbad105a70737f73d5bf (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-extension-api_pom.xml')
0 files changed, 0 insertions, 0 deletions