apache / apache/paimon-cpp

[Feature] Improve scan performance in hot read paths

Aberta
#240 1 comentário 0 reações 0 responsáveis Ver no GitHub
enhancement
Linguagem predominante
C++
Estrelas
65
Forks
25
Merge médio
2d 9h
PRs com merge (30d)
82

Descrição

### Search before asking

- [x] I searched in the [issues](https://github.com/apache/paimon-cpp/issues) and found nothing similar.

### Motivation

Recent profiling of highly concurrent scans has revealed several performance bottlenecks caused by
repeated operations on Arrow-returned `shared_ptr` objects in hot read loops.

Two significant cases have been identified:

1. Manifest readers repeatedly call `StructArray::fields()` while processing individual rows. This
copies `shared_ptr` objects and, with GCC 8.3's libstdc++, can introduce substantial lock
contention through `_Sp_locker`, `pthread_mutex_lock`, and futex waits when multiple workers read
manifests concurrently.

2. Avro decoding calls `ArrayBuilder::type()` for every integer and timestamp value. Because this
method returns `std::shared_ptr` by value, concurrent scans repeatedly modify reference
counts on shared Arrow primitive data types, causing cache-line contention. Profiling showed
`ArrayBuilder::type()` and shared-pointer release operations accounting for a large proportion of
samples after the manifest bottleneck was removed.

This issue tracks the broader effort to identify and eliminate similar shared-pointer operations
from scan hot paths. The goal is to cache immutable Arrow metadata at an appropriate batch, reader,
or builder lifetime, while ensuring caches are invalidated whenever the corresponding Arrow object
tree is replaced.

The expected outcome is lower synchronization and reference-counting overhead under concurrent
scans, allowing CPU time to return to actual decoding, memory copying, and buffer management.

### Solution

_No response_

### Anything else?

_No response_

### Are you willing to submit a PR?

- [x] I'm willing to submit a PR!

Guia de contribuição

Abrir o guia de contribuição

Direção de pesquisa

Comece criando um perfil das chamadas de StructArray::fields() do manifest reader e das chamadas de ArrayBuilder::type() do Avro decoder em caminhos de varredura concorrentes. Identifique o tempo de vida apropriado do batch, reader ou builder para os metadados imutáveis do Arrow e, em seguida, verifique se os caches são invalidados quando a árvore de objetos correspondente do Arrow é substituída. Considera-se concluído quando a sobrecarga de sincronização de shared pointers e de contagem de referências é reduzida durante varreduras concorrentes.

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

Avaliação

Stack de tecnologia
cpp
Domínio
performance
Tipo de issue
Funcionalidade
Dificuldade
5/5
Tempo estimado
Mais de uma semana
Status de atividade
Ativa
Clareza
Precisa de esclarecimento
Facilidade para iniciantes
35/100

Receba novas issues na sua caixa de entrada

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