[
https://issues.apache.org/jira/browse/LUCENENET-618?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Shad Storhaug updated LUCENENET-618:
------------------------------------
Labels: cross-platform linux macOS (was: cross-platform linux macOS
up-for-grabs)
> Need a Cross-OS NativeFSLock Implementation
> -------------------------------------------
>
> Key: LUCENENET-618
> URL: https://issues.apache.org/jira/browse/LUCENENET-618
> Project: Lucene.Net
> Issue Type: Task
> Components: Lucene.Net Core
> Affects Versions: Lucene.Net 4.8.0
> Reporter: Shad Storhaug
> Assignee: Shad Storhaug
> Priority: Critical
> Labels: cross-platform, linux, macOS
> Fix For: Lucene.Net 4.8.0
>
>
> Now that we have (finally) begun testing on platforms other than Windows, it
> has been discovered that the {{NativeFSLock}} doesn't work reliably on other
> platforms.
> Due to differences in how Java and .NET handle file system locking, we have
> switched from the Lucene 4.8.0 implementation to [one that is based on
> {{FileStream.Lock}}|https://lucene.markmail.org/search/?q=lucenenet%20An%20alternative%20NativeFSLockFactory#query:lucenenet%20An%20alternative%20NativeFSLockFactory+page:1+mid:pdx6nwciw4rn75l6+state:results].
> While this implementation does include support for .NET Framework/.NET
> Standard 1.x/.NET Standard 2.x, it relies on {{HResult}} error codes that
> exist only on Windows.
> I have done some research, and it turns out that [using {{HResult}} error
> codes cannot be made reliably portable across
> platforms|https://stackoverflow.com/a/46381756]. So, I used the original
> implementation we had as a fallback when the OS is not Windows.
> {code:c#}
> internal virtual Lock NewLock(string path)
> {
> if (Constants.WINDOWS)
> return new WindowsNativeFSLock(this, m_lockDir, path);
> // Fallback implementation for unknown platforms that don't rely
> on HResult
> return new NativeFSLock(this, m_lockDir, path);
> }
> {code}
> Unfortunately, we are now seeing error messages when testing on macOS and
> Linux, which are a clear symptom of resource locking failures:
> {quote}{{System.IO.IOException : The process cannot access the file
> '/tmp/LuceneTemp/index-MMapDirectory-i0xc4fz2/write.lock' because it is being
> used by another process.}}{quote}
> {quote}{{at Lucene.Net.Util.IOUtils.DisposeWhileHandlingException(Exception
> priorException, IDisposable[] objects) in
> D:\a\1\s\src\Lucene.Net\Util\IOUtils.cs:line 197}}{{at
> Lucene.Net.Store.Directory.Copy(Directory to, String src, String dest,
> IOContext context) in D:\a\1\s\src\Lucene.Net\Store\Directory.cs:line
> 214}}{{at Lucene.Net.Store.MockDirectoryWrapper.Copy(Directory to, String
> src, String dest, IOContext context) in
> D:\a\1\s\src\Lucene.Net.TestFramework\Store\MockDirectoryWrapper.cs:line
> 1320}}{{at Lucene.Net.Store.RAMDirectory..ctor(Directory dir, Boolean
> closeDir, IOContext context) in
> D:\a\1\s\src\Lucene.Net\Store\RAMDirectory.cs:line 106}}{{at
> Lucene.Net.Index.TestTermVectorsWriter.TestTermVectorCorruption() in
> D:\a\1\s\src\Lucene.Net.Tests\Index\TestTermVectorsWriter.cs:line 446}}{quote}
> It turns out the implementation that was used as a fallback had been
> [contributed back when .NET Framework was the only target framework in
> Lucene.Net|https://github.com/apache/lucenenet/pull/70#issuecomment-72958293]
> and it sounds like running on non-Windows platforms was not being considered
> in its implementation.
> As a result, we only have 2 implementations that work on Windows and none
> that work reliably on other platforms.
> The {{NativeFSLock}} implementation does prevent the "file in use" error from
> happening frequently on non-Windows platforms, but doesn't prevent it from
> happening completely. However, the {{WindowsNativeFSLock}} is reliably making
> all of the tests pass on Windows across several dozen test runs.
> IMO, the approach being used on Windows is fine, but for other operating
> systems we should fallback to an implementation that is more reliable than
> the one we currently have.
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)