diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Lucene/IndexManager.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Lucene/IndexManager.cs index 0aa3ccbab..2408b3b7f 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Lucene/IndexManager.cs +++ b/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); } - indexHolder = new IndexHolder(ownerId); + var directory = await indexStorage.CreateDirectoryAsync(ownerId); + + indexHolder = new IndexHolder(ownerId, directory); indices[ownerId] = indexHolder; } finally @@ -70,10 +72,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene lockObject.Release(); } - var directory = await indexStorage.CreateDirectoryAsync(ownerId); - - indexHolder.Open(directory); - return indexHolder; } @@ -87,7 +85,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene { lockObject.Wait(); - indexHolder.Release(); + indexHolder.Dispose(); indices.Remove(indexHolder.Id); } finally @@ -118,7 +116,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene holder.Commit(); } - await indexStorage.WriteAsync(holder.GetUnsafeWriter().Directory, holder.Snapshotter); + await indexStorage.WriteAsync(holder.Directory, holder.Snapshotter); } } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Lucene/IndexManager_Impl.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Lucene/IndexManager_Impl.cs index 313d4b462..edb5f0732 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Lucene/IndexManager_Impl.cs +++ b/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.Store; using Lucene.Net.Util; -using Squidex.Infrastructure; 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 Analyzer SharedAnalyzer = new MultiLanguageAnalyzer(Version); private readonly SnapshotDeletionPolicy snapshotter = new SnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy()); - private Directory directory; + private readonly Directory directory; private IndexWriter indexWriter; private IndexSearcher? indexSearcher; private DirectoryReader? indexReader; - private bool isReleased; + private bool isDisposed; public Analyzer Analyzer { @@ -39,12 +38,22 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene get { return snapshotter; } } + public Directory Directory + { + get { return directory; } + } + public IndexWriter Writer { get { ThrowIfReleased(); + if (indexWriter == null) + { + throw new InvalidOperationException("Index writer has not been created yet. Call Open()"); + } + return indexWriter; } } @@ -71,20 +80,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene public Guid Id { get; } - public IndexHolder(Guid id) + public IndexHolder(Guid id, Directory directory) { Id = id; - } - - public void Dispose() - { - indexReader?.Dispose(); - indexWriter?.Dispose(); - } - - public void Open(Directory directory) - { - Guard.NotNull(directory, nameof(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) { @@ -108,13 +119,15 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene indexWriter = new IndexWriter(directory, config); MarkStale(); + + return indexWriter; } public void EnsureReader() { ThrowIfReleased(); - if (indexReader == null) + if (indexReader == null && indexWriter != null) { indexReader = indexWriter.GetReader(true); indexSearcher = new IndexSearcher(indexReader); @@ -156,21 +169,11 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text.Lucene 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; - } } } }