Skip to content
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

Avoid stacktrace on process exit in Client.__del__() #3397

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

noirbee
Copy link

@noirbee noirbee commented Oct 1, 2024

Pull Request check-list

Please make sure to review and check all of these items:

  • Do tests and lints pass with this change?
  • Do the CI tests pass with this change (enable it first in your forked repo and wait for the github action build to finish)?
  • Is the new or changed code fully tested?
  • Is a documentation update included (if this change modifies existing APIs, or introduces new ones)?
  • Is there an example added to the examples folder (if applicable)?
  • Was the change added to CHANGES file?

NOTE: these things are not required to open a PR and can be done
afterwards / while the PR is open.

Description of change

Client.close() may call ConnectionPool.release() or ConnectionPool.disconnect(); both methods may end up calling os.getpid() (through ConnectionPool._checkpid() or threading.Lock() (through ConnectionPool.reset()). As mentioned in the Python documentation [1], at interpreter shutdown, module globals (in this case, the os and threading module references) may be deleted or set to None before del() methods are called. This causes an AttributeError to be raised when trying to run e.g. os.getpid(); while the error is ignored by the interpreter, the traceback is still printed out to stderr.

Closes #3014

[1] https://docs.python.org/3/reference/datamodel.html#object.__del__

Client.close() may call ConnectionPool.release() or
ConnectionPool.disconnect(); both methods may end up calling
os.getpid() (through ConnectionPool._checkpid() or threading.Lock()
(through ConnectionPool.reset()). As mentioned in the Python
documentation [1], at interpreter shutdown, module globals (in this
case, the os and threading module references) may be deleted or set to
None before __del__() methods are called. This causes an
AttributeError to be raised when trying to run e.g. os.getpid(); while
the error is ignored by the interpreter, the traceback is still
printed out to stderr.

Closes redis#3014

[1] https://docs.python.org/3/reference/datamodel.html#object.__del__
@noirbee
Copy link
Author

noirbee commented Oct 1, 2024

Note that I unfortunately cannot provide an easy way to reproduce the issue; I can only reproduce it using our own codebase. I suspect this is due to the fact that we load a much larger amount of code than what a synthetic / minimal reproduction attempt would.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Stderr backtrace caused by redis.client.Redis.__del__ on process exit.
1 participant