private void StartTransaction(bool haveReadLock)
{
lock (this)
{
bool success = false;
try
{
if (infoStream != null)
Message("now start transaction");
System.Diagnostics.Debug.Assert(docWriter.GetNumBufferedDeleteTerms() == 0 ,
"calling startTransaction with buffered delete terms not supported: numBufferedDeleteTerms=" + docWriter.GetNumBufferedDeleteTerms());
System.Diagnostics.Debug.Assert(docWriter.NumDocsInRAM == 0 ,
"calling startTransaction with buffered documents not supported: numDocsInRAM=" + docWriter.NumDocsInRAM);
EnsureOpen();
// If a transaction is trying to roll back (because
// addIndexes hit an exception) then wait here until
// that's done:
lock (this)
{
while (stopMerges)
DoWait();
}
success = true;
}
finally
{
// Release the write lock if our caller held it, on
// hitting an exception
if (!success && haveReadLock)
ReleaseRead();
}
if (haveReadLock)
{
UpgradeReadToWrite();
}
else
{
AcquireWrite();
}
success = false;
try
{
localRollbackSegmentInfos = (SegmentInfos) segmentInfos.Clone();
System.Diagnostics.Debug.Assert(!HasExternalSegments());
localFlushedDocCount = docWriter.GetFlushedDocCount();
// Remove the incRef we did in startTransaction:
deleter.IncRef(segmentInfos, false);
success = true;
}
finally
{
if (!success)
FinishAddIndexes();
}
}
}