Hi all

I've just created a new test project and I confirm that the exception occurs.

The steps to reproduce:
1. Open the index Reader and/or Searcher. (Select and index flder or wrtite the 
path in the first textbox, then Click button "Open")
2. Check IsCurrent. Must return TRUE (Click the "IsCurrent?" button)
3. Modify the index. (Click the "Add doc" button, this will add a doc and close 
the Writer)
4. Check IsCurrent. Must return FALSE (Click the "IsCurrent?" button)
5. Reopen Searcer and/or Reader. (Click "Reopen" button)
6. Check IsCurrent. Must return TRUE (Click the "IsCurrent?" button)
6.1 Here I get: 
"Lucene.Net.Store.AlreadyClosedException: this Directory is closed
   at Lucene.Net.Store.Directory.EnsureOpen() in 
G:\Installers\Desarrollo\LuceneNET\SVN\LuceneNET_SVN\trunk(2.4.0,2009-09-17)\C#\src\Lucene.Net\Store\Directory.cs:line
 244
   at Lucene.Net.Store.FSDirectory.List() in 
G:\Installers\Desarrollo\LuceneNET\SVN\LuceneNET_SVN\trunk(2.4.0,2009-09-17)\C#\src\Lucene.Net\Store\FSDirectory.cs:line
 386
   at Lucene.Net.Index.SegmentInfos.FindSegmentsFile.Run() in 
G:\Installers\Desarrollo\LuceneNET\SVN\LuceneNET_SVN\trunk(2.4.0,2009-09-17)\C#\src\Lucene.Net\Index\SegmentInfos.cs:line
 620
   at Lucene.Net.Index.SegmentInfos.ReadCurrentVersion(Directory directory) in 
G:\Installers\Desarrollo\LuceneNET\SVN\LuceneNET_SVN\trunk(2.4.0,2009-09-17)\C#\src\Lucene.Net\Index\SegmentInfos.cs:line
 473
   at Lucene.Net.Index.DirectoryIndexReader.IsCurrent() in 
G:\Installers\Desarrollo\LuceneNET\SVN\LuceneNET_SVN\trunk(2.4.0,2009-09-17)\C#\src\Lucene.Net\Index\DirectoryIndexReader.cs:line
 232
   at LuceneReopenTest.Form1.btnIsCurent_Click(Object sender, EventArgs e) in 
G:\Installers\Desarrollo\LuceneNET\Tests\LuceneReopenTest\LuceneReopenTest\Form1.vb:line
 268"

If instead of using Reopen you do a Close + Open, there is no exception.
1. Open the index Reader and/or Searcher. (Select and index flder or wrtite the 
path in the first textbox, then Click button "Open")
2. Check IsCurrent. Must return TRUE (Click the "IsCurrent?" button)
3. Modify the index. (Click the "Add doc" button, this will add a doc and close 
the Writer)
4. Check IsCurrent. Must return FALSE (Click the "IsCurrent?" button)
5. Close+Open Searcer and/or Reader. (Click "Close" then the "Open" button)
6. Check IsCurrent. Must return TRUE (Click the "IsCurrent?" button)
6.1 Here I get: TRUE    :-)

