🟠 Alto | Performance | Engine
Problema
O pipeline de escrita é completamente serializado: WAL lock → escreve WAL → MemTable lock → insere. Cada operação só pode iniciar após a anterior completar. Não há pipelining.
Impacto
- Throughput máximo de escrita = 1 / (latency_wal + latency_memtable)
- Com WAL latency de 100μs + MemTable de 1μs = ~9.900 ops/s máx
- Com pipelining (WAL + MemTable em paralelo): até ~50.000 ops/s
Evidência
src/core/engine/mod.rs:753-780: sequência core.lock() → WAL write → MemTable insert → unlock
Fluxo atual:
Thread 1: [lock] → WAL write → MemTable insert → [unlock]
Thread 2: [lock] → WAL write → ...
Fluxo recomendado (pipelining):
Thread 1: [WAL lock] → WAL write → [WAL unlock] → [MT lock] → insert → [MT unlock]
Thread 2: [WAL lock] → WAL write → [WAL unlock] → [MT lock] → insert → ...
Correção
Separar EngineCore em dois locks independentes:
pub struct EngineCore {
wal: Mutex<WalManager>, // Lock para WAL
memtable: RwLock<MemTable>, // Lock para MemTable
version_set: RwLock<VersionSet>, // Lock para VersionSet
}
Pipeline de put_cf:
wal.lock() → escreve no WAL → wal.unlock()
memtable.write() → insere no MemTable → memtable.unlock()
Isso permite que a thread N+1 comece a escrever no WAL enquanto a thread N ainda está inserindo no MemTable.
Esforço: Alto (20h)
🟠 Alto | Performance | Engine
Problema
O pipeline de escrita é completamente serializado: WAL lock → escreve WAL → MemTable lock → insere. Cada operação só pode iniciar após a anterior completar. Não há pipelining.
Impacto
Evidência
src/core/engine/mod.rs:753-780: sequênciacore.lock()→ WAL write → MemTable insert → unlockFluxo atual:
Fluxo recomendado (pipelining):
Correção
Separar
EngineCoreem dois locks independentes:Pipeline de put_cf:
wal.lock()→ escreve no WAL →wal.unlock()memtable.write()→ insere no MemTable →memtable.unlock()Isso permite que a thread N+1 comece a escrever no WAL enquanto a thread N ainda está inserindo no MemTable.
Esforço: Alto (20h)