public override void Merge(IndexWriter writer, MergeTrigger trigger, bool newMergesFound) { UninterruptableMonitor.Enter(this); try { while (true) { MergePolicy.OneMerge merge = writer.NextMerge(); if (merge == null) { break; } for (int i = 0; i < merge.Segments.Count; i++) { if (Debugging.AssertsEnabled) { Debugging.Assert(merge.Segments[i].Info.DocCount < 20); } } writer.Merge(merge); } } finally { UninterruptableMonitor.Exit(this); } }
public override void Merge(IndexWriter writer, MergeTrigger trigger, bool newMergesFound) { lock (this) { if (!MayMerge.Get() && writer.NextMerge() != null) { throw new InvalidOperationException(); } base.Merge(writer, trigger, newMergesFound); } }
public override void Merge(IndexWriter writer, MergeTrigger trigger, bool newMergesFound) { MergePolicy.OneMerge merge = null; while ((merge = writer.NextMerge()) != null) { if (VERBOSE) { Console.WriteLine("executing merge " + merge.SegString(writer.Directory)); } writer.Merge(merge); } }
/// <summary> /// Just do the merges in sequence. We do this /// "synchronized" so that even if the application is using /// multiple threads, only one merge may run at a time. /// </summary> public override void Merge(IndexWriter writer, MergeTrigger trigger, bool newMergesFound) // LUCENENET NOTE: This was internal in the original, but the base class is public so there isn't much choice here { lock (this) { while (true) { MergePolicy.OneMerge merge = writer.NextMerge(); if (merge == null) { break; } writer.Merge(merge); } } }
public override void Merge(IndexWriter writer, MergeTrigger trigger, bool newMergesFound) { UninterruptableMonitor.Enter(this); try { if (!mayMerge.Value && writer.NextMerge() != null) { throw AssertionError.Create(); } base.Merge(writer, trigger, newMergesFound); } finally { UninterruptableMonitor.Exit(this); } }
public override void Merge(IndexWriter writer, MergeTrigger trigger, bool newMergesFound) { lock (this) { while (true) { MergePolicy.OneMerge merge = writer.NextMerge(); if (merge == null) { break; } for (int i = 0; i < merge.Segments.Count; i++) { Debug.Assert(merge.Segments[i].Info.DocCount < 20); } writer.Merge(merge); } } }
public override void Merge(IndexWriter writer, MergeTrigger trigger, bool newMergesFound) // LUCENENET NOTE: This was internal in the original, but the base class is public so there isn't much choice here { UninterruptableMonitor.Enter(this); try { while (true) { MergePolicy.OneMerge merge = writer.NextMerge(); if (merge is null) { break; } writer.Merge(merge); } } finally { UninterruptableMonitor.Exit(this); } }
public override void Run() { // First time through the while loop we do the merge // that we were started with: MergePolicy.OneMerge merge = this.startMerge; try { if (outerInstance.IsVerbose) { outerInstance.Message(" merge thread: start"); } while (true) { RunningMerge = merge; outerInstance.DoMerge(merge); // Subsequent times through the loop we do any new // merge that writer says is necessary: merge = tWriter.NextMerge(); // Notify here in case any threads were stalled; // they will notice that the pending merge has // been pulled and possibly resume: lock (outerInstance) { Monitor.PulseAll(outerInstance); } if (merge != null) { outerInstance.UpdateMergeThreads(); if (outerInstance.IsVerbose) { outerInstance.Message(" merge thread: do another merge " + tWriter.SegString(merge.Segments)); } } else { break; } } if (outerInstance.IsVerbose) { outerInstance.Message(" merge thread: done"); } } catch (Exception exc) { // Ignore the exception if it was due to abort: if (!(exc is MergePolicy.MergeAbortedException)) { //System.out.println(Thread.currentThread().getName() + ": CMS: exc"); //exc.printStackTrace(System.out); if (!outerInstance.suppressExceptions) { // suppressExceptions is normally only set during // testing. outerInstance.HandleMergeException(exc); } } } finally { done = true; lock (outerInstance) { outerInstance.UpdateMergeThreads(); Monitor.PulseAll(outerInstance); } } }
public override void Merge(IndexWriter writer, MergeTrigger trigger, bool newMergesFound) { lock (this) { //Debug.Assert(!Thread.holdsLock(writer)); this.m_writer = writer; InitMergeThreadPriority(); m_dir = writer.Directory; // First, quickly run through the newly proposed merges // and add any orthogonal merges (ie a merge not // involving segments already pending to be merged) to // the queue. If we are way behind on merging, many of // these newly proposed merges will likely already be // registered. if (IsVerbose) { Message("now merge"); Message(" index: " + writer.SegString()); } // Iterate, pulling from the IndexWriter's queue of // pending merges, until it's empty: while (true) { long startStallTime = 0; while (writer.HasPendingMerges() && MergeThreadCount >= maxMergeCount) { // this means merging has fallen too far behind: we // have already created maxMergeCount threads, and // now there's at least one more merge pending. // Note that only maxThreadCount of // those created merge threads will actually be // running; the rest will be paused (see // updateMergeThreads). We stall this producer // thread to prevent creation of new segments, // until merging has caught up: startStallTime = Environment.TickCount; if (IsVerbose) { Message(" too many merges; stalling..."); } //try //{ Monitor.Wait(this); //} //catch (ThreadInterruptedException ie) // LUCENENET NOTE: Senseless to catch and rethrow the same exception type //{ // throw new ThreadInterruptedException(ie.ToString(), ie); //} } if (IsVerbose) { if (startStallTime != 0) { Message(" stalled for " + (Environment.TickCount - startStallTime) + " msec"); } } MergePolicy.OneMerge merge = writer.NextMerge(); if (merge == null) { if (IsVerbose) { Message(" no more merges pending; now return"); } return; } bool success = false; try { if (IsVerbose) { Message(" consider merge " + writer.SegString(merge.Segments)); } // OK to spawn a new merge thread to handle this // merge: MergeThread merger = GetMergeThread(writer, merge); m_mergeThreads.Add(merger); if (IsVerbose) { Message(" launch new thread [" + merger.Name + "]"); } merger.Start(); // Must call this after starting the thread else // the new thread is removed from mergeThreads // (since it's not alive yet): UpdateMergeThreads(); success = true; } finally { if (!success) { writer.MergeFinish(merge); } } } } }
private void Run(CancellationToken cancellationToken) { // First time through the while loop we do the merge // that we were started with: MergePolicy.OneMerge merge = _startingMerge; try { if (_isLoggingEnabled) { _logger.Message(COMPONENT_NAME, " merge thread: start"); } while (true && !cancellationToken.IsCancellationRequested) { RunningMerge = merge; _writer.Merge(merge); // Subsequent times through the loop we do any new // merge that writer says is necessary: merge = _writer.NextMerge(); // Notify here in case any threads were stalled; // they will notice that the pending merge has // been pulled and possibly resume: _resetEvent.Set(); if (merge != null) { if (_isLoggingEnabled) { _logger.Message(COMPONENT_NAME, " merge thread: do another merge " + _writer.SegString(merge.Segments)); } } else { break; } } if (_isLoggingEnabled) { _logger.Message(COMPONENT_NAME, " merge thread: done"); } } catch (Exception exc) { // Ignore the exception if it was due to abort: if (!(exc is MergePolicy.MergeAbortedException)) { //System.out.println(Thread.currentThread().getName() + ": CMS: exc"); //exc.printStackTrace(System.out) _exceptionHandler(exc); } } finally { _isDone = true; if (MergeThreadCompleted != null) { MergeThreadCompleted(this, EventArgs.Empty); } } }
public override void Merge(IndexWriter writer, MergeTrigger trigger, bool newMergesFound) { using (_lock.Write()) { _writer = writer; _directory = writer.Directory; if (Verbose) { Message("now merge"); Message(" index: " + writer.SegString()); } // First, quickly run through the newly proposed merges // and add any orthogonal merges (ie a merge not // involving segments already pending to be merged) to // the queue. If we are way behind on merging, many of // these newly proposed merges will likely already be // registered. // Iterate, pulling from the IndexWriter's queue of // pending merges, until it's empty: while (true) { long startStallTime = 0; while (writer.HasPendingMerges() && MergeThreadCount >= MaxMergeCount) { // this means merging has fallen too far behind: we // have already created maxMergeCount threads, and // now there's at least one more merge pending. // Note that only maxThreadCount of // those created merge threads will actually be // running; the rest will be paused (see // updateMergeThreads). We stall this producer // thread to prevent creation of new segments, // until merging has caught up: startStallTime = Environment.TickCount; if (Verbose) { Message(" too many merges; stalling..."); } _manualResetEvent.Reset(); _manualResetEvent.Wait(); } if (Verbose) { if (startStallTime != 0) { Message(" stalled for " + (Environment.TickCount - startStallTime) + " msec"); } } MergePolicy.OneMerge merge = writer.NextMerge(); if (merge == null) { if (Verbose) { Message(" no more merges pending; now return"); } return; } bool success = false; try { if (Verbose) { Message(" consider merge " + writer.SegString(merge.Segments)); } // OK to spawn a new merge thread to handle this // merge: var merger = CreateTask(writer, merge); merger.MergeThreadCompleted += OnMergeThreadCompleted; _mergeThreads.Add(merger); if (Verbose) { Message(" launch new thread [" + merger.Name + "]"); } merger.Start(_taskScheduler); // Must call this after starting the thread else // the new thread is removed from mergeThreads // (since it's not alive yet): UpdateMergeThreads(); success = true; } finally { if (!success) { writer.MergeFinish(merge); } } } } }