My test project code is below. It is just a VB project with a single form.
Just create a new form, delete the "Form1.Designer.vb" file and paste the code 
in the "Form1.vb".
=======================================================
Imports Lucene.Net.Index
Imports Lucene.Net.Search
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Class Form1
    Inherits System.Windows.Forms.Form

    'Form overrides dispose to clean up the component list.
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.txtIndexFolder = New System.Windows.Forms.TextBox
        Me.btnBrowseFolder = New System.Windows.Forms.Button
        Me.bntOpen = New System.Windows.Forms.Button
        Me.btnClose = New System.Windows.Forms.Button
        Me.btnReopen = New System.Windows.Forms.Button
        Me.btnIsCurent = New System.Windows.Forms.Button
        Me.btnSearch = New System.Windows.Forms.Button
        Me.txtSearch = New System.Windows.Forms.TextBox
        Me.StatusStrip1 = New System.Windows.Forms.StatusStrip
        Me.statusLabel = New System.Windows.Forms.ToolStripStatusLabel
        Me.btnAdd = New System.Windows.Forms.Button
        Me.StatusStrip1.SuspendLayout()
        Me.SuspendLayout()
        '
        'txtIndexFolder
        '
        Me.txtIndexFolder.Location = New System.Drawing.Point(12, 12)
        Me.txtIndexFolder.Name = "txtIndexFolder"
        Me.txtIndexFolder.Size = New System.Drawing.Size(713, 20)
        Me.txtIndexFolder.TabIndex = 0
        '
        'btnBrowseFolder
        '
        Me.btnBrowseFolder.Location = New System.Drawing.Point(731, 12)
        Me.btnBrowseFolder.Name = "btnBrowseFolder"
        Me.btnBrowseFolder.Size = New System.Drawing.Size(24, 20)
        Me.btnBrowseFolder.TabIndex = 1
        Me.btnBrowseFolder.Text = "..."
        Me.btnBrowseFolder.UseVisualStyleBackColor = True
        '
        'bntOpen
        '
        Me.bntOpen.Location = New System.Drawing.Point(12, 38)
        Me.bntOpen.Name = "bntOpen"
        Me.bntOpen.Size = New System.Drawing.Size(75, 23)
        Me.bntOpen.TabIndex = 2
        Me.bntOpen.Text = "Open"
        Me.bntOpen.UseVisualStyleBackColor = True
        '
        'btnClose
        '
        Me.btnClose.Location = New System.Drawing.Point(93, 38)
        Me.btnClose.Name = "btnClose"
        Me.btnClose.Size = New System.Drawing.Size(75, 23)
        Me.btnClose.TabIndex = 3
        Me.btnClose.Text = "Close"
        Me.btnClose.UseVisualStyleBackColor = True
        '
        'btnReopen
        '
        Me.btnReopen.Location = New System.Drawing.Point(174, 38)
        Me.btnReopen.Name = "btnReopen"
        Me.btnReopen.Size = New System.Drawing.Size(75, 23)
        Me.btnReopen.TabIndex = 4
        Me.btnReopen.Text = "Reopen"
        Me.btnReopen.UseVisualStyleBackColor = True
        '
        'btnIsCurent
        '
        Me.btnIsCurent.Location = New System.Drawing.Point(255, 38)
        Me.btnIsCurent.Name = "btnIsCurent"
        Me.btnIsCurent.Size = New System.Drawing.Size(75, 23)
        Me.btnIsCurent.TabIndex = 5
        Me.btnIsCurent.Text = "IsCurrent?"
        Me.btnIsCurent.UseVisualStyleBackColor = True
        '
        'btnSearch
        '
        Me.btnSearch.Location = New System.Drawing.Point(680, 67)
        Me.btnSearch.Name = "btnSearch"
        Me.btnSearch.Size = New System.Drawing.Size(75, 20)
        Me.btnSearch.TabIndex = 6
        Me.btnSearch.Text = "Search"
        Me.btnSearch.UseVisualStyleBackColor = True
        '
        'txtSearch
        '
        Me.txtSearch.Location = New System.Drawing.Point(12, 67)
        Me.txtSearch.Name = "txtSearch"
        Me.txtSearch.Size = New System.Drawing.Size(662, 20)
        Me.txtSearch.TabIndex = 7
        '
        'StatusStrip1
        '
        Me.StatusStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() 
{Me.statusLabel})
        Me.StatusStrip1.Location = New System.Drawing.Point(0, 375)
        Me.StatusStrip1.Name = "StatusStrip1"
        Me.StatusStrip1.Size = New System.Drawing.Size(767, 22)
        Me.StatusStrip1.TabIndex = 8
        Me.StatusStrip1.Text = "StatusStrip1"
        '
        'statusLabel
        '
        Me.statusLabel.Name = "statusLabel"
        Me.statusLabel.Size = New System.Drawing.Size(111, 17)
        Me.statusLabel.Text = "ToolStripStatusLabel1"
        '
        'btnAdd
        '
        Me.btnAdd.Location = New System.Drawing.Point(336, 38)
        Me.btnAdd.Name = "btnAdd"
        Me.btnAdd.Size = New System.Drawing.Size(75, 23)
        Me.btnAdd.TabIndex = 9
        Me.btnAdd.Text = "Add doc"
        Me.btnAdd.UseVisualStyleBackColor = True
        '
        'Form1
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(767, 397)
        Me.Controls.Add(Me.btnAdd)
        Me.Controls.Add(Me.StatusStrip1)
        Me.Controls.Add(Me.txtSearch)
        Me.Controls.Add(Me.btnSearch)
        Me.Controls.Add(Me.btnIsCurent)
        Me.Controls.Add(Me.btnReopen)
        Me.Controls.Add(Me.btnClose)
        Me.Controls.Add(Me.bntOpen)
        Me.Controls.Add(Me.btnBrowseFolder)
        Me.Controls.Add(Me.txtIndexFolder)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.StatusStrip1.ResumeLayout(False)
        Me.StatusStrip1.PerformLayout()
        Me.ResumeLayout(False)
        Me.PerformLayout()

    End Sub
    Friend WithEvents txtIndexFolder As System.Windows.Forms.TextBox
    Friend WithEvents btnBrowseFolder As System.Windows.Forms.Button
    Friend WithEvents bntOpen As System.Windows.Forms.Button
    Friend WithEvents btnClose As System.Windows.Forms.Button
    Friend WithEvents btnReopen As System.Windows.Forms.Button
    Friend WithEvents btnIsCurent As System.Windows.Forms.Button
    Friend WithEvents btnSearch As System.Windows.Forms.Button
    Friend WithEvents txtSearch As System.Windows.Forms.TextBox
    Friend WithEvents StatusStrip1 As System.Windows.Forms.StatusStrip
    Friend WithEvents statusLabel As System.Windows.Forms.ToolStripStatusLabel
    Friend WithEvents btnAdd As System.Windows.Forms.Button


    Private _ir As IndexReader
    Private _is As IndexSearcher

    Private Sub btnBrowseFolder_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles btnBrowseFolder.Click
        Using ofd As New FolderBrowserDialog
            ofd.SelectedPath = txtIndexFolder.Text

            If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
                txtIndexFolder.Text = ofd.SelectedPath
            End If
        End Using
    End Sub

    Private Sub bntOpen_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles bntOpen.Click
        Dim sDir As String = txtIndexFolder.Text.Trim
        If sDir = "" OrElse IO.Directory.Exists(sDir) = False Then
            MessageBox.Show("Select the index directory.")
            Exit Sub
        End If

        Try
            _ir.EnsureOpen()
            MessageBox.Show("Reader is already open.")
            Exit Sub
        Catch ex As Exception
            ' Reader is not open,    continue
        End Try

        _ir = IndexReader.Open(sDir)
        _is = New IndexSearcher(sDir)
        statusLabel.Text = "Index open."
    End Sub

    Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles btnClose.Click
        Try
            _ir.EnsureOpen()
        Catch ex As Exception
            MessageBox.Show("Reader is closed.")
            Exit Sub
        End Try

        _ir.Close()
        _is.Close()
        statusLabel.Text = "Index closed"
    End Sub

    Private Sub btnReopen_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles btnReopen.Click
        Try
            _ir.EnsureOpen()
        Catch ex As Exception
            MessageBox.Show("Reader is closed.")
            Exit Sub
        End Try

        Dim newR As IndexReader
        Dim newSR As IndexReader
        Try
            newR = _ir.Reopen
            If newR IsNot _ir Then
                ' READER
                ' Store a reference to the old reader to close it later
                Try
                    _ir.Close()
                Catch
                    ' do Nothing, just in case its already closed an exception 
