~/bend-docscommunity

src/Db.bend fails

raw source on the hub · import mylsm-lsm-store@0.2.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

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.

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

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:0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable -> @+mut:0x7279d7e59732e720723bbd4a452d447a/src/Wal.Mut -> 0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable

def apply_batch source · line 63 · raw

@+muts:List<&2, 0x7279d7e59732e720723bbd4a452d447a/src/Wal.Mut> -> @+mem:0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable -> 0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable

def table_entries source · line 72 · raw

@+tab:0x7279d7e59732e720723bbd4a452d447a/src/Sstable.Table -> List<&2, 0x7279d7e59732e720723bbd4a452d447a/src/MemTable.Entry>

def level_entries source · line 77 · raw

@+tabs:List<&2, 0x7279d7e59732e720723bbd4a452d447a/src/Sstable.Table> -> List<&2, 0x7279d7e59732e720723bbd4a452d447a/src/MemTable.Entry>

def all_level_entries source · line 84 · raw

@+lvls:List<&2, List<&2, 0x7279d7e59732e720723bbd4a452d447a/src/Sstable.Table>> -> List<&2, 0x7279d7e59732e720723bbd4a452d447a/src/MemTable.Entry>

def all_entries source · line 91 · raw

@+db:Db -> List<&2, 0x7279d7e59732e720723bbd4a452d447a/src/MemTable.Entry>

def table_hit_if source · line 98 · raw

@present:Bool -> @tab:0x7279d7e59732e720723bbd4a452d447a/src/Sstable.Table -> @+key:String -> Maybe<&2, Maybe<&2, String>>

def table_hit source · line 105 · raw

@+tab:0x7279d7e59732e720723bbd4a452d447a/src/Sstable.Table -> @+key:String -> Maybe<&2, Maybe<&2, String>>

def tables_hits source · line 108 · raw

@+tabs:List<&2, 0x7279d7e59732e720723bbd4a452d447a/src/Sstable.Table> -> @+key:String -> List<&2, Maybe<&2, Maybe<&2, String>>>

def levels_hits source · line 115 · raw

@+lvls:List<&2, List<&2, 0x7279d7e59732e720723bbd4a452d447a/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:0x7279d7e59732e720723bbd4a452d447a/src/Sstable.Table -> @+key:String -> Pair(Maybe<&2, Maybe<&2, String>>, List<&2, BEntry>)

def table_probe source · line 183 · raw

@+tab:0x7279d7e59732e720723bbd4a452d447a/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, 0x7279d7e59732e720723bbd4a452d447a/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, 0x7279d7e59732e720723bbd4a452d447a/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:0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable -> @+frozen:0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable -> @+batch_cap:Nat -> @+bcache:List<&2, BEntry> -> @+levels:List<&2, List<&2, 0x7279d7e59732e720723bbd4a452d447a/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:0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable -> @+frozen:0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable -> @+batch_cap:Nat -> @+bcache:List<&2, BEntry> -> @+levels:List<&2, List<&2, 0x7279d7e59732e720723bbd4a452d447a/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:0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable -> @+frozen:0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable -> @+batch_cap:Nat -> @+bcache:List<&2, BEntry> -> @+levels:List<&2, List<&2, 0x7279d7e59732e720723bbd4a452d447a/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, 0x7279d7e59732e720723bbd4a452d447a/src/Wal.Mut> -> Nat

def rotate_cnt source · line 267 · raw

@full:Bool -> @+grown:0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable -> @+frozen:0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable -> @+count:Nat -> @+fcount:Nat -> RotRes

def frozen_empty source · line 274 · raw

@+frozen:0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable -> Bool

def rotate_after source · line 283 · raw

@+grown:0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable -> @+frozen:0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable -> @+count:Nat -> @+fcount:Nat -> RotRes

def apply_and_rotate source · line 286 · raw

@+muts:List<&2, 0x7279d7e59732e720723bbd4a452d447a/src/Wal.Mut> -> @+mem:0x7279d7e59732e720723bbd4a452d447a/src/MemTable.MemTable -> @+frozen:0x7279d7e59732e720723bbd4a452d447a/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, 0x7279d7e59732e720723bbd4a452d447a/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, 0x7279d7e59732e720723bbd4a452d447a/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:0x7279d7e59732e720723bbd4a452d447a/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, 0x7279d7e59732e720723bbd4a452d447a/src/Wal.Batch> -> List<&2, 0x7279d7e59732e720723bbd4a452d447a/src/Wal.Mut>

def db_write_staged source · line 326 · raw

@+db:Db -> @+staged:List<&2, 0x7279d7e59732e720723bbd4a452d447a/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>)