You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by "Michael McCandless (JIRA)" <ji...@apache.org> on 2006/11/17 23:35:40 UTC

[jira] Resolved: (LUCENE-715) IndexWriter does not release its write lock when trying to open an index which does not yet exist

     [ http://issues.apache.org/jira/browse/LUCENE-715?page=all ]

Michael McCandless resolved LUCENE-715.
---------------------------------------

    Fix Version/s: 2.1
       Resolution: Fixed

> IndexWriter does not release its write lock when trying to open an index which does not yet exist
> -------------------------------------------------------------------------------------------------
>
>                 Key: LUCENE-715
>                 URL: http://issues.apache.org/jira/browse/LUCENE-715
>             Project: Lucene - Java
>          Issue Type: Bug
>          Components: Index
>    Affects Versions: 2.0.0
>         Environment: Windows XP, Java 1.5, IntelliJ 6
>            Reporter: Matthew Bogosian
>             Fix For: 2.1
>
>         Attachments: LUCENE-715.patch, LUCENE-715.patch
>
>
> In version 2.0.0, the private IndexWriter constructor does not properly remove its write lock in the event of an error. This can be seen when one attempts to open (not create) an index in a directory which exists, but in which there is no segments file. Here is the offending code:
>     247   private IndexWriter(Directory d, Analyzer a, final boolean create, boolean closeDir)
>     248     throws IOException {
>     249       this.closeDir = closeDir;
>     250       directory = d;
>     251       analyzer = a;
>     252 
>     253       Lock writeLock = directory.makeLock(IndexWriter.WRITE_LOCK_NAME);
>     254       if (!writeLock.obtain(writeLockTimeout)) // obtain write lock
>     255         throw new IOException("Index locked for write: " + writeLock);
>     256       this.writeLock = writeLock;                   // save it
>     257 
>     258       synchronized (directory) {        // in- & inter-process sync
>     259         new Lock.With(directory.makeLock(IndexWriter.COMMIT_LOCK_NAME), commitLockTimeout) {
>     260             public Object doBody() throws IOException {
>     261               if (create)
>     262                 segmentInfos.write(directory);
>     263               else
>     264                 segmentInfos.read(directory);
>     265               return null;
>     266             }
>     267           }.run();
>     268       }
>     269   }
> On line 254, a write lock is obtained by the constructor. If an exception is raised inside the doBody() method (on line 260), then that exception is propagated, the constructor will fail, but the lock is not released until the object is garbage collected. This is typically an issue except when using the IndexModifier class.
> As of the filing of this bug, this has not yet been fixed in the trunk (IndexWriter.java#472959):
>     251   private IndexWriter(Directory d, Analyzer a, final boolean create, boolean closeDir)
>     252     throws IOException {
>     253       this.closeDir = closeDir;
>     254       directory = d;
>     255       analyzer = a;
>     256 
>     257       Lock writeLock = directory.makeLock(IndexWriter.WRITE_LOCK_NAME);
>     258       if (!writeLock.obtain(writeLockTimeout)) // obtain write lock
>     259         throw new IOException("Index locked for write: " + writeLock);
>     260       this.writeLock = writeLock;                   // save it
>     261 
>     262       synchronized (directory) {        // in- & inter-process sync
>     263         new Lock.With(directory.makeLock(IndexWriter.COMMIT_LOCK_NAME), commitLockTimeout) {
>     264             public Object doBody() throws IOException {
>     265               if (create)
>     266                 segmentInfos.write(directory);
>     267               else
>     268                 segmentInfos.read(directory);
>     269               return null;
>     270             }
>     271           }.run();
>     272       }
>     273   }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-dev-help@lucene.apache.org