flush method

Future<SegmentInfo?> flush()

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;
}