Skip to content

Fix std::terminate in LoadTableHandlersHelper#14603

Open
Ignition wants to merge 1 commit intofacebook:mainfrom
Ignition:fix_unintended_terminate
Open

Fix std::terminate in LoadTableHandlersHelper#14603
Ignition wants to merge 1 commit intofacebook:mainfrom
Ignition:fix_unintended_terminate

Conversation

@Ignition
Copy link
Copy Markdown

@Ignition Ignition commented Apr 11, 2026

LoadTableHandlersHelper spawns background threads into a std::vector using emplace_back in a loop. If emplace_back throws (e.g. std::bad_alloc from vector reallocation, or std::system_error from pthread_create failing under resource limits), stack unwinding destroys the vector, which calls ~thread() on already-started but unjoined threads. Per the C++ standard, destroying a joinable std::thread calls std::terminate, crashing the process unconditionally.

Fix by switching from port::Thread (std::thread) to std::jthread, which auto-joins on destruction. This guarantees that if an exception propagates (e.g. std::bad_alloc from a per-query memory limit), all running threads are safely joined during stack unwinding rather than triggering std::terminate. Additionally catch std::system_error from thread creation to degrade gracefully to fewer threads rather than aborting. Also add an early return when files_meta is empty to avoid unnecessary work.

Fixes #13303

@meta-cla
Copy link
Copy Markdown

meta-cla Bot commented Apr 11, 2026

Hi @Ignition!

Thank you for your pull request and welcome to our community.

Action Required

In order to merge any pull request (code, docs, etc.), we require contributors to sign our Contributor License Agreement, and we don't seem to have one on file for you.

Process

In order for us to review and merge your suggested changes, please sign at https://code.facebook.com/cla. If you are contributing on behalf of someone else (eg your employer), the individual CLA may not be sufficient and your employer may need to sign the corporate CLA.

Once the CLA is signed, our tooling will perform checks and validations. Afterwards, the pull request will be tagged with CLA signed. The tagging process may take up to 1 hour after signing. Please give it that time before contacting us about it.

If you have received this in error or have any questions, please contact us at cla@meta.com. Thanks!

@meta-cla meta-cla Bot added the CLA Signed label Apr 11, 2026
@meta-cla
Copy link
Copy Markdown

meta-cla Bot commented Apr 11, 2026

Thank you for signing our Contributor License Agreement. We can now accept your code for this (and any) Meta Open Source project. Thanks!

Comment thread db/version_util.cc Outdated
Comment thread db/version_util.cc Outdated
LoadTableHandlersHelper spawns background threads into a std::vector
using emplace_back in a loop. If emplace_back throws (e.g. std::bad_alloc
from vector reallocation, or std::system_error from pthread_create failing
under resource limits), stack unwinding destroys the vector, which calls
~thread() on already-started but unjoined threads. Per the C++ standard,
destroying a joinable std::thread calls std::terminate, crashing the
process unconditionally.

Fix by switching from port::Thread (std::thread) to std::jthread, which
auto-joins on destruction. This guarantees that if an exception propagates
(e.g. std::bad_alloc from a per-query memory limit), all running threads
are safely joined during stack unwinding rather than triggering
std::terminate. Additionally catch std::system_error from thread creation
to degrade gracefully to fewer threads rather than aborting. Also add an
early return when files_meta is empty to avoid unnecessary work.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

LoadTableHandlers can cause std::terminate

2 participants