Chunked secrets storage leaks a goroutine on every failed release decode
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 78/100
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
-
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), }, } -
Call
Get("bad.v1")on a driver created withstorage.NewChunkedSecrets20 times. -
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
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de operator-framework/helm-operator-plugins
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 54/100
-
Update to Helm 4Aberta
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 42/100
Todas as issues de operator-framework/helm-operator-plugins
Issues semelhantes
-
enhancement
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
Azure/azure-storage-azcopy#3681 ·
Mantenedores costumam responder em até 2 dias
-
Case detail: main-column section headers are hard to distinguish from body textTalvez já em andamento @yubessy assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
ubie-oss/hecatoncheires#347 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
meilisearch/meilisearch-go#829 ·