Chunked secrets storage leaks a goroutine on every failed release decode

Aberta Para iniciantes
#572 1 comentário 0 reações 0 responsáveis Ver no GitHub

@RaphaelFakhri já está trabalhando nisso.

Desde 5/11/2026.

  • #573 de @RaphaelFakhri — aberto

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
78/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
go
Domínio
backend

Direção de pesquisa

Comece em pkg/storage/chunked.go, em chunkedSecrets.decodeRelease, e acompanhe como o leitor e o gravador de io.Pipe são tratados quando a decodificação gzip ou JSON falha. Reproduza o problema com os dados de chunk inválidos descritos nas etapas e, em seguida, verifique se chamadas repetidas de Get que falham não aumentam mais a quantidade de goroutines e continuam retornando o erro gzip esperado.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

chunkedSecrets.decodeRelease in pkg/storage/chunked.go starts a goroutine that writes the chunk data into an io.Pipe, and it reads the other end with gzip.NewReader and json.Decoder. The read side of the pipe is never closed. When decoding returns an error before all of the data has been read, the writer goroutine blocks on pw.Write forever and holds a reference to the secret data.

The leak happens whenever decoding fails before the writer finishes, for example because the gzip header is invalid or the JSON payload can't be decoded due to a corrupt or truncated chunk. Each failed Get, List, or Query leaks one goroutine, so an operator that keeps reconciling an affected release leaks a goroutine on every attempt.

Steps to reproduce

  1. Create an index secret with invalid chunk data that is larger than the gzip reader's buffer:

    sec := &corev1.Secret{
        ObjectMeta: metav1.ObjectMeta{Name: "bad.v1"},
        Type:       storage.SecretTypeChunkedIndex,
        Data: map[string][]byte{
            "extraChunks": []byte("[]"),
            "chunk":       make([]byte, 10000),
        },
    }
    
  2. Call Get("bad.v1") on a driver created with storage.NewChunkedSecrets 20 times.

  3. Compare runtime.NumGoroutine() before and after.

Expected behavior

Each call returns failed to create gzip reader: gzip: invalid header, and the goroutine count stays the same.

Actual behavior

Each call returns the error, but the goroutine count goes up by one for every call (13 before, 33 after 20 calls). The leaked goroutines are blocked in (*chunkedSecrets).decodeRelease.func1 on pw.Write.

Successful decodes don't leak.

Linguagem predominante
Go
Estrelas
59
Forks
54
Métricas de merge de PRs
Nenhum PR com merge em 30d

Preparar o ambiente

  • Inclui um Dockerfile ou arquivo Docker Compose
  • Sem modelo de pull request
  • Sem guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de operator-framework/helm-operator-plugins

Todas as issues de operator-framework/helm-operator-plugins

Issues semelhantes

Mais issues de Go

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.