ChaosSQL

Começando

Guia de Início Rápido & Primeiros Passos

Aprenda os fundamentos do ChaosSQL, como instalar a ferramenta com zero dependências externas (Pure Go, CGO_ENABLED=0) e executar seu primeiro teste de concorrência com detecção de anomalia e redução do trace.

O Que é o ChaosSQL?

O ChaosSQL é um Fuzzer Determinístico de Concorrência e Invariantes para Bancos de Dados SQL, criado por Ricardo Bregalda (Studio Bregalda). Em sistemas concorrentes e microsserviços modernos, bugs de concorrência como Lost Updates, Write Skew, Dirty Reads e Deadlocks são extremamente difíceis de reproduzir e depurar. Testes de unidade convencionais são sequenciais e determinísticos por natureza, enquanto testes de carga estocásticos (como JMeter ou k6) geram ruído desmedido e raramente reproduzem as trocas de contexto (context switches) críticas necessárias para disparar a anomalia.

O ChaosSQL aborda essa lacuna fundamental unindo a engenharia do caos com três pilares da computação teórica:

  • Agendamento com Jitter Semeado: O motor intercala os workers com atrasos sorteados por um PRNG semeado, então a mesma spec com a mesma semente repete o mesmo agendamento. O proxy transparente adiciona um agendador no estilo PCT, inspirado em Burckhardt & Musuvathi (ASPLOS 2010). Nenhum dos dois prova a ausência de bugs; eles tornam reproduzíveis os agendamentos explorados.
  • Classificação Automática de Anomalias via Grafos de Adya: Reconstrói o Grafo de Serialização Direta (Direct Serialization Graph) com base na tese seminal de Atul Adya (MIT 1999) e nas observações de caixa-preta do Elle (VLDB 2020), identificando arestas de conflito rw (anti-dependência), ww (sobreposição) e wr (dependência de leitura).
  • Delta-Debugging (ddmin): Implementa o algoritmo de Andreas Zeller com replays memoizados e uma auditoria final de 1-minimalidade, reduzindo um trace com falha ao menor conjunto de operações que ainda produz a mesma assinatura de falha.
Zero CGO & Pure Go: O ChaosSQL compila para um único binário executável estático sem necessidade de ferramentas de compilação em C (CGO_ENABLED=0). O motor SQLite embutido roda via transpilador nativo em Go puro (modernc.org/sqlite), permitindo execução instantânea em qualquer container Alpine, WSL2, Linux, macOS ou Windows.

Requisitos de Sistema & Instalação

O ChaosSQL requer apenas o ambiente Go 1.22 ou superior (caso deseje compilar a partir do código-fonte) ou pode ser baixado diretamente como binário standalone.

Método 1: Instalação Rápida via Go Toolchain

go install github.com/bregaldahq/chaossql/cmd/chaossql@latest

Método 2: Compilação Estática a Partir do Repositório Git

# 1. Clonar o repositório oficial
git clone https://github.com/bregaldahq/chaossql.git
cd chaossql

# 2. Compilar binário estático de alta performance
CGO_ENABLED=0 go build -ldflags="-s -w" -o bin/chaossql ./cmd/chaossql

# 3. Testar a instalação
./bin/chaossql --help

Método 3: Execução via Docker Container

docker run --rm -v $(pwd):/workspace -w /workspace ghcr.io/bregaldahq/chaossql:latest run specs/banking.yaml

Seu Primeiro Teste em 5 Minutos (Passo a Passo)

Vamos criar e testar um cenário clássico de perda de atualização bancária (Lost Update, anomalia P4), onde dois clientes sacam dinheiro simultaneamente da mesma conta sob isolamento permissivo.

Passo 1: Criar o Scaffolding com chaossql init

O comando init cria a estrutura de diretórios e arquivos de modelo prontos para execução:

chaossql init quickstart_banking --driver sqlite

