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]

Reply via email to