Skip to content

WRITE-SERIAL-001: Pipeline de escrita WAL + MemTable serializada — throughput limitado #363

@ElioNeto

Description

@ElioNeto

🟠 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:

  1. wal.lock() → escreve no WAL → wal.unlock()
  2. 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)

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions