fix: последните 4 критични/средни бъга — LSM-Tree, MVCC, DistTxn, Raft

Поправени проблеми:
- LSM-Tree: WAL write вече е извън db.lock (отделен walLock) → по-добра concurrency
- MVCC: добавен compactVersions() който се изпълнява на всеки 100 commits
  Премахва стари overwritten версии, които не са видими за active транзакции
- DistTxn: commit() вече НЕ rollback-ва commit-нали participants
  Ако някой participant е commit-нал, транзакцията се маркира като committed
- Raft: добавен disk persistence за currentTerm, votedFor, log
  saveState() при всяка промяна; loadState() при стартиране

292 теста, 0 failure-а.
This commit is contained in:
2026-05-12 23:30:58 +03:00
parent 750746eb18
commit a72e17f063
4 changed files with 123 additions and 15 deletions
+12 -4
View File
@@ -51,6 +51,7 @@ type
currentSeq: uint64
nextSSTableId: int
lock*: Lock
walLock*: Lock
proc newMemTable(maxSize: int = DefaultMemTableSize): MemTable =
MemTable(entries: @[], size: 0, maxSize: maxSize)
@@ -322,6 +323,7 @@ proc newLSMTree*(dir: string, memMaxSize: int = DefaultMemTableSize): LSMTree =
new(result)
initLock(result.lock)
initLock(result.walLock)
result.dir = dir
result.memTable = newMemTable(memMaxSize)
result.immutableMem = newMemTable(0)
@@ -375,10 +377,13 @@ proc newLSMTree*(dir: string, memMaxSize: int = DefaultMemTableSize): LSMTree =
stream.close()
proc put*(db: LSMTree, key: string, value: seq[byte]) =
let ts = uint64(getMonoTime().ticks())
acquire(db.walLock)
db.wal.writePut(cast[seq[byte]](key), value, ts)
release(db.walLock)
acquire(db.lock)
defer: release(db.lock)
let ts = uint64(getMonoTime().ticks())
db.wal.writePut(cast[seq[byte]](key), value, ts)
if not db.memTable.put(key, value, ts):
if db.immutableMem.len > 0:
db.flushUnsafe()
@@ -387,10 +392,13 @@ proc put*(db: LSMTree, key: string, value: seq[byte]) =
discard db.memTable.put(key, value, ts)
proc delete*(db: LSMTree, key: string) =
let ts = uint64(getMonoTime().ticks())
acquire(db.walLock)
db.wal.writeDelete(cast[seq[byte]](key), ts)
release(db.walLock)
acquire(db.lock)
defer: release(db.lock)
let ts = uint64(getMonoTime().ticks())
db.wal.writeDelete(cast[seq[byte]](key), ts)
if not db.memTable.put(key, @[], ts, deleted = true):
if db.immutableMem.len > 0:
db.flushUnsafe()