Hello Joseph,

I have created an issue for this 
here: https://github.com/s3ql/s3ql/issues/384

Could you please try this patch:

Index: src/s3ql/http.py
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/s3ql/http.py b/src/s3ql/http.py
--- a/src/s3ql/http.py (revision 751e14b08e3401acae81686c7c237300d350a7e6)
+++ b/src/s3ql/http.py (date 1755705524152)
@@ -1239,6 +1239,11 @@
             return None
         except (ConnectionResetError, BrokenPipeError, ssl.SSLEOFError):
             raise ConnectionClosed('connection was interrupted')
+        except ssl.SSLError as exc:
+            if exc.library == 'SSL' and exc.reason == 
'UNEXPECTED_EOF_WHILE_READING':
+                raise ConnectionClosed('connection was interrupted')
+            else:
+                raise exc
 
         rbuf.e += len_
         log.debug('done (got %d bytes)', len_)


Locally, this patch fixed the failed test for me:

$ python3 -m pytest tests/t0_http.py::test_aborted_write2[ssl]

*==================================================================================
 
test session starts 
===================================================================================*

platform linux -- Python 3.13.5, pytest-8.3.5, pluggy-1.5.0 -- 
/usr/bin/python3

cachedir: .pytest_cache

rootdir: /.../s3ql-git/tests

configfile: pytest.ini

plugins: trio-0.8.0, typeguard-4.4.2

*collected 1 item                                                          
                                                                            
                                   *


tests/t0_http.py::test_aborted_write2[ssl] PASSED                          
                                                                            
                            [100%]


===================================================================================
 
*1 passed* in 0.72s 
====================================================================================

Joseph Maher schrieb am Montag, 18. August 2025 um 03:56:59 UTC+2:

>
> Yes - it's a persistent error...
>
> I don't get any errors on ubuntu 24.10 (oracular), but I do get the errors 
> on ubuntu 25.04 (plucky), so it looks like something changed between these 
> versions:
>
>
> ubuntu 24.10 has:
>
> libssl3t64:amd64 3.3.1-2ubuntu2.1
> python3-openssl 24.2.1-1
>
>
> ubuntu 25.04 has:
>
> libssl3t64:amd64 3.4.1-1ubuntu3
> python3-openssl 25.0.0-1
>
>
>
> Joseph
>
>
> On Sun, 17 Aug 2025, Daniel Jagszent wrote:
>
> > 
> > Hi Joseph,
> >
> > I'm building s3ql on debian trixie, and I'm getting the following test 
> failure, any advice
> > much appreciated! […]
> > 
> > 
> > Is this a persistent error? Re-running the tests multiple times, do you 
> always get the error?
> > 
> > We currently do not run tests with Python 3.13, and it looks like the 
> Python 3.13 "ssl" package has
> > changes that we need to address.
> > 
> > But when I run the tests with Python 3.13 (on Ubuntu 24.04 with uv, 
> main-branch), I only get some
> > warnings, not the error you get:
> > 
> > $ uv venv --python 3.13
> > $ source .venv/bin/activate
> > $ uv sync --extra dev
> > $ PYTHONTRACEMALLOC=20  py.test tests/t0_http.py
> > # […]
> > ============== warnings summary ==============
> > t0_http.py::test_read_text[plain]
> > t0_http.py::test_read_text[ssl]
> >   
> /s3ql-source/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py:67:
> > PytestUnraisableExceptionWarning: Exception ignored in: 
> <_io.TextIOWrapper encoding='UTF-8'>
> >  
> >   AttributeError: 'HTTPConnection' object has no attribute 'flush'
> >  
> >   During handling of the above exception, another exception occurred:
> >  
> >   Traceback (most recent call last):
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/python.py", line 
> 157, in
> > pytest_pyfunc_call
> >       result = testfunction(**testargs)
> >   AttributeError: 'HTTPConnection' object has no attribute 'close'. Did 
> you mean: 'closed'?
> >  
> >  
> >   Object allocated at:
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 
> 121
> >       res = hook_impl.function(*args)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/main.py", line 367
> >       item.config.hook.pytest_runtest_protocol(item=item, 
> nextitem=nextitem)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 512
> >       return self._hookexec(self.name, self._hookimpls.copy(), kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 
> 120
> >       return self._inner_hookexec(hook_name, methods, kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 
> 121
> >       res = hook_impl.function(*args)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 117
> >       runtestprotocol(item, nextitem=nextitem)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 136
> >       reports.append(call_and_report(item, "call", log))
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 245
> >       call = CallInfo.from_call(
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 344
> >       result: TResult | None = func()
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 246
> >       lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 512
> >       return self._hookexec(self.name, self._hookimpls.copy(), kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 
> 120
> >       return self._inner_hookexec(hook_name, methods, kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 
> 121
> >       res = hook_impl.function(*args)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 178
> >       item.runtest()
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/python.py", line 
> 1671
> >       self.ihook.pytest_pyfunc_call(pyfuncitem=self)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 512
> >       return self._hookexec(self.name, self._hookimpls.copy(), kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 
> 120
> >       return self._inner_hookexec(hook_name, methods, kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 
> 121
> >       res = hook_impl.function(*args)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/python.py", line 
> 157
> >       result = testfunction(**testargs)
> >     File "/s3ql-source/tests/t0_http.py", line 486
> >       fh = TextIOWrapper(conn)
> >     warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))
> > 
> > t0_http.py::test_read_text2[plain]
> > t0_http.py::test_read_text2[ssl]
> >   
> /s3ql-source/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py:67:
> > PytestUnraisableExceptionWarning: Exception ignored in: 
> <_io.TextIOWrapper encoding='UTF-8'>
> >  
> >   AttributeError: 'HTTPConnection' object has no attribute 'flush'
> >  
> >   During handling of the above exception, another exception occurred:
> >  
> >   Traceback (most recent call last):
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/python.py", line 
> 157, in
> > pytest_pyfunc_call
> >       result = testfunction(**testargs)
> >   AttributeError: 'HTTPConnection' object has no attribute 'close'. Did 
> you mean: 'closed'?
> >  
> >  
> >   Object allocated at:
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 
> 121
> >       res = hook_impl.function(*args)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/main.py", line 367
> >       item.config.hook.pytest_runtest_protocol(item=item, 
> nextitem=nextitem)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 512
> >       return self._hookexec(self.name, self._hookimpls.copy(), kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 
> 120
> >       return self._inner_hookexec(hook_name, methods, kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 
> 121
> >       res = hook_impl.function(*args)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 117
> >       runtestprotocol(item, nextitem=nextitem)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 136
> >       reports.append(call_and_report(item, "call", log))
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 245
> >       call = CallInfo.from_call(
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 344
> >       result: TResult | None = func()
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 246
> >       lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 512
> >       return self._hookexec(self.name, self._hookimpls.copy(), kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 
> 120
> >       return self._inner_hookexec(hook_name, methods, kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 
> 121
> >       res = hook_impl.function(*args)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 178
> >       item.runtest()
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/python.py", line 
> 1671
> >       self.ihook.pytest_pyfunc_call(pyfuncitem=self)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 512
> >       return self._hookexec(self.name, self._hookimpls.copy(), kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 
> 120
> >       return self._inner_hookexec(hook_name, methods, kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 
> 121
> >       res = hook_impl.function(*args)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/python.py", line 
> 157
> >       result = testfunction(**testargs)
> >     File "/s3ql-source/tests/t0_http.py", line 494
> >       fh = TextIOWrapper(conn)
> >     warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))
> > 
> > t0_http.py::test_read_text3[plain]
> > t0_http.py::test_read_text3[ssl]
> >   
> /s3ql-source/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py:67:
> > PytestUnraisableExceptionWarning: Exception ignored in: 
> <_io.TextIOWrapper encoding='UTF-8'>
> >  
> >   AttributeError: 'HTTPConnection' object has no attribute 'flush'
> >  
> >   During handling of the above exception, another exception occurred:
> >  
> >   Traceback (most recent call last):
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/python.py", line 
> 157, in
> > pytest_pyfunc_call
> >       result = testfunction(**testargs)
> >   AttributeError: 'HTTPConnection' object has no attribute 'close'. Did 
> you mean: 'closed'?
> >  
> >  
> >   Object allocated at:
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 
> 121
> >       res = hook_impl.function(*args)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/main.py", line 367
> >       item.config.hook.pytest_runtest_protocol(item=item, 
> nextitem=nextitem)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 512
> >       return self._hookexec(self.name, self._hookimpls.copy(), kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 
> 120
> >       return self._inner_hookexec(hook_name, methods, kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 
> 121
> >       res = hook_impl.function(*args)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 117
> >       runtestprotocol(item, nextitem=nextitem)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 136
> >       reports.append(call_and_report(item, "call", log))
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 245
> >       call = CallInfo.from_call(
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 344
> >       result: TResult | None = func()
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 246
> >       lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 512
> >       return self._hookexec(self.name, self._hookimpls.copy(), kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 
> 120
> >       return self._inner_hookexec(hook_name, methods, kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 
> 121
> >       res = hook_impl.function(*args)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 
> 178
> >       item.runtest()
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/python.py", line 
> 1671
> >       self.ihook.pytest_pyfunc_call(pyfuncitem=self)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 512
> >       return self._hookexec(self.name, self._hookimpls.copy(), kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 
> 120
> >       return self._inner_hookexec(hook_name, methods, kwargs, 
> firstresult)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 
> 121
> >       res = hook_impl.function(*args)
> >     File 
> "/s3ql-source/.venv/lib/python3.13/site-packages/_pytest/python.py", line 
> 157
> >       result = testfunction(**testargs)
> >     File "/s3ql-source/tests/t0_http.py", line 503
> >       fh = TextIOWrapper(conn)
> >     warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))
> > 
> > 
> > 
> > 
> > Until we address Python 3.13 compatibility issues, you might want to 
> install S3QL inside a venv with
> > Python 3.12.
> > 
> > 
> >

-- 
You received this message because you are subscribed to the Google Groups 
"s3ql" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/s3ql/52021bc6-5d58-435b-a53e-be828d172308n%40googlegroups.com.

Reply via email to