can occur
                End Try

                ' Set Reader to the new reopened instance
                _ir = newR
            End If

            newSR = _is.Reader.Reopen
            If newSR IsNot _is.Reader Then
                ' SEARCHER
                Try
                    ' We dont need this since we created the Searcher with a 
string "c:\asdasfd\"
                    '_is.Reader.Close 
                    _is.Close()
                Catch ex As Exception
                    ' do Nothing, just in case its already closed an exception 
can occur
                End Try

                ' Create a new Searcher using the reopened reader
                _is = New IndexSearcher(newSR)
            End If
        Catch ex As Exception
            MessageBox.Show("Error reopening index: " + ex.Message)
        End Try
    End Sub

    Private Sub btnIsCurent_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles btnIsCurent.Click
        Try
            _ir.EnsureOpen()
        Catch ex As Exception
            MessageBox.Show("Reader is closed.")
            Exit Sub
        End Try
        Try
            MessageBox.Show("Reader is current=" + _ir.IsCurrent.ToString)
            MessageBox.Show("Searcher is current=" + 
_is.Reader.IsCurrent.ToString)
        Catch ex As Exception
            MessageBox.Show("ERROR gettings IsCurrent: " + ex.Message + vbCrLf 
+ ex.ToString)
        End Try
    End Sub

    Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles btnSearch.Click
        If txtSearch.Text.Trim <> "" Then
            Dim qp As New Lucene.Net.QueryParsers.QueryParser("", New 
Lucene.Net.Analysis.WhitespaceAnalyzer())
            Dim q As Query = qp.Parse(txtSearch.Text)
            Dim topD As Lucene.Net.Search.TopDocs = _is.Search(q, 100)
        End If
    End Sub

    Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles btnAdd.Click
        Try
            _ir.EnsureOpen()
        Catch ex As Exception
            MessageBox.Show("Reader is closed.")
            Exit Sub
        End Try
        Dim _iw As IndexWriter
        Try
            _iw = New IndexWriter(txtIndexFolder.Text, New 
Lucene.Net.Analysis.WhitespaceAnalyzer(), False, 
Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED)
            Dim d As New Lucene.Net.Documents.Document()
            Dim f As New Lucene.Net.Documents.Field("fieldName", "fieldValue", 
Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.ANALYZED)
            d.Add(f)
            _iw.AddDocument(d)
            _iw.Commit()
        Catch ex As Exception
            MessageBox.Show("Error: " + ex.Message + vbCrLf + ex.ToString)
        Finally
            If _iw IsNot Nothing Then
                _iw.Close()
            End If
        End Try
    End Sub

