def recover.result

mylsm-lsm-store@0.6.0.1 · src/ByteWalIo.bend:265

import mylsm-lsm-store@0.6.0.1/src/ByteWalIo.bend as ByteWalIo
import Base
import mylsm-lsm-store@0.6.0.1/src/ByteMemTable.bend as ByteMemTable
import mylsm-lsm-store@0.6.0.1/src/ByteWal.bend as ByteWal
import mylsm-lsm-store@0.6.0.1/src/SstStreamIo.bend as SstStreamIo
import bend-kit-bytes@0.3.2.0/bytes.bend as Bytes

265def recover.result(
266  +path: String,
267  fuel: Nat,
268  state: RecoveryState
269) -> IO(Result<&1, &1, U32 & String, ByteMemTable.Table>):
270  match fuel:
271    case 0n:
272      recover.exhausted(state)
273    case 1n+rest:
274      match state:
275        case Tail{file, path, +offset, table}:
276          do IO<Result<&1, &1, U32 & String, ByteMemTable.Table>>:
277            _closed : Unit <- File.close(file)
278            tail.closed(path, offset, table)
279        case At{file, +size, +offset, table, at_end, can_read_length}:
280          match at_end:
281            case True{}:
282              close.done(file, table)
283            case False{}:
284              match can_read_length:
285                case False{}:
286                  recover.result(path, rest, Tail{file, path, offset, table})
287                case True{}:
288                  do IO<Result<&1, &1, U32 & String, ByteMemTable.Table>>:
289                    pair : File & Result<&1, &1, U32 & String, SstStreamIo.ExactResult> <-
290                      SstStreamIo.exact.start(file, 4n)
291                    recover.result(path, rest, Length{pair, size, offset, table})
292        case Length{pair, +size, +offset, table}:
293          match pair:
294            case (file, Fail{failure}):
295              close.failed(file, failure)
296            case (file, Done{SstStreamIo.ExactResult{bytes, complete}}):
297              recover.result(path, rest, recover.length.completed(path, file, size, offset, table, bytes, complete))
298        case Prefix{file, +size, +offset, table, prefix, +frame_length, within_file}:
299          match within_file:
300            case False{}:
301              recover.result(path, rest, Tail{file, path, offset, table})
302            case True{}:
303              do IO<Result<&1, &1, U32 & String, ByteMemTable.Table>>:
304                pair : File & Result<&1, &1, U32 & String, SstStreamIo.ExactResult> <-
305                  SstStreamIo.exact.start(file, 4n)
306                recover.result(path, rest, Count{pair, size, offset, table,
307                  prefix, frame_length})
308        case Count{pair, +size, +offset, table, prefix, +frame_length}:
309          match pair:
310            case (file, Fail{failure}):
311              close.failed(file, failure)
312            case (file, Done{SstStreamIo.ExactResult{bytes, complete}}):
313              recover.result(path, rest, recover.count.completed(path, file, size, offset, table, prefix, bytes, complete, frame_length))
314        case Counted{file, +size, +offset, table, prefix, count_bytes,
315            +frame_length, within_limit}:
316          match within_limit:
317            case False{}:
318              close.failed(file, error("byte WAL frame exceeds configured limit"))
319            case True{}:
320              do IO<Result<&1, &1, U32 & String, ByteMemTable.Table>>:
321                pair : File & Result<&1, &1, U32 & String, SstStreamIo.ExactResult> <-
322                  SstStreamIo.exact.start(file, U32.to_nat((frame_length - 4 : U32)))
323                recover.result(path, rest, Body{pair, size, offset, table,
324                  prefix, count_bytes, frame_length})
325        case Body{pair, +size, +offset, table, prefix, count_bytes, +frame_length}:
326          match pair:
327            case (file, Fail{failure}):
328              close.failed(file, failure)
329            case (file, Done{SstStreamIo.ExactResult{bytes, complete}}):
330              match complete:
331                case False{}:
332                  recover.result(path, rest, Tail{file, path, offset, table})
333                case True{}:
334                  recover.result(path, rest, Decoded{file, size,
335                    Nat.add(offset, Nat.add(4n, U32.to_nat(frame_length))), table,
336                    ByteWal.decode(Bytes.concat([prefix, count_bytes, bytes]))})
337        case Decoded{file, +size, +next_offset, table, result}:
338          match result:
339            case Fail{_}:
340              close.failed(file, error("corrupt byte WAL frame"))
341            case Done{batch}:
342              recover.result(path, rest, recover.at(file, size, next_offset,
343                apply.batch(table, batch)))
344        case Failed{file, failure}:
345          close.failed(file, failure)

Uses (31)

Used by (1)