dmitrys 2003/09/25 14:41:51 Modified: src/java/org/apache/lucene/index IndexReader.java Log: Submitted by: Christoph Goller via Dmitry Slightly modified patch from Christoph to prohibit modifications of an index by readers that have a stale view of it. Revision Changes Path 1.18 +35 -16 jakarta-lucene/src/java/org/apache/lucene/index/IndexReader.java Index: IndexReader.java =================================================================== RCS file: /home/cvs/jakarta-lucene/src/java/org/apache/lucene/index/IndexReader.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- IndexReader.java 12 Aug 2003 15:05:03 -0000 1.17 +++ IndexReader.java 25 Sep 2003 21:41:51 -0000 1.18 @@ -80,11 +80,15 @@ public abstract class IndexReader { protected IndexReader(Directory directory) { this.directory = directory; + segmentInfosAge = Long.MAX_VALUE; } Directory directory; private Lock writeLock; + //used to determine whether index has chaged since reader was opened + private long segmentInfosAge; + /** Returns an IndexReader reading the index in an FSDirectory in the named path. */ public static IndexReader open(String path) throws IOException { @@ -101,18 +105,24 @@ public static IndexReader open(final Directory directory) throws IOException{ synchronized (directory) { // in- & inter-process sync return (IndexReader)new Lock.With(directory.makeLock("commit.lock"), IndexWriter.COMMIT_LOCK_TIMEOUT) { - public Object doBody() throws IOException { - SegmentInfos infos = new SegmentInfos(); - infos.read(directory); - if (infos.size() == 1) // index is optimized - return new SegmentReader(infos.info(0), true); - - SegmentReader[] readers = new SegmentReader[infos.size()]; - for (int i = 0; i < infos.size(); i++) - readers[i] = new SegmentReader(infos.info(i), i==infos.size()-1); - return new SegmentsReader(directory, readers); - } - }.run(); + public Object doBody() throws IOException { + IndexReader result = null; + + SegmentInfos infos = new SegmentInfos(); + infos.read(directory); + if (infos.size() == 1) { // index is optimized + result = new SegmentReader(infos.info(0), true); + } else { + SegmentReader[] readers = new SegmentReader[infos.size()]; + for (int i = 0; i < infos.size(); i++) + readers[i] = new SegmentReader(infos.info(i), i==infos.size()-1); + result = new SegmentsReader(directory, readers); + } + + result.segmentInfosAge = lastModified(directory); + return result; + } + }.run(); } } @@ -229,8 +239,8 @@ <p><ul> Term => <docNum, freq, <pos<sub>1</sub>, pos<sub>2</sub>, ... - pos<sub>freq-1</sub>> - ><sup>*</sup> + pos<sub>freq-1</sub>> + ><sup>*</sup> </ul> <p> This positional information faciliates phrase and proximity searching. <p>The enumeration is ordered by document number. Each document number is @@ -258,6 +268,15 @@ if (!writeLock.obtain(IndexWriter.WRITE_LOCK_TIMEOUT)) // obtain write lock throw new IOException("Index locked for write: " + writeLock); this.writeLock = writeLock; + + // we have to check whether index has changed since this reader was opened. + // if so, this reader is no longer valid for deletion + if(lastModified(directory) > segmentInfosAge){ + this.writeLock.release(); + this.writeLock = null; + throw new IOException( + "IndexReader out of date and no longer valid for deletion"); + } } doDelete(docNum); } @@ -276,8 +295,8 @@ int n = 0; try { while (docs.next()) { - delete(docs.doc()); - n++; + delete(docs.doc()); + n++; } } finally { docs.close();
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]