Branches
Branches Postgres copy-on-write na Kisenon — fork-at-LSN, ciclo de vida e cascata.
Um branch é um ponteiro para um Log Sequence Number (LSN) no storage do projeto. Criar um é um insert de linha O(1); ele não copia dados. Branches divergem conforme você escreve neles, e apenas o delta é armazenado.
O modelo
Todo projeto tem um branch main desde a criação. A partir de main (ou de qualquer
branch existente) você pode bifurcar um novo branch:
- No HEAD — o novo branch começa a partir do LSN atual do pai.
- Em um LSN específico — o novo branch começa a partir de um LSN histórico dentro da janela de retenção de WAL do pai. Este é o caso de "viagem no tempo": você pode bifurcar a partir de um ponto no passado desde que o WAL ainda esteja retido.
Leituras em um branch caem para as páginas do pai até que o branch divirja. Escritas registram apenas o delta. O resultado:
- Um projeto de 100 GB com dez branches pequenos é cobrado como ~100 GB no total.
- Criar um branch leva menos de um segundo.
- Branches são descartáveis. Rode uma migração destrutiva, jogue o branch fora, o pai fica intocado.
Nomenclatura
Nomes de branch são rótulos visíveis ao usuário, com escopo no projeto pai. As restrições coincidem com as de nomes de projeto:
- 1–63 caracteres.
^[a-zA-Z][a-zA-Z0-9_-]*$.- Único dentro do projeto.
O id interno do branch (br_<24 hex>) é a referência estável. Use
o id, não o nome, ao criar scripts contra a API; nomes podem ser
renomeados.
Máquina de estados
Um branch transita por:
creating → ready → deleting → deleted- creating — o control plane está registrando o branch na camada de storage. Tipicamente menos de um segundo; mais longo se o storage estiver sob carga.
- ready — o branch pode ser anexado a endpoints e aceitar escritas.
- deleting — cascata em andamento: cada endpoint neste branch está sendo parado e removido.
- deleted — terminal. A linha é retida para auditabilidade por um curto período, depois é coletada como lixo.
A CLI mostra o estado atual de cada branch:
keon branches list --project <project-id>Criar
keon branches create --project <project-id> --name my-feature --parent mainPara bifurcar em um LSN histórico, passe --parent-lsn <lsn>:
keon branches create \
--project <project-id> \
--name pre-migration \
--parent main \
--parent-lsn 0/1A2B3C4DO LSN deve estar dentro da janela de retenção de WAL do projeto. Se ele já tiver sido compactado para além disso, a criação do branch falha.
Excluir
Excluir um branch faz cascata para cada endpoint anexado a ele:
- Todos os endpoints no branch são parados e removidos.
- O próprio branch é desmontado.
- O storage é recuperado de forma assíncrona pela compactação do pageserver.
keon branches delete <branch-id>Você não pode excluir o branch main de um projeto — exclua o projeto
em vez disso. Você pode excluir qualquer outro branch mesmo que ele tenha filhos;
nesse caso os filhos são reparentados ao pai do branch excluído
no LSN da exclusão.
Reset e restauração
Na página de detalhes do branch no console, o menu de ações ⋯ expõe duas operações de re-fork em qualquer branch que não seja raiz:
- Reset para o pai — re-bifurca o branch no HEAD atual do seu pai. Toda escrita feita no branch desde o fork original é descartada. Endpoints no branch suspendem brevemente durante a troca.
- Restaurar para um ponto no tempo — re-bifurca o branch em um LSN escolhido ou um timestamp UTC (RFC 3339). Escritas após esse ponto são descartadas.
Ambas rodam de forma assíncrona: o console emite a requisição e o branch
retorna a ready assim que o re-fork conclui. O branch raiz (main)
não pode ser resetado — não há pai para o qual resetar.
Snapshots
Um snapshot fixa um LSN de ponto no tempo para que ele permaneça restaurável além do horizonte de retenção de WAL. Sem um snapshot, um alvo de restauração só é alcançável enquanto seu WAL ainda estiver retido; um snapshot mantém esse ponto endereçável indefinidamente.
A aba Snapshots na página de detalhes do branch lista os snapshots do branch e permite capturar um novo. Cada linha oferece:
- Restaurar — re-bifurca o branch no LSN fixado do snapshot.
- Excluir — remove o snapshot (o LSN subjacente deixa de estar fixado e pode ser recuperado pela compactação).