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