private bool PreUpdate() { EnsureOpen(); bool hasEvents = false; if (flushControl.AnyStalledThreads() || flushControl.NumQueuedFlushes > 0) { // Help out flushing any queued DWPTs so we can un-stall: if (infoStream.IsEnabled("DW")) { infoStream.Message("DW", "DocumentsWriter has queued dwpt; will hijack this thread to flush pending segment(s)"); } do { // Try pick up pending threads here if possible DocumentsWriterPerThread flushingDWPT; while ((flushingDWPT = flushControl.NextPendingFlush()) != null) { // Don't push the delete here since the update could fail! hasEvents |= DoFlush(flushingDWPT); } if (infoStream.IsEnabled("DW")) { if (flushControl.AnyStalledThreads()) { infoStream.Message("DW", "WARNING DocumentsWriter has stalled threads; waiting"); } } flushControl.WaitIfStalled(); // block if stalled } while (flushControl.NumQueuedFlushes != 0); // still queued DWPTs try help flushing if (infoStream.IsEnabled("DW")) { infoStream.Message("DW", "continue indexing after helping out flushing DocumentsWriter is healthy"); } } return(hasEvents); }