Bug 578650 - AIOOBE in TypeDeclarationPattern$PackageNameSet.rehash
Summary: AIOOBE in TypeDeclarationPattern$PackageNameSet.rehash
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 4.19   Edit
Hardware: PC All
: P3 normal (vote)
Target Milestone: 4.23 M3   Edit
Assignee: Andrey Loskutov CLA
QA Contact:
URL:
Whiteboard:
Keywords: regression
Depends on:
Blocks:
 
Reported: 2022-02-09 04:31 EST by Karsten Thoms CLA
Modified: 2022-02-16 03:48 EST (History)
2 users (show)

See Also:


Attachments
Screenshot (318.43 KB, image/png)
2022-02-09 04:31 EST, Karsten Thoms CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Karsten Thoms CLA 2022-02-09 04:31:41 EST
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)
Comment 1 Andrey Loskutov CLA 2022-02-09 05:25:02 EST
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.
Comment 2 Eclipse Genie CLA 2022-02-09 05:28:57 EST
New Gerrit change created: https://git.eclipse.org/r/c/jdt/eclipse.jdt.core/+/190613
Comment 3 Andrey Loskutov CLA 2022-02-09 05:30:53 EST
Looks like regression from bug 567521.
Comment 5 Sravan Kumar Lakkimsetti CLA 2022-02-16 03:48:15 EST
Verified by parsing the code in master.