1 import Base 2 import ./Db.bend as Db 3 import ./Wal.bend as Wal 4 5 # Identifies the durability boundary reached by a commit. 6 type Stage is Data: 7 EncodingRejected{error: Wal.Error} 8 AppendRejected{code: U32, message: String} 9 AppendUnknown{code: U32, message: String} 10 DurableAppend{} 11 12 # Applies mutations only after the WAL commit stage is durable. 13 def apply(pair: Stage & List<&2, Wal.Mut>, +db: Db.Db) -> Db.Db & Stage: 14 match pair: 15 case (stage, muts): 16 match stage: 17 case EncodingRejected{error}: 18 (db, EncodingRejected{error}) 19 case AppendRejected{code, message}: 20 (db, AppendRejected{code, message}) 21 case AppendUnknown{code, message}: 22 (db, AppendUnknown{code, message}) 23 case DurableAppend{}: 24 match db: 25 case Db.Db{dir, mem, frozen, batch_cap, bcache, levels, flushed, manifest_token, mem_count, frozen_count}: 26 (Db.apply_done(Db.apply_and_rotate(muts, mem, frozen, mem_count, frozen_count), dir, 27 batch_cap, bcache, levels, flushed, manifest_token), DurableAppend{})