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
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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]