def index.page.loop

mylsm-lsm-store@0.6.0.1 · src/scan/ByteBlockReader.bend:1598

import mylsm-lsm-store@0.6.0.1/src/scan/ByteBlockReader.bend as ByteBlockReader
import Base
import mylsm-lsm-store@0.6.0.1/src/Fs.bend as Fs
import mylsm-lsm-store@0.6.0.1/src/SstStreamIo.bend as SstStreamIo
import mylsm-lsm-store@0.6.0.1/src/scan/BlockIndexPolicy.bend as BlockIndexPolicy
import bend-kit-bytes@0.3.2.0/bytes.bend as Bytes

1598def index.page.loop(fuel: Nat, state: IndexPageState) -> IO(Result<&1, &1, U32 & String, Step>):
1599  match fuel:
1600    case 0n:
1601      match state:
1602        case IndexPageNeed{file, _, _, _, _, _}:
1603          close.failed(file, resource_limit("SST index page traversal limit exceeded"))
1604        case IndexPageRead{pair, _, _, _, _, _}:
1605          match pair:
1606            case (file, _):
1607              close.failed(file, resource_limit("SST index page traversal limit exceeded"))
1608        case IndexPageParsed{file, _}:
1609          close.failed(file, resource_limit("SST index page traversal limit exceeded"))
1610    case 1n+rest:
1611      match state:
1612        case IndexPageNeed{file, reader, +offset, +remaining,
1613            actual_hash, root_hash}:
1614          match remaining:
1615            case 0n:
1616              index.page.footer.read(file, reader, offset, root_hash)
1617            case 1n+_:
1618              +needed = U32.from_nat(BlockIndexPolicy.read_bytes(remaining))
1619              do IO<Result<&1, &1, U32 & String, Step>>:
1620                raw : File & Result<&1, &1, U32 & String, Bytes.Bytes> <-
1621                  Fs.read_at(file, U32.from_nat(offset), needed)
1622                index.page.loop(rest, IndexPageRead{
1623                  read_at.exact.pair(needed, raw), reader, offset, remaining,
1624                  actual_hash, root_hash})
1625        case IndexPageRead{pair, reader, +offset, +remaining,
1626            actual_hash, root_hash}:
1627          match pair:
1628            case (file, Fail{error}): close.failed(file, error)
1629            case (file, Done{SstStreamIo.ExactResult{bytes, complete}}):
1630              index.page.loop(rest, IndexPageParsed{file,
1631                index.page.decode(reader, offset, remaining,
1632                  actual_hash, root_hash, bytes, complete)})
1633        case IndexPageParsed{file, result}:
1634          match result:
1635            case Fail{error}: close.failed(file, error)
1636            case Done{IndexPageData{reader, offset, remaining,
1637                actual_hash, root_hash}}:
1638              index.page.loop(rest, IndexPageNeed{file, reader, offset,
1639                remaining, actual_hash, root_hash})
1640            case Done{_}:
1641              close.failed(file, corruption("invalid SST index traversal state"))

Uses (23)

Used by (1)