Skip to content

IO-DISK-001: Disco cheio não ativa modo ReadOnly automaticamente — corrupção de dados #358

@ElioNeto

Description

@ElioNeto

🟠 Alto | Resiliência | Engine/API/Disk

Problema

Quando o disco enche, write_record() no WAL retorna Err(IoError). O erro propaga para a API, que retorna 500. O engine não entra em modo ReadOnly automaticamente — writes continuam sendo tentados e falhando. O DegradationManager existe mas não é verificado nos handlers da API.

Impacto

  • Escrita em disco cheio pode causar corrupção de SSTable
  • Perda de dados por gravação parcial
  • IOError repetitivo sem degradação graceful
  • WAL pode ficar em estado inconsistente

Evidência

  • src/storage/wal.rs:214-221: erro de sync_all() propaga via ?
  • src/infra/degradation.rs: implementado mas handlers put_key, post_key, delete_key, batch_keys não chamam check_write_allowed()
  • src/infra/disk_monitor.rs: on_critical callback não conectado ao engine
  • src/api/mod.rs:46-123: handlers de mutação sem verificação de degradação

Fluxo de correção necessário

  1. DiskMonitor::on_criticalDegradationManager::set_mode(ReadOnly)
  2. Em todos os handlers de mutação, verificar degradation_manager.check_write_allowed()
  3. Em vez de 500, retornar 503 Service Unavailable com corpo JSON explicativo
  4. Health check /health/readiness deve refletir modo degradado
// Em start_server:
let deg = DegradationManager::normal();
let deg_data = web::Data::new(deg.clone());
let mut disk_monitor = DiskMonitor::default(config.dir_path.clone());
disk_monitor.on_critical(move || {
    deg.set_mode(DegradationMode::ReadOnly);
    tracing::error!("Disk critically low — entering READ ONLY mode");
});

// Em cada handler de mutação:
fn put_key(..., deg: web::Data<DegradationManager>, ...) {
    deg.check_write_allowed().map_err(|_| {
        HttpResponse::ServiceUnavailable().json(json!({
            "error": "engine is in read-only mode",
            "reason": "disk critically low"
        }))
    })?;
}

Esforço: Médio (6h)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions