Index: lucene/src/java/org/apache/lucene/index/DirectoryReader.java --- lucene/src/java/org/apache/lucene/index/DirectoryReader.java Sun Dec 05 19:21:44 2010 -0500 +++ lucene/src/java/org/apache/lucene/index/DirectoryReader.java Mon Dec 06 19:51:46 2010 -0500 @@ -770,6 +770,7 @@ deletionPolicy == null ? new KeepOnlyLastCommitDeletionPolicy() : deletionPolicy, segmentInfos, null, null, codecs); segmentInfos.updateGeneration(deleter.getLastSegmentInfos()); + segmentInfos.changed(); // Checkpoint the state we are about to change, in // case we have to roll back: Index: lucene/src/java/org/apache/lucene/index/IndexWriter.java --- lucene/src/java/org/apache/lucene/index/IndexWriter.java Sun Dec 05 19:21:44 2010 -0500 +++ lucene/src/java/org/apache/lucene/index/IndexWriter.java Mon Dec 06 19:51:46 2010 -0500 @@ -741,6 +741,7 @@ // Record that we have a change (zero out all // segments) pending: changeCount++; + segmentInfos.changed(); } else { segmentInfos.read(directory, codecs); @@ -757,6 +758,7 @@ oldInfos.read(directory, commit.getSegmentsFileName(), codecs); segmentInfos.replace(oldInfos); changeCount++; + segmentInfos.changed(); if (infoStream != null) message("init: loaded commit \"" + commit.getSegmentsFileName() + "\""); } @@ -774,12 +776,14 @@ conf.getIndexDeletionPolicy(), segmentInfos, infoStream, docWriter, codecs); - if (deleter.startingCommitDeleted) + if (deleter.startingCommitDeleted) { // Deletion policy deleted the "head" commit point. // We have to mark ourself as changed so that if we // are closed w/o any further changes we write a new // segments_N file. changeCount++; + segmentInfos.changed(); + } docWriter.setMaxBufferedDeleteTerms(conf.getMaxBufferedDeleteTerms()); docWriter.setRAMBufferSizeMB(conf.getRAMBufferSizeMB()); @@ -1537,6 +1541,7 @@ // name that was previously returned which can cause // problems at least with ConcurrentMergeScheduler. changeCount++; + segmentInfos.changed(); return "_" + Integer.toString(segmentInfos.counter++, Character.MAX_RADIX); } } @@ -2119,6 +2124,7 @@ */ private synchronized void checkpoint() throws IOException { changeCount++; + segmentInfos.changed(); deleter.checkpoint(segmentInfos, false); } @@ -3686,6 +3692,7 @@ } toSync.remove(toSync.size()-1); changeCount++; + segmentInfos.changed(); } } assert filesExist(toSync); Index: lucene/src/java/org/apache/lucene/index/SegmentInfos.java --- lucene/src/java/org/apache/lucene/index/SegmentInfos.java Sun Dec 05 19:21:44 2010 -0500 +++ lucene/src/java/org/apache/lucene/index/SegmentInfos.java Mon Dec 06 19:51:46 2010 -0500 @@ -862,4 +862,10 @@ } return count; } + + /** Call this before committing if changes have been made to the + * segments. */ + public void changed() { + version++; + } }