From 3df4b37cd00b7210b479b110964664542a9df68c Mon Sep 17 00:00:00 2001 From: sig5 Date: Fri, 24 Apr 2026 14:14:41 +0530 Subject: [PATCH] added WAL Clean and Replay --- db/db.go | 14 ++++++++++++-- db/db_test.go | 32 ++++++++++++++++++++++++++++++++ wal/wal.go | 10 ++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 db/db_test.go diff --git a/db/db.go b/db/db.go index 483448b..cd2ef3f 100644 --- a/db/db.go +++ b/db/db.go @@ -22,13 +22,22 @@ type LoremDB struct { func NewLoremDB(useBloom bool) *LoremDB { os.MkdirAll("sstable", 0755) - wal, _ := wal.NewWal("wal.log") + writeAheadLog, _ := wal.NewWal("wal.log") memTable := memtable.NewMemTable() + + writeAheadLog.Recover(func(walRow *wal.WalRow) { + if !walRow.IsDeleted { + memTable.Put(walRow.Key, walRow.Value) + } else { + memTable.Delete(walRow.Key) + } + }) + ssTables := []*sstable.SSTable{} ssTablePath := "sstable" return &LoremDB{ - wal: wal, + wal: writeAheadLog, memTable: memTable, ssTables: ssTables, ssTablePath: ssTablePath, @@ -64,6 +73,7 @@ func (db *LoremDB) Put(key string, value string) error { } db.memTable = memtable.NewMemTable() + db.wal.Clear() } return nil } diff --git a/db/db_test.go b/db/db_test.go new file mode 100644 index 0000000..03e5052 --- /dev/null +++ b/db/db_test.go @@ -0,0 +1,32 @@ +package db + +import ( + "os" + "testing" +) + +func TestCrashRecovery(t *testing.T) { + os.RemoveAll("sstable") + os.Remove("wal.log") + os.MkdirAll("sstable", 0755) + + // write some keys + store := NewLoremDB(true) + store.Put("name", "sakar") + store.Put("lang", "go") + + // simulate crash — don't flush, just create a new instance + store2 := NewLoremDB(true) + + val, ok := store2.Get("name") + if !ok || val != "sakar" { + t.Errorf("expected sakar, got %s", val) + } + val, ok = store2.Get("lang") + if !ok || val != "go" { + t.Errorf("expected go, got %s", val) + } + + os.RemoveAll("sstable") + os.Remove("wal.log") +} diff --git a/wal/wal.go b/wal/wal.go index 086b26b..88a1af7 100644 --- a/wal/wal.go +++ b/wal/wal.go @@ -46,6 +46,16 @@ func (wal *Wal) Append(walRow WalRow) { wal.file.WriteString(wal.lineDelimiter) } +func (wal *Wal) Clear() error { + + err := wal.file.Truncate(0) + if err != nil { + return err + } + _, err = wal.file.Seek(0, 0) + return err +} + func (wal *Wal) Recover(callback func(*WalRow)) error { file, err := os.Open(wal.file.Name())