Index: lucene/src/java/org/apache/lucene/index/DocFieldProcessor.java --- lucene/src/java/org/apache/lucene/index/DocFieldProcessor.java Sat Nov 27 15:02:06 2010 -0500 +++ lucene/src/java/org/apache/lucene/index/DocFieldProcessor.java Sat Nov 27 17:11:12 2010 -0500 @@ -39,9 +39,9 @@ final StoredFieldsWriter fieldsWriter; public DocFieldProcessor(DocumentsWriter docWriter, DocFieldConsumer consumer) { - this.fieldInfos = new FieldInfos(); this.docWriter = docWriter; this.consumer = consumer; + fieldInfos = docWriter.getFieldInfos(); consumer.setFieldInfos(fieldInfos); fieldsWriter = new StoredFieldsWriter(docWriter, fieldInfos); } Index: lucene/src/java/org/apache/lucene/index/DocumentsWriter.java --- lucene/src/java/org/apache/lucene/index/DocumentsWriter.java Sat Nov 27 15:02:06 2010 -0500 +++ lucene/src/java/org/apache/lucene/index/DocumentsWriter.java Sat Nov 27 17:11:12 2010 -0500 @@ -315,13 +315,15 @@ } private boolean closed; + private final FieldInfos fieldInfos; - DocumentsWriter(Directory directory, IndexWriter writer, IndexingChain indexingChain, int maxThreadStates) throws IOException { + DocumentsWriter(Directory directory, IndexWriter writer, IndexingChain indexingChain, int maxThreadStates, FieldInfos fieldInfos) throws IOException { this.directory = directory; this.writer = writer; this.similarity = writer.getConfig().getSimilarity(); this.maxThreadStates = maxThreadStates; flushedDocCount = writer.maxDoc(); + this.fieldInfos = fieldInfos; consumer = indexingChain.getChain(this); if (consumer instanceof DocFieldProcessor) { @@ -329,10 +331,14 @@ } } + public FieldInfos getFieldInfos() { + return fieldInfos; + } + /** Returns true if any of the fields in the current * buffered docs have omitTermFreqAndPositions==false */ boolean hasProx() { - return (docFieldProcessor != null) ? docFieldProcessor.fieldInfos.hasProx() + return (docFieldProcessor != null) ? fieldInfos.hasProx() : true; } @@ -602,8 +608,8 @@ synchronized private void initFlushState(boolean onlyDocStore) { initSegmentName(onlyDocStore); - final SegmentCodecs info = SegmentCodecs.build(docFieldProcessor.fieldInfos, writer.codecs); - flushState = new SegmentWriteState(infoStream, directory, segment, docFieldProcessor.fieldInfos, + final SegmentCodecs info = SegmentCodecs.build(fieldInfos, writer.codecs); + flushState = new SegmentWriteState(infoStream, directory, segment, fieldInfos, docStoreSegment, numDocsInRAM, numDocsInStore, writer.getConfig().getTermIndexInterval(), info); } Index: lucene/src/java/org/apache/lucene/index/IndexWriter.java --- lucene/src/java/org/apache/lucene/index/IndexWriter.java Sat Nov 27 15:02:06 2010 -0500 +++ lucene/src/java/org/apache/lucene/index/IndexWriter.java Sat Nov 27 17:11:12 2010 -0500 @@ -1111,7 +1111,7 @@ setRollbackSegmentInfos(segmentInfos); - docWriter = new DocumentsWriter(directory, this, conf.getIndexingChain(), conf.getMaxThreadStates()); + docWriter = new DocumentsWriter(directory, this, conf.getIndexingChain(), conf.getMaxThreadStates(), getCurrentFieldInfos()); docWriter.setInfoStream(infoStream); docWriter.setMaxFieldLength(maxFieldLength); @@ -1154,7 +1154,27 @@ } } } - + + private FieldInfos getCurrentFieldInfos() throws IOException { + final FieldInfos fieldInfos; + if (segmentInfos.size() > 0) { + SegmentInfo info = segmentInfos.info(segmentInfos.size()-1); + Directory cfsDir; + if (info.getUseCompoundFile()) { + cfsDir = new CompoundFileReader(directory, IndexFileNames.segmentFileName(info.name, "", IndexFileNames.COMPOUND_FILE_EXTENSION)); + } else { + cfsDir = directory; + } + fieldInfos = new FieldInfos(cfsDir, IndexFileNames.segmentFileName(info.name, "", IndexFileNames.FIELD_INFOS_EXTENSION)); + if (info.getUseCompoundFile()) { + cfsDir.close(); + } + } else { + fieldInfos = new FieldInfos(); + } + return fieldInfos; + } + private synchronized void setRollbackSegmentInfos(SegmentInfos infos) { rollbackSegmentInfos = (SegmentInfos) infos.clone(); rollbackSegments = new HashMap();