[Bug] BE aborts via std::terminate when a VARIANT read exceeds the query memory limit (allocation in noexcept release path)
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 22/100
Piste de recherche
Start at release_batch_container in be/src/core/value/variant/variant_batch_builder.cpp (around line 134) and at _take_encoded_metadata() (around line 342), then check the noexcept functions there that call it, including release_scratch(). Run or write a test that drives the VARIANT V2 assembly path under a tight memory tracker limit. Done means the query returns MEM_LIMIT_EXCEEDED without the BE terminating, and the noexcept release paths no longer allocate.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Search before asking
- I had searched in the issues and found no similar issues.
Version
4.1.4 (cloud mode, arm64); master is the same. On master release_batch_container is be/src/core/value/variant/variant_batch_builder.cpp:134 and _take_encoded_metadata() is :342.
What's Wrong?
A query that reads a VARIANT V2 column and exceeds its memory limit aborts the BE process with std::terminate, instead of failing the query with MEM_LIMIT_EXCEEDED. When the query runs on every BE, every BE aborts at once. In our case all 4 BEs aborted within about 10 s and restarted.
FE error for the query: [MEM_ALLOC_FAILED]Allocator mem tracker check failed, [MEM_LIMIT_EXCEEDED]failed alloc size 13.68 MB.
Symbolized BE stack:
#0 std::terminate handler
#3 __clang_call_terminate
#4 doris::VariantMetadataBuilder::_take_encoded_metadata() (allocation, core/custom_allocator.h:133)
#5 doris::VariantBatchBuilder::finish_batch() (core/value/variant/variant_batch_builder.cpp:1728)
#6 doris::segment_v2::variant_v2::VariantAssembler::assemble(...)
... segment iterator / scan operator frames
Cause:
template <typename Container>
void release_batch_container(Container& container) noexcept {
Container().swap(container);
}
PaddedPODArray<char> VariantMetadataBuilder::_take_encoded_metadata() noexcept {
...
release_batch_container(_impl->keys); // Keys = std::deque<PaddedPODArray<char>, CustomStdAllocator<...>>
...
}
A default-constructed libstdc++ std::deque allocates its map and first node. With CustomStdAllocator, that allocation goes through MemoryAllocator::alloc, which throws doris::Exception (MEM_ALLOC_FAILED, "Allocator mem tracker check failed") once the thread's memory tracker is over its limit. The throw happens inside a noexcept function, so the runtime calls std::terminate. release_scratch() is also noexcept and uses the same helper. Other noexcept functions in this file may allocate as well, and are worth auditing for the same pattern.
What You Expected?
The query fails with MEM_LIMIT_EXCEEDED and the BE keeps running.
How to Reproduce?
A table with a VARIANT column (Variant V2) holding about 1B rows of nested JSON. A query that materializes the VARIANT for many rows under the default query memory limit, e.g.:
SELECT count(*), sum(length(j))
FROM (SELECT CAST(v AS STRING) AS j FROM t
WHERE ts >= '...' AND ts < '...'
ORDER BY ts DESC, id LIMIT 1000000) x;
Any query whose VARIANT read pushes the memory tracker over its limit while finish_batch runs should reproduce it. (Separately, the CAST is evaluated in the scan projection for every row before the top-N, rather than being deferred by lazy materialization. That makes this query far more memory-hungry than its LIMIT suggests.)
Anything Else?
Possible fix: make the release path unable to allocate or throw. For example, fall back to clear() when constructing an empty container throws, or drop noexcept where no caller relies on it, so the memory-limit exception reaches the query as a normal error.
Are you willing to submit PR?
- Yes I am willing to submit a PR!
Code of Conduct
- I agree to follow this project's Code of Conduct
- Langage dominant
- Java
- Étoiles
- 16.1k
- Forks
- 4k
- Merge moyen
- 2 j 23 h
- PR mergées (30 j)
- 686
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de apache/doris
-
Difficulté 2/5 Moins d'une heure Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 Une demi-journée Accessibilité débutants 70/100
Les mainteneurs répondent en général sous 1 jour
-
4.1.4.1 Release NoteOuverterelease notes
Difficulté 1/5 Moins d'une heure Accessibilité débutants 85/100
Les mainteneurs répondent en général sous 1 jour
-
[Bug] FE metric http_copy_into_query_err_total is registered under the upload error namePeut-être pris @manesioz l’a pris il y a 23 jours. Ouverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 85/100
apache/doris#68505 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de apache/doris
Issues similaires
-
enhancement Improvement
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
zowe/zowe-client-java-sdk#647 ·
-
NullPointerException when a `DeserializationProblemHandler` returns `null` for `byte[]` (single value unwrapped) and `char[]` elementsPeut-être pris @Marti2203 l’a pris aujourd’hui. Ouverte
Difficulté 2/5 Une demi-journée Accessibilité débutants 88/100
FasterXML/jackson-databind#6300 ·
Les mainteneurs répondent en général sous 1 jour
-
content good first issue
Difficulté 1/5 Moins d'une heure Accessibilité débutants 95/100
cpinitiative/usaco-guide#6699 ·
Les mainteneurs répondent en général sous 1 jour
-
BC remittance upload: a claim MSP refused (S03) is saved with a blank status instead of refused (F)Peut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouvertetype: bug
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
carlos-emr/carlos#4933 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
apache/rocketmq-dashboard#6925 ·
Les mainteneurs répondent en général sous 3 jours