def table.walk.go

mylsm-lsm-store@0.6.0.1 · src/transfer/MigrateIo.bend:242

import mylsm-lsm-store@0.6.0.1/src/transfer/MigrateIo.bend as MigrateIo
import Base
import mylsm-lsm-store@0.6.0.1/src/Sstable.bend as Sstable
import mylsm-lsm-store@0.6.0.1/src/SstReadPolicy.bend as SstReadPolicy
import mylsm-lsm-store@0.6.0.1/src/coordinator/QueuePolicy.bend as QueuePolicy

242def table.walk.go(fuel: Nat, state: LegacyTableWalk) -> IO(TableValidation):
243  match fuel:
244    case 0n:
245      match state:
246        case LegacyLevels{lock, _, release_path, _, _, _, _, records}:
247          table.finished(lock, release_path, Fail{ResourceLimit{}})
248        case LegacyPath{lock, _, release_path, _, _, _, _, _, _, records}:
249          table.finished(lock, release_path, Fail{ResourceLimit{}})
250        case LegacyNames{lock, _, release_path, _, _, _, _, _, _, records}:
251          table.finished(lock, release_path, Fail{ResourceLimit{}})
252        case LegacySize{lock, _, release_path, _, _, _, _, _, _, _, _, records}:
253          table.finished(lock, release_path, Fail{ResourceLimit{}})
254        case LegacyBudget{lock, _, release_path, _, _, _, _, _, _, _, records}:
255          table.finished(lock, release_path, Fail{ResourceLimit{}})
256        case LegacyRead{lock, _, release_path, _, _, _, _, _, _, _, records}:
257          table.finished(lock, release_path, Fail{ResourceLimit{}})
258    case 1n+rest:
259      match state:
260        case LegacyLevels{lock, read_path, release_path, levels, index,
261            total_bytes, entries, records}:
262          match levels:
263            case Nil{}:
264              table.finished.records(lock, release_path,
265                Done{(entries, total_bytes)}, records)
266            case Con{names, tail}:
267              table.walk.go(rest, table.walk.level.path(
268                QueuePolicy.nat.clone.pair(index), lock, read_path,
269                release_path, names, tail, total_bytes, entries, records))
270        case LegacyPath{lock, read_path, release_path, ldir, names, levels,
271            index, total_bytes, entries, records}:
272          match ldir:
273            case None{}:
274              table.finished.records(lock, release_path,
275                Fail{InvalidLegacyManifest{}}, records)
276            case Some{dir}:
277              table.walk.go(rest, LegacyNames{lock, read_path, release_path,
278                levels, index, dir, names, total_bytes, entries, records})
279        case LegacyNames{lock, read_path, release_path, levels, index, dir,
280            names, total_bytes, entries, records}:
281          match names:
282            case Nil{}:
283              table.walk.go(rest, LegacyLevels{lock, read_path, release_path,
284                levels, Nat.add(index, 1n), total_bytes, entries, records})
285            case Con{name, tail}:
286              do IO<TableValidation>:
287                next : LegacyTableWalk <- table.walk.size(
288                  (path.clone.pair(read_path),
289                  (path.clone.pair(name), path.clone.pair(dir))),
290                  lock, release_path, levels, index, tail,
291                  total_bytes, entries, records)
292                table.walk.go(rest, next)
293        case LegacySize{lock, read_path, release_path, levels, index, dir,
294            name, names, total_bytes, entries, result, records}:
295          match result:
296            case Fail{(code, message)}:
297              table.finished.records(lock, release_path,
298                Fail{HostError{code, message}}, records)
299            case Done{size}:
300              table.walk.go(rest, LegacyBudget{lock, read_path, release_path,
301                levels, index, dir, name, names, entries,
302                SstReadPolicy.total_decision(total_bytes, size, 67108864n),
303                records})
304        case LegacyBudget{lock, read_path, release_path, levels, index, dir,
305            name, names, entries, decision, records}:
306          match decision:
307            case SstReadPolicy.TotalRejected{}:
308              table.finished.records(lock, release_path,
309                Fail{ResourceLimit{}}, records)
310            case SstReadPolicy.TotalAdmitted{next_total}:
311              do IO<TableValidation>:
312                next : LegacyTableWalk <- table.walk.decode(
313                  (path.clone.pair(read_path), path.clone.pair(dir)), lock,
314                  release_path, levels, index, name, names, next_total,
315                  entries, records)
316                table.walk.go(rest, next)
317        case LegacyRead{lock, read_path, release_path, levels, index, dir,
318            names, total_bytes, entries, result, records}:
319          match result:
320            case Fail{(code, _)}:
321              table.finished.records(lock, release_path,
322                Fail{table.failure(code)}, records)
323            case Done{Sstable.Tbl{table_entries, _, _, _, _, _, _, _}}:
324              table.walk.go(rest, table.read.next(
325                table.entries.count.keep(table_entries), lock, read_path,
326                release_path, levels, index, dir, names, total_bytes,
327                entries, records))

Uses (24)

Used by (1)