internal bool UpdateDocuments(IEnumerable <IEnumerable <IIndexableField> > docs, Analyzer analyzer, Term delTerm) { bool hasEvents = PreUpdate(); ThreadState perThread = flushControl.ObtainAndLock(); DocumentsWriterPerThread flushingDWPT; try { if (!perThread.IsActive) { EnsureOpen(); if (Debugging.AssertsEnabled) { Debugging.Assert(false, "perThread is not active but we are still open"); } } EnsureInitialized(perThread); if (Debugging.AssertsEnabled) { Debugging.Assert(perThread.IsInitialized); } DocumentsWriterPerThread dwpt = perThread.dwpt; int dwptNumDocs = dwpt.NumDocsInRAM; try { int docCount = dwpt.UpdateDocuments(docs, analyzer, delTerm); numDocsInRAM.AddAndGet(docCount); } finally { if (dwpt.CheckAndResetHasAborted()) { if (dwpt.PendingFilesToDelete.Count > 0) { PutEvent(new DeleteNewFilesEvent(dwpt.PendingFilesToDelete)); } SubtractFlushedNumDocs(dwptNumDocs); flushControl.DoOnAbort(perThread); } } bool isUpdate = delTerm != null; flushingDWPT = flushControl.DoAfterDocument(perThread, isUpdate); } finally { perThreadPool.Release(perThread); } return(PostUpdate(flushingDWPT, hasEvents)); }
internal ThreadState ObtainAndLock() { ThreadState perThread = perThreadPool.GetAndLock(Thread.CurrentThread, documentsWriter); bool success = false; try { if (perThread.IsInitialized && perThread.dwpt.deleteQueue != documentsWriter.deleteQueue) { // There is a flush-all in process and this DWPT is // now stale -- enroll it for flush and try for // another DWPT: AddFlushableState(perThread); } success = true; // simply return the ThreadState even in a flush all case sine we already hold the lock return(perThread); } finally { if (!success) // make sure we unlock if this fails { perThreadPool.Release(perThread); } } }