StatsMetadata sstableMetadata = (StatsMetadata) sstableMetadataCollector.finalizeMetadata(partitioner.getClass().getCanonicalName(),
metadata.getBloomFilterFpChance(),
repairedAt).get(MetadataType.STATS);
// find the max (exclusive) readable key
DecoratedKey exclusiveUpperBoundOfReadableIndex = iwriter.getMaxReadableKey(0);
if (exclusiveUpperBoundOfReadableIndex == null)
return null;
// create temp links if they don't already exist
Descriptor link = descriptor.asType(Descriptor.Type.TEMPLINK);
if (!new File(link.filenameFor(Component.PRIMARY_INDEX)).exists())
{
FileUtils.createHardLink(new File(descriptor.filenameFor(Component.PRIMARY_INDEX)), new File(link.filenameFor(Component.PRIMARY_INDEX)));
FileUtils.createHardLink(new File(descriptor.filenameFor(Component.DATA)), new File(link.filenameFor(Component.DATA)));
}
// open the reader early, giving it a FINAL descriptor type so that it is indistinguishable for other consumers
SegmentedFile ifile = iwriter.builder.openEarly(link.filenameFor(Component.PRIMARY_INDEX));
SegmentedFile dfile = dbuilder.openEarly(link.filenameFor(Component.DATA));
SSTableReader sstable = SSTableReader.internalOpen(descriptor.asType(Descriptor.Type.FINAL),
components, metadata,
partitioner, ifile,
dfile, iwriter.summary.build(partitioner, exclusiveUpperBoundOfReadableIndex),
iwriter.bf, maxDataAge, sstableMetadata, true);
// now it's open, find the ACTUAL last readable key (i.e. for which the data file has also been flushed)
sstable.first = getMinimalKey(first);
sstable.last = getMinimalKey(exclusiveUpperBoundOfReadableIndex);
DecoratedKey inclusiveUpperBoundOfReadableData = iwriter.getMaxReadableKey(1);
if (inclusiveUpperBoundOfReadableData == null)
return null;
int offset = 2;
while (true)
{