David-Banquet opened a new issue, #4076:
URL: https://github.com/apache/iceberg-python/issues/4076

   ### Apache Iceberg version
   
   main (development)
   
   ### Please describe the bug 🐞
   
   `rest.client.connection-timeout-ms` and `rest.client.socket-timeout-ms` 
(added in #3418, not released yet) have no effect when `rest.sigv4-enabled` is 
set, so a catalog request to AWS (S3 Tables, Glue REST) can still wait forever 
for a response.
   
   `_create_session` mounts the timeout adapter on `http://` and `https://`, 
then `_init_sigv4` mounts `SigV4Adapter` on `self.uri`. `requests` picks the 
adapter with the longest matching prefix, so every catalog request goes through 
`SigV4Adapter`, which is a plain `HTTPAdapter` and never sets a timeout. The 
code already says so in a comment 
([L577-L581](https://github.com/apache/iceberg-python/blob/068aae50402285657b41f5357acb67672b0a053d/pyiceberg/catalog/rest/__init__.py#L577-L581),
 
[L1148](https://github.com/apache/iceberg-python/blob/068aae50402285657b41f5357acb67672b0a053d/pyiceberg/catalog/rest/__init__.py#L1148)),
 and the docs don't mention the limitation.
   
   Repro with a local server that answers after 8 s and a 2 s timeout (fake 
credentials are enough, since the request is signed locally):
   
   ```python
   import threading, time
   from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
   
   from pyiceberg.catalog.rest import RestCatalog
   
   
   class Slow(BaseHTTPRequestHandler):
       def do_GET(self):
           time.sleep(8)
           body = b'{"defaults": {}, "overrides": {}}'
           self.send_response(200)
           self.send_header("Content-Type", "application/json")
           self.send_header("Content-Length", str(len(body)))
           self.end_headers()
           self.wfile.write(body)
   
   
   server = ThreadingHTTPServer(("127.0.0.1", 0), Slow)
   threading.Thread(target=server.serve_forever, daemon=True).start()
   
   base = {
       "uri": f"http://127.0.0.1:{server.server_port}";,
       "rest.client.connection-timeout-ms": "1000",
       "rest.client.socket-timeout-ms": "1000",
   }
   sigv4 = {
       "rest.sigv4-enabled": "true",
       "rest.signing-region": "eu-west-1",
       "rest.signing-name": "s3tables",
       "client.access-key-id": "AKIAEXAMPLE",
       "client.secret-access-key": "secret",
       "client.region": "eu-west-1",
   }
   
   for label, props in [("without SigV4", base), ("with SigV4", {**base, 
**sigv4})]:
       start = time.monotonic()
       try:
           RestCatalog("t", **props)
           outcome = "response received"
       except Exception as e:
           outcome = type(e).__name__
       print(f"{label}: {outcome} after {time.monotonic() - start:.1f} s")
   ```
   
   ```
   without SigV4: ConnectionError after 2.0 s
   with SigV4: response received after 8.1 s
   ```
   
   I ran into this while looking at #2512, where a `delete` on S3 Tables 
through the REST catalog is reported to hang. I can't tell yet whether that 
hang comes from a missing timeout, but on 0.10 there was no way to set one, and 
on `main` the new setting doesn't reach SigV4 users.
   
   The fix I have in mind is small: make `SigV4Adapter` extend 
`_RetryTimeoutHTTPAdapter` and pass it the same timeout, keeping 
`rest.sigv4.max-retries` for its retries. With that change the repro above 
times out with SigV4 too. Since `SigV4Adapter` retries 10 times by default with 
no backoff, a GET then waits up to 11 times the timeout before failing, which 
is the retry problem tracked in #3008.
   
   #3120 rewrites SigV4 signing and replaces `SigV4Adapter` with a plain 
`HTTPAdapter(max_retries=...)` on the catalog URI, so the timeout would still 
be skipped there. I'm happy to align with it if that PR lands first.
   
   ### Willingness to contribute
   
   - [x] I can contribute a fix for this bug independently
   - [ ] I would be willing to contribute a fix for this bug with guidance from 
the Iceberg community
   - [ ] I cannot contribute a fix for this bug at this time
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to