Bug 578650

Summary: AIOOBE in TypeDeclarationPattern$PackageNameSet.rehash
Product: [Eclipse Project] JDT Reporter: Karsten Thoms <karsten.thoms>
Component: CoreAssignee: Andrey Loskutov <loskutov>
Status: VERIFIED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: loskutov, sravankumarl
Version: 4.19Keywords: regression
Target Milestone: 4.23 M3   
Hardware: PC   
OS: All   
See Also: https://git.eclipse.org/r/c/jdt/eclipse.jdt.core/+/190613
https://bugs.eclipse.org/bugs/show_bug.cgi?id=567521
https://git.eclipse.org/c/jdt/eclipse.jdt.core.git/commit/?id=59a4d842bef14c06ca63252b1683405b4906a640
Whiteboard:
Attachments:
Description Flags
Screenshot none

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.