Yes - this works!  Thanks ever so much - I notice this has already been 
applied to the 5.4 release.

One more issue I ran in to for trixie is that something seems to have 
changed for the type checking. If I set  --metadata-backup-interval=0 to 
disable automatic uploading I get this sort of error:

> TypeError: '<' not supported between instances of 'NoneType' and 'int' at 
mount.py:670 → with > 
trio.move_on_after(self.options.metadata_backup_interval): 


The following patch fixes this for me, but obviously I don't know if this 
is the right thing to do:

--- s3ql-5.4.0.orig/src/s3ql/mount.py
+++ s3ql-5.4.0/src/s3ql/mount.py
@@ -684,6 +684,8 @@ class MetadataUploadTask:
         log.debug('started')
 
         while not self.quit:
+            if self.options.metadata_backup_interval is None:
+                break
             with trio.move_on_after(self.options.metadata_backup_interval):
                 await self.event.wait()



Thanks a lot!

Joseph


On Wednesday, August 20, 2025 at 12:18:11 PM UTC-4 [email protected] wrote:

> 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/a2ee3022-ca56-4ff7-b31d-3ed975019a26n%40googlegroups.com.

Reply via email to