src/Db.bend fails
raw source on the hub · import mylsm-lsm-store@0.3.0.0/src/Db.bend as Db
8 imports
import Base import ./Keys.bend as Keys import ./MemTable.bend as MemTable import ./Sstable.bend as Sstable import ./Wal.bend as Wal import ./Fs.bend as Fs import ./Manifest.bend as Manifest import ./CrashPoint.bend as CrashPoint
Types
type BEntry source · line 28 · raw
Data
BEntry@tab:String -> @key:String -> @val:Maybe<&2, String> -> BEntry
type Db source · line 39 · raw
Data
manifest_token is the exact serialized Manifest observed by this handle. Flush and compaction compare it before publication to reject stale-handle drift.
Db@dir:String -> @mem:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @frozen:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @batch_cap:Nat -> @bcache:List<&2, BEntry> -> @levels:List<&2, List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table>> -> @flushed:Nat -> @manifest_token:String -> @mem_count:Nat -> @frozen_count:Nat -> Db
type RotRes source · line 45 · raw
Data
Rotation result: both tables plus their exact counts, so no pass ever walks a memtable to learn its size. Counts stay exact by construction (open_db starts 0/0; every transition does arithmetic, never List.length).
Rot@mem:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @frozen:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @mem_count:Nat -> @frozen_count:Nat -> RotRes
Definitions
def default_batch_cap source · line 31 · raw
Nat
def bcache_bound source · line 34 · raw
Nat
def wal_path source · line 48 · raw
@+dir:String -> String
def open_db source · line 51 · raw
@+dir:String -> Db
def apply_mut source · line 56 · raw
@+mem:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @+mut:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Wal.Mut -> 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable
def apply_batch source · line 63 · raw
@+muts:List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Wal.Mut> -> @+mem:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable
def table_entries source · line 72 · raw
@+tab:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table -> List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.Entry>
def level_entries source · line 77 · raw
@+tabs:List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table> -> List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.Entry>
def all_level_entries source · line 84 · raw
@+lvls:List<&2, List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table>> -> List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.Entry>
def all_entries source · line 91 · raw
@+db:Db -> List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.Entry>
def table_hit_if source · line 98 · raw
@present:Bool -> @tab:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table -> @+key:String -> Maybe<&2, Maybe<&2, String>>
def table_hit source · line 105 · raw
@+tab:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table -> @+key:String -> Maybe<&2, Maybe<&2, String>>
def tables_hits source · line 108 · raw
@+tabs:List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table> -> @+key:String -> List<&2, Maybe<&2, Maybe<&2, String>>>
def levels_hits source · line 115 · raw
@+lvls:List<&2, List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table>> -> @+key:String -> List<&2, Maybe<&2, Maybe<&2, String>>>
def hits_first source · line 122 · raw
@+hits:List<&2, Maybe<&2, Maybe<&2, String>>> -> Maybe<&2, Maybe<&2, String>>
def flatten_opt source · line 131 · raw
@+opt:Maybe<&2, Maybe<&2, String>> -> Maybe<&2, String>
def db_get source · line 138 · raw
@+db:Db -> @+key:String -> Maybe<&2, String>
def pick_hit source · line 149 · raw
@hit:Bool -> @ans:Maybe<&2, String> -> @best:Maybe<&2, Maybe<&2, String>> -> Maybe<&2, Maybe<&2, String>>
def bcache_go source · line 156 · raw
@+cache:List<&2, BEntry> -> @+tab:String -> @+key:String -> @+best:Maybe<&2, Maybe<&2, String>> -> Maybe<&2, Maybe<&2, String>>
def bcache_lookup source · line 163 · raw
@+cache:List<&2, BEntry> -> @+tab:String -> @+key:String -> Maybe<&2, Maybe<&2, String>>
def bcache_push_all source · line 166 · raw
@+fresh:List<&2, BEntry> -> @+old:List<&2, BEntry> -> List<&2, BEntry>
def probe_fill source · line 169 · raw
@hit:Maybe<&2, Maybe<&2, String>> -> @+tab:String -> @+key:String -> Pair(Maybe<&2, Maybe<&2, String>>, List<&2, BEntry>)
def probe_cached source · line 176 · raw
@cached:Maybe<&2, Maybe<&2, String>> -> @+tab:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table -> @+key:String -> Pair(Maybe<&2, Maybe<&2, String>>, List<&2, BEntry>)
def table_probe source · line 183 · raw
@+tab:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table -> @+key:String -> @+cache:List<&2, BEntry> -> Pair(Maybe<&2, Maybe<&2, String>>, List<&2, BEntry>)
def tables_cons source · line 186 · raw
@cur:Pair(Maybe<&2, Maybe<&2, String>>, List<&2, BEntry>) -> @rest:Pair(List<&2, Maybe<&2, Maybe<&2, String>>>, List<&2, BEntry>) -> Pair(List<&2, Maybe<&2, Maybe<&2, String>>>, List<&2, BEntry>)
def tables_walk source · line 193 · raw
@+tabs:List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table> -> @+key:String -> @+cache:List<&2, BEntry> -> Pair(List<&2, Maybe<&2, Maybe<&2, String>>>, List<&2, BEntry>)
def levels_cons source · line 200 · raw
@cur:Pair(List<&2, Maybe<&2, Maybe<&2, String>>>, List<&2, BEntry>) -> @rest:Pair(List<&2, Maybe<&2, Maybe<&2, String>>>, List<&2, BEntry>) -> Pair(List<&2, Maybe<&2, Maybe<&2, String>>>, List<&2, BEntry>)
def levels_cached source · line 207 · raw
@+lvls:List<&2, List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table>> -> @+key:String -> @+cache:List<&2, BEntry> -> Pair(List<&2, Maybe<&2, Maybe<&2, String>>>, List<&2, BEntry>)
def cached_levels source · line 214 · raw
@lr:Pair(List<&2, Maybe<&2, Maybe<&2, String>>>, List<&2, BEntry>) -> @+dir:String -> @+mem:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @+frozen:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @+batch_cap:Nat -> @+bcache:List<&2, BEntry> -> @+levels:List<&2, List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table>> -> @+flushed:Nat -> @+manifest_token:String -> @+mem_count:Nat -> @+frozen_count:Nat -> Pair(Db, Maybe<&2, String>)
def cached_frozen source · line 219 · raw
@fhit:Maybe<&2, Maybe<&2, String>> -> @+dir:String -> @+mem:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @+frozen:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @+batch_cap:Nat -> @+bcache:List<&2, BEntry> -> @+levels:List<&2, List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table>> -> @+flushed:Nat -> @+manifest_token:String -> @+key:String -> @+mem_count:Nat -> @+frozen_count:Nat -> Pair(Db, Maybe<&2, String>)
def cached_mem source · line 226 · raw
@mhit:Maybe<&2, Maybe<&2, String>> -> @+dir:String -> @+mem:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @+frozen:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @+batch_cap:Nat -> @+bcache:List<&2, BEntry> -> @+levels:List<&2, List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table>> -> @+flushed:Nat -> @+manifest_token:String -> @+key:String -> @+mem_count:Nat -> @+frozen_count:Nat -> Pair(Db, Maybe<&2, String>)
def db_get_cached source · line 233 · raw
@+db:Db -> @+key:String -> Pair(Db, Maybe<&2, String>)
def wal_frame source · line 241 · raw
@+data:String -> String
WAL framing v1 is applied here (see Recover): each batch is stored as dashes(len) ++ ";" ++ encode(batch) so replay can stream frames and truncate a torn tail. Files are permissioned 0600 at creation.
def wal_tail source · line 246 · raw
@fr:Pair(File, Result<&1, &1, Pair(U32, String), Unit>) -> @+dir:String -> IO(Result<&1, &1, Pair(U32, String), Unit>)
Tail of the append: match heads the def body (params always destructurable), so the write's pair splits with single uses.
def wal_append source · line 258 · raw
@+dir:String -> @+data:String -> IO(Result<&1, &1, Pair(U32, String), Unit>)
def batch_len source · line 264 · raw
@+muts:List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Wal.Mut> -> Nat
def rotate_cnt source · line 267 · raw
@full:Bool -> @+grown:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @+frozen:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @+count:Nat -> @+fcount:Nat -> RotRes
def frozen_empty source · line 274 · raw
@+frozen:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> Bool
def rotate_after source · line 283 · raw
@+grown:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @+frozen:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @+count:Nat -> @+fcount:Nat -> RotRes
def apply_and_rotate source · line 286 · raw
@+muts:List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Wal.Mut> -> @+mem:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @+frozen:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/MemTable.MemTable -> @+mem_count:Nat -> @+frozen_count:Nat -> RotRes
def apply_done source · line 289 · raw
@res:RotRes -> @+dir:String -> @+batch_cap:Nat -> @+bcache:List<&2, BEntry> -> @+levels:List<&2, List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table>> -> @+flushed:Nat -> @+manifest_token:String -> Db
def rot_done source · line 294 · raw
@res:RotRes -> @+dir:String -> @+batch_cap:Nat -> @+bcache:List<&2, BEntry> -> @+levels:List<&2, List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Sstable.Table>> -> @+flushed:Nat -> @+manifest_token:String -> Result<&1, &1, Pair(U32, String), Db>
def db_write source · line 297 · raw
@+db:Db -> @+batch:0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Wal.Batch -> IO(Result<&1, &1, Pair(U32, String), Db>)
def db_put source · line 306 · raw
@+db:Db -> @+key:String -> @+val:String -> IO(Result<&1, &1, Pair(U32, String), Db>)
def batch_cap_of source · line 309 · raw
@+db:Db -> Nat
def with_batch_cap source · line 314 · raw
@+db:Db -> @+cap:Nat -> Db
def staged_muts source · line 319 · raw
@+staged:List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Wal.Batch> -> List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Wal.Mut>
def db_write_staged source · line 326 · raw
@+db:Db -> @+staged:List<&2, 0x8bf6d41adbe0e67e438f6cdc25a6cb6e/src/Wal.Batch> -> IO(Result<&1, &1, Pair(U32, String), Db>)
def db_del source · line 331 · raw
@+db:Db -> @+key:String -> IO(Result<&1, &1, Pair(U32, String), Db>)