-
Notifications
You must be signed in to change notification settings - Fork 207
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Need to hold a write lock to clear result caches assertion error #128
Comments
testModelBuilderBug262785 (org.eclipse.cdt.core.model.tests.CModelBuilderBugsTest) failed with the same assertion error. |
testTripleLinear (org.eclipse.cdt.internal.index.tests.IndexCompositeTests) failed was the original failure |
testModelBuilderBug274490 (org.eclipse.cdt.core.model.tests.CModelBuilderBugsTest) failed for the same reason. |
And another: testModelBuilderBug222398 (org.eclipse.cdt.core.model.tests.CModelBuilderBugsTest) |
Here is a trace of the test failing showing all the acquiring and releasing of the locksExpected number (0) of Non-OK status objects in log differs from actual (1).
Error while parsing /testPreprocessorNodes/DeclaratorsTests.cpp. java.lang.reflect.InvocationTargetException
Stack Trace
java.lang.reflect.InvocationTargetException
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.getMaskedException(AbstractIndexerTask.java:1206)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.swallowError(AbstractIndexerTask.java:1192)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseFile(AbstractIndexerTask.java:1128)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseLinkage(AbstractIndexerTask.java:910)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:572)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: java.lang.AssertionError: Need to hold a write lock to clear result caches
at org.eclipse.cdt.internal.core.index.WritableCIndex.clearResultCache(WritableCIndex.java:169)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.storeSymbolsInIndex(PDOMWriter.java:353)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.addSymbols(PDOMWriter.java:287)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.writeToIndex(AbstractIndexerTask.java:1295)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseFile(AbstractIndexerTask.java:1107)
... 5 more
junit.framework.AssertionFailedError:
Expected number (0) of Non-OK status objects in log differs from actual (1).
Error while parsing /testPreprocessorNodes/DeclaratorsTests.cpp. java.lang.reflect.InvocationTargetException
Stack Trace
java.lang.reflect.InvocationTargetException
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.getMaskedException(AbstractIndexerTask.java:1206)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.swallowError(AbstractIndexerTask.java:1192)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseFile(AbstractIndexerTask.java:1128)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseLinkage(AbstractIndexerTask.java:910)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:572)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: java.lang.AssertionError: Need to hold a write lock to clear result caches
at org.eclipse.cdt.internal.core.index.WritableCIndex.clearResultCache(WritableCIndex.java:169)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.storeSymbolsInIndex(PDOMWriter.java:353)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.addSymbols(PDOMWriter.java:287)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.writeToIndex(AbstractIndexerTask.java:1295)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseFile(AbstractIndexerTask.java:1107)
... 5 more
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.AssertionError: Need to hold a write lock to clear result caches
java.lang.Exception: 49: Acquiered lock in thread Worker-354: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.acquireWriteLock(WritableCIndex.java:124)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMRebuildTask.clearIndex(PDOMRebuildTask.java:103)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMRebuildTask.run(PDOMRebuildTask.java:80)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 49: clearResultCache(true) in thread Worker-354: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.clearResultCache(WritableCIndex.java:167)
at org.eclipse.cdt.internal.core.index.WritableCIndex.releaseWriteLock(WritableCIndex.java:143)
at org.eclipse.cdt.internal.core.index.WritableCIndex.releaseWriteLock(WritableCIndex.java:132)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMRebuildTask.clearIndex(PDOMRebuildTask.java:111)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMRebuildTask.run(PDOMRebuildTask.java:80)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 49: Released lock in thread Worker-354: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.releaseWriteLock(WritableCIndex.java:146)
at org.eclipse.cdt.internal.core.index.WritableCIndex.releaseWriteLock(WritableCIndex.java:132)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMRebuildTask.clearIndex(PDOMRebuildTask.java:111)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMRebuildTask.run(PDOMRebuildTask.java:80)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 49: Acquiered lock in thread Worker-354: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.acquireWriteLock(WritableCIndex.java:124)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.setResume(AbstractIndexerTask.java:638)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:560)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMRebuildTask.run(PDOMRebuildTask.java:94)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 50: Released lock in thread Worker-354: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.releaseWriteLock(WritableCIndex.java:146)
at org.eclipse.cdt.internal.core.index.WritableCIndex.releaseWriteLock(WritableCIndex.java:132)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.setResume(AbstractIndexerTask.java:642)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:560)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMRebuildTask.run(PDOMRebuildTask.java:94)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 50: Acquiered lock in thread Worker-354: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.acquireWriteLock(WritableCIndex.java:124)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.setResume(AbstractIndexerTask.java:638)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:621)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMRebuildTask.run(PDOMRebuildTask.java:94)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 50: Released lock in thread Worker-354: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.releaseWriteLock(WritableCIndex.java:146)
at org.eclipse.cdt.internal.core.index.WritableCIndex.releaseWriteLock(WritableCIndex.java:132)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.setResume(AbstractIndexerTask.java:642)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:621)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMRebuildTask.run(PDOMRebuildTask.java:94)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 54: Acquiered lock in thread Worker-286: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.acquireWriteLock(WritableCIndex.java:124)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.setResume(AbstractIndexerTask.java:638)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:560)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 54: Released lock in thread Worker-286: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.releaseWriteLock(WritableCIndex.java:146)
at org.eclipse.cdt.internal.core.index.WritableCIndex.releaseWriteLock(WritableCIndex.java:132)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.setResume(AbstractIndexerTask.java:642)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:560)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 56: Acquiered lock in thread Worker-286: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.acquireWriteLock(WritableCIndex.java:124)
at org.eclipse.cdt.internal.core.pdom.YieldableIndexLock.acquire(YieldableIndexLock.java:43)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.storeSymbolsInIndex(PDOMWriter.java:324)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.addSymbols(PDOMWriter.java:287)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.writeToIndex(AbstractIndexerTask.java:1295)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseFile(AbstractIndexerTask.java:1107)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseLinkage(AbstractIndexerTask.java:910)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:572)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 56: clearResultCache(true) in thread Worker-286: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.clearResultCache(WritableCIndex.java:167)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.storeSymbolsInIndex(PDOMWriter.java:353)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.addSymbols(PDOMWriter.java:287)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.writeToIndex(AbstractIndexerTask.java:1295)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseFile(AbstractIndexerTask.java:1107)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseLinkage(AbstractIndexerTask.java:910)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:572)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 56: Released lock in thread Worker-286: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.releaseWriteLock(WritableCIndex.java:146)
at org.eclipse.cdt.internal.core.pdom.YieldableIndexLock.release(YieldableIndexLock.java:52)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.storeSymbolsInIndex(PDOMWriter.java:355)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.addSymbols(PDOMWriter.java:287)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.writeToIndex(AbstractIndexerTask.java:1295)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseFile(AbstractIndexerTask.java:1107)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseLinkage(AbstractIndexerTask.java:910)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:572)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 59: Acquiered lock in thread Worker-286: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.acquireWriteLock(WritableCIndex.java:124)
at org.eclipse.cdt.internal.core.pdom.YieldableIndexLock.acquire(YieldableIndexLock.java:43)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.storeSymbolsInIndex(PDOMWriter.java:324)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.addSymbols(PDOMWriter.java:287)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.writeToIndex(AbstractIndexerTask.java:1295)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseFile(AbstractIndexerTask.java:1107)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseLinkage(AbstractIndexerTask.java:910)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:572)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 61: clearResultCache(true) in thread Worker-286: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.clearResultCache(WritableCIndex.java:167)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.storeSymbolsInIndex(PDOMWriter.java:353)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.addSymbols(PDOMWriter.java:287)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.writeToIndex(AbstractIndexerTask.java:1295)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseFile(AbstractIndexerTask.java:1107)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseLinkage(AbstractIndexerTask.java:910)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:572)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 62: Released lock in thread Worker-286: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.releaseWriteLock(WritableCIndex.java:146)
at org.eclipse.cdt.internal.core.pdom.YieldableIndexLock.release(YieldableIndexLock.java:52)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.storeSymbolsInIndex(PDOMWriter.java:355)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.addSymbols(PDOMWriter.java:287)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.writeToIndex(AbstractIndexerTask.java:1295)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseFile(AbstractIndexerTask.java:1107)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseLinkage(AbstractIndexerTask.java:910)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:572)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 64: Acquiered lock in thread Worker-286: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.acquireWriteLock(WritableCIndex.java:124)
at org.eclipse.cdt.internal.core.pdom.YieldableIndexLock.acquire(YieldableIndexLock.java:43)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.storeSymbolsInIndex(PDOMWriter.java:324)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.addSymbols(PDOMWriter.java:287)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.writeToIndex(AbstractIndexerTask.java:1295)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseFile(AbstractIndexerTask.java:1107)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseLinkage(AbstractIndexerTask.java:910)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:572)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 65: Released lock in thread Worker-286: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.releaseWriteLock(WritableCIndex.java:146)
at org.eclipse.cdt.internal.core.pdom.YieldableIndexLock.yield(YieldableIndexLock.java:65)
at org.eclipse.cdt.internal.core.pdom.dom.PDOMFile.addNames(PDOMFile.java:485)
at org.eclipse.cdt.internal.core.pdom.WritablePDOM.addFileContent(WritablePDOM.java:158)
at org.eclipse.cdt.internal.core.index.WritableCIndex.setFileContent(WritableCIndex.java:89)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.storeFileInIndex(PDOMWriter.java:679)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.storeSymbolsInIndex(PDOMWriter.java:329)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.addSymbols(PDOMWriter.java:287)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.writeToIndex(AbstractIndexerTask.java:1295)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseFile(AbstractIndexerTask.java:1107)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseLinkage(AbstractIndexerTask.java:910)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:572)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
java.lang.Exception: 68: clearResultCache(false) in thread Worker-286: C/C++ Indexer
at org.eclipse.cdt.internal.core.index.WritableCIndex.clearResultCache(WritableCIndex.java:167)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.storeSymbolsInIndex(PDOMWriter.java:353)
at org.eclipse.cdt.internal.core.pdom.PDOMWriter.addSymbols(PDOMWriter.java:287)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.writeToIndex(AbstractIndexerTask.java:1295)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseFile(AbstractIndexerTask.java:1107)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.parseLinkage(AbstractIndexerTask.java:910)
at org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask.runTask(AbstractIndexerTask.java:572)
at org.eclipse.cdt.internal.core.pdom.indexer.PDOMIndexerTask.run(PDOMIndexerTask.java:164)
at org.eclipse.cdt.internal.core.pdom.PDOMIndexerJob.run(PDOMIndexerJob.java:160)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) |
The trace shows that the call to cdt/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/YieldableIndexLock.java Lines 65 to 68 in 6eaaf71
The only way the above code could fail to acquire the lock before returning is if there is an exception, which makes sense as it is in the finally block (see details below) that the dodgy call without a held lock is made. I added some logging to try to confirm before I fix it. Here is where the lock was first acquired: cdt/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java Lines 323 to 325 in 6eaaf71
Here is where yield is (eventually) called from inside that try block: cdt/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java Line 329 in 6eaaf71
And here is where the lock is fully released, but first it clears the cache (conditionally). It is the call to clearing the cache that causes the assertion failure in tests, but the call to release would also raise the same assertion. cdt/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java Lines 349 to 356 in 6eaaf71
|
My guess is the experiment will show an Do I need to force reaquiring the cache so I can clear the results? Probably not. So I probably need to check if I have already released the lock in the finally block and just do nothing. |
The indexer has a feature that allows readers of the index to read the index in the middle of write operations. This is done by using a YeildableIndexLock. The YeildableIndexLock's yield method can be called to temporarily give up the write lock. However the assumption in the code was that it would always successfully reaquire the lock after that. However, if the indexing was cancelled the lock would fail to be reaquired. Therefore the code that thinks it owns the lock no longer owns it. In this case the code in PDOMWriter.storeSymbolsInIndex's finally block. Therefore I have added an new exception type to explicitly identify this use case so the original code can differentiate between cases where an exception was thrown where the lock is still held, and cases where the lock is no longer held. Note that instead of a new exception caught like this: ```java } catch (FailedToReAcquireLockException e) { hasLock = false; e.reThrow(); ``` I could have done this: ```java } catch (InterruptedException | OperationCanceledException e) { hasLock = false; throw e; ``` But it is not obvious that nothing else other than the acquire can raise an OperationCanceledException because it is a RuntimeException. By having a new checked exception we can know for sure that in the finally block we have lost our lock. There are no API implications of this change as all the classes and interfaces are internal to CDT. Fixes eclipse-cdt#128
The indexer has a feature that allows readers of the index to read the index in the middle of write operations. This is done by using a YeildableIndexLock. The YeildableIndexLock's yield method can be called to temporarily give up the write lock. However the assumption in the code was that it would always successfully reaquire the lock after that. However, if the indexing was cancelled the lock would fail to be reaquired. Therefore the code that thinks it owns the lock no longer owns it. In this case the code in PDOMWriter.storeSymbolsInIndex's finally block. Therefore I have added an new exception type to explicitly identify this use case so the original code can differentiate between cases where an exception was thrown where the lock is still held, and cases where the lock is no longer held. Note that instead of a new exception caught like this: ```java } catch (FailedToReAcquireLockException e) { hasLock = false; e.reThrow(); ``` I could have done this: ```java } catch (InterruptedException | OperationCanceledException e) { hasLock = false; throw e; ``` But it is not obvious that nothing else other than the acquire can raise an OperationCanceledException because it is a RuntimeException. By having a new checked exception we can know for sure that in the finally block we have lost our lock. There are no API implications of this change as all the classes and interfaces are internal to CDT. Fixes eclipse-cdt#128
The indexer has a feature that allows readers of the index to read the index in the middle of write operations. This is done by using a YeildableIndexLock. The YeildableIndexLock's yield method can be called to temporarily give up the write lock. However the assumption in the code was that it would always successfully reaquire the lock after that. However, if the indexing was cancelled the lock would fail to be reaquired. Therefore the code that thinks it owns the lock no longer owns it. In this case the code in PDOMWriter.storeSymbolsInIndex's finally block. Therefore I have added an new exception type to explicitly identify this use case so the original code can differentiate between cases where an exception was thrown where the lock is still held, and cases where the lock is no longer held. Note that instead of a new exception caught like this: ```java } catch (FailedToReAcquireLockException e) { hasLock = false; e.reThrow(); ``` I could have done this: ```java } catch (InterruptedException | OperationCanceledException e) { hasLock = false; throw e; ``` But it is not obvious that nothing else other than the acquire can raise an OperationCanceledException because it is a RuntimeException. By having a new checked exception we can know for sure that in the finally block we have lost our lock. There are no API implications of this change as all the classes and interfaces are internal to CDT. Fixes #128
Part of eclipse-cdt#128
Nope - turns out that there are still some other exceptions besides OperationCanceledException/InterruptedException that can be thrown by acquire. |
Part of eclipse-cdt#128
Part of eclipse-cdt#128
Part of eclipse-cdt#128
are hit on the build machine to trigger the lost lock. Part of eclipse-cdt#128
We can fail to regain our lock in other cases than just operation cancelled exception, so capture all of those cases to throw an FailedToReAcquireLockException. Also, fix another finally block that assumes it has the lock. Fixes eclipse-cdt#128
We can fail to regain our lock in other cases than just operation cancelled exception, so capture all of those cases to throw an FailedToReAcquireLockException. Also, fix another finally block that assumes it has the lock. Fixes eclipse-cdt#128
We can fail to regain our lock in other cases than just operation cancelled exception, so capture all of those cases to throw an FailedToReAcquireLockException. Also, fix another finally block that assumes it has the lock. Fixes #128
This test, or one similar to it, has failed a couple of times recently.
This is the detailed output:
The stack trace is incomplete on this, but the assertion is from:
cdt/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/WritableCIndex.java
Lines 159 to 163 in 10e95a1
The text was updated successfully, but these errors were encountered: