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

fix on_recv called when None after close #83

Merged
merged 8 commits into from
Jan 26, 2024

Conversation

graingert
Copy link
Contributor

Fixes #82

pytest.ini Show resolved Hide resolved
@graingert
Copy link
Contributor Author

@mmerickel can you approve my workflow build please?

@graingert
Copy link
Contributor Author

thanks looks like there's an fd use after close bug:

>               warnings.warn(pytest.PytestUnhandledThreadExceptionWarning(msg))
E               pytest.PytestUnhandledThreadExceptionWarning: Exception in thread Thread-1
E               
E               Traceback (most recent call last):
E                 File "/Users/runner/hostedtoolcache/PyPy/3.8.16/x64/lib/pypy3.8/threading.py", line 932, in _bootstrap_inner
E                   self.run()
E                 File "/Users/runner/hostedtoolcache/PyPy/3.8.16/x64/lib/pypy3.8/threading.py", line 870, in run
E                   self._target(*self._args, **self._kwargs)
E                 File "/Users/runner/work/hupper/hupper/.tox/py/lib/pypy3.8/site-packages/hupper/ipc.py", line 167, in _read_loop
E                   packet = self._recv_packet()
E                 File "/Users/runner/work/hupper/hupper/.tox/py/lib/pypy3.8/site-packages/hupper/ipc.py", line 144, in _recv_packet
E                   chunk = os.read(self.r_fd, self._packet_len.size)
E               OSError: [Errno 9] Bad file descriptor

@graingert
Copy link
Contributor Author

@mmerickel can I get another run approved please?

src/hupper/ipc.py Outdated Show resolved Hide resolved
src/hupper/ipc.py Outdated Show resolved Hide resolved
src/hupper/ipc.py Outdated Show resolved Hide resolved
@graingert
Copy link
Contributor Author

graingert commented Aug 20, 2023

Apparently os.read(-1) hangs on windows?

looks like Connection.close() hangs on windows, this happens on main too if Connection is tested in isolation

@graingert
Copy link
Contributor Author

this always hangs forever on windows:

import os
import sys
import threading

def consume(ident, fd):
    while chunk := os.read(fd, 1):
        print(ident, chunk)

def main():
    cr, cw = os.pipe()
    crt = threading.Thread(target=consume, args=("cr", cr))
    crt.start()

    print("close cr", flush=True)
    os.close(cr)
    print("close cw", flush=True)
    os.close(cw)

    

if __name__ == "__main__":
    sys.exit(main())

@graingert graingert force-pushed the fix-ipc-connection-close-exception branch from cea22a8 to be19728 Compare August 21, 2023 20:24
@graingert graingert force-pushed the fix-ipc-connection-close-exception branch from be19728 to e13d393 Compare August 21, 2023 20:29
@graingert
Copy link
Contributor Author

@mmerickel ok I tested this on linux and windows now it should pass in CI!

@shughes-uk
Copy link

This is a constant annoyance I have using hupper, would love to see it fixed!

@mmerickel
Copy link
Member

@graingert I finally got a chance to sit down and think about this and I'm wondering if we can simplify this to a one-line fix? What do you think?

diff --git a/src/hupper/ipc.py b/src/hupper/ipc.py
index cec1a85..11fdba3 100644
--- a/src/hupper/ipc.py
+++ b/src/hupper/ipc.py
@@ -135,9 +135,9 @@ class Connection(object):
         self.reader_thread.start()
 
     def close(self):
+        self.on_recv = lambda _: None
         close_fd(self.r_fd)
         close_fd(self.w_fd)
-        self.on_recv = None
 
     def _recv_packet(self):
         buf = io.BytesIO()

@graingert
Copy link
Contributor Author

Doesn't fix the use after close

@graingert
Copy link
Contributor Author

@mmerickel I've pushed that change

@mmerickel
Copy link
Member

mmerickel commented Aug 26, 2023

How does it not fix the use-after-close? The exception you posted in the original ticket is showing that things were properly caught (by the EOFError?) but the on_recv was None at the time instead of something that could be invoked.

@mmerickel
Copy link
Member

ok I see - it's not in your original stacktrace but I agree that invoking read on a closed fd will return EBADF which is not currently handled so your fix improves that.

@mmerickel
Copy link
Member

Please modify the PR to set self.on_recv before closing the fds to avoid a race there. I think there is no real point in setting the fds to -1 either but if you want to keep that it's ok. Thanks!

The following to me is a proper fix:

diff --git a/src/hupper/ipc.py b/src/hupper/ipc.py
index cec1a85..bbc567a 100644
--- a/src/hupper/ipc.py
+++ b/src/hupper/ipc.py
@@ -1,3 +1,4 @@
+import errno
 import io
 import os
 import pickle
@@ -135,9 +136,9 @@ class Connection(object):
         self.reader_thread.start()
 
     def close(self):
+        self.on_recv = lambda _: None
         close_fd(self.r_fd)
         close_fd(self.w_fd)
-        self.on_recv = None
 
     def _recv_packet(self):
         buf = io.BytesIO()
@@ -166,6 +167,9 @@ class Connection(object):
                 self.on_recv(packet)
         except EOFError:
             pass
+        except OSError as e:
+            if e.errno != errno.EBADF:
+                raise
         self.on_recv(None)
 
     def _write_packet(self, data):

@mmerickel
Copy link
Member

@graingert I haven't had time to debug this but something is clearly wrong with the new test you added on windows. Obviously one run passes, but all the others fail. I tried to re-run the failed jobs and they failed again in the same way with a deadlock in those tests.

You cannot invoke close(r_fd) on windows while a blocking os.read(r_fd)
is active. However, if you close the write_fd first, then things seem to
work.
@mmerickel
Copy link
Member

Whelp, 4 hours later after installing a windows VM and banging my head for a while I found the issue. Basically you cannot invoke os.close(r_fd) if the other thread is blocking on os.read(r_fd). Thanks windows. It appears to work reliably if you close the write_fd before the read_fd.

@mmerickel mmerickel merged commit 2c8f615 into Pylons:main Jan 26, 2024
27 checks passed
mmerickel added a commit that referenced this pull request Jan 26, 2024
@graingert graingert deleted the fix-ipc-connection-close-exception branch January 26, 2024 10:58
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Jan 28, 2024
1.12.1 (2024-01-26)

- Add support for Python 3.12.

- Fix a blocking issue when shutting down on Windows.

- Fix a race condition closing pipes when restarting the worker process.
  See Pylons/hupper#83

- Fix issues with watchman when the server shuts down unexpectedly and when
  subscriptions are canceled.

- Add ``hupper.get_reloader().graceful_shutdown()`` which can be used within
  your own app to trigger a full shutdown of the worker as well as the
  monitoring.
  See Pylons/hupper#88
