private void RollbackInternal()
{
bool success = false;
if (infoStream != null)
{
Message("rollback");
}
docWriter.PauseAllThreads();
try
{
FinishMerges(false);
// Must pre-close these two, in case they increment
// changeCount so that we can then set it to false
// before calling closeInternal
mergePolicy.Close();
mergeScheduler.Close();
lock (this)
{
if (pendingCommit != null)
{
pendingCommit.RollbackCommit(directory);
deleter.DecRef(pendingCommit);
pendingCommit = null;
System.Threading.Monitor.PulseAll(this);
}
// Keep the same segmentInfos instance but replace all
// of its SegmentInfo instances. This is so the next
// attempt to commit using this instance of IndexWriter
// will always write to a new generation ("write
// once").
segmentInfos.Clear();
segmentInfos.AddRange(rollbackSegmentInfos);
System.Diagnostics.Debug.Assert(!HasExternalSegments());
docWriter.Abort();
System.Diagnostics.Debug.Assert(TestPoint("rollback before checkpoint"));
// Ask deleter to locate unreferenced files & remove
// them:
deleter.Checkpoint(segmentInfos, false);
deleter.Refresh();
}
// Don't bother saving any changes in our segmentInfos
readerPool.Clear(null);
lastCommitChangeCount = changeCount;
success = true;
}
catch (System.OutOfMemoryException oom)
{
HandleOOM(oom, "rollbackInternal");
}
finally
{
lock (this)
{
if (!success)
{
docWriter.ResumeAllThreads();
closing = false;
System.Threading.Monitor.PulseAll(this);
if (infoStream != null)
Message("hit exception during rollback");
}
}
}
CloseInternal(false);
}