End Class
=======================================================

Saludos,
Luis


-----Original Message-----
From: Luis Fco. Ramirez Daza Gonzalez [mailto:[email protected]] 
Sent: Thursday, October 15, 2009 5:04 PM
To: '[email protected]'
Subject: RE: Port of Java Lucene 2.9 is under way

Just to confirm I've just downloaded the version in the trunk and it’s the same 
version I have in my environment.

-----Original Message-----
From: Luis Fco. Ramirez Daza Gonzalez [mailto:[email protected]] 
Sent: Thursday, October 15, 2009 3:55 PM
To: [email protected]; [email protected]
Subject: RE: Port of Java Lucene 2.9 is under way

Hi Michael

I'm not sure if I have latest version from the trunk. I'll check that right now.

The error is:
"Lucene.Net.Store.AlreadyClosedException: this Directory is closed
   at Lucene.Net.Store.Directory.EnsureOpen() in 
G:\Projects\Code\LN_2_4_0\src\LN\Store\Directory.cs:line 246
   at Lucene.Net.Store.FSDirectory.List() in 
G:\Projects\Code\LN_2_4_0\src\LN\Store\FSDirectory.cs:line 389
   at Lucene.Net.Index.SegmentInfos.FindSegmentsFile.Run() in 
G:\Projects\Code\LN_2_4_0\src\LN\Index\SegmentInfos.cs:line 623
   at Lucene.Net.Index.SegmentInfos.ReadCurrentVersion(Directory directory) in 
