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"))