def blocks.pack.go

mylsm-lsm-store@0.6.0.1 · src/SstFile.bend:296

import mylsm-lsm-store@0.6.0.1/src/SstFile.bend as SstFile
import Base
import mylsm-lsm-store@0.6.0.1/src/MemTable.bend as MemTable
import mylsm-lsm-store@0.6.0.1/src/StorageBytes.bend as StorageBytes

296# Pack records into blocks capped by encoded payload bytes, preserving order.
297def blocks.pack.go(
298  entries: List<&2, MemTable.Entry>,
299  current: List<&2, MemTable.Entry>,
300  +size: U32,
301  acc: List<&2, List<&2, MemTable.Entry>>,
302  measured: BlockMeasure
303) -> List<&2, List<&2, MemTable.Entry>>:
304  match entries:
305    case Nil{}:
306      blocks.pack.finish(current, acc)
307    case Con{entry, +rest}:
308      match current:
309        case Nil{}:
310          match measured:
311            case InvalidRecord{}:
312              blocks.pack.go(rest, Con{entry, Nil{}}, StorageBytes.MAX_BLOCK_BYTES(), acc,
313                blocks.measure.next(rest, StorageBytes.MAX_BLOCK_BYTES()))
314            case Measured{+length, fits}:
315              blocks.pack.go(rest, Con{entry, Nil{}}, length, acc,
316                blocks.measure.next(rest, length))
317        case Con{_, _}:
318          match measured:
319            case InvalidRecord{}:
320              blocks.pack.go(rest, Con{entry, Nil{}}, StorageBytes.MAX_BLOCK_BYTES(),
321                Con{List.reverse(&2, MemTable.Entry, current), acc},
322                blocks.measure.next(rest, StorageBytes.MAX_BLOCK_BYTES()))
323            case Measured{+length, False{}}:
324              blocks.pack.go(rest, Con{entry, Nil{}}, length,
325                Con{List.reverse(&2, MemTable.Entry, current), acc},
326                blocks.measure.next(rest, length))
327            case Measured{+length, True{}}:
328              blocks.pack.go(rest, Con{entry, current}, (size + length : U32), acc,
329                blocks.measure.next(rest, (size + length : U32)))

Uses (10)

Used by (1)