flush method
Flushes the memtable into a segment object and commits the manifest.
Implementation
Future<SegmentInfo?> flush() async {
if (_memtable.length == 0) return null;
final builder = SegmentBuilder(blockTargetSize: blockTargetSize);
_memtable.forEachSorted((key, chunk, offset, length) {
if (length < 0) {
builder.addTombstone(key);
} else {
builder.add(key, _arena.view(chunk, offset, length));
}
});
final bytes = builder.finish();
final name = _segmentName(_nextSegmentId++);
await store.put(_key(name), bytes.asUint8List());
final info = SegmentInfo(
name: name,
entryCount: builder.docCount,
byteLength: bytes.length,
);
_segmentInfos.add(info);
_generation++;
await store.put(
_key(manifestKey),
Manifest(generation: _generation, segments: _segmentInfos).encode(),
);
// The manifest is the commit point; WAL objects can go now.
await store.deleteMany(<String>[..._walKeys]);
_walKeys.clear();
_memtable.clear();
_arena = DocArena(chunkSize: _arenaChunkSize);
return info;
}