A estrutura de arquivos criada é:

  • schema.sql: Esquema das tabelas e índices DDL.
  • seed.sql: Carga inicial de dados DML.
  • chaos.yaml: Especificação do motor, workers, invariantes e operações.
  • README.md: Documentação contextual do cenário.

Passo 2: Definir o Esquema DDL (schema.sql)

-- Tabela de contas bancárias
CREATE TABLE accounts (
    id INT PRIMARY KEY,
    owner TEXT NOT NULL,
    balance INT NOT NULL
);

Passo 3: Inserir a Carga Inicial (seed.sql)

-- Saldo inicial de R$ 1.000 para Alice
INSERT INTO accounts (id, owner, balance) VALUES (1, 'Alice', 1000);

Passo 4: Configurar a Especificação (chaos.yaml)

version: "1.0"
name: "quickstart_banking"
description: "Verificação de integridade de saldo sob saques simultâneos"

database:
  driver: "sqlite"
  schema: "schema.sql"
  seed: "seed.sql"

engine:
  workers: 4          # 4 goroutines concorrentes
  iterations: 20      # 20 operações de saque no total
  seed: 42            # Semente determinística reproduzível
  jitter_ms: [1, 5]   # Micro-atrasos estocásticos de 1ms a 5ms

invariants:
  - name: "total_balance_consistency"
    query: "SELECT balance FROM accounts WHERE id = 1;"
    assert: "balance == 1000 - (total_completed * 100)"

operations:
  - name: "withdraw_100"
    steps:
      - "SELECT balance FROM accounts WHERE id = 1 -> cur"
      - "UPDATE accounts SET balance = {cur - 100} WHERE id = 1"

Passo 5: Executar o Fuzzer com chaossql run

chaossql run quickstart_banking/chaos.yaml --seed=42 --workers=4

Passo 6: Analisando o Diagnóstico no Terminal

O ChaosSQL executa os 4 workers simultaneamente, intercalando as operações de leitura (SELECT) e escrita (UPDATE) com jitter estocástico. O fuzzer detecta a violação da invariante:

  • Violação Identificada: balance == 1000 - (total_completed * 100) falhou (esperado: 0, real: 500).
  • Classificação Adya: Anomalia P4_LOST_UPDATE (G-single cycle).
  • Grafo de Conflito: T1 ──(rw)──► T2 ──(ww)──► T1.
  • Delta-Debugging (ddmin): Reduziu o trace original de 20 operações para apenas 2 operações críticas (90.0% de redução).
Interface Visual Interativa: Adicione a flag --ui ao executar qualquer teste (ex: chaossql run chaos.yaml --ui) para inicializar instantaneamente o servidor de visualização local em http://127.0.0.1:8090, com linha do tempo Gantt e visualização de grafos SVG.

Demonstrações Flagship Embutidas

O ChaosSQL inclui 10 cenários pré-configurados prontos para execução imediata via comando chaossql demo:

Comando Fenômeno Código Adya Severidade
chaossql demo banking Banking Lost Update P4 Alta (Perda de Mutação)
chaossql demo inventory Inventory Oversell A3 Crítica (Estoque Negativo)
chaossql demo hospital Hospital Write Skew A5B Crítica (Violação Global)
chaossql demo financial Financial Read Skew A5A Média (Auditoria Quebrada)
chaossql demo auction Auction Dirty Write G0 Crítica (Violação 2PL)
chaossql demo crypto Crypto Arbitrage Info Cycle G1c Alta (Fluxo Circular)
chaossql demo flash_crash Flash Crash Dirty Read G1a Crítica (Dados Abortados)
chaossql demo ticket Ticket Anti-Dependency G2 Alta (Reserva Duplicada)
chaossql demo deadlock Deadlock Cycle & Recovery G-DL Média (Bloqueio Mútuo)
chaossql demo fk Foreign Key Cascade Deadlock G-DL Alta (Conflito Cascata)