def validate.loop

mylsm-lsm-store@0.6.0.1 · src/ByteSstIo.bend:91

import mylsm-lsm-store@0.6.0.1/src/ByteSstIo.bend as ByteSstIo
import Base
import mylsm-lsm-store@0.6.0.1/src/scan/ByteBlockReader.bend as ByteBlockReader

91# Advances full-file validation without retaining decoded SST entries.
92def validate.loop(
93  fuel: Nat,
94  state: ValidationState
95) -> IO(Result<&1, &1, U32 & String, ByteBlockReader.Metadata>):
96  match fuel:
97    case 0n:
98      match state:
99        case ValidateNeed{reader, _}:
100          do IO<Result<&1, &1, U32 & String, ByteBlockReader.Metadata>>:
101            _closed : Result<&1, &1, U32 & String, Unit> <-
102              ByteBlockReader.close(reader)
103            return Fail{corruption("byte SST validation exceeded its block budget")}
104        case ValidatePage{reader, _, _}:
105          do IO<Result<&1, &1, U32 & String, ByteBlockReader.Metadata>>:
106            _closed : Result<&1, &1, U32 & String, Unit> <-
107              ByteBlockReader.close(reader)
108            return Fail{corruption("byte SST validation exceeded its block budget")}
109        case ValidateStep{result, _}:
110          match result:
111            case Done{ByteBlockReader.Block{reader, _}}:
112              do IO<Result<&1, &1, U32 & String, ByteBlockReader.Metadata>>:
113                _closed : Result<&1, &1, U32 & String, Unit> <-
114                  ByteBlockReader.close(reader)
115                return Fail{corruption("byte SST validation exceeded its block budget")}
116            case Fail{error}:
117              IO.pure(Result<&1, &1, U32 & String, ByteBlockReader.Metadata>, Fail{error})
118            case _: IO.pure(
119              Result<&1, &1, U32 & String, ByteBlockReader.Metadata>,
120              Fail{corruption("byte SST validation exhausted its transition limit")})
121    case 1n+rest:
122      match state:
123        case ValidateNeed{reader, metadata}:
124          do IO<Result<&1, &1, U32 & String, ByteBlockReader.Metadata>>:
125            result : Result<&1, &1, U32 & String, ByteBlockReader.Step> <-
126              ByteBlockReader.next(reader)
127            validate.loop(rest, ValidateStep{result, metadata})
128        case ValidatePage{reader, metadata, entries}:
129          validate.loop(rest, ValidateNeed{reader, validate.page(entries, metadata)})
130        case ValidateStep{result, metadata}:
131          match result:
132            case Fail{error}:
133              IO.pure(Result<&1, &1, U32 & String, ByteBlockReader.Metadata>, Fail{error})
134            case Done{ByteBlockReader.End{}}:
135              IO.pure(Result<&1, &1, U32 & String, ByteBlockReader.Metadata>, Done{metadata})
136            case Done{ByteBlockReader.Block{reader, entries}}:
137              validate.loop(rest, ValidatePage{reader, metadata, entries})

Uses (16)

Used by (1)