Community
Participate
Working Groups
Created attachment 288019 [details] Screenshot An error popped up. I think I was opening the Search Type (CMD+SHIFT+T) action: java.lang.ArrayIndexOutOfBoundsException at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) at java.base/java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:603) at java.base/java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:1006) at org.eclipse.jdt.internal.core.search.PatternSearchJob.performParallelSearch(PatternSearchJob.java:154) at org.eclipse.jdt.internal.core.search.PatternSearchJob.execute(PatternSearchJob.java:115) at org.eclipse.jdt.internal.core.search.processing.JobManager.performConcurrentJob(JobManager.java:300) at org.eclipse.jdt.internal.core.search.BasicSearchEngine.searchAllTypeNames(BasicSearchEngine.java:1923) at org.eclipse.jdt.internal.core.search.BasicSearchEngine.searchAllTypeNames(BasicSearchEngine.java:1751) at org.eclipse.jdt.core.search.SearchEngine.searchAllTypeNames(SearchEngine.java:1202) at org.eclipse.jdt.internal.ui.dialogs.FilteredTypesSelectionDialog.fillContentProvider(FilteredTypesSelectionDialog.java:489) at org.eclipse.ui.dialogs.FilteredItemsSelectionDialog$FilterJob.filterContent(FilteredItemsSelectionDialog.java:1959) at org.eclipse.ui.dialogs.FilteredItemsSelectionDialog$FilterJob.internalRun(FilteredItemsSelectionDialog.java:1914) at org.eclipse.ui.dialogs.FilteredItemsSelectionDialog$FilterJob.doRun(FilteredItemsSelectionDialog.java:1891) at org.eclipse.ui.dialogs.FilteredItemsSelectionDialog$FilterJob.run(FilteredItemsSelectionDialog.java:1879) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 2929 out of bounds for length 1461 at org.eclipse.jdt.internal.core.search.matching.TypeDeclarationPattern$PackageNameSet.rehash(TypeDeclarationPattern.java:84) at org.eclipse.jdt.internal.core.search.matching.TypeDeclarationPattern$PackageNameSet.add(TypeDeclarationPattern.java:76) at org.eclipse.jdt.internal.core.search.matching.TypeDeclarationPattern.decodeIndexKey(TypeDeclarationPattern.java:228) at org.eclipse.jdt.core.search.SearchPattern.findIndexMatches(SearchPattern.java:2517) at org.eclipse.jdt.core.search.SearchPattern.findIndexMatches(SearchPattern.java:2479) at org.eclipse.jdt.internal.core.search.matching.MatchLocator.findIndexMatches(MatchLocator.java:306) at org.eclipse.jdt.internal.core.search.PatternSearchJob.search(PatternSearchJob.java:238) at org.eclipse.jdt.internal.core.search.PatternSearchJob.search(PatternSearchJob.java:212) at org.eclipse.jdt.internal.core.search.PatternSearchJob.lambda$0(PatternSearchJob.java:148) at java.base/java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1448) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
org.eclipse.jdt.internal.core.search.matching.TypeDeclarationPattern.internedPackageNames is a static field that can be used by *all* TypeDeclarationPattern instances (including subtype QualifiedTypeDeclarationPattern) *in parallel*, and it doesn't do *anything* to protect itself from concurrent access. So most likely there was parallel search query that updated internedPackageNames via internedPackageNames.add() while the original code was inside internedPackageNames.rehash(). OMG. The code is ancient, so most likely one of recent efforts to parallelize index work uncovered this issue. I assume one solution would be to make PackageNameSet methods synchronized. Another would be to get rid of this interning at all, not sure if that is still needed.
New Gerrit change created: https://git.eclipse.org/r/c/jdt/eclipse.jdt.core/+/190613
Looks like regression from bug 567521.
Gerrit change https://git.eclipse.org/r/c/jdt/eclipse.jdt.core/+/190613 was merged to [master]. Commit: http://git.eclipse.org/c/jdt/eclipse.jdt.core.git/commit/?id=59a4d842bef14c06ca63252b1683405b4906a640
Verified by parsing the code in master.