Return-Path: Delivered-To: apmail-lucene-java-dev-archive@www.apache.org Received: (qmail 11023 invoked from network); 17 Nov 2006 21:51:03 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 17 Nov 2006 21:51:03 -0000 Received: (qmail 83940 invoked by uid 500); 17 Nov 2006 21:51:09 -0000 Delivered-To: apmail-lucene-java-dev-archive@lucene.apache.org Received: (qmail 83905 invoked by uid 500); 17 Nov 2006 21:51:09 -0000 Mailing-List: contact java-dev-help@lucene.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: java-dev@lucene.apache.org Delivered-To: mailing list java-dev@lucene.apache.org Received: (qmail 83872 invoked by uid 99); 17 Nov 2006 21:51:09 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 17 Nov 2006 13:51:09 -0800 X-ASF-Spam-Status: No, hits=0.0 required=10.0 tests= X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO brutus.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 17 Nov 2006 13:50:58 -0800 Received: from brutus (localhost [127.0.0.1]) by brutus.apache.org (Postfix) with ESMTP id 43DC2714327 for ; Fri, 17 Nov 2006 13:50:38 -0800 (PST) Message-ID: <27689418.1163800238275.JavaMail.jira@brutus> Date: Fri, 17 Nov 2006 13:50:38 -0800 (PST) From: "Matthew Bogosian (JIRA)" To: java-dev@lucene.apache.org Subject: [jira] Updated: (LUCENE-715) IndexWriter does not release its write lock when trying to open an index which does not yet exist In-Reply-To: <21123197.1163789137098.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org [ http://issues.apache.org/jira/browse/LUCENE-715?page=all ] Matthew Bogosian updated LUCENE-715: ------------------------------------ Attachment: LUCENE-715.patch Ugh! How embarrassing! If it makes you feel better, I re-raised the exception in my mind.... ;-) I added the the missing throw statement and moved the try/catch outside of the synchronized block (which is probably even better since it will also take care of the case where the call to makeLock raises an IOException). Thanks for catching that (no pun intended)! > 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 > 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