G:\Projects\Code\LN_2_4_0\src\LN\Index\SegmentInfos.cs:line 476
   at Lucene.Net.Index.DirectoryIndexReader.IsCurrent() in 
G:\Projects\Code\LN_2_4_0\src\LN\Index\DirectoryIndexReader.cs:line 235
   at TextIndexLucene.TIdxLucene.TIdxL.IsCurrent() in 
G:\Projects\Code\TextIndexLucene\TxtIdxL.vb:line 3491
   at TextIndexLuceneTestBed.frmMain.DoSearch() in 
G:\Projects\Code\TextIndexLuceneTestBed\frmMain.vb:line 2201"


>From what I read from the post in the Lucene-Java and from debugging, the 
>problem is that the Directory/FSDirectory are being closed recursively, and it 
>eventually closes all Directories and resets all ref count to 0.
And as I undertand from the post is happens when you create the Reader/Searcher 
using a string "NEW Reader("c:\indexfolder\")" and later you reopen the index 
using a Directory (FSDirectory for example), it calls DecRef() recursively 
until it reaches 0. And later when I call IsCurrent() it throws 
-AlreadyClosedException("this IndexReader is closed")- when EnsureOpen() is 
called because the refCount is <=0.

I'll try to write a function to reproduce the problem.

Thanks in advance for your help.

Saludos, 
Luis

-----Original Message-----
From: Michael Garski [mailto:[email protected]] 
Sent: Thursday, October 15, 2009 12:42 PM
To: [email protected]; [email protected]
Subject: RE: Port of Java Lucene 2.9 is under way

Luis,

What issue are you having with the IndexReader.Reopen() method?  We use it for 
the same reasons you are and do not have any issues with it using the latest 
version in the trunk.

Michael

-----Original Message-----
From: Luis Fco. Ramirez Daza Gonzalez [mailto:[email protected]] 
Sent: Wednesday, October 14, 2009 7:13 PM
To: [email protected]; [email protected]
Subject: RE: Port of Java Lucene 2.9 is under way

Hi George

I just want to know the status of the 2.9 port.

I'm thinking of trying it because we are using 2.4 and I think we are
hitting a bug with the Reopen method.
I was looking for a solution and found a thread in the Java JIRA that says
the fix wont be ported back to 2.4, but I think it is solved in 2.9 in with
a patch:
https://issues.apache.org/jira/browse/LUCENE-1453

The reopen function is very important for us because we update the index
very often, and right now we have to Close + Open each time we update the
index, and because we use custom sort field, we also need to warm up each
time we Close+Open, and all that seems to be solved with the Reopen. 

Thanks

Best regards
Luis

-----Original Message-----
From: George Aroush [mailto:[email protected]] 
Sent: Wednesday, September 16, 2009 9:32 PM
To: [email protected];
[email protected]
Subject: Port of Java Lucene 2.9 is under way

Hi folks,

 

This is to let you know that I have begun the porting process of Java Lucene
2.9 to Lucene.Net.  I hope in few weeks (maybe even next week) to have an
early release checked-into SVN.

 

If you are following Java Lucene mailing list, you will know that 2.9 is
currently undergoing release as Release Candidate 4 and RC5 is expected (a
bug was found in RC4).  My port is based on RC3, but changes between Java
Lucene 2.9 RC3 and soon to come RC5 aren't major to side track my port.

 

With 2.9 release, we should be able to keep Java Lucene and Lucene.Net
releases very close; my hope is, any further ports should be an accumulation
of Java Lucene SVN commits ports vs. waiting for a new release to do a chunk
release.  I'm not sure if this goal can be achieved, but we will see.

 

Regards,

 

-- George






Reply via email to