eclipse-jdt / eclipse.jdt.core

Eclipse Public License 2.0
157 stars 125 forks source link

Sporadic test hang in the indexer code #797

Open iloveeclipse opened 1 year ago

iloveeclipse commented 1 year ago

JDT Jenkins tests sporadically hang in indexer code (again). This time it seems the indexer managed to acquire and never release a write lock. The index in question is the meta-index.

Related :

Most important parts from stack

Test waits for IndexManager lock

"main": BLOCKED
    org.eclipse.jdt.internal.core.search.indexing.IndexManager.findMatchingIndexNames(IndexManager.java:1600)
    org.eclipse.jdt.internal.core.search.IndexSelector.getIndexLocations(IndexSelector.java:319)
    org.eclipse.jdt.internal.core.search.JavaSearchParticipant.selectIndexURLs(JavaSearchParticipant.java:160)
    org.eclipse.jdt.internal.core.search.PatternSearchJob.getIndexes(PatternSearchJob.java:186)
    org.eclipse.jdt.internal.core.search.SubTypeSearchJob.getIndexes(SubTypeSearchJob.java:47)
    org.eclipse.jdt.internal.core.search.PatternSearchJob.ensureReadyToRun(PatternSearchJob.java:99)
    org.eclipse.jdt.internal.core.search.processing.JobManager.performConcurrentJob(JobManager.java:262)
    org.eclipse.jdt.internal.core.hierarchy.IndexBasedHierarchyBuilder.legacySearchAllPossibleSubTypes(IndexBasedHierarchyBuilder.java:605)
    org.eclipse.jdt.internal.core.hierarchy.IndexBasedHierarchyBuilder.searchAllPossibleSubTypes(IndexBasedHierarchyBuilder.java:506)
    org.eclipse.jdt.internal.core.hierarchy.IndexBasedHierarchyBuilder.determinePossibleSubTypes(IndexBasedHierarchyBuilder.java:465)
    org.eclipse.jdt.internal.core.hierarchy.IndexBasedHierarchyBuilder.build(IndexBasedHierarchyBuilder.java:158)
    org.eclipse.jdt.internal.core.hierarchy.TypeHierarchy.compute(TypeHierarchy.java:323)
    org.eclipse.jdt.internal.core.hierarchy.TypeHierarchy.refresh(TypeHierarchy.java:1319)
    org.eclipse.jdt.internal.core.CreateTypeHierarchyOperation.executeOperation(CreateTypeHierarchyOperation.java:94)
    org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:740)
    org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:806)
    org.eclipse.jdt.internal.core.SourceType.newTypeHierarchy(SourceType.java:950)
    org.eclipse.jdt.core.tests.model.WorkingCopyOwnerTests.testHierarchy(WorkingCopyOwnerTests.java:939)
    java.base@19.0.1/java.lang.invoke.LambdaForm$DMH/0x000000080120e400.invokeVirtual(LambdaForm$DMH)
    java.base@19.0.1/java.lang.invoke.LambdaForm$MH/0x00000008010b8800.invoke(LambdaForm$MH)
    java.base@19.0.1/java.lang.invoke.Invokers$Holder.invokeExact_MT(Invokers$Holder)
    java.base@19.0.1/jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(DirectMethodHandleAccessor.java:154)
    java.base@19.0.1/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    java.base@19.0.1/java.lang.reflect.Method.invoke(Method.java:578)
    junit.framework.TestCase.runTest(TestCase.java:177)
    org.eclipse.jdt.core.tests.junit.extension.TestCase.runTest(TestCase.java:983)
    junit.framework.TestCase.runBare(TestCase.java:142)
    junit.framework.TestResult$1.protect(TestResult.java:122)
    junit.framework.TestResult.runProtected(TestResult.java:142)
    junit.framework.TestResult.run(TestResult.java:125)
    junit.framework.TestCase.run(TestCase.java:130)
    junit.framework.TestSuite.runTest(TestSuite.java:241)
    org.eclipse.jdt.core.tests.model.SuiteOfTestCases$Suite.runTest(SuiteOfTestCases.java:114)
    junit.framework.TestSuite.run(TestSuite.java:236)
    org.eclipse.jdt.core.tests.model.SuiteOfTestCases$Suite.superRun(SuiteOfTestCases.java:98)
    org.eclipse.jdt.core.tests.model.SuiteOfTestCases$Suite$1.protect(SuiteOfTestCases.java:86)
    junit.framework.TestResult.runProtected(TestResult.java:142)
    org.eclipse.jdt.core.tests.model.SuiteOfTestCases$Suite.run(SuiteOfTestCases.java:95)

Indexer holds IndexManager lock and waits for write lock on particular index

"Java indexing": WAITING
    java.base@19.0.1/java.lang.Object.wait0(Native Method)
    java.base@19.0.1/java.lang.Object.wait(Object.java:366)
    java.base@19.0.1/java.lang.Object.wait(Object.java:339)
    org.eclipse.jdt.internal.core.search.indexing.ReadWriteMonitor.enterWrite(ReadWriteMonitor.java:49)
    org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveMetaIndex(IndexManager.java:1247)
    org.eclipse.jdt.internal.core.search.indexing.IndexManager.saveIndexes(IndexManager.java:1225)
    org.eclipse.jdt.internal.core.search.indexing.IndexManager.notifyIdle(IndexManager.java:838)
    org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:487)
    org.eclipse.jdt.internal.core.search.processing.JobManager$$Lambda$165/0x0000000801275d58.run(Unknown Source)
    java.base@19.0.1/java.lang.Thread.run(Thread.java:1589)
iloveeclipse commented 1 year ago

Reminds me on https://bugs.eclipse.org/bugs/show_bug.cgi?id=574171 and 6fd51ccf52d0a6c35917eb2f6119bf314b21a7fc. However, this time I don't see index monitor locked for write in the "main" thread...

iloveeclipse commented 1 year ago

Same hang in https://ci.eclipse.org/jdt/job/eclipse.jdt.core-Github/job/PR-1001/2/consoleText

jukzi commented 1 year ago

Indexer holds IndexManager lock and waits for write lock on particular index

Don't understand that statement. The enterWrite() is called outside the synchronized (this) ! image