private bool FlushDocStores()
{
lock (this)
{
if (infoStream != null)
{
Message("flushDocStores segment=" + docWriter.DocStoreSegment);
}
bool useCompoundDocStore = false;
if (infoStream != null)
{
Message("closeDocStores segment=" + docWriter.DocStoreSegment);
}
System.String docStoreSegment;
bool success = false;
try
{
docStoreSegment = docWriter.CloseDocStore();
success = true;
}
finally
{
if (!success && infoStream != null)
{
Message("hit exception closing doc store segment");
}
}
if (infoStream != null)
{
Message("flushDocStores files=" + docWriter.ClosedFiles());
}
useCompoundDocStore = mergePolicy.UseCompoundDocStore(segmentInfos);
if (useCompoundDocStore && docStoreSegment != null && docWriter.ClosedFiles().Count != 0)
{
// Now build compound doc store file
if (infoStream != null)
{
Message("create compound file " + docStoreSegment + "." + IndexFileNames.COMPOUND_FILE_STORE_EXTENSION);
}
success = false;
int numSegments = segmentInfos.Count;
System.String compoundFileName = docStoreSegment + "." + IndexFileNames.COMPOUND_FILE_STORE_EXTENSION;
try
{
CompoundFileWriter cfsWriter = new CompoundFileWriter(directory, compoundFileName);
foreach(string file in docWriter.closedFiles)
{
cfsWriter.AddFile(file);
}
// Perform the merge
cfsWriter.Close();
success = true;
}
finally
{
if (!success)
{
if (infoStream != null)
Message("hit exception building compound file doc store for segment " + docStoreSegment);
deleter.DeleteFile(compoundFileName);
docWriter.Abort();
}
}
for (int i = 0; i < numSegments; i++)
{
SegmentInfo si = segmentInfos.Info(i);
if (si.DocStoreOffset != - 1 && si.DocStoreSegment.Equals(docStoreSegment))
si.DocStoreIsCompoundFile = true;
}
Checkpoint();
// In case the files we just merged into a CFS were
// not previously checkpointed:
deleter.DeleteNewFiles(docWriter.ClosedFiles());
}
return useCompoundDocStore;
}
}