paulirwin opened a new issue, #1233: URL: https://github.com/apache/lucenenet/issues/1233
### Is there an existing issue for this? - [x] I have searched the existing issues ### Describe the bug ## Description `TestDirectoryReaderReopen.TestThreadSafety` intermittently fails with a `FileNotFoundException` when concurrent reader threads attempt to open segment files that have been deleted by concurrent index modifications. ## Failure Details **Test:** `Lucene.Net.Index.TestDirectoryReaderReopen.TestThreadSafety` ## Root Cause The test spawns 20-40 threads that concurrently: 1. Call `DirectoryReader.OpenIfChanged()` to refresh readers 2. Modify the index by adding documents (which triggers merges) A race condition occurs when: 1. Thread A reads segment info and discovers segment file `_8.cfe` exists 2. Thread B's merge/commit operation deletes that segment 3. Thread A attempts to open `_8.cfe` and gets `FileNotFoundException` ## Observed In - GitHub Actions run: https://github.com/apache/lucenenet/actions/runs/20665128917/job/59335657279 - Platform: Ubuntu 24.04, .NET 10.0, x64, Release - Note: The same test passed on Windows in the same CI run ### Expected Behavior _No response_ ### Steps To Reproduce _No response_ ### Exceptions (if any) _No response_ ### Lucene.NET Version _No response_ ### .NET Version _No response_ ### Operating System _No response_ ### Anything else? Raw error log: ``` Failed Lucene.Net.Index.TestDirectoryReaderReopen.TestThreadSafety [1 s] Error Message: Error occurred in thread : _8.cfe in dir=RAMDirectory@247c787 lockFactory=Lucene.Net.Store.SingleInstanceLockFactory (Test: Lucene.Net.Index.TestDirectoryReaderReopen.TestThreadSafety) To reproduce this test result: Option 1: Apply the following assembly-level attributes: [assembly: Lucene.Net.Util.RandomSeed("0xee1e2c83dd9ff3e5:0x8a5316feb9c2a929")] [assembly: NUnit.Framework.SetCulture("en-FK")] Option 2: Use the following .runsettings file: <RunSettings> <TestRunParameters> <Parameter name="tests:seed" value="0xee1e2c83dd9ff3e5:0x8a5316feb9c2a929" /> <Parameter name="tests:culture" value="en-FK" /> </TestRunParameters> </RunSettings> Option 3: Create the following lucene.testsettings.json file somewhere between the test assembly and the root of your drive: { "tests": { "seed": "0xee1e2c83dd9ff3e5:0x8a5316feb9c2a929", "culture": "en-FK" } } Fixture Test Values ================= Random Seed: 0xee1e2c83dd9ff3e5:0x8a5316feb9c2a929 Culture: en-FK Time Zone: (UTC-06:00) Central Time (Tegucigalpa) Default Codec: Lucene42 (Lucene42RWCodec) Default Similarity: RandomSimilarityProvider(queryNorm=True,coord=yes): {id=DFR I(n)L3(800), field1=DFR I(ne)B2, field2=DFR I(F)L2, field3=DFR I(n)B1, field4=DFR I(ne)B1} System Properties ================= Nightly: False Weekly: False Slow: False Awaits Fix: False Directory: random Verbose: False Random Multiplier: 1 Stack Trace: at Lucene.Net.Index.TestDirectoryReaderReopen.TestThreadSafety() in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net.Tests/Index/TestDirectoryReaderReopen.cs:line 313 1) at Lucene.Net.Index.TestDirectoryReaderReopen.TestThreadSafety() in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net.Tests/Index/TestDirectoryReaderReopen.cs:line 313 Standard Output Messages: System.IO.FileNotFoundException: _8.cfe in dir=RAMDirectory@247c787 lockFactory=Lucene.Net.Store.SingleInstanceLockFactory at Lucene.Net.Store.MockDirectoryWrapper.OpenInput(String name, IOContext context) in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net.TestFramework/Store/MockDirectoryWrapper.cs:line 802 at Lucene.Net.Store.CompoundFileDirectory.ReadEntries(IndexInputSlicer handle, Directory dir, String name) in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net/Store/CompoundFileDirectory.cs:line 170 --- End of stack trace from previous location --- at Lucene.Net.Store.CompoundFileDirectory.ReadEntries(IndexInputSlicer handle, Directory dir, String name) in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net/Store/CompoundFileDirectory.cs:line 143 at Lucene.Net.Index.StandardDirectoryReader.DoOpenFromCommit(IndexCommit commit) in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net/Index/StandardDirectoryReader.cs:line 402 at Lucene.Net.Index.StandardDirectoryReader.DoOpenNoWriter(IndexCommit commit) in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net/Index/StandardDirectoryReader.cs:line 397 at Lucene.Net.Index.StandardDirectoryReader.DoOpenIfChanged(IndexCommit commit) in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net/Index/StandardDirectoryReader.cs:line 335 at Lucene.Net.Index.StandardDirectoryReader.DoOpenIfChanged() in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net/Index/StandardDirectoryReader.cs:line 320 at Lucene.Net.Index.DirectoryReader.OpenIfChanged(DirectoryReader oldReader) in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net/Index/DirectoryReader.cs:line 174 at Lucene.Net.Index.TestDirectoryReaderReopen.ReaderThreadTaskAnonymousClass.Run() in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net.Tests/Index/TestDirectoryReaderReopen.cs:line 397 at Lucene.Net.Index.TestDirectoryReaderReopen.ReaderThread.Run() in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net.Tests/Index/TestDirectoryReaderReopen.cs:line 504 System.IO.DirectoryNotFoundException: _5.cfe in dir=RAMDirectory@247c787 lockFactory=Lucene.Net.Store.SingleInstanceLockFactory at Lucene.Net.Store.MockDirectoryWrapper.OpenInput(String name, IOContext context) in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net.TestFramework/Store/MockDirectoryWrapper.cs:line 802 at Lucene.Net.Store.CompoundFileDirectory.ReadEntries(IndexInputSlicer handle, Directory dir, String name) in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net/Store/CompoundFileDirectory.cs:line 170 --- End of stack trace from previous location --- at Lucene.Net.Store.CompoundFileDirectory.ReadEntries(IndexInputSlicer handle, Directory dir, String name) in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net/Store/CompoundFileDirectory.cs:line 143 at Lucene.Net.Index.StandardDirectoryReader.DoOpenFromCommit(IndexCommit commit) in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net/Index/StandardDirectoryReader.cs:line 402 at Lucene.Net.Index.StandardDirectoryReader.DoOpenNoWriter(IndexCommit commit) in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net/Index/StandardDirectoryReader.cs:line 397 at Lucene.Net.Index.StandardDirectoryReader.DoOpenIfChanged(IndexCommit commit) in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net/Index/StandardDirectoryReader.cs:line 335 at Lucene.Net.Index.StandardDirectoryReader.DoOpenIfChanged() in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net/Index/StandardDirectoryReader.cs:line 320 at Lucene.Net.Index.DirectoryReader.OpenIfChanged(DirectoryReader oldReader) in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net/Index/DirectoryReader.cs:line 174 at Lucene.Net.Index.TestDirectoryReaderReopen.ReaderThreadTaskAnonymousClass.Run() in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net.Tests/Index/TestDirectoryReaderReopen.cs:line 397 at Lucene.Net.Index.TestDirectoryReaderReopen.ReaderThread.Run() in /home/runner/work/lucenenet/lucenenet/src/Lucene.Net.Tests/Index/TestDirectoryReaderReopen.cs:line 504 ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
