lucenenet-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Maximilian Haru Raditya (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (LUCENENET-511) ObjectDisposedException thrown when IndexWriter disposed by finalizer
Date Mon, 01 Oct 2012 22:57:08 GMT

     [ https://issues.apache.org/jira/browse/LUCENENET-511?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Maximilian Haru Raditya updated LUCENENET-511:
----------------------------------------------

    Description: 
I'm having an issue of ObjectDisposedException with an error message "Cannot access a closed
file." when working IndexWriter.

I manage to reproduce it when I create a new WPF (4.5) app and install 3.0.3-RC2 from NuGet.
I then create a LuceneManager which implements IDisposable, and I create a finalizer for it.
I wrap IndexWriter inside it, and dispose it inside Dispose(bool). The implementation code
looks like this:


{code}
namespace WpfApplication
{
    using System;
    using System.Collections.Generic;
    using System.IO;

    using Lucene.Net.Analysis.Standard;
    using Lucene.Net.Index;
    using Lucene.Net.Store;

    using Version = Lucene.Net.Util.Version;

    public class LuceneManager : IDisposable
    {
        public static readonly string IndexPath =
            Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Index");

        private IndexWriter _indexWriter;

        private bool _isDisposed;

        public LuceneManager()
        {
            var directory = FSDirectory.Open(IndexPath);
            var analyzer = new StandardAnalyzer(Version.LUCENE_30, new HashSet<string>());
            this._indexWriter = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
        }

        ~LuceneManager()
        {
            this.Dispose(false);
        }

        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }

        private void Dispose(bool isDisposing)
        {
            if (!this._isDisposed)
            {
                if (this._indexWriter != null)
                {
                    this._indexWriter.Dispose();
                }
                this._indexWriter = null;

                this._isDisposed = true;
            }
        }
    }
}
{code}


And the calling code looks like this:


{code}
namespace WpfApplication
{
    using System.Windows;

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.InitializeComponent();
        }

        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            var lucenceManager = new LuceneManager();
        }
    }
}
{code}


The app run just fine until I close it and it throws ObjectDisposedException as described
above.

The exception details:


{code}
System.ObjectDisposedException was unhandled
  HResult=-2146232798
  Message=Cannot access a closed file.
  Source=mscorlib
  ObjectName=""
  StackTrace:
       at System.IO.__Error.FileNotOpen()
       at System.IO.FileStream.get_Length()
       at Lucene.Net.Store.NativeFSLock.Release()
       at Lucene.Net.Index.IndexWriter.CloseInternal(Boolean waitForMerges)
       at Lucene.Net.Index.IndexWriter.Dispose(Boolean disposing, Boolean waitForMerges)
       at Lucene.Net.Index.IndexWriter.Dispose(Boolean waitForMerges)
       at Lucene.Net.Index.IndexWriter.Dispose()
       at WpfApplication.LuceneManager.Dispose(Boolean isDisposing)
       at WpfApplication.LuceneManager.Finalize()
  InnerException: 
{code}

  was:
I'm having an issue of ObjectDisposedException with an error message "Cannot access a closed
file." when working IndexWriter.

I manage to reproduce it when I create a new WPF (4.5) app and install 3.0.3-RC2 from NuGet.
I then create a LuceneManager which implements IDisposable, and I create a finalizer for it.
I wrap IndexWriter inside it, and dispose it inside Dispose(bool). The implementation code
looks like this:


namespace WpfApplication
{
    using System;
    using System.Collections.Generic;
    using System.IO;

    using Lucene.Net.Analysis.Standard;
    using Lucene.Net.Index;
    using Lucene.Net.Store;

    using Version = Lucene.Net.Util.Version;

    public class LuceneManager : IDisposable
    {
        public static readonly string IndexPath =
            Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Index");

        private IndexWriter _indexWriter;

        private bool _isDisposed;

        public LuceneManager()
        {
            var directory = FSDirectory.Open(IndexPath);
            var analyzer = new StandardAnalyzer(Version.LUCENE_30, new HashSet<string>());
            this._indexWriter = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
        }

        ~LuceneManager()
        {
            this.Dispose(false);
        }

        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }

        private void Dispose(bool isDisposing)
        {
            if (!this._isDisposed)
            {
                if (this._indexWriter != null)
                {
                    this._indexWriter.Dispose();
                }
                this._indexWriter = null;

                this._isDisposed = true;
            }
        }
    }
}


And the calling code looks like this:


{{namespace WpfApplication
{
    using System.Windows;

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.InitializeComponent();
        }

        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            var lucenceManager = new LuceneManager();
        }
    }
}}}