lengau referenced this pull request in canonical/snapcraft Mar 29, 2024
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [MarkupSafe](https://palletsprojects.com/p/markupsafe/)
([changelog](https://markupsafe.palletsprojects.com/changes/)) |
`==2.1.3` -> `==2.1.5` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/MarkupSafe/2.1.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/MarkupSafe/2.1.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/MarkupSafe/2.1.3/2.1.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/MarkupSafe/2.1.3/2.1.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [alabaster](https://github.com/sphinx-doc/alabaster)
([changelog](https://alabaster.readthedocs.io/en/latest/changelog.html))
| `==0.7.13` -> `==0.7.16` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/alabaster/0.7.16?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/alabaster/0.7.16?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/alabaster/0.7.13/0.7.16?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/alabaster/0.7.13/0.7.16?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [cachetools](https://github.com/tkem/cachetools) | `==5.3.2` ->
`==5.3.3` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/cachetools/5.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/cachetools/5.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/cachetools/5.3.2/5.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/cachetools/5.3.2/5.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [coverage](https://github.com/nedbat/coveragepy) | `==7.4.0` ->
`==7.4.4` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/coverage/7.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/coverage/7.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/coverage/7.4.0/7.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/coverage/7.4.0/7.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [cryptography](https://github.com/pyca/cryptography)
([changelog](https://cryptography.io/en/latest/changelog/)) | `==42.0.4`
-> `==42.0.5` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/cryptography/42.0.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/cryptography/42.0.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/cryptography/42.0.4/42.0.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/cryptography/42.0.4/42.0.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [dill](https://github.com/uqfoundation/dill) | `==0.3.7` ->
`==0.3.8` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/dill/0.3.8?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/dill/0.3.8?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/dill/0.3.7/0.3.8?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/dill/0.3.7/0.3.8?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [filelock](https://github.com/tox-dev/py-filelock) | `==3.13.1` ->
`==3.13.3` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/filelock/3.13.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/filelock/3.13.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/filelock/3.13.1/3.13.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/filelock/3.13.1/3.13.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [hupper](https://github.com/Pylons/hupper)
([changelog](https://docs.pylonsproject.org/projects/hupper/en/latest/changes.html))
| `==1.12` -> `==1.12.1` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/hupper/1.12.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/hupper/1.12.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/hupper/1.12/1.12.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/hupper/1.12/1.12.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [jaraco.classes](https://github.com/jaraco/jaraco.classes) |
`==3.3.0` -> `==3.3.1` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/jaraco.classes/3.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/jaraco.classes/3.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/jaraco.classes/3.3.0/3.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/jaraco.classes/3.3.0/3.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [keyring](https://github.com/jaraco/keyring) | `==24.3.0` ->
`==24.3.1` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/keyring/24.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/keyring/24.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/keyring/24.3.0/24.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/keyring/24.3.0/24.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [lazr.restfulclient](https://launchpad.net/lazr.restfulclient)
([source](https://code.launchpad.net/lazr.restfulclient)) | `==0.14.5`
-> `==0.14.6` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/lazr.restfulclient/0.14.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/lazr.restfulclient/0.14.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/lazr.restfulclient/0.14.5/0.14.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/lazr.restfulclient/0.14.5/0.14.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [psutil](https://github.com/giampaolo/psutil) | `==5.9.7` ->
`==5.9.8` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/psutil/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/psutil/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/psutil/5.9.7/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/psutil/5.9.7/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [psutil](https://github.com/giampaolo/psutil) | `==5.9.6` ->
`==5.9.8` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/psutil/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/psutil/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/psutil/5.9.6/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/psutil/5.9.6/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [pydantic](https://github.com/pydantic/pydantic)
([changelog](https://docs.pydantic.dev/latest/changelog/)) | `==1.10.13`
-> `==1.10.14` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/pydantic/1.10.14?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pydantic/1.10.14?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pydantic/1.10.13/1.10.14?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pydantic/1.10.13/1.10.14?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [pyinstaller](https://www.pyinstaller.org/)
([source](https://github.com/pyinstaller/pyinstaller)) | `==5.13.1` ->
`==5.13.2` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/pyinstaller/5.13.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pyinstaller/5.13.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pyinstaller/5.13.1/5.13.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pyinstaller/5.13.1/5.13.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [pylxd](https://ubuntu.com/lxd) | `==2.3.1` -> `==2.3.2` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/pylxd/2.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pylxd/2.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pylxd/2.3.1/2.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pylxd/2.3.1/2.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| pyparsing | `==3.1.1` -> `==3.1.2` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/pyparsing/3.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pyparsing/3.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pyparsing/3.1.1/3.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pyparsing/3.1.1/3.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [pyright](https://github.com/RobertCraigie/pyright-python) |
`==1.1.350` -> `==1.1.355` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/pyright/1.1.355?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pyright/1.1.355?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pyright/1.1.350/1.1.355?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pyright/1.1.350/1.1.355?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [tomlkit](https://github.com/sdispater/tomlkit) | `==0.12.3` ->
`==0.12.4` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/tomlkit/0.12.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/tomlkit/0.12.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/tomlkit/0.12.3/0.12.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/tomlkit/0.12.3/0.12.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [virtualenv](https://github.com/pypa/virtualenv) | `==20.25.0` ->
`==20.25.1` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/virtualenv/20.25.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/virtualenv/20.25.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/virtualenv/20.25.0/20.25.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/virtualenv/20.25.0/20.25.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>sphinx-doc/alabaster (alabaster)</summary>

###
[`v0.7.16`](https://github.com/sphinx-doc/alabaster/releases/tag/0.7.16):
Alabaster 0.7.16

[Compare
Source](https://github.com/sphinx-doc/alabaster/compare/0.7.15...0.7.16)

Changelog: https://alabaster.readthedocs.io/en/latest/changelog.html

###
[`v0.7.15`](https://github.com/sphinx-doc/alabaster/releases/tag/0.7.15):
Alabaster 0.7.15

[Compare
Source](https://github.com/sphinx-doc/alabaster/compare/0.7.14...0.7.15)

Changelog: https://alabaster.readthedocs.io/en/latest/changelog.html

###
[`v0.7.14`](https://github.com/sphinx-doc/alabaster/releases/tag/0.7.14):
Alabaster 0.7.14

[Compare
Source](https://github.com/sphinx-doc/alabaster/compare/0.7.13...0.7.14)

Changelog: https://alabaster.readthedocs.io/en/latest/changelog.html

</details>

<details>
<summary>tkem/cachetools (cachetools)</summary>

###
[`v5.3.3`](https://github.com/tkem/cachetools/blob/HEAD/CHANGELOG.rst#v533-2024-02-26)

[Compare
Source](https://github.com/tkem/cachetools/compare/v5.3.2...v5.3.3)

\===================

-   Documentation improvements.

-   Update CI environment.

</details>

<details>
<summary>nedbat/coveragepy (coverage)</summary>

###
[`v7.4.4`](https://github.com/nedbat/coveragepy/blob/HEAD/CHANGES.rst#Version-744--2024-03-14)

[Compare
Source](https://github.com/nedbat/coveragepy/compare/7.4.3...7.4.4)

- Fix: in some cases, even with `[run] relative_files=True`, a data file
could be created with absolute path names. When combined with other
relative
data files, it was random whether the absolute file names would be made
relative or not. If they weren't, then a file would be listed twice in
reports, as detailed in `issue 1752`\_. This is now fixed: absolute file
names are always made relative when combining. Thanks to Bruno Rodrigues
dos
    Santos for support.

- Fix: the last case of a match/case statement had an incorrect message
if the
branch was missed. It said the pattern never matched, when actually the
    branch is missed if the last case always matched.

- Fix: clicking a line number in the HTML report now positions more
accurately.

- Fix: the `report:format` setting was defined as a boolean, but should
be a
string. Thanks, `Tanaydin Sirin <pull 1754_>`\_. It is also now
documented
    on the :ref:`configuration page <config_report_format>`.

.. \_issue
1752:[https://github.com/nedbat/coveragepy/issues/1752](https://github.com/nedbat/coveragepy/issues/1752)2
.. \_pull
1754[https://github.com/nedbat/coveragepy/pull/1754](https://github.com/nedbat/coveragepy/pull/1754)54

.. \_changes\_7-4-3:

###
[`v7.4.3`](https://github.com/nedbat/coveragepy/blob/HEAD/CHANGES.rst#Version-743--2024-02-23)

[Compare
Source](https://github.com/nedbat/coveragepy/compare/7.4.2...7.4.3)

- Fix: in some cases, coverage could fail with a RuntimeError: "Set
changed
    size during iteration." This is now fixed, closing `issue 1733`\_.

.. \_issue
1733:[https://github.com/nedbat/coveragepy/issues/1733](https://github.com/nedbat/coveragepy/issues/1733)3

.. \_changes\_7-4-2:

###
[`v7.4.2`](https://github.com/nedbat/coveragepy/blob/HEAD/CHANGES.rst#Version-742--2024-02-20)

[Compare
Source](https://github.com/nedbat/coveragepy/compare/7.4.1...7.4.2)

- Fix: setting `COVERAGE_CORE=sysmon` no longer errors on 3.11 and
lower,
thanks `Hugo van Kemenade <pull 1747_>`\_. It now issues a warning that
sys.monitoring is not available and falls back to the default core
instead.

.. \_pull
1747:[https://github.com/nedbat/coveragepy/pull/1747](https://github.com/nedbat/coveragepy/pull/1747)7

.. \_changes\_7-4-1:

###
[`v7.4.1`](https://github.com/nedbat/coveragepy/blob/HEAD/CHANGES.rst#Version-741--2024-01-26)

[Compare
Source](https://github.com/nedbat/coveragepy/compare/7.4.0...7.4.1)

-   Python 3.13.0a3 is supported.

- Fix: the JSON report now includes an explicit format version number,
closing
    `issue 1732`\_.

.. \_issue
1732:[https://github.com/nedbat/coveragepy/issues/1732](https://github.com/nedbat/coveragepy/issues/1732)2

.. \_changes\_7-4-0:

</details>

<details>
<summary>pyca/cryptography (cryptography)</summary>

###
[`v42.0.5`](https://github.com/pyca/cryptography/compare/42.0.4...42.0.5)

[Compare
Source](https://github.com/pyca/cryptography/compare/42.0.4...42.0.5)

</details>

<details>
<summary>uqfoundation/dill (dill)</summary>

###
[`v0.3.8`](https://github.com/uqfoundation/dill/releases/tag/0.3.8)

[Compare
Source](https://github.com/uqfoundation/dill/compare/dill-0.3.7...0.3.8)

### 0.3.8 Release Notes

With `dill`, you can serialize almost anything in python, even an entire
interpreter session. If you encounter any pickling failures, `dill` also
has some good tools to help you discover why your object fails to
pickle.

`dill` installs with `pip`:
`$ pip install dill`

`dill` requires:
`- python or pypy, >=3.8`

Optional requirements:
`- pyreadline, >=1.7.1` (install with `$ pip install dill[readline]`)
`- objgraph, >=1.7.2` (install with `$ pip install dill[graph]`)

`dill` is licensed under 3-clause BSD:

    >>> import dill
    >>> print (dill.license())

To cite `dill`:

    >>> import dill
    >>> print (dill.citation())

#### What's Changed

- test for qualname in get_typedef_type by
[@&#8203;mmckerns](https://github.com/mmckerns) in
[https://github.com/uqfoundation/dill/pull/613](https://github.com/uqfoundation/dill/pull/613)
- drop formal support for python 3.7 by
[@&#8203;mmckerns](https://github.com/mmckerns) in
[https://github.com/uqfoundation/dill/pull/614](https://github.com/uqfoundation/dill/pull/614)
- define html_theme as rtd workaround by
[@&#8203;mmckerns](https://github.com/mmckerns) in
[https://github.com/uqfoundation/dill/pull/615](https://github.com/uqfoundation/dill/pull/615)
- update install doc in tests by
[@&#8203;mmckerns](https://github.com/mmckerns) in
[https://github.com/uqfoundation/dill/pull/621](https://github.com/uqfoundation/dill/pull/621)
- formal support for 3.12, initial support for 3.13 by
[@&#8203;mmckerns](https://github.com/mmckerns) in
[https://github.com/uqfoundation/dill/pull/630](https://github.com/uqfoundation/dill/pull/630)
- add build to rtfd config by
[@&#8203;mmckerns](https://github.com/mmckerns) in
[https://github.com/uqfoundation/dill/pull/632](https://github.com/uqfoundation/dill/pull/632)
- add guard for math.log in Logger record size calculation by
[@&#8203;mmckerns](https://github.com/mmckerns) in
[https://github.com/uqfoundation/dill/pull/637](https://github.com/uqfoundation/dill/pull/637)
- updated copyright for 2024 by
[@&#8203;mmckerns](https://github.com/mmckerns) in
[https://github.com/uqfoundation/dill/pull/638](https://github.com/uqfoundation/dill/pull/638)
- Bump jinja2 from 3.1.1 to 3.1.3 in /docs by
[@&#8203;dependabot](https://github.com/dependabot) in
[https://github.com/uqfoundation/dill/pull/640](https://github.com/uqfoundation/dill/pull/640)
- Import submodule properly when there is an attribute of the module
with the same name by
[@&#8203;kelvinburke](https://github.com/kelvinburke) in
[https://github.com/uqfoundation/dill/pull/629](https://github.com/uqfoundation/dill/pull/629)
- update sphinx to 6.2.1 by
[@&#8203;mmckerns](https://github.com/mmckerns) in
[https://github.com/uqfoundation/dill/pull/641](https://github.com/uqfoundation/dill/pull/641)
- Bump readthedocs-sphinx-search from 0.3.1 to 0.3.2 in /docs by
[@&#8203;dependabot](https://github.com/dependabot) in
[https://github.com/uqfoundation/dill/pull/642](https://github.com/uqfoundation/dill/pull/642)
- skip BufferedRandomType on pyodide by
[@&#8203;mmckerns](https://github.com/mmckerns) in
[https://github.com/uqfoundation/dill/pull/644](https://github.com/uqfoundation/dill/pull/644)

#### New Contributors

- [@&#8203;kelvinburke](https://github.com/kelvinburke) made their
first contribution in
[https://github.com/uqfoundation/dill/pull/629](https://github.com/uqfoundation/dill/pull/629)

**Full Changelog**:
uqfoundation/dill@dill-0.3.7...0.3.8

</details>

<details>
<summary>tox-dev/py-filelock (filelock)</summary>

###
[`v3.13.3`](https://github.com/tox-dev/filelock/releases/tag/3.13.3)

[Compare
Source](https://github.com/tox-dev/py-filelock/compare/3.13.2...3.13.3)

<!-- Release notes generated using configuration in .github/release.yml
at main -->

#### What's Changed

- Make singleton class instance dict unique per subclass by
[@&#8203;nefrob](https://github.com/nefrob) in
[https://github.com/tox-dev/filelock/pull/318](https://github.com/tox-dev/filelock/pull/318)

**Full Changelog**:
tox-dev/filelock@3.13.2...3.13.3

###
[`v3.13.2`](https://github.com/tox-dev/filelock/releases/tag/3.13.2)

[Compare
Source](https://github.com/tox-dev/py-filelock/compare/3.13.1...3.13.2)

<!-- Release notes generated using configuration in .github/release.yml
at main -->

#### What's Changed

- Fixed small typo in \_unix.py by
[@&#8203;snemes](https://github.com/snemes) in
[https://github.com/tox-dev/filelock/pull/302](https://github.com/tox-dev/filelock/pull/302)
- Update SECURITY.md to reflect Python 3.7 support dropoff by
[@&#8203;kemzeb](https://github.com/kemzeb) in
[https://github.com/tox-dev/filelock/pull/304](https://github.com/tox-dev/filelock/pull/304)
- Update index.rst to improve the demo usage by
[@&#8203;youkaichao](https://github.com/youkaichao) in
[https://github.com/tox-dev/filelock/pull/314](https://github.com/tox-dev/filelock/pull/314)
- \[BugFix] fix permission denied error when lock file is placed in
`/tmp` by [@&#8203;kota-iizuka](https://github.com/kota-iizuka) in
[https://github.com/tox-dev/filelock/pull/317](https://github.com/tox-dev/filelock/pull/317)

#### New Contributors

- [@&#8203;snemes](https://github.com/snemes) made their first
contribution in
[https://github.com/tox-dev/filelock/pull/302](https://github.com/tox-dev/filelock/pull/302)
- [@&#8203;kemzeb](https://github.com/kemzeb) made their first
contribution in
[https://github.com/tox-dev/filelock/pull/304](https://github.com/tox-dev/filelock/pull/304)
- [@&#8203;youkaichao](https://github.com/youkaichao) made their first
contribution in
[https://github.com/tox-dev/filelock/pull/314](https://github.com/tox-dev/filelock/pull/314)
- [@&#8203;kota-iizuka](https://github.com/kota-iizuka) made their
first contribution in
[https://github.com/tox-dev/filelock/pull/317](https://github.com/tox-dev/filelock/pull/317)

**Full Changelog**:
tox-dev/filelock@3.13.1...3.13.2

</details>

<details>
<summary>Pylons/hupper (hupper)</summary>

###
[`v1.12.1`](https://github.com/Pylons/hupper/blob/HEAD/CHANGES.rst#1121-2024-01-26)

[Compare
Source](https://github.com/Pylons/hupper/compare/1.12...1.12.1)

\===================

-   Add support for Python 3.12.

-   Fix a blocking issue when shutting down on Windows.

- Fix a race condition closing pipes when restarting the worker process.

[https://github.com/Pylons/hupper/pull/83](https://github.com/Pylons/hupper/pull/83)l/83

- Fix issues with watchman when the server shuts down unexpectedly and
when
    subscriptions are canceled.

- Add `hupper.get_reloader().graceful_shutdown()` which can be used
within
    your own app to trigger a full shutdown of the worker as well as the

monitori[https://github.com/Pylons/hupper/pull/88](https://github.com/Pylons/hupper/pull/88)pper/pull/88

</details>

<details>
<summary>jaraco/jaraco.classes (jaraco.classes)</summary>

###
[`v3.3.1`](https://github.com/jaraco/jaraco.classes/compare/v3.3.0...v3.3.1)

[Compare
Source](https://github.com/jaraco/jaraco.classes/compare/v3.3.0...v3.3.1)

</details>

<details>
<summary>jaraco/keyring (keyring)</summary>

###
[`v24.3.1`](https://github.com/jaraco/keyring/compare/v24.3.0...v24.3.1)

[Compare
Source](https://github.com/jaraco/keyring/compare/v24.3.0...v24.3.1)

</details>

<details>
<summary>giampaolo/psutil (psutil)</summary>

###
[`v5.9.8`](https://github.com/giampaolo/psutil/blob/HEAD/HISTORY.rst#598)

[Compare
Source](https://github.com/giampaolo/psutil/compare/release-5.9.7...release-5.9.8)

\=====

2024-01-19

**Enhancements**

- 2343\_, \[FreeBSD]: filter `net_connections()`\_ returned list in C
instead of
Python, and avoid to retrieve unnecessary connection types unless
explicitly
asked. E.g., on an IDLE system with few IPv6 connections this will run
around
4 times faster. Before all connection types (TCP, UDP, UNIX) were
retrieved
    internally, even if only a portion was returned.
- 2342\_, \[NetBSD]: same as above
([#&#8203;2343](https://github.com/giampaolo/psutil/issues/2343)) but
for NetBSD.
-   2349\_: adopted black formatting style.

**Bug fixes**

- 930\_, \[NetBSD], \[critical]: `net_connections()`\_ implementation
was broken.
    It could either leak memory or core dump.
- 2340\_, \[NetBSD]: if process is terminated, `Process.cwd()`\_ will
return an
    empty string instead of raising `NoSuchProcess`\_.
- 2345\_, \[Linux]: fix compilation on older compiler missing
DUPLEX_UNKNOWN.
- 2222\_, \[macOS]: `cpu_freq()` now returns fixed values for `min` and
`max`
    frequencies in all Apple Silicon chips.

</details>

<details>
<summary>pydantic/pydantic (pydantic)</summary>

###
[`v1.10.14`](https://github.com/pydantic/pydantic/releases/tag/v1.10.14):
2024-01-19

[Compare
Source](https://github.com/pydantic/pydantic/compare/v1.10.13...v1.10.14)

#### What's Changed

- Update install.md by [@&#8203;dmontagu](https://github.com/dmontagu)
in
[https://github.com/pydantic/pydantic/pull/7690](https://github.com/pydantic/pydantic/pull/7690)
- Fix ci to only deploy docs on release by
[@&#8203;sydney-runkle](https://github.com/sydney-runkle) in
[https://github.com/pydantic/pydantic/pull/7740](https://github.com/pydantic/pydantic/pull/7740)
- Ubuntu fixes for V1 by
[@&#8203;sydney-runkle](https://github.com/sydney-runkle) in
[https://github.com/pydantic/pydantic/pull/8540](https://github.com/pydantic/pydantic/pull/8540)
and
[https://github.com/pydantic/pydantic/pull/8587](https://github.com/pydantic/pydantic/pull/8587)
- Fix `cached_property` handling in dataclasses when copied by
[@&#8203;rdbisme](https://github.com/rdbisme) in
[https://github.com/pydantic/pydantic/pull/8407](https://github.com/pydantic/pydantic/pull/8407)

#### New Contributors

- [@&#8203;rdbisme](https://github.com/rdbisme) made their first
contribution in
[https://github.com/pydantic/pydantic/pull/8407](https://github.com/pydantic/pydantic/pull/8407)

**Full Changelog**:
pydantic/pydantic@v1.10.13...v1.10.14

</details>

<details>
<summary>pyinstaller/pyinstaller (pyinstaller)</summary>

###
[`v5.13.2`](https://github.com/pyinstaller/pyinstaller/releases/tag/v5.13.2)

[Compare
Source](https://github.com/pyinstaller/pyinstaller/compare/v5.13.1...v5.13.2)

Please see the [v5.13.2 section of the
changelog](https://pyinstaller.org/en/v5.13.2/CHANGES.html#id1) for a
list of the changes since v5.13.1.

</details>

<details>
<summary>RobertCraigie/pyright-python (pyright)</summary>

###
[`v1.1.355`](https://github.com/RobertCraigie/pyright-python/compare/v1.1.354...v1.1.355)

[Compare
Source](https://github.com/RobertCraigie/pyright-python/compare/v1.1.354...v1.1.355)

###
[`v1.1.354`](https://github.com/RobertCraigie/pyright-python/compare/v1.1.353...v1.1.354)

[Compare
Source](https://github.com/RobertCraigie/pyright-python/compare/v1.1.353...v1.1.354)

###
[`v1.1.353`](https://github.com/RobertCraigie/pyright-python/compare/v1.1.352...v1.1.353)

[Compare
Source](https://github.com/RobertCraigie/pyright-python/compare/v1.1.352...v1.1.353)

###
[`v1.1.352`](https://github.com/RobertCraigie/pyright-python/compare/v1.1.351...v1.1.352)

[Compare
Source](https://github.com/RobertCraigie/pyright-python/compare/v1.1.351...v1.1.352)

###
[`v1.1.351`](https://github.com/RobertCraigie/pyright-python/compare/v1.1.350...v1.1.351)

[Compare
Source](https://github.com/RobertCraigie/pyright-python/compare/v1.1.350...v1.1.351)

</details>

<details>
<summary>sdispater/tomlkit (tomlkit)</summary>

###
[`v0.12.4`](https://github.com/sdispater/tomlkit/blob/HEAD/CHANGELOG.md#0124---2024-02-27)

[Compare
Source](https://github.com/sdispater/tomlkit/compare/0.12.3...0.12.4)

##### Fixed

- Support `|` and `|=` operator for tables, and support `+` and `+=`
operator for arrays.
([#&#8203;331](https://github.com/sdispater/tomlkit/issues/331))
- Fix an index error when setting dotted keys in a table.
([#&#8203;332](https://github.com/sdispater/tomlkit/issues/332))

</details>

<details>
<summary>pypa/virtualenv (virtualenv)</summary>

###
[`v20.25.1`](https://github.com/pypa/virtualenv/compare/20.25.0...20.25.1)

[Compare
Source](https://github.com/pypa/virtualenv/compare/20.25.0...20.25.1)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "every weekend" in timezone Etc/UTC,
Automerge - "every weekend" in timezone Etc/UTC.

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config help](https://github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/canonical/snapcraft).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNjkuMiIsInVwZGF0ZWRJblZlciI6IjM3LjI2OS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

---------

Signed-off-by: Callahan Kovacs <callahan.kovacs@canonical.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Callahan Kovacs <callahan.kovacs@canonical.com>
bmwiedemann pushed a commit to bmwiedemann/openSUSE that referenced this pull request May 29, 2024
https://build.opensuse.org/request/show/1177531
by user dgarcia + anag+factory
- Update to 1.2.1:
  - Add support for Python 3.12.
  - Fix a blocking issue when shutting down on Windows.
  - Fix a race condition closing pipes when restarting the worker
    process. See Pylons/hupper#83
  - Fix issues with watchman when the server shuts down unexpectedly
    and when subscriptions are canceled.
  - Add hupper.get_reloader().graceful_shutdown() which can be used
    within your own app to trigger a full shutdown of the worker as
    well as the monitoring. See
    Pylons/hupper#88
1.12:
  - When the reloader is stopped, exit with the same code received
    from the subprocess. See Pylons/hupper#81
1.11:
  - Drop support for Python 2.7, 3.4, 3.5, and 3.6.
  - Add support/testing for Python 3.10, and
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.

'NoneType' object is not callable in Connection._read_loop
3 participants