Details
-
Bug
-
Status: Resolved (View Workflow)
-
Major
-
Resolution: Fixed
Description
The current search box is very inefficient when checking for suggestions. When a user enters part of a username waiting for the autocomplete to finish, if there are a lot of users it can take a very long time.
While running a search in the search box I ran a quick thread dump to find out where the suggest was being stuck at and found:
Handling GET /jenkins/search/suggest : … state=RUNNABLE at java.lang.String$CaseInsensitiveComparator.compare(String.java:1170) at java.lang.String.compareToIgnoreCase(String.java:1220) at hudson.model.User$1.compare(User.java:397) at hudson.model.User$1.compare(User.java:395) at java.util.TimSort.mergeLo(TimSort.java:687) at java.util.TimSort.mergeAt(TimSort.java:483) at java.util.TimSort.mergeCollapse(TimSort.java:408) at java.util.TimSort.sort(TimSort.java:214) at java.util.TimSort.sort(TimSort.java:173) at java.util.Arrays.sort(Arrays.java:659) at java.util.Collections.sort(Collections.java:217) at hudson.model.User.getAll(User.java:395) at hudson.model.User$FullNameIdResolver.resolveCanonicalId(User.java:735) at hudson.model.User.get(User.java:326) at hudson.model.User.get(User.java:299) at hudson.model.User.get(User.java:354) at hudson.model.User.current(User.java:366) at hudson.search.UserSearchProperty.isCaseInsensitive(UserSearchProperty.java:26) at hudson.search.CollectionSearchIndex.suggest(CollectionSearchIndex.java:61) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:63) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:63) at hudson.search.Search$Mode$2.find(Search.java:192) at hudson.search.Search.find(Search.java:343) at hudson.search.Search.suggest(Search.java:268) at hudson.search.Search.getSuggestions(Search.java:134) at hudson.search.Search.doSuggest(Search.java:117)
Attachments
Activity
Field | Original Value | New Value |
---|---|---|
Description | The current search box is very inefficient when checking for suggestions. | The current search box is very inefficient when checking for suggestions. When a user enters part of a username waiting for the autocomplete to finish, if there are a lot of users it can take a very long time. |
Description | The current search box is very inefficient when checking for suggestions. When a user enters part of a username waiting for the autocomplete to finish, if there are a lot of users it can take a very long time. |
The current search box is very inefficient when checking for suggestions. When a user enters part of a username waiting for the autocomplete to finish, if there are a lot of users it can take a very long time. While running a search in the search box I ran a quick thread dump to find out where the suggest was being stuck at and found: Handling GET /jenkins/search/suggest : … state=RUNNABLE at java.lang.String$CaseInsensitiveComparator.compare(String.java:1170) at java.lang.String.compareToIgnoreCase(String.java:1220) at hudson.model.User$1.compare(User.java:397) at hudson.model.User$1.compare(User.java:395) at java.util.TimSort.mergeLo(TimSort.java:687) at java.util.TimSort.mergeAt(TimSort.java:483) at java.util.TimSort.mergeCollapse(TimSort.java:408) at java.util.TimSort.sort(TimSort.java:214) at java.util.TimSort.sort(TimSort.java:173) at java.util.Arrays.sort(Arrays.java:659) at java.util.Collections.sort(Collections.java:217) at hudson.model.User.getAll(User.java:395) at hudson.model.User$FullNameIdResolver.resolveCanonicalId(User.java:735) at hudson.model.User.get(User.java:326) at hudson.model.User.get(User.java:299) at hudson.model.User.get(User.java:354) at hudson.model.User.current(User.java:366) at hudson.search.UserSearchProperty.isCaseInsensitive(UserSearchProperty.java:26) at hudson.search.CollectionSearchIndex.suggest(CollectionSearchIndex.java:61) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:63) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:63) at hudson.search.Search$Mode$2.find(Search.java:192) at hudson.search.Search.find(Search.java:343) at hudson.search.Search.suggest(Search.java:268) at hudson.search.Search.getSuggestions(Search.java:134) at hudson.search.Search.doSuggest(Search.java:117) |
Description |
The current search box is very inefficient when checking for suggestions. When a user enters part of a username waiting for the autocomplete to finish, if there are a lot of users it can take a very long time. While running a search in the search box I ran a quick thread dump to find out where the suggest was being stuck at and found: Handling GET /jenkins/search/suggest : … state=RUNNABLE at java.lang.String$CaseInsensitiveComparator.compare(String.java:1170) at java.lang.String.compareToIgnoreCase(String.java:1220) at hudson.model.User$1.compare(User.java:397) at hudson.model.User$1.compare(User.java:395) at java.util.TimSort.mergeLo(TimSort.java:687) at java.util.TimSort.mergeAt(TimSort.java:483) at java.util.TimSort.mergeCollapse(TimSort.java:408) at java.util.TimSort.sort(TimSort.java:214) at java.util.TimSort.sort(TimSort.java:173) at java.util.Arrays.sort(Arrays.java:659) at java.util.Collections.sort(Collections.java:217) at hudson.model.User.getAll(User.java:395) at hudson.model.User$FullNameIdResolver.resolveCanonicalId(User.java:735) at hudson.model.User.get(User.java:326) at hudson.model.User.get(User.java:299) at hudson.model.User.get(User.java:354) at hudson.model.User.current(User.java:366) at hudson.search.UserSearchProperty.isCaseInsensitive(UserSearchProperty.java:26) at hudson.search.CollectionSearchIndex.suggest(CollectionSearchIndex.java:61) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:63) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:63) at hudson.search.Search$Mode$2.find(Search.java:192) at hudson.search.Search.find(Search.java:343) at hudson.search.Search.suggest(Search.java:268) at hudson.search.Search.getSuggestions(Search.java:134) at hudson.search.Search.doSuggest(Search.java:117) |
The current search box is very inefficient when checking for suggestions. When a user enters part of a username waiting for the autocomplete to finish, if there are a lot of users it can take a very long time. While running a search in the search box I ran a quick thread dump to find out where the suggest was being stuck at and found: {noformat}Handling GET /jenkins/search/suggest : … state=RUNNABLE at java.lang.String$CaseInsensitiveComparator.compare(String.java:1170) at java.lang.String.compareToIgnoreCase(String.java:1220) at hudson.model.User$1.compare(User.java:397) at hudson.model.User$1.compare(User.java:395) at java.util.TimSort.mergeLo(TimSort.java:687) at java.util.TimSort.mergeAt(TimSort.java:483) at java.util.TimSort.mergeCollapse(TimSort.java:408) at java.util.TimSort.sort(TimSort.java:214) at java.util.TimSort.sort(TimSort.java:173) at java.util.Arrays.sort(Arrays.java:659) at java.util.Collections.sort(Collections.java:217) at hudson.model.User.getAll(User.java:395) at hudson.model.User$FullNameIdResolver.resolveCanonicalId(User.java:735) at hudson.model.User.get(User.java:326) at hudson.model.User.get(User.java:299) at hudson.model.User.get(User.java:354) at hudson.model.User.current(User.java:366) at hudson.search.UserSearchProperty.isCaseInsensitive(UserSearchProperty.java:26) at hudson.search.CollectionSearchIndex.suggest(CollectionSearchIndex.java:61) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:63) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:62) at hudson.search.UnionSearchIndex.suggest(UnionSearchIndex.java:63) at hudson.search.Search$Mode$2.find(Search.java:192) at hudson.search.Search.find(Search.java:343) at hudson.search.Search.suggest(Search.java:268) at hudson.search.Search.getSuggestions(Search.java:134) at hudson.search.Search.doSuggest(Search.java:117){noformat} |
Labels | performance |
Resolution | Fixed [ 1 ] | |
Status | Open [ 1 ] | Resolved [ 5 ] |
Labels | performance | lts-candidate performance |
Labels | lts-candidate performance | 1.554.1-fixed performance |
Workflow | JNJira [ 154046 ] | JNJira + In-Review [ 194768 ] |
The fix this issue in https://github.com/jenkinsci/jenkins/pull/1143. We are executing UserSearchProperty.isCaseInsensitive(); once per item which is a very expensive operation because it calls User.current(); which in turn calls a getAll. Instead this fix just calls the UserSearchProperty.isCaseInsensitive(); once and saves the result.