I refurbished my timestamp patch a little bit in order to eliminate unnecessary changes e.g. in test code. The attached patch has to be applied to
/src/java/org/apache/lucene/index
regards, Christoph
Index: IndexReader.java =================================================================== RCS file: /home/cvs/jakarta-lucene/src/java/org/apache/lucene/index/IndexReader.java,v retrieving revision 1.22 diff -u -r1.22 IndexReader.java --- IndexReader.java 21 Oct 2003 18:24:23 -0000 1.22 +++ IndexReader.java 31 Oct 2003 12:39:08 -0000 @@ -83,14 +83,14 @@ public abstract class IndexReader { protected IndexReader(Directory directory) { this.directory = directory; - segmentInfosAge = Long.MAX_VALUE; + stale = false; + segmentInfos = null; } private Directory directory; private Lock writeLock; - - //used to determine whether index has chaged since reader was opened - private long segmentInfosAge; + protected SegmentInfos segmentInfos; + private boolean stale; /** Returns an IndexReader reading the index in an FSDirectory in the named path. */ @@ -111,21 +111,16 @@ directory.makeLock(IndexWriter.COMMIT_LOCK_NAME), IndexWriter.COMMIT_LOCK_TIMEOUT) { 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); + return new SegmentReader(infos, 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); + readers[i] = new SegmentReader(infos, infos.info(i), i==infos.size()-1); + return new SegmentsReader(infos, directory, readers); } - - result.segmentInfosAge = lastModified(directory); - return result; } }.run(); } @@ -274,6 +269,9 @@ this will be corrected eventually as the index is further modified. */ public final synchronized void delete(int docNum) throws IOException { + if(stale) + throw new IOException("IndexReader out of date and no longer valid for deletion"); + if (writeLock == null) { Lock writeLock = directory.makeLock(IndexWriter.WRITE_LOCK_NAME); if (!writeLock.obtain(IndexWriter.WRITE_LOCK_TIMEOUT)) // obtain write lock @@ -282,11 +280,12 @@ // 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){ + if(segmentInfos != null + && SegmentInfos.readNrChanges(directory) > segmentInfos.getNrChanges()){ + stale = true; this.writeLock.release(); this.writeLock = null; - throw new IOException( - "IndexReader out of date and no longer valid for deletion"); + throw new IOException("IndexReader out of date and no longer valid for deletion"); } } doDelete(docNum); Index: SegmentInfos.java =================================================================== RCS file: /home/cvs/jakarta-lucene/src/java/org/apache/lucene/index/SegmentInfos.java,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 SegmentInfos.java --- SegmentInfos.java 18 Sep 2001 16:29:53 -0000 1.1.1.1 +++ SegmentInfos.java 31 Oct 2003 12:39:09 -0000 @@ -62,6 +62,8 @@ final class SegmentInfos extends Vector { public int counter = 0; // used to name new segments + private long nrChanges = 0; // counts how often the index is changed + // by adding or deleting docs public final SegmentInfo info(int i) { return (SegmentInfo)elementAt(i); @@ -70,6 +72,7 @@ public final void read(Directory directory) throws IOException { InputStream input = directory.openFile("segments"); try { + nrChanges = input.readLong(); // read nrChanges counter = input.readInt(); // read counter for (int i = input.readInt(); i > 0; i--) { // read segmentInfos SegmentInfo si = new SegmentInfo(input.readString(), input.readInt(), @@ -84,6 +87,8 @@ public final void write(Directory directory) throws IOException { OutputStream output = directory.createFile("segments.new"); try { + nrChanges++; // every write changes the index + output.writeLong(nrChanges); // write nrChanges output.writeInt(counter); // write counter output.writeInt(size()); // write infos for (int i = 0; i < size(); i++) { @@ -97,5 +102,20 @@ // install new segment info directory.renameFile("segments.new", "segments"); + } + + public long getNrChanges(){ + return nrChanges; + } + + public static long readNrChanges(Directory directory) throws IOException { + InputStream input = directory.openFile("segments"); + long nrChanges; + try { + nrChanges = input.readLong(); // read nrChanges + } finally { + input.close(); + } + return nrChanges; } } Index: SegmentReader.java =================================================================== RCS file: /home/cvs/jakarta-lucene/src/java/org/apache/lucene/index/SegmentReader.java,v retrieving revision 1.15 diff -u -r1.15 SegmentReader.java --- SegmentReader.java 21 Oct 2003 18:24:23 -0000 1.15 +++ SegmentReader.java 31 Oct 2003 12:39:09 -0000 @@ -98,10 +98,11 @@ } private Hashtable norms = new Hashtable(); - SegmentReader(SegmentInfo si, boolean closeDir) + SegmentReader(SegmentInfos sis, SegmentInfo si, boolean closeDir) throws IOException { this(si); closeDirectory = closeDir; + segmentInfos = sis; } SegmentReader(SegmentInfo si) @@ -141,7 +142,7 @@ public Object doBody() throws IOException { deletedDocs.write(directory(), segment + ".tmp"); directory().renameFile(segment + ".tmp", segment + ".del"); - directory().touchFile("segments"); + segmentInfos.write(directory()); return null; } }.run(); Index: SegmentsReader.java =================================================================== RCS file: /home/cvs/jakarta-lucene/src/java/org/apache/lucene/index/SegmentsReader.java,v retrieving revision 1.15 diff -u -r1.15 SegmentsReader.java --- SegmentsReader.java 31 Oct 2003 09:46:54 -0000 1.15 +++ SegmentsReader.java 31 Oct 2003 12:39:10 -0000 @@ -78,6 +78,11 @@ private int numDocs = -1; private boolean hasDeletions = false; + SegmentsReader(SegmentInfos sis, Directory directory, SegmentReader[] r) throws IOException { + this(directory, r); + segmentInfos = sis; + } + SegmentsReader(Directory directory, SegmentReader[] r) throws IOException { super(directory); readers = r;
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]