Browse Source

Nullable improvement.

pull/534/head
Sebastian 6 years ago
parent
commit
28facb0ac9
  1. 12
      backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Lucene/IndexManager.cs
  2. 61
      backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Lucene/IndexManager_Impl.cs

12
backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Lucene/IndexManager.cs

@ -62,7 +62,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene
await CommitInternalAsync(indexHolder, true); await CommitInternalAsync(indexHolder, true);
} }
indexHolder = new IndexHolder(ownerId); var directory = await indexStorage.CreateDirectoryAsync(ownerId);
indexHolder = new IndexHolder(ownerId, directory);
indices[ownerId] = indexHolder; indices[ownerId] = indexHolder;
} }
finally finally
@ -70,10 +72,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene
lockObject.Release(); lockObject.Release();
} }
var directory = await indexStorage.CreateDirectoryAsync(ownerId);
indexHolder.Open(directory);
return indexHolder; return indexHolder;
} }
@ -87,7 +85,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene
{ {
lockObject.Wait(); lockObject.Wait();
indexHolder.Release(); indexHolder.Dispose();
indices.Remove(indexHolder.Id); indices.Remove(indexHolder.Id);
} }
finally finally
@ -118,7 +116,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene
holder.Commit(); holder.Commit();
} }
await indexStorage.WriteAsync(holder.GetUnsafeWriter().Directory, holder.Snapshotter); await indexStorage.WriteAsync(holder.Directory, holder.Snapshotter);
} }
} }

61
backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Lucene/IndexManager_Impl.cs

@ -11,7 +11,6 @@ using Lucene.Net.Index;
using Lucene.Net.Search; using Lucene.Net.Search;
using Lucene.Net.Store; using Lucene.Net.Store;
using Lucene.Net.Util; using Lucene.Net.Util;
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene
{ {
@ -23,11 +22,11 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene
private static readonly MergeScheduler MergeScheduler = new ConcurrentMergeScheduler(); private static readonly MergeScheduler MergeScheduler = new ConcurrentMergeScheduler();
private static readonly Analyzer SharedAnalyzer = new MultiLanguageAnalyzer(Version); private static readonly Analyzer SharedAnalyzer = new MultiLanguageAnalyzer(Version);
private readonly SnapshotDeletionPolicy snapshotter = new SnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy()); private readonly SnapshotDeletionPolicy snapshotter = new SnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy());
private Directory directory; private readonly Directory directory;
private IndexWriter indexWriter; private IndexWriter indexWriter;
private IndexSearcher? indexSearcher; private IndexSearcher? indexSearcher;
private DirectoryReader? indexReader; private DirectoryReader? indexReader;
private bool isReleased; private bool isDisposed;
public Analyzer Analyzer public Analyzer Analyzer
{ {
@ -39,12 +38,22 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene
get { return snapshotter; } get { return snapshotter; }
} }
public Directory Directory
{
get { return directory; }
}
public IndexWriter Writer public IndexWriter Writer
{ {
get get
{ {
ThrowIfReleased(); ThrowIfReleased();
if (indexWriter == null)
{
throw new InvalidOperationException("Index writer has not been created yet. Call Open()");
}
return indexWriter; return indexWriter;
} }
} }
@ -71,20 +80,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene
public Guid Id { get; } public Guid Id { get; }
public IndexHolder(Guid id) public IndexHolder(Guid id, Directory directory)
{ {
Id = id; Id = id;
}
public void Dispose()
{
indexReader?.Dispose();
indexWriter?.Dispose();
}
public void Open(Directory directory)
{
Guard.NotNull(directory, nameof(directory));
this.directory = directory; this.directory = directory;
@ -96,7 +94,20 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene
} }
} }
private void RecreateIndexWriter() public void Dispose()
{
if (!isDisposed)
{
indexReader?.Dispose();
indexReader = null;
indexWriter.Dispose();
isDisposed = true;
}
}
private IndexWriter RecreateIndexWriter()
{ {
var config = new IndexWriterConfig(Version, Analyzer) var config = new IndexWriterConfig(Version, Analyzer)
{ {
@ -108,13 +119,15 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene
indexWriter = new IndexWriter(directory, config); indexWriter = new IndexWriter(directory, config);
MarkStale(); MarkStale();
return indexWriter;
} }
public void EnsureReader() public void EnsureReader()
{ {
ThrowIfReleased(); ThrowIfReleased();
if (indexReader == null) if (indexReader == null && indexWriter != null)
{ {
indexReader = indexWriter.GetReader(true); indexReader = indexWriter.GetReader(true);
indexSearcher = new IndexSearcher(indexReader); indexSearcher = new IndexSearcher(indexReader);
@ -156,21 +169,11 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene
private void ThrowIfReleased() private void ThrowIfReleased()
{ {
if (isReleased) if (indexWriter == null)
{ {
throw new InvalidOperationException("Index is already released."); throw new InvalidOperationException("Index is already released or not open yet.");
} }
} }
internal void Release()
{
isReleased = true;
}
internal IndexWriter GetUnsafeWriter()
{
return indexWriter;
}
} }
} }
} }

Loading…
Cancel
Save