Index: src/test/org/apache/lucene/index/TestIndexReader.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexReader.java (revision 777080) +++ src/test/org/apache/lucene/index/TestIndexReader.java (working copy) @@ -1590,6 +1590,27 @@ IndexReader.open(dir).close(); } + // LUCENE-1647 + public void testIndexReaderUnDeleteAll() throws Exception { + MockRAMDirectory dir = new MockRAMDirectory(); + dir.setPreventDoubleWrite(false); + IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(), + IndexWriter.MaxFieldLength.UNLIMITED); + writer.addDocument(createDocument("a")); + writer.addDocument(createDocument("b")); + writer.addDocument(createDocument("c")); + writer.close(); + IndexReader reader = IndexReader.open(dir); + reader.deleteDocuments(new Term("id", "a")); + reader.flush(); + reader.deleteDocuments(new Term("id", "b")); + reader.undeleteAll(); + reader.deleteDocuments(new Term("id", "b")); + reader.close(); + IndexReader.open(dir).close(); + dir.close(); + } + private Document createDocument(String id) { Document doc = new Document(); doc.add(new Field("id", id, Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); Index: src/test/org/apache/lucene/store/MockRAMDirectory.java =================================================================== --- src/test/org/apache/lucene/store/MockRAMDirectory.java (revision 777080) +++ src/test/org/apache/lucene/store/MockRAMDirectory.java (working copy) @@ -215,7 +215,7 @@ createdFiles.add(name); RAMFile existing = (RAMFile)fileMap.get(name); // Enforce write once: - if (existing!=null && !name.equals("segments.gen")) + if (existing!=null && !name.equals("segments.gen") && preventDoubleWrite) throw new IOException("file " + name + " already exists"); else { if (existing!=null) { Index: src/java/org/apache/lucene/index/SegmentReader.java =================================================================== --- src/java/org/apache/lucene/index/SegmentReader.java (revision 777080) +++ src/java/org/apache/lucene/index/SegmentReader.java (working copy) @@ -57,12 +57,10 @@ Ref deletedDocsRef = null; private boolean deletedDocsDirty = false; private boolean normsDirty = false; - private boolean undeleteAll = false; private int pendingDeleteCount; private boolean rollbackDeletedDocsDirty = false; private boolean rollbackNormsDirty = false; - private boolean rollbackUndeleteAll = false; private int rollbackPendingDeleteCount; IndexInput freqStream; IndexInput proxStream; @@ -683,14 +681,14 @@ clone.readBufferSize = readBufferSize; clone.cfsReader = cfsReader; clone.storeCFSReader = storeCFSReader; - + clone.fieldInfos = fieldInfos; clone.tis = tis; clone.freqStream = freqStream; clone.proxStream = proxStream; clone.termVectorsReaderOrig = termVectorsReaderOrig; clone.fieldsReaderOrig = fieldsReaderOrig; - + if (!openReadOnly && hasChanges) { // My pending changes transfer to the new reader clone.pendingDeleteCount = pendingDeleteCount; @@ -762,11 +760,10 @@ si.setDelCount(si.getDelCount()+pendingDeleteCount); pendingDeleteCount = 0; assert deletedDocs.count() == si.getDelCount(): "delete count mismatch during commit: info=" + si.getDelCount() + " vs BitVector=" + deletedDocs.count(); + } else { + assert pendingDeleteCount == 0; } - if (undeleteAll && si.hasDeletions()) { - si.clearDelGen(); - si.setDelCount(0); - } + if (normsDirty) { // re-write norms si.setNumFields(fieldInfos.size()); Iterator it = norms.values().iterator(); @@ -779,7 +776,6 @@ } deletedDocsDirty = false; normsDirty = false; - undeleteAll = false; } FieldsReader getFieldsReader() { @@ -865,21 +861,23 @@ oldRef.decRef(); } deletedDocsDirty = true; - undeleteAll = false; if (!deletedDocs.getAndSet(docNum)) pendingDeleteCount++; } protected void doUndeleteAll() { deletedDocsDirty = false; - undeleteAll = true; if (deletedDocs != null) { assert deletedDocsRef != null; deletedDocsRef.decRef(); deletedDocs = null; deletedDocsRef = null; + pendingDeleteCount = 0; + si.clearDelGen(); + si.setDelCount(0); } else { assert deletedDocsRef == null; + assert pendingDeleteCount == 0; } } @@ -1254,7 +1252,6 @@ super.startCommit(); rollbackDeletedDocsDirty = deletedDocsDirty; rollbackNormsDirty = normsDirty; - rollbackUndeleteAll = undeleteAll; rollbackPendingDeleteCount = pendingDeleteCount; Iterator it = norms.values().iterator(); while (it.hasNext()) { @@ -1267,7 +1264,6 @@ super.rollbackCommit(); deletedDocsDirty = rollbackDeletedDocsDirty; normsDirty = rollbackNormsDirty; - undeleteAll = rollbackUndeleteAll; pendingDeleteCount = rollbackPendingDeleteCount; Iterator it = norms.values().iterator(); while (it.hasNext()) {