func newDocumentsWriterPerThread(segmentName string, directory store.Directory, indexWriterConfig *LiveIndexWriterConfig, infoStream util.InfoStream, deleteQueue *DocumentsWriterDeleteQueue, fieldInfos *model.FieldInfosBuilder) *DocumentsWriterPerThread { counter := util.NewCounter() ans := &DocumentsWriterPerThread{ directoryOrig: directory, directory: store.NewTrackingDirectoryWrapper(directory), fieldInfos: fieldInfos, indexWriterConfig: indexWriterConfig, infoStream: infoStream, codec: indexWriterConfig.codec, _bytesUsed: counter, byteBlockAllocator: util.NewDirectTrackingAllocator(counter), pendingDeletes: newBufferedDeletes(), intBlockAllocator: newIntBlockAllocator(counter), deleteQueue: deleteQueue, deleteSlice: deleteQueue.newSlice(), segmentInfo: model.NewSegmentInfo(directory, util.LUCENE_MAIN_VERSION, segmentName, -1, false, indexWriterConfig.codec, nil, nil), filesToDelete: make(map[string]bool), } ans.docState = newDocState(ans, infoStream) ans.docState.similarity = indexWriterConfig.similarity assertn(ans.numDocsInRAM == 0, "num docs ", ans.numDocsInRAM) if DWPT_VERBOSE && infoStream.IsEnabled("DWPT") { infoStream.Message("DWPT", "init seg=%v delQueue=%v", segmentName, deleteQueue) } // this should be the last call in the ctor // it really sucks that we need to pull this within the ctor and pass this ref to the chain! ans.consumer = indexWriterConfig.indexingChain(ans) return ans }
/* Commit live docs (writes new _X_N.del files) and field update (writes new _X_N.del files) to the directory; returns true if it wrote any file and false if there were no new deletes or updates to write: */ func (rld *ReadersAndUpdates) writeLiveDocs(dir store.Directory) (bool, error) { panic("not implemented yet") rld.Lock() defer rld.Unlock() log.Printf("rld.writeLiveDocs seg=%v pendingDelCount=%v", rld.info, rld._pendingDeleteCount) if rld._pendingDeleteCount != 0 { // We have new deletes assert(rld._liveDocs.Length() == rld.info.Info.DocCount()) // Do this so we can delete any created files on error; this // saves all codecs from having to do it: trackingDir := store.NewTrackingDirectoryWrapper(dir) // We can write directly to the actual name (vs to a .tmp & // renaming it) becaues the file is not live until segments file // is written: var success = false defer func() { if !success { // Advance only the nextWriteDelGen so that a 2nd attempt to // write will write to a new file rld.info.AdvanceNextWriteDelGen() // Delete any partially created files(s): trackingDir.EachCreatedFiles(func(filename string) { dir.DeleteFile(filename) // ignore error }) } }() err := rld.info.Info.Codec().(Codec).LiveDocsFormat().WriteLiveDocs(rld._liveDocs.(util.MutableBits), trackingDir, rld.info, rld._pendingDeleteCount, store.IO_CONTEXT_DEFAULT) if err != nil { return false, err } success = true // If we hit an error in the line above (e.g. disk full) then // info's delGen remains pointing to the previous (successfully // written) del docs: rld.info.AdvanceDelGen() rld.info.SetDelCount(rld.info.DelCount() + rld._pendingDeleteCount) assert(rld.info.DelCount() <= rld.info.Info.DocCount()) rld._pendingDeleteCount = 0 return true, nil } return false, nil }