The app run just fine until I close it and it throws ObjectDisposedException as described
above.

The exception details:


System.ObjectDisposedException was unhandled
  HResult=-2146232798
  Message=Cannot access a closed file.
  Source=mscorlib
  ObjectName=""
  StackTrace:
       at System.IO.__Error.FileNotOpen()
       at System.IO.FileStream.get_Length()
       at Lucene.Net.Store.NativeFSLock.Release()
       at Lucene.Net.Index.IndexWriter.CloseInternal(Boolean waitForMerges)
       at Lucene.Net.Index.IndexWriter.Dispose(Boolean disposing, Boolean waitForMerges)
       at Lucene.Net.Index.IndexWriter.Dispose(Boolean waitForMerges)
       at Lucene.Net.Index.IndexWriter.Dispose()
       at WpfApplication.LuceneManager.Dispose(Boolean isDisposing)
       at WpfApplication.LuceneManager.Finalize()
  InnerException: 

    
> ObjectDisposedException thrown when IndexWriter disposed by finalizer
> ---------------------------------------------------------------------
>
>                 Key: LUCENENET-511
>                 URL: https://issues.apache.org/jira/browse/LUCENENET-511
>             Project: Lucene.Net
>          Issue Type: Bug
>          Components: Lucene.Net Core
>    Affects Versions: Lucene.Net 3.0.3
>         Environment: Windows 7 x64, .NET Framework 4.5
>            Reporter: Maximilian Haru Raditya
>
> I'm having an issue of ObjectDisposedException with an error message "Cannot access a
closed file." when working IndexWriter.
> I manage to reproduce it when I create a new WPF (4.5) app and install 3.0.3-RC2 from
NuGet. I then create a LuceneManager which implements IDisposable, and I create a finalizer
for it. I wrap IndexWriter inside it, and dispose it inside Dispose(bool). The implementation
code looks like this:
> {code}
> namespace WpfApplication
> {
>     using System;
>     using System.Collections.Generic;
>     using System.IO;
>     using Lucene.Net.Analysis.Standard;
>     using Lucene.Net.Index;
>     using Lucene.Net.Store;
>     using Version = Lucene.Net.Util.Version;
>     public class LuceneManager : IDisposable
>     {
>         public static readonly string IndexPath =
>             Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Index");
>         private IndexWriter _indexWriter;
>         private bool _isDisposed;
>         public LuceneManager()
>         {
>             var directory = FSDirectory.Open(IndexPath);
>             var analyzer = new StandardAnalyzer(Version.LUCENE_30, new HashSet<string>());
>             this._indexWriter = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
>         }
>         ~LuceneManager()
>         {
>             this.Dispose(false);
>         }
>         public void Dispose()
>         {
>             this.Dispose(true);
>             GC.SuppressFinalize(this);
>         }
>         private void Dispose(bool isDisposing)
>         {
>             if (!this._isDisposed)
>             {
>                 if (this._indexWriter != null)
>                 {
>                     this._indexWriter.Dispose();
>                 }
>                 this._indexWriter = null;
>                 this._isDisposed = true;
>             }
>         }
>     }
> }
> {code}
> And the calling code looks like this:
> {code}
> namespace WpfApplication
> {
>     using System.Windows;
>     public partial class MainWindow : Window
>     {
>         public MainWindow()
>         {
>             this.InitializeComponent();
>         }
>         private void OnLoaded(object sender, RoutedEventArgs e)
>         {
>             var lucenceManager = new LuceneManager();
>         }
>     }
> }
> {code}
> The app run just fine until I close it and it throws ObjectDisposedException as described
above.
> The exception details:
> {code}
> System.ObjectDisposedException was unhandled
>   HResult=-2146232798
>   Message=Cannot access a closed file.
>   Source=mscorlib
>   ObjectName=""
>   StackTrace:
>        at System.IO.__Error.FileNotOpen()
>        at System.IO.FileStream.get_Length()
>        at Lucene.Net.Store.NativeFSLock.Release()
>        at Lucene.Net.Index.IndexWriter.CloseInternal(Boolean waitForMerges)
>        at Lucene.Net.Index.IndexWriter.Dispose(Boolean disposing, Boolean waitForMerges)
>        at Lucene.Net.Index.IndexWriter.Dispose(Boolean waitForMerges)
>        at Lucene.Net.Index.IndexWriter.Dispose()
>        at WpfApplication.LuceneManager.Dispose(Boolean isDisposing)
>        at WpfApplication.LuceneManager.Finalize()
>   InnerException: 
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message