8000 gh-133885: Disallow sharing zstd (de)compressor contexts by emmatyping · Pull Request #134253 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

gh-133885: Disallow sharing zstd (de)compressor contexts #134253

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed

Conversation

emmatyping
Copy link
Member
@emmatyping emmatyping commented May 19, 2025

It is not possible to share Zstandard objects across thread boundaries. To resolve this, we check if the object was created on the current thread and raise a RuntimeError if it is not. Wasn't totally sure what exception to raise to communicate the issue, so if RuntimeError isn't correct, please suggestion another option.

The tests are updated to ensure that the error is raised if a (de)compression context is shared across threads.

(as requested, cc @ngoldbaum )

According to the zstd author, it is not possible to share Zstandard objects across thread boundaries. To resolve this, we check if the object was created on the current thread and raise a RuntimeError if it is not.

The tests are updated to ensure that the error is raised if a (de)compression context is shared across threads.
@emmatyping emmatyping closed this May 19, 2025
@emmatyping emmatyping reopened this May 19, 2025
@@ -52,4 +52,21 @@ extern void
set_parameter_error(const _zstd_state* const state, int is_compress,
int key_v, int value_v);

static inline int
check_object_shared(PyObject *ob, char *type)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is probably not be the right way to implement this check? Access from different threads could happen regardless of free-threading builds.

I think the concept the extension module might want to enforce is something like getting the current thread id (we have a python c api for this IIRC) upon first "use" of the object, saving that in the object state, and checking that current thread id == that thread id for subsequent uses.

first use could be construction... but unless the zstandard C API requires that, it may be better to consider first use the first time that ZStdCompressor is actually used by a C API. This allows for the pattern of:

A compressor or decompressor is created by one thread - and added to a thread pool or work queue to be actually used and exhausted - exclusively - in another thread.

@emmatyping
Copy link
Member Author

After talking with Thomas, I think I'm going to try a different approach.

@emmatyping emmatyping closed this May 19, 2025
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.

2 participants
0