Skip to content

Commit 844f2fe

Browse files
committed
try to fix Python getting stuck during finalizer
See #63 for more details.
1 parent 99389dd commit 844f2fe

File tree

3 files changed

+36
-13
lines changed

3 files changed

+36
-13
lines changed

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919

2020
matrix:
2121
os: [ubuntu-latest, macos-latest]
22-
pyv: ["3.8", "3.9", "3.10", "3.11.0-rc - 3.11", "3.12"]
22+
pyv: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
2323

2424
steps:
2525
- uses: actions/checkout@v4

setup.cfg

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@ long_description_content_type = text/markdown
77
classifiers =
88
Development Status :: 4 - Beta
99
Programming Language :: Python :: 3
10-
Programming Language :: Python :: 3.7
1110
Programming Language :: Python :: 3.8
1211
Programming Language :: Python :: 3.9
1312
Programming Language :: Python :: 3.10
13+
Programming Language :: Python :: 3.11
14+
Programming Language :: Python :: 3.12
15+
Programming Language :: Python :: 3.13
16+
Programming Language :: Python :: 3.14
1417

1518
[options]
1619
install_requires =

sshfs/spec.py

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@
88

99
import asyncssh
1010
from asyncssh.sftp import SFTPOpUnsupported
11-
from fsspec.asyn import AsyncFileSystem, async_methods, sync, sync_wrapper
11+
from fsspec.asyn import (
12+
AsyncFileSystem,
13+
FSTimeoutError,
14+
async_methods,
15+
sync,
16+
sync_wrapper,
17+
)
1218
from fsspec.utils import infer_storage_options
1319

1420
from sshfs.file import SSHFile
@@ -71,7 +77,7 @@ def __init__(
7177
**_client_args,
7278
)
7379
weakref.finalize(
74-
self, sync, self.loop, self._finalize, self._pool, self._stack
80+
self, self._finalize, self.loop, self._pool, self._stack
7581
)
7682

7783
@classmethod
@@ -101,15 +107,29 @@ async def _connect(
101107
connect = sync_wrapper(_connect)
102108

103109
@staticmethod
104-
async def _finalize(pool, stack):
105-
await pool.close()
106-
107-
# If an error occurs while the SSHFile is trying to
108-
# open the native file, then the client might get broken
109-
# due to partial initialization. We are just going to ignore
110-
# the errors that arises on the finalization layer
111-
with suppress(BrokenPipeError):
112-
await stack.aclose()
110+
def _finalize(loop, pool, stack):
111+
async def close():
112+
await pool.close()
113+
# If an error occurs while the SSHFile is trying to
114+
# open the native file, then the client might get broken
115+
# due to partial initialization. We are just going to ignore
116+
# the errors that arises on the finalization layer
117+
with suppress(BrokenPipeError):
118+
await stack.aclose()
119+
120+
if loop is not None and loop.is_running():
121+
try:
122+
loop = asyncio.get_running_loop()
123+
loop.create_task(close())
124+
return
125+
except RuntimeError:
126+
pass
127+
128+
try:
129+
sync(loop, close, timeout=0.1)
130+
return
131+
except FSTimeoutError:
132+
pass
113133

114134
@property
115135
def client(self):

0 commit comments

Comments
 (0)