)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"9b9b65df7c33541d3f6afb985cbe754cc6f9a032","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9579e575_9c474b34","updated":"2026-03-13 17:24:37.000000000","message":"recheck","commit_id":"e002bb0dbf033f20fc6e6e5c4cef86cfd79f04ea"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"94096ded86702ab8668bd48868abb6c3d1402742","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"62f04909_aece17e6","in_reply_to":"9579e575_9c474b34","updated":"2026-08-21 08:55:10.000000000","message":"Done","commit_id":"e002bb0dbf033f20fc6e6e5c4cef86cfd79f04ea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"26824f8ceb326c8a4d119bffe031061a50398717","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"505da2e8_99d3c5d2","updated":"2026-05-01 20:07:59.000000000","message":"Sorry, this is going to be a painful rebase, isn\u0027t it... I wanted to try to help, but I think I want to make sure we\u0027ve got consensus on `eventletflag` before doing much.","commit_id":"764a31a0bef197d5b258d438e91a9f8e92224dd2"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1b4f52439007934816cbe315e920395c363ff62a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"132977c5_201557ac","updated":"2026-03-23 10:10:32.000000000","message":"recheck","commit_id":"764a31a0bef197d5b258d438e91a9f8e92224dd2"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy","status":"I\u0027m a Software Engineer at Red Hat and I love Open Source and connect with people! Feel free to DM through IRC, I\u0027ll be delighted to chat"},"change_message_id":"8d805ad0399faa4e28f260eab2033d747fbce3c1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"21b3d915_152e75fe","updated":"2026-06-17 15:35:06.000000000","message":"This looks really good to me! I also wrote a few tests to test Timeout(0), OSError when socket closes, check_time() enforcement, and nested timeouts to verify the new Timeout class works correctly in both eventlet and threading modes and I think I\u0027m very satisfied with the results.","commit_id":"0991d9d787d757a92d02ef38e107bdaef07b13fb"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"c65712c1_241cfea8","in_reply_to":"21b3d915_152e75fe","updated":"2026-07-22 12:39:40.000000000","message":"Good point, added some tests as well.","commit_id":"0991d9d787d757a92d02ef38e107bdaef07b13fb"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"5878ecf3d78d921c348ac5a2c826fa3f7a32b393","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"bda18455_763d6968","updated":"2026-07-06 12:05:45.000000000","message":"recheck\n\nTests passing locally using the same tox env.","commit_id":"f1d981064c7c3dd247a610b50c3867b8b6bf6a9f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"25978665_4624bb79","updated":"2026-07-09 21:33:15.000000000","message":"I feel like there\u0027s enough going on in our new `Timeout` class that we might want some unit tests for it...","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"b7029c962c629f6eeced4b8970740f77ff962e0a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"b7103d90_5fb91bf0","updated":"2026-07-07 14:59:17.000000000","message":"recheck\n\nUnrelated probetest failure","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"d5e6ddeb_ae28cad6","in_reply_to":"25978665_4624bb79","updated":"2026-07-22 12:39:40.000000000","message":"Yes, agree - done.","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c382745ba0be788868edc348eaa9aa0d5136112a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"bcfd250c_14cf141d","updated":"2026-07-13 19:31:22.000000000","message":"OK, I think my biggest questions are:\n- What\u0027s the plan with our `ConnectionTimeout`? Are we just switching to stdlib `TimeoutError`s for that part of a connection lifecycle now?\n- Are we OK with the new overall deadlines implied by using `settimeout` when there are multiple network calls? Is it moot, because we don\u0027t really have much of a choice?\n- There are a handful of places where direct client now uses `conn_timeout` when reading body data where we used to just block. Is that intentional?","commit_id":"4ea9fbbf39121862d90ddf037c7893fe5f2825ec"}],"swift/common/bufferedhttp.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":233,"context_line":"    :param path: request path"},{"line_number":234,"context_line":"    :param headers: dictionary of headers"},{"line_number":235,"context_line":"    :param query_string: request query string"},{"line_number":236,"context_line":"    :param ssl: set True if SSL should be used (default: False)"},{"line_number":237,"context_line":"    :returns: HTTPConnection object"},{"line_number":238,"context_line":"    \"\"\""},{"line_number":239,"context_line":"    if isinstance(path, str):"}],"source_content_type":"text/x-python","patch_set":2,"id":"88b5f8b5_69cfefcd","line":236,"updated":"2026-03-12 00:32:25.000000000","message":"Could use a `:param timeout:`","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":233,"context_line":"    :param path: request path"},{"line_number":234,"context_line":"    :param headers: dictionary of headers"},{"line_number":235,"context_line":"    :param query_string: request query string"},{"line_number":236,"context_line":"    :param ssl: set True if SSL should be used (default: False)"},{"line_number":237,"context_line":"    :returns: HTTPConnection object"},{"line_number":238,"context_line":"    \"\"\""},{"line_number":239,"context_line":"    if isinstance(path, str):"}],"source_content_type":"text/x-python","patch_set":2,"id":"16a3c474_438f35c9","line":236,"in_reply_to":"88b5f8b5_69cfefcd","updated":"2026-03-13 16:24:43.000000000","message":"Yes!","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":262,"context_line":"    :param path: request path"},{"line_number":263,"context_line":"    :param headers: dictionary of headers"},{"line_number":264,"context_line":"    :param query_string: request query string"},{"line_number":265,"context_line":"    :param ssl: set True if SSL should be used (default: False)"},{"line_number":266,"context_line":"    :returns: HTTPConnection object"},{"line_number":267,"context_line":"    \"\"\""},{"line_number":268,"context_line":"    if not port:"}],"source_content_type":"text/x-python","patch_set":2,"id":"c9f4eb7a_ed9a048a","line":265,"updated":"2026-03-12 00:32:25.000000000","message":"Here, too.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":262,"context_line":"    :param path: request path"},{"line_number":263,"context_line":"    :param headers: dictionary of headers"},{"line_number":264,"context_line":"    :param query_string: request query string"},{"line_number":265,"context_line":"    :param ssl: set True if SSL should be used (default: False)"},{"line_number":266,"context_line":"    :returns: HTTPConnection object"},{"line_number":267,"context_line":"    \"\"\""},{"line_number":268,"context_line":"    if not port:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1cf1765c_79dddddf","line":265,"in_reply_to":"c9f4eb7a_ed9a048a","updated":"2026-03-13 16:24:43.000000000","message":"Yes!","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":282,"context_line":"            encoding\u003d\u0027latin1\u0027)"},{"line_number":283,"context_line":"        path +\u003d \u0027?\u0027 + query_string"},{"line_number":284,"context_line":"    conn.path \u003d path"},{"line_number":285,"context_line":"    conn.putrequest(method, path, skip_host\u003d(headers and \u0027Host\u0027 in headers))"},{"line_number":286,"context_line":"    if headers:"},{"line_number":287,"context_line":"        for header, value in headers.items():"},{"line_number":288,"context_line":"            conn.putheader(header, str(value))"}],"source_content_type":"text/x-python","patch_set":10,"id":"6ee4f06a_7cac5f2d","line":285,"updated":"2026-07-09 21:33:15.000000000","message":"This (through `endheaders` or so) makes some network requests, yeah? Should we wrap it in a `with ConnectionTimeout(timeout):` block?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":282,"context_line":"            encoding\u003d\u0027latin1\u0027)"},{"line_number":283,"context_line":"        path +\u003d \u0027?\u0027 + query_string"},{"line_number":284,"context_line":"    conn.path \u003d path"},{"line_number":285,"context_line":"    conn.putrequest(method, path, skip_host\u003d(headers and \u0027Host\u0027 in headers))"},{"line_number":286,"context_line":"    if headers:"},{"line_number":287,"context_line":"        for header, value in headers.items():"},{"line_number":288,"context_line":"            conn.putheader(header, str(value))"}],"source_content_type":"text/x-python","patch_set":10,"id":"8fbd381b_f8e7c7e0","line":285,"in_reply_to":"6ee4f06a_7cac5f2d","updated":"2026-07-22 12:39:40.000000000","message":"Not needed anymore, connection now uses timeout.","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"}],"swift/common/concurrency.py":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"01c73072fc8e7d1bda403108bcc0eff566945410","unresolved":true,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        # Only used in tests, but just in case restore timeouts"},{"line_number":144,"context_line":"        def cancel(self):"},{"line_number":145,"context_line":"            self.restore_timeout()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"# flake8 raises a F401 without this"}],"source_content_type":"text/x-python","patch_set":9,"id":"7ef7b873_8f943372","line":145,"updated":"2026-07-09 06:32:57.000000000","message":"nit: should we set self.deadline \u003d None before calling this method?","commit_id":"f1d981064c7c3dd247a610b50c3867b8b6bf6a9f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        # Only used in tests, but just in case restore timeouts"},{"line_number":144,"context_line":"        def cancel(self):"},{"line_number":145,"context_line":"            self.restore_timeout()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"# flake8 raises a F401 without this"}],"source_content_type":"text/x-python","patch_set":9,"id":"b605dd2c_c44670c3","line":145,"in_reply_to":"7ef7b873_8f943372","updated":"2026-07-09 21:33:15.000000000","message":"Or do it as part of `restore_timeout`","commit_id":"f1d981064c7c3dd247a610b50c3867b8b6bf6a9f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        # Only used in tests, but just in case restore timeouts"},{"line_number":144,"context_line":"        def cancel(self):"},{"line_number":145,"context_line":"            self.restore_timeout()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"# flake8 raises a F401 without this"}],"source_content_type":"text/x-python","patch_set":9,"id":"a01511e7_f514e6cc","line":145,"in_reply_to":"b605dd2c_c44670c3","updated":"2026-07-22 12:39:40.000000000","message":"Acknowledged","commit_id":"f1d981064c7c3dd247a610b50c3867b8b6bf6a9f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        def __init__(self, *args, **kwargs):"},{"line_number":88,"context_line":"            # Timeout might be used with a socket keyword, which does not"},{"line_number":89,"context_line":"            # exist in eventlet. Remove this from the list of keywords"},{"line_number":90,"context_line":"            new_kwargs \u003d {k: v for k, v in kwargs.items() if k !\u003d \"socket\"}"},{"line_number":91,"context_line":"            super(Timeout, self).__init__(*args, **new_kwargs)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        def check_time(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"0844c17a_4ec4caf4","line":90,"updated":"2026-07-09 21:33:15.000000000","message":"`kwargs.pop(\u0027socket\u0027, None)`? Saves us needing to create a whole new dict. \\*shrug\\*","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        def __init__(self, *args, **kwargs):"},{"line_number":88,"context_line":"            # Timeout might be used with a socket keyword, which does not"},{"line_number":89,"context_line":"            # exist in eventlet. Remove this from the list of keywords"},{"line_number":90,"context_line":"            new_kwargs \u003d {k: v for k, v in kwargs.items() if k !\u003d \"socket\"}"},{"line_number":91,"context_line":"            super(Timeout, self).__init__(*args, **new_kwargs)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        def check_time(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"195654f1_bbe991ce","line":90,"in_reply_to":"0844c17a_4ec4caf4","updated":"2026-07-22 12:39:40.000000000","message":"Acknowledged","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":115,"context_line":"                    self.deadline \u003d time.monotonic() + self.seconds"},{"line_number":116,"context_line":"            if self.seconds is not None and self.socket is not None:"},{"line_number":117,"context_line":"                self.old_timeout \u003d self.socket.gettimeout()"},{"line_number":118,"context_line":"                self.socket.settimeout(self.seconds)"},{"line_number":119,"context_line":"            return self"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        def check_time(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"60de7279_a0f3ce43","line":118,"updated":"2026-07-09 21:33:15.000000000","message":"OK, but that\u0027s not quite the same, is it? Like,\n```\nwith Timeout(2, socket\u003dsock) as t:\n    sock.recv(1024)\n    sock.recv(1024)\n    sock.recv(1024)\n```\nwill cap the total execution time to 2s under eventlet, but could get close to 6s with this class. Even if we add a `t.check_time()` in between each, we have to wait until a `recv` returns before raising, so the effective timeout can nearly double.\n\nAre we OK with that? Maybe we *have* to be OK with it...","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"0182567143580fd78eae60759c76af31ca2b34af","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                    self.deadline \u003d time.monotonic() + self.seconds"},{"line_number":116,"context_line":"            if self.seconds is not None and self.socket is not None:"},{"line_number":117,"context_line":"                self.old_timeout \u003d self.socket.gettimeout()"},{"line_number":118,"context_line":"                self.socket.settimeout(self.seconds)"},{"line_number":119,"context_line":"            return self"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        def check_time(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"17a324b0_aceb41ee","line":118,"in_reply_to":"0c467b9d_42bbd20a","updated":"2026-08-21 08:11:19.000000000","message":"Fixed since: Timeout uses a wall-clock watchdog on the socket now, so a block with several recv() calls is bounded by the total timeout now.","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":true,"context_lines":[{"line_number":115,"context_line":"                    self.deadline \u003d time.monotonic() + self.seconds"},{"line_number":116,"context_line":"            if self.seconds is not None and self.socket is not None:"},{"line_number":117,"context_line":"                self.old_timeout \u003d self.socket.gettimeout()"},{"line_number":118,"context_line":"                self.socket.settimeout(self.seconds)"},{"line_number":119,"context_line":"            return self"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        def check_time(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"0c467b9d_42bbd20a","line":118,"in_reply_to":"60de7279_a0f3ce43","updated":"2026-07-22 12:39:40.000000000","message":"I think we might have to be ok with it, given that we can\u0027t reproduce eventlet\u0027s preemptive whole-block deadline?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        def __exit__(self, exc_type, exc_value, exc_traceback):"},{"line_number":134,"context_line":"            self.restore_timeout()"},{"line_number":135,"context_line":"            if exc_type is socket_timeout:"},{"line_number":136,"context_line":"                raise self"},{"line_number":137,"context_line":"            return False"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"c4b86183_c5f96fd2","line":135,"updated":"2026-07-09 21:33:15.000000000","message":"Not using `issubclass`?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"0182567143580fd78eae60759c76af31ca2b34af","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        def __exit__(self, exc_type, exc_value, exc_traceback):"},{"line_number":134,"context_line":"            self.restore_timeout()"},{"line_number":135,"context_line":"            if exc_type is socket_timeout:"},{"line_number":136,"context_line":"                raise self"},{"line_number":137,"context_line":"            return False"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"e77afbd3_4cd90949","line":135,"in_reply_to":"2b086a9d_ef49786b","updated":"2026-08-21 08:11:19.000000000","message":"Done in 979583: Add replacement for swift.common.utils.Watchdog | https://review.opendev.org/c/openstack/swift/+/979583","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":true,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        def __exit__(self, exc_type, exc_value, exc_traceback):"},{"line_number":134,"context_line":"            self.restore_timeout()"},{"line_number":135,"context_line":"            if exc_type is socket_timeout:"},{"line_number":136,"context_line":"                raise self"},{"line_number":137,"context_line":"            return False"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"2b086a9d_ef49786b","line":135,"in_reply_to":"c4b86183_c5f96fd2","updated":"2026-07-22 12:39:40.000000000","message":"If exc_type is None (normal exit) issubclass(None, socket_timeout) would raise a TypeError - so this would need sth like `if exc_type is not None and issubclass(exc_type, socket_timeout)`- not sure that is better?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e7ad38af041204726a527f6f207c5f1e693738fe","unresolved":true,"context_lines":[{"line_number":121,"context_line":"            if self.seconds is not None and self.socket is not None:"},{"line_number":122,"context_line":"                try:"},{"line_number":123,"context_line":"                    self.old_timeout \u003d self.socket.gettimeout()"},{"line_number":124,"context_line":"                    self.socket.settimeout(self.seconds)"},{"line_number":125,"context_line":"                except OSError:"},{"line_number":126,"context_line":"                    # socket already closed; nothing to bound and nothing to"},{"line_number":127,"context_line":"                    # restore, so leave old_timeout unset."}],"source_content_type":"text/x-python","patch_set":13,"id":"444104e9_845ce291","line":124,"updated":"2026-07-15 19:38:27.000000000","message":"Do we ever find ourselves in a situation (essentially) like\n```\nwith Timeout(1, socket\u003dsock):\n    with Timeout(5, socket\u003dsock):\n        sock.recv(sz)\n```\n? Under eventlet, the outer timeout would pop at 1s, but without eventlet we wait the 5s...\n\nOr, maybe a little more likely, something like\n```\nwith Timeout(5, socket\u003dsock):\n    # some other work that takes, say, 4s\n    with Timeout(5, socket\u003dsock):\n        sock.recv(sz)\n```","commit_id":"4ea9fbbf39121862d90ddf037c7893fe5f2825ec"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            if self.seconds is not None and self.socket is not None:"},{"line_number":122,"context_line":"                try:"},{"line_number":123,"context_line":"                    self.old_timeout \u003d self.socket.gettimeout()"},{"line_number":124,"context_line":"                    self.socket.settimeout(self.seconds)"},{"line_number":125,"context_line":"                except OSError:"},{"line_number":126,"context_line":"                    # socket already closed; nothing to bound and nothing to"},{"line_number":127,"context_line":"                    # restore, so leave old_timeout unset."}],"source_content_type":"text/x-python","patch_set":13,"id":"a0f8d154_a5b0fb60","line":124,"in_reply_to":"444104e9_845ce291","updated":"2026-07-22 12:39:40.000000000","message":"Acknowledged","commit_id":"4ea9fbbf39121862d90ddf037c7893fe5f2825ec"}],"swift/common/db.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":87,"context_line":"                if \u0027locked\u0027 not in str(e):"},{"line_number":88,"context_line":"                    raise"},{"line_number":89,"context_line":"            if deadline is not None and time.time() \u003e\u003d deadline:"},{"line_number":90,"context_line":"                raise LockTimeout(timeout, db_file)"},{"line_number":91,"context_line":"            sleep(retry_wait)"},{"line_number":92,"context_line":"            retry_wait \u003d min(retry_wait * 2, 0.05)"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9ddf4f2e_17624276","line":90,"updated":"2026-03-12 00:32:25.000000000","message":"WDYT about having `Timeout` do some deadline tracking? So we could get a pattern more like\n```\nwith Timeout(timeout) as t:\n    while True:\n        # try to do work, break if we can\n        e.check_time()\n        time.sleep(...)\n```","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                if \u0027locked\u0027 not in str(e):"},{"line_number":88,"context_line":"                    raise"},{"line_number":89,"context_line":"            if deadline is not None and time.time() \u003e\u003d deadline:"},{"line_number":90,"context_line":"                raise LockTimeout(timeout, db_file)"},{"line_number":91,"context_line":"            sleep(retry_wait)"},{"line_number":92,"context_line":"            retry_wait \u003d min(retry_wait * 2, 0.05)"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"af049719_97584168","line":90,"in_reply_to":"9ddf4f2e_17624276","updated":"2026-03-13 16:24:43.000000000","message":"Yes, that would be better. Adding this in the next patchset. There are a few more \"with True\" within a \"with *Timeout\" cases that can be covered as well.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":127,"context_line":"        self.timeout \u003d timeout"},{"line_number":128,"context_line":"        self.db_file \u003d database"},{"line_number":129,"context_line":"        super(GreenDBConnection, self).__init__("},{"line_number":130,"context_line":"            database, timeout\u003d0, *args, **kwargs)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def cursor(self, cls\u003dNone):"},{"line_number":133,"context_line":"        if cls is None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"f4e4dd53_e618a2ff","line":130,"updated":"2026-03-12 00:32:25.000000000","message":"Should we start passing the `timeout` kwarg through? At least, when `USE_EVENTLET` is false? I always kinda hated `_db_timeout`...","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"0182567143580fd78eae60759c76af31ca2b34af","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        self.timeout \u003d timeout"},{"line_number":128,"context_line":"        self.db_file \u003d database"},{"line_number":129,"context_line":"        super(GreenDBConnection, self).__init__("},{"line_number":130,"context_line":"            database, timeout\u003d0, *args, **kwargs)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def cursor(self, cls\u003dNone):"},{"line_number":133,"context_line":"        if cls is None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"55c318c8_4949e4dd","line":130,"in_reply_to":"f4e4dd53_e618a2ff","updated":"2026-08-21 08:11:19.000000000","message":"Leaving it for now. Passing the timeout to sqlite3 makes it wait for the lock down in C, which blocks the whole hub under eventlet. Once eventlet is gone we could drop it, but I want to avoid an additional `if USE_EVENTLET` here","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"}],"swift/common/db_replicator.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":411,"context_line":"                                        different_region\u003ddifferent_region):"},{"line_number":412,"context_line":"                    return False"},{"line_number":413,"context_line":"        http.timeout \u003d replicate_timeout or self.node_timeout"},{"line_number":414,"context_line":"        with Timeout(replicate_timeout or self.node_timeout):"},{"line_number":415,"context_line":"            response \u003d http.replicate(replicate_method, local_id,"},{"line_number":416,"context_line":"                                      os.path.basename(broker.db_file))"},{"line_number":417,"context_line":"        return response and 200 \u003c\u003d response.status \u003c 300"}],"source_content_type":"text/x-python","patch_set":2,"id":"93e7674d_88ebe189","line":414,"updated":"2026-03-12 00:32:25.000000000","message":"We can\u0027t say `socket\u003dhttp.sock` here? Or the other places where we call `http.replicate`?","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":411,"context_line":"                                        different_region\u003ddifferent_region):"},{"line_number":412,"context_line":"                    return False"},{"line_number":413,"context_line":"        http.timeout \u003d replicate_timeout or self.node_timeout"},{"line_number":414,"context_line":"        with Timeout(replicate_timeout or self.node_timeout):"},{"line_number":415,"context_line":"            response \u003d http.replicate(replicate_method, local_id,"},{"line_number":416,"context_line":"                                      os.path.basename(broker.db_file))"},{"line_number":417,"context_line":"        return response and 200 \u003c\u003d response.status \u003c 300"}],"source_content_type":"text/x-python","patch_set":2,"id":"4f591357_959e3355","line":414,"in_reply_to":"93e7674d_88ebe189","updated":"2026-03-13 16:24:43.000000000","message":"Yes, good point. I think the change in line 174/175 is no longer needed than, and it\u0027s much cleaner and more in-line with the overall change.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            if self.sock is None:"},{"line_number":173,"context_line":"                # connect now: request() would connect lazily, after the"},{"line_number":174,"context_line":"                # Timeout below has already found no socket to arm."},{"line_number":175,"context_line":"                self.connect()"},{"line_number":176,"context_line":"            # self.timeout is (re)set by the caller before each call; owning"},{"line_number":177,"context_line":"            # the context here guarantees the socket exists when it arms."},{"line_number":178,"context_line":"            with Timeout(self.timeout, socket\u003dself.sock):"}],"source_content_type":"text/x-python","patch_set":10,"id":"e03712c1_412bd4fb","line":175,"updated":"2026-07-09 21:33:15.000000000","message":"Right, and this still respects the timeout because we\u0027ve already set `self.timeout`","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":false,"context_lines":[{"line_number":179,"context_line":"                self.request(\u0027REPLICATE\u0027, self.path, body,"},{"line_number":180,"context_line":"                             {\u0027Content-Type\u0027: \u0027application/json\u0027})"},{"line_number":181,"context_line":"                response \u003d self.getresponse()"},{"line_number":182,"context_line":"                response.data \u003d response.read()"},{"line_number":183,"context_line":"            return response"},{"line_number":184,"context_line":"        except (Exception, Timeout):"},{"line_number":185,"context_line":"            self.close()"}],"source_content_type":"text/x-python","patch_set":10,"id":"1c09f01a_e04c6ee5","line":182,"updated":"2026-07-09 21:33:15.000000000","message":"But why do we need to wrap all of these in a single timeout? Oh, I guess that\u0027s how the callers did it...","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":415,"context_line":"                    return False"},{"line_number":416,"context_line":"        # replicate() owns the timeout context; it arms self.timeout on the"},{"line_number":417,"context_line":"        # connected socket."},{"line_number":418,"context_line":"        http.timeout \u003d replicate_timeout or self.node_timeout"},{"line_number":419,"context_line":"        response \u003d http.replicate(replicate_method, local_id,"},{"line_number":420,"context_line":"                                  os.path.basename(broker.db_file))"},{"line_number":421,"context_line":"        return response and 200 \u003c\u003d response.status \u003c 300"}],"source_content_type":"text/x-python","patch_set":10,"id":"e812e838_125d8c8e","line":418,"range":{"start_line":418,"start_character":23,"end_line":418,"end_character":40},"updated":"2026-07-09 21:33:15.000000000","message":"Oh, huh -- sometimes this is `replicate_timeout\u003d(info[\u0027count\u0027] / 2000)`??\n\nWhich means we have to set `http.timeout` all over the place 😕","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                    return False"},{"line_number":416,"context_line":"        # replicate() owns the timeout context; it arms self.timeout on the"},{"line_number":417,"context_line":"        # connected socket."},{"line_number":418,"context_line":"        http.timeout \u003d replicate_timeout or self.node_timeout"},{"line_number":419,"context_line":"        response \u003d http.replicate(replicate_method, local_id,"},{"line_number":420,"context_line":"                                  os.path.basename(broker.db_file))"},{"line_number":421,"context_line":"        return response and 200 \u003c\u003d response.status \u003c 300"}],"source_content_type":"text/x-python","patch_set":10,"id":"938a3e8b_b1e784aa","line":418,"range":{"start_line":418,"start_character":23,"end_line":418,"end_character":40},"in_reply_to":"e812e838_125d8c8e","updated":"2026-07-22 12:39:40.000000000","message":"Acknowledged","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"}],"swift/common/direct_client.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":204,"context_line":"    with Timeout(response_timeout, socket\u003dconn.sock):"},{"line_number":205,"context_line":"        resp \u003d conn.getresponse()"},{"line_number":206,"context_line":"    if not is_success(resp.status):"},{"line_number":207,"context_line":"        resp.read()"},{"line_number":208,"context_line":"        raise DirectClientException(stype, \u0027GET\u0027, node, part, path, resp)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    resp_headers \u003d HeaderKeyDict()"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3a6434_d9f6ca2b","line":207,"updated":"2026-07-09 21:33:15.000000000","message":"This now uses `conn_timeout` instead of blocking -- intentional?\n\nProbably better to have some kind of timeout...","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    with Timeout(response_timeout, socket\u003dconn.sock):"},{"line_number":205,"context_line":"        resp \u003d conn.getresponse()"},{"line_number":206,"context_line":"    if not is_success(resp.status):"},{"line_number":207,"context_line":"        resp.read()"},{"line_number":208,"context_line":"        raise DirectClientException(stype, \u0027GET\u0027, node, part, path, resp)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    resp_headers \u003d HeaderKeyDict()"}],"source_content_type":"text/x-python","patch_set":10,"id":"e1289c0e_83fc7f82","line":207,"in_reply_to":"2fb273d6_d46e2f33","updated":"2026-07-22 12:39:40.000000000","message":"Acknowledged","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"74b4b8ab034c03034fe564fdbafbd03c198ae34b","unresolved":true,"context_lines":[{"line_number":204,"context_line":"    with Timeout(response_timeout, socket\u003dconn.sock):"},{"line_number":205,"context_line":"        resp \u003d conn.getresponse()"},{"line_number":206,"context_line":"    if not is_success(resp.status):"},{"line_number":207,"context_line":"        resp.read()"},{"line_number":208,"context_line":"        raise DirectClientException(stype, \u0027GET\u0027, node, part, path, resp)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    resp_headers \u003d HeaderKeyDict()"}],"source_content_type":"text/x-python","patch_set":10,"id":"2fb273d6_d46e2f33","line":207,"in_reply_to":"5a3a6434_d9f6ca2b","updated":"2026-07-15 19:27:37.000000000","message":"OK, looks like these got addressed in https://review.opendev.org/c/openstack/swift/+/996120 ?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":484,"context_line":"    with Timeout(response_timeout, socket\u003dconn.sock):"},{"line_number":485,"context_line":"        resp \u003d conn.getresponse()"},{"line_number":486,"context_line":"    if not is_success(resp.status):"},{"line_number":487,"context_line":"        resp.read()"},{"line_number":488,"context_line":"        raise DirectClientException(\u0027Object\u0027, \u0027GET\u0027, node, part, path, resp)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"    if resp_chunk_size:"}],"source_content_type":"text/x-python","patch_set":10,"id":"b562813b_47004413","line":487,"updated":"2026-07-09 21:33:15.000000000","message":"Here too","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":484,"context_line":"    with Timeout(response_timeout, socket\u003dconn.sock):"},{"line_number":485,"context_line":"        resp \u003d conn.getresponse()"},{"line_number":486,"context_line":"    if not is_success(resp.status):"},{"line_number":487,"context_line":"        resp.read()"},{"line_number":488,"context_line":"        raise DirectClientException(\u0027Object\u0027, \u0027GET\u0027, node, part, path, resp)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"    if resp_chunk_size:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ec59676c_680bec6d","line":487,"in_reply_to":"b562813b_47004413","updated":"2026-07-22 12:39:40.000000000","message":"Done in 996120","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":619,"context_line":"                                    host\u003d{\u0027ip\u0027: node[\u0027replication_ip\u0027],"},{"line_number":620,"context_line":"                                          \u0027port\u0027: node[\u0027replication_port\u0027]}"},{"line_number":621,"context_line":"                                    )"},{"line_number":622,"context_line":"    return unpickle(resp.read())"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"def retry(func, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":10,"id":"98239570_8947eaba","line":622,"updated":"2026-07-09 21:33:15.000000000","message":"And here","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":619,"context_line":"                                    host\u003d{\u0027ip\u0027: node[\u0027replication_ip\u0027],"},{"line_number":620,"context_line":"                                          \u0027port\u0027: node[\u0027replication_port\u0027]}"},{"line_number":621,"context_line":"                                    )"},{"line_number":622,"context_line":"    return unpickle(resp.read())"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"def retry(func, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":10,"id":"0d7aed0c_d94427ed","line":622,"in_reply_to":"98239570_8947eaba","updated":"2026-07-22 12:39:40.000000000","message":"Done in 996120","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":691,"context_line":"        resp \u003d conn.getresponse()"},{"line_number":692,"context_line":"    if not is_success(resp.status):"},{"line_number":693,"context_line":"        raise DirectClientReconException(\u0027GET\u0027, node, path, resp)"},{"line_number":694,"context_line":"    return json.loads(resp.read())"}],"source_content_type":"text/x-python","patch_set":10,"id":"c590e088_2963817d","line":694,"updated":"2026-07-09 21:33:15.000000000","message":"And here","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":691,"context_line":"        resp \u003d conn.getresponse()"},{"line_number":692,"context_line":"    if not is_success(resp.status):"},{"line_number":693,"context_line":"        raise DirectClientReconException(\u0027GET\u0027, node, path, resp)"},{"line_number":694,"context_line":"    return json.loads(resp.read())"}],"source_content_type":"text/x-python","patch_set":10,"id":"53524633_e6ea027e","line":694,"in_reply_to":"c590e088_2963817d","updated":"2026-07-22 12:39:40.000000000","message":"Done in 996120","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"}],"swift/common/exceptions.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":26,"context_line":"            super(Timeout, self).__init__(*args, **new_kwargs)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"else:"},{"line_number":29,"context_line":"    class Timeout(BaseException):"},{"line_number":30,"context_line":"        def __init__(self, seconds\u003dNone, exception\u003dNone, socket\u003dNone):"},{"line_number":31,"context_line":"            self.seconds \u003d seconds"},{"line_number":32,"context_line":"            self.exception \u003d exception"}],"source_content_type":"text/x-python","patch_set":2,"id":"bca17187_f3e9deae","line":29,"range":{"start_line":29,"start_character":18,"end_line":29,"end_character":31},"updated":"2026-03-12 00:32:25.000000000","message":"Definitely want to go straight from `BaseException`, right? `TimeoutError` seems like a reasonably obvious alternative, but we consciously **don\u0027t** want to be inheriting from `Exception` or `OSError`, yeah?\n\nBut... when used as a context manager to get the *socket* to pop the error... that **will** raise a `TimeoutError` -- and I guess (hope?) things mostly just get handled?","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":26,"context_line":"            super(Timeout, self).__init__(*args, **new_kwargs)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"else:"},{"line_number":29,"context_line":"    class Timeout(BaseException):"},{"line_number":30,"context_line":"        def __init__(self, seconds\u003dNone, exception\u003dNone, socket\u003dNone):"},{"line_number":31,"context_line":"            self.seconds \u003d seconds"},{"line_number":32,"context_line":"            self.exception \u003d exception"}],"source_content_type":"text/x-python","patch_set":2,"id":"ded1a4e1_c9e273b3","line":29,"range":{"start_line":29,"start_character":18,"end_line":29,"end_character":31},"in_reply_to":"bca17187_f3e9deae","updated":"2026-03-13 16:24:43.000000000","message":"Yes. I stumbled upon this recently as well when working on getting unittests running/passing. In fact we need to catch some of these in exceptions.ChunkReadError, because socket.timeout would otherwise not raise a Timeout, but the ChunkedReadError. Will include that in the next patch for the Watchdog-replacement","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        def __enter__(self):"},{"line_number":36,"context_line":"            if self.seconds is not None and self.socket is not None \\"},{"line_number":37,"context_line":"                    and hasattr(self.socket, \u0027settimeout\u0027):"},{"line_number":38,"context_line":"                self.socket.settimeout(self.seconds)"},{"line_number":39,"context_line":"            return self"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"6d179622_d67490ee","line":37,"updated":"2026-03-12 00:32:25.000000000","message":"When would `self.socket` (be non-`None` and) *not* have `settimeout`?","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        def __enter__(self):"},{"line_number":36,"context_line":"            if self.seconds is not None and self.socket is not None \\"},{"line_number":37,"context_line":"                    and hasattr(self.socket, \u0027settimeout\u0027):"},{"line_number":38,"context_line":"                self.socket.settimeout(self.seconds)"},{"line_number":39,"context_line":"            return self"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9645ea58_a34c54cc","line":37,"in_reply_to":"6d179622_d67490ee","updated":"2026-03-13 16:24:43.000000000","message":"Ouch. Should be never, but I think at one time I was accidentally overriding socket. In fact if this happens, there should be an error raised, because it is clearly wrong. Will change this.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":39,"context_line":"            return self"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        def __exit__(self, exc_type, exc_value, exc_traceback):"},{"line_number":42,"context_line":"            return False"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        def __str__(self):"},{"line_number":45,"context_line":"            if self.seconds is not None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"6d8a1d3b_aa8cc998","line":42,"updated":"2026-03-12 00:32:25.000000000","message":"Not going to try to reset the socket timeout to what was there before? I suppose the assumption is that the next time we use the socket, we\u0027ll be wrapping it in a `with Timeout(...):` again anyway.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            return self"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        def __exit__(self, exc_type, exc_value, exc_traceback):"},{"line_number":42,"context_line":"            return False"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        def __str__(self):"},{"line_number":45,"context_line":"            if self.seconds is not None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"6daa4ea9_c656d61e","line":42,"in_reply_to":"6d8a1d3b_aa8cc998","updated":"2026-03-13 16:24:43.000000000","message":"No, but I was thinking about this as well, because we might actually might continue using a socket without the Timeout ctx mgr? I will add a restore_timeout func, just to be save.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        def __str__(self):"},{"line_number":45,"context_line":"            if self.seconds is not None:"},{"line_number":46,"context_line":"                return \u0027%s seconds\u0027 % self.seconds"},{"line_number":47,"context_line":"            return \u0027\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        def cancel(self):"},{"line_number":50,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"3e55a786_4e9fc2c6","line":47,"updated":"2026-03-12 00:32:25.000000000","message":"Matches eventlet behavior, but still a bit of an odd return value...","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"0182567143580fd78eae60759c76af31ca2b34af","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        def __str__(self):"},{"line_number":45,"context_line":"            if self.seconds is not None:"},{"line_number":46,"context_line":"                return \u0027%s seconds\u0027 % self.seconds"},{"line_number":47,"context_line":"            return \u0027\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        def cancel(self):"},{"line_number":50,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"a3df79c8_24dae8f7","line":47,"in_reply_to":"3e55a786_4e9fc2c6","updated":"2026-08-21 08:11:19.000000000","message":"Right, but I\u0027d rather not diverge while both modes are around.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":46,"context_line":"                return \u0027%s seconds\u0027 % self.seconds"},{"line_number":47,"context_line":"            return \u0027\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        def cancel(self):"},{"line_number":50,"context_line":"            pass"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"from swift.common.utils.timestamp import Timestamp"}],"source_content_type":"text/x-python","patch_set":2,"id":"e093d1e6_a25fb238","line":49,"updated":"2026-03-12 00:32:25.000000000","message":"Only used in tests, yeah?","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                return \u0027%s seconds\u0027 % self.seconds"},{"line_number":47,"context_line":"            return \u0027\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        def cancel(self):"},{"line_number":50,"context_line":"            pass"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"from swift.common.utils.timestamp import Timestamp"}],"source_content_type":"text/x-python","patch_set":2,"id":"6d9641fa_cb4d5b57","line":49,"in_reply_to":"e093d1e6_a25fb238","updated":"2026-03-13 16:24:43.000000000","message":"Yes, I\u0027ll add an inline comment. Will also make sure the socket timeout is reset at this point before getting to __exit__.\n\nMight be even worth to refactor the tests later on as well, but I wanted to avoid test changes as much as possible at the beginning.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":true,"context_lines":[{"line_number":45,"context_line":"            if self.seconds is not None:"},{"line_number":46,"context_line":"                if self.seconds \u003e 0:"},{"line_number":47,"context_line":"                    self.deadline \u003d time.monotonic() + self.seconds"},{"line_number":48,"context_line":"            if self.seconds is not None and self.socket is not None:"},{"line_number":49,"context_line":"                self.old_timeout \u003d self.socket.gettimeout()"},{"line_number":50,"context_line":"                self.socket.settimeout(self.seconds)"},{"line_number":51,"context_line":"            return self"}],"source_content_type":"text/x-python","patch_set":3,"id":"14897c2d_aaafec4c","line":48,"updated":"2026-03-13 16:24:43.000000000","message":"Ahh, could be intended, using one less if-condition.","commit_id":"e002bb0dbf033f20fc6e6e5c4cef86cfd79f04ea"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"0182567143580fd78eae60759c76af31ca2b34af","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            if self.seconds is not None:"},{"line_number":46,"context_line":"                if self.seconds \u003e 0:"},{"line_number":47,"context_line":"                    self.deadline \u003d time.monotonic() + self.seconds"},{"line_number":48,"context_line":"            if self.seconds is not None and self.socket is not None:"},{"line_number":49,"context_line":"                self.old_timeout \u003d self.socket.gettimeout()"},{"line_number":50,"context_line":"                self.socket.settimeout(self.seconds)"},{"line_number":51,"context_line":"            return self"}],"source_content_type":"text/x-python","patch_set":3,"id":"1b420375_eda39d19","line":48,"in_reply_to":"14897c2d_aaafec4c","updated":"2026-08-21 08:11:19.000000000","message":"Done","commit_id":"e002bb0dbf033f20fc6e6e5c4cef86cfd79f04ea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"26824f8ceb326c8a4d119bffe031061a50398717","unresolved":true,"context_lines":[{"line_number":33,"context_line":"            pass"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"else:"},{"line_number":36,"context_line":"    class Timeout(BaseException):"},{"line_number":37,"context_line":"        def __init__(self, seconds\u003dNone, socket\u003dNone, exception\u003dNone):"},{"line_number":38,"context_line":"            # exception is unused, kept to be compatible with eventlet and"},{"line_number":39,"context_line":"            # test/unit/obj/test_ssync.py::TestSsyncECReconstructorSyncJob"}],"source_content_type":"text/x-python","patch_set":4,"id":"7e0b9e60_411dd942","line":36,"updated":"2026-05-01 20:07:59.000000000","message":"OK, so I\u0027m pretty sure most of this hunk will be moving to `swift.common.concurrency` -- we\u0027ll just keep the `socket_timeout` import for the later hunk.","commit_id":"764a31a0bef197d5b258d438e91a9f8e92224dd2"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"0182567143580fd78eae60759c76af31ca2b34af","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            pass"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"else:"},{"line_number":36,"context_line":"    class Timeout(BaseException):"},{"line_number":37,"context_line":"        def __init__(self, seconds\u003dNone, socket\u003dNone, exception\u003dNone):"},{"line_number":38,"context_line":"            # exception is unused, kept to be compatible with eventlet and"},{"line_number":39,"context_line":"            # test/unit/obj/test_ssync.py::TestSsyncECReconstructorSyncJob"}],"source_content_type":"text/x-python","patch_set":4,"id":"34250422_1f4ce7df","line":36,"in_reply_to":"7e0b9e60_411dd942","updated":"2026-08-21 08:11:19.000000000","message":"Yes - Timeout lives in swift.common.concurrency now, exceptions.py only imports it plus socket_timeout.","commit_id":"764a31a0bef197d5b258d438e91a9f8e92224dd2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":142,"context_line":"class ChunkReadError(SwiftException):"},{"line_number":143,"context_line":"    def __init__(self, *args):"},{"line_number":144,"context_line":"        if args and isinstance(args[0], socket_timeout):"},{"line_number":145,"context_line":"            raise args[0]"},{"line_number":146,"context_line":"        super().__init__(*args)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"0d2fae41_f15bbbf6","line":145,"updated":"2026-07-09 21:33:15.000000000","message":"Where does this come into play? What isn\u0027t the code re-raising themselves instead of trying to wrap it in a `ChunkReadError`?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":142,"context_line":"class ChunkReadError(SwiftException):"},{"line_number":143,"context_line":"    def __init__(self, *args):"},{"line_number":144,"context_line":"        if args and isinstance(args[0], socket_timeout):"},{"line_number":145,"context_line":"            raise args[0]"},{"line_number":146,"context_line":"        super().__init__(*args)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"4b87fd46_b950ae60","line":145,"in_reply_to":"0d2fae41_f15bbbf6","updated":"2026-07-22 12:39:40.000000000","message":"Done","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":158,"context_line":"    pass"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"class ConnectionTimeout(Timeout):"},{"line_number":162,"context_line":"    pass"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"cf7454b5_4286ed1e","line":161,"updated":"2026-07-09 21:33:15.000000000","message":"Do we still use this anywhere?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"0182567143580fd78eae60759c76af31ca2b34af","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    pass"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"class ConnectionTimeout(Timeout):"},{"line_number":162,"context_line":"    pass"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"64d3d8ed_3a3b4d95","line":161,"in_reply_to":"06c5381f_e1574cd7","updated":"2026-08-21 08:11:19.000000000","message":"Done","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":true,"context_lines":[{"line_number":158,"context_line":"    pass"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"class ConnectionTimeout(Timeout):"},{"line_number":162,"context_line":"    pass"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"06c5381f_e1574cd7","line":161,"in_reply_to":"cf7454b5_4286ed1e","updated":"2026-07-22 12:39:40.000000000","message":"No - good catch. It\u0027s still raised in tests, will be fixed in next patchset.","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"}],"swift/common/memcached.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        self._tls_context \u003d tls_context"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def create(self):"},{"line_number":138,"context_line":"        addrs \u003d socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC,"},{"line_number":139,"context_line":"                                   socket.SOCK_STREAM)"},{"line_number":140,"context_line":"        family, socktype, proto, canonname, sockaddr \u003d addrs[0]"},{"line_number":141,"context_line":"        sock \u003d socket.socket(family, socket.SOCK_STREAM)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bcdf55d4_832aa397","line":138,"updated":"2026-03-12 00:32:25.000000000","message":"🤔 I wonder if we should try to get a timeout on this guy...\n\nEh, future work.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":255,"context_line":"    def _exception_occurred(self, server, e, cmd, conn_start_time,"},{"line_number":256,"context_line":"                            action\u003d\u0027talking\u0027, sock\u003dNone,"},{"line_number":257,"context_line":"                            fp\u003dNone, got_connection\u003dTrue):"},{"line_number":258,"context_line":"        if isinstance(e, Timeout):"},{"line_number":259,"context_line":"            self.logger.error("},{"line_number":260,"context_line":"                \"Timeout %(action)s to memcached: %(server)s\""},{"line_number":261,"context_line":"                \": with key_prefix %(key_prefix)s, method %(method)s, \""}],"source_content_type":"text/x-python","patch_set":2,"id":"33f9e67a_2f7b378b","line":258,"updated":"2026-03-12 00:32:25.000000000","message":"I wonder if this should pick up `TimeoutError`s (or, since those don\u0027t have a `seconds` attr, if there should be a similar-but-slightly-different stanza added)\n\nAt least they shouldn\u0027t fall down to the `self.logger.exception` case!","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":255,"context_line":"    def _exception_occurred(self, server, e, cmd, conn_start_time,"},{"line_number":256,"context_line":"                            action\u003d\u0027talking\u0027, sock\u003dNone,"},{"line_number":257,"context_line":"                            fp\u003dNone, got_connection\u003dTrue):"},{"line_number":258,"context_line":"        if isinstance(e, Timeout):"},{"line_number":259,"context_line":"            self.logger.error("},{"line_number":260,"context_line":"                \"Timeout %(action)s to memcached: %(server)s\""},{"line_number":261,"context_line":"                \": with key_prefix %(key_prefix)s, method %(method)s, \""}],"source_content_type":"text/x-python","patch_set":2,"id":"2554209b_5b238d15","line":258,"in_reply_to":"33f9e67a_2f7b378b","updated":"2026-07-22 12:39:40.000000000","message":"Done in current PS","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":443,"context_line":"            try:"},{"line_number":444,"context_line":"                with Timeout(self._io_timeout, socket\u003dsock) as to:"},{"line_number":445,"context_line":"                    sock.sendall(b\u0027get \u0027 + cmd.hash_key + b\u0027\\r\\n\u0027)"},{"line_number":446,"context_line":"                    line \u003d fp.readline().strip().split()"},{"line_number":447,"context_line":"                    while True:"},{"line_number":448,"context_line":"                        to.check_time()"},{"line_number":449,"context_line":"                        if not line:"}],"source_content_type":"text/x-python","patch_set":10,"id":"09ab9fad_177318af","line":446,"updated":"2026-07-09 21:33:15.000000000","message":"Should there be another `check_time` between the `sendall` and the `readline`?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":true,"context_lines":[{"line_number":443,"context_line":"            try:"},{"line_number":444,"context_line":"                with Timeout(self._io_timeout, socket\u003dsock) as to:"},{"line_number":445,"context_line":"                    sock.sendall(b\u0027get \u0027 + cmd.hash_key + b\u0027\\r\\n\u0027)"},{"line_number":446,"context_line":"                    line \u003d fp.readline().strip().split()"},{"line_number":447,"context_line":"                    while True:"},{"line_number":448,"context_line":"                        to.check_time()"},{"line_number":449,"context_line":"                        if not line:"}],"source_content_type":"text/x-python","patch_set":10,"id":"df42e1f0_1c51d684","line":446,"in_reply_to":"09ab9fad_177318af","updated":"2026-07-22 12:39:40.000000000","message":"Both are guarded by their socket timeout - not needed?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"0182567143580fd78eae60759c76af31ca2b34af","unresolved":false,"context_lines":[{"line_number":443,"context_line":"            try:"},{"line_number":444,"context_line":"                with Timeout(self._io_timeout, socket\u003dsock) as to:"},{"line_number":445,"context_line":"                    sock.sendall(b\u0027get \u0027 + cmd.hash_key + b\u0027\\r\\n\u0027)"},{"line_number":446,"context_line":"                    line \u003d fp.readline().strip().split()"},{"line_number":447,"context_line":"                    while True:"},{"line_number":448,"context_line":"                        to.check_time()"},{"line_number":449,"context_line":"                        if not line:"}],"source_content_type":"text/x-python","patch_set":10,"id":"03de91e7_d1157e7c","line":446,"in_reply_to":"df42e1f0_1c51d684","updated":"2026-08-21 08:11:19.000000000","message":"Done","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":458,"context_line":"                                value \u003d None"},{"line_number":459,"context_line":"                            if int(line[2]) \u0026 JSON_FLAG:"},{"line_number":460,"context_line":"                                value \u003d json.loads(value)"},{"line_number":461,"context_line":"                            fp.readline()"},{"line_number":462,"context_line":"                        line \u003d fp.readline().strip().split()"},{"line_number":463,"context_line":"                    self._return_conn(server, fp, sock)"},{"line_number":464,"context_line":"                    return value"}],"source_content_type":"text/x-python","patch_set":10,"id":"1c08f482_62d1c3bd","line":461,"updated":"2026-07-09 21:33:15.000000000","message":"And after this `readline`","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":true,"context_lines":[{"line_number":458,"context_line":"                                value \u003d None"},{"line_number":459,"context_line":"                            if int(line[2]) \u0026 JSON_FLAG:"},{"line_number":460,"context_line":"                                value \u003d json.loads(value)"},{"line_number":461,"context_line":"                            fp.readline()"},{"line_number":462,"context_line":"                        line \u003d fp.readline().strip().split()"},{"line_number":463,"context_line":"                    self._return_conn(server, fp, sock)"},{"line_number":464,"context_line":"                    return value"}],"source_content_type":"text/x-python","patch_set":10,"id":"fd53d839_5e3e3971","line":461,"in_reply_to":"1c08f482_62d1c3bd","updated":"2026-07-22 12:39:40.000000000","message":"Same - socket bounded should be ok?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"0182567143580fd78eae60759c76af31ca2b34af","unresolved":false,"context_lines":[{"line_number":458,"context_line":"                                value \u003d None"},{"line_number":459,"context_line":"                            if int(line[2]) \u0026 JSON_FLAG:"},{"line_number":460,"context_line":"                                value \u003d json.loads(value)"},{"line_number":461,"context_line":"                            fp.readline()"},{"line_number":462,"context_line":"                        line \u003d fp.readline().strip().split()"},{"line_number":463,"context_line":"                    self._return_conn(server, fp, sock)"},{"line_number":464,"context_line":"                    return value"}],"source_content_type":"text/x-python","patch_set":10,"id":"11d992c7_3b38f2ce","line":461,"in_reply_to":"fd53d839_5e3e3971","updated":"2026-08-21 08:11:19.000000000","message":"Done","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":609,"context_line":"                    sock.sendall(b\u0027\u0027.join(msg))"},{"line_number":610,"context_line":"                    # Wait for the set to complete"},{"line_number":611,"context_line":"                    for line in range(len(mapping)):"},{"line_number":612,"context_line":"                        fp.readline()"},{"line_number":613,"context_line":"                    self._return_conn(server, fp, sock)"},{"line_number":614,"context_line":"                    return"},{"line_number":615,"context_line":"            except (Exception, Timeout) as e:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3119b29a_2ec8bc10","line":612,"updated":"2026-07-09 21:33:15.000000000","message":"Surely ought to have some `check_time` calls in here.","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":609,"context_line":"                    sock.sendall(b\u0027\u0027.join(msg))"},{"line_number":610,"context_line":"                    # Wait for the set to complete"},{"line_number":611,"context_line":"                    for line in range(len(mapping)):"},{"line_number":612,"context_line":"                        fp.readline()"},{"line_number":613,"context_line":"                    self._return_conn(server, fp, sock)"},{"line_number":614,"context_line":"                    return"},{"line_number":615,"context_line":"            except (Exception, Timeout) as e:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3d12b5e6_4f0d7550","line":612,"in_reply_to":"3119b29a_2ec8bc10","updated":"2026-07-22 12:39:40.000000000","message":"Acknowledged","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"}],"swift/common/middleware/copy.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":217,"context_line":"                            with Timeout(self.yield_frequency):"},{"line_number":218,"context_line":"                                app_iter \u003d gt.wait()"},{"line_number":219,"context_line":"                        except Timeout:"},{"line_number":220,"context_line":"                            yield b\u0027 \u0027"},{"line_number":221,"context_line":"                except Exception as e:"},{"line_number":222,"context_line":"                    # Send back the status to the client if error"},{"line_number":223,"context_line":"                    self._response_status \u003d \u0027500 Internal Error\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"8012270c_4c878c68","line":220,"updated":"2026-03-12 00:32:25.000000000","message":"This pattern makes me nervous (since that `with` will  only ever cause a `raise` with `USE_EVENTLET` enabled), but I guess I should see what it looks like once we\u0027ve got the GreenThread replacement.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                            with Timeout(self.yield_frequency):"},{"line_number":218,"context_line":"                                app_iter \u003d gt.wait()"},{"line_number":219,"context_line":"                        except Timeout:"},{"line_number":220,"context_line":"                            yield b\u0027 \u0027"},{"line_number":221,"context_line":"                except Exception as e:"},{"line_number":222,"context_line":"                    # Send back the status to the client if error"},{"line_number":223,"context_line":"                    self._response_status \u003d \u0027500 Internal Error\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"85dee360_d29ac084","line":220,"in_reply_to":"8012270c_4c878c68","updated":"2026-03-13 16:24:43.000000000","message":"Actually there is a timeout arg added  in the spawn-replacement patch to catch this.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":1325,"context_line":"                    raise timeout_class(timeout, lockpath)"},{"line_number":1326,"context_line":"                if time_slept \u003e slowdown_at:"},{"line_number":1327,"context_line":"                    sleep_time \u003d slower_sleep_time"},{"line_number":1328,"context_line":"                sleep(sleep_time)"},{"line_number":1329,"context_line":"                time_slept +\u003d sleep_time"},{"line_number":1330,"context_line":"        yield True"},{"line_number":1331,"context_line":"    finally:"}],"source_content_type":"text/x-python","patch_set":2,"id":"df756582_9e95452b","line":1328,"updated":"2026-03-12 00:32:25.000000000","message":"This is where eventlet\u0027s `Timeout` would have popped, right? So I see two concerns:\n\n1. We can sleep past our deadline -- though only by the larger of 10ms or 1% of `timeout`\n2. If we *do* sleep past our deadline, we get one more crack at `_get_any_lock` before raising\n\nI\u0027m not sure either of those is terribly *significant*, but they seem worth calling out.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":1325,"context_line":"                    raise timeout_class(timeout, lockpath)"},{"line_number":1326,"context_line":"                if time_slept \u003e slowdown_at:"},{"line_number":1327,"context_line":"                    sleep_time \u003d slower_sleep_time"},{"line_number":1328,"context_line":"                sleep(sleep_time)"},{"line_number":1329,"context_line":"                time_slept +\u003d sleep_time"},{"line_number":1330,"context_line":"        yield True"},{"line_number":1331,"context_line":"    finally:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ca0991a_6310fd72","line":1328,"in_reply_to":"df756582_9e95452b","updated":"2026-03-13 16:24:43.000000000","message":"Yes. I think #2 can be fixed by moved the deadline check?\n\nUsing your idea on adding a check_time to Timeout we can nearly avoid this refactoring. Will add this in a follow up","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":1358,"context_line":"        fd \u003d os.open(filename, flags)"},{"line_number":1359,"context_line":"        file_obj \u003d os.fdopen(fd, mode)"},{"line_number":1360,"context_line":"        try:"},{"line_number":1361,"context_line":"            if USE_EVENTLET:"},{"line_number":1362,"context_line":"                with swift.common.exceptions.LockTimeout(timeout, filename):"},{"line_number":1363,"context_line":"                    while True:"},{"line_number":1364,"context_line":"                        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fa0f876_679730c4","line":1361,"updated":"2026-03-13 16:24:43.000000000","message":"Same here, using your idea on adding a check_time to Timeout we can nearly avoid this refactoring. Will add this in a follow up","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":2271,"context_line":"                            break"},{"line_number":2272,"context_line":"            except (GreenAsyncPileWaitallTimeout, StopIteration):"},{"line_number":2273,"context_line":"                pass"},{"line_number":2274,"context_line":"        else:"},{"line_number":2275,"context_line":"            deadline \u003d (time.time() + timeout) if timeout is not None \\"},{"line_number":2276,"context_line":"                else None"},{"line_number":2277,"context_line":"            while True:"}],"source_content_type":"text/x-python","patch_set":2,"id":"d2327ee6_c4bdfb57","line":2274,"updated":"2026-03-12 00:32:25.000000000","message":"So, a not-so-green async pile ;-)","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":2271,"context_line":"                            break"},{"line_number":2272,"context_line":"            except (GreenAsyncPileWaitallTimeout, StopIteration):"},{"line_number":2273,"context_line":"                pass"},{"line_number":2274,"context_line":"        else:"},{"line_number":2275,"context_line":"            deadline \u003d (time.time() + timeout) if timeout is not None \\"},{"line_number":2276,"context_line":"                else None"},{"line_number":2277,"context_line":"            while True:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5713783d_4e9c63dc","line":2274,"in_reply_to":"d2327ee6_c4bdfb57","updated":"2026-03-13 16:24:43.000000000","message":"Indeed :) Did not want to rename this yet.\n\nAgain, using your idea on adding a check_time to Timeout we can nearly avoid this refactoring. Will add this in a follow up","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":1303,"context_line":"    try:"},{"line_number":1304,"context_line":"        with timeout_class(timeout, lockpath) as to:"},{"line_number":1305,"context_line":"            while True:"},{"line_number":1306,"context_line":"                to.check_time()"},{"line_number":1307,"context_line":"                if _get_any_lock(fds):"},{"line_number":1308,"context_line":"                    break"},{"line_number":1309,"context_line":"                if time_slept \u003e slowdown_at:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faf0bff_e62002e1","line":1306,"updated":"2026-07-09 21:33:15.000000000","message":"So when do we want to do this at the start of the loop vs at the end of it?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":1303,"context_line":"    try:"},{"line_number":1304,"context_line":"        with timeout_class(timeout, lockpath) as to:"},{"line_number":1305,"context_line":"            while True:"},{"line_number":1306,"context_line":"                to.check_time()"},{"line_number":1307,"context_line":"                if _get_any_lock(fds):"},{"line_number":1308,"context_line":"                    break"},{"line_number":1309,"context_line":"                if time_slept \u003e slowdown_at:"}],"source_content_type":"text/x-python","patch_set":10,"id":"31500701_c72ed96a","line":1306,"in_reply_to":"7faf0bff_e62002e1","updated":"2026-07-22 12:39:40.000000000","message":"Stat so it never sleeps and then retries after the deadline","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":3264,"context_line":"                try:"},{"line_number":3265,"context_line":"                    chunk \u003d self.wsgi_input.read(to_read)"},{"line_number":3266,"context_line":"                except (IOError, ValueError) as e:"},{"line_number":3267,"context_line":"                    raise swift.common.exceptions.ChunkReadError(e)"},{"line_number":3268,"context_line":"                to_read -\u003d len(chunk)"},{"line_number":3269,"context_line":"                self.input_buffer +\u003d chunk"},{"line_number":3270,"context_line":"                if not chunk:"}],"source_content_type":"text/x-python","patch_set":10,"id":"83bc2e30_20714349","line":3267,"updated":"2026-07-09 21:33:15.000000000","message":"Is this relevant? I don\u0027t think `e` can ever be a `Timeout` -- or did you mean to add that to the `except` coverage?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":true,"context_lines":[{"line_number":3264,"context_line":"                try:"},{"line_number":3265,"context_line":"                    chunk \u003d self.wsgi_input.read(to_read)"},{"line_number":3266,"context_line":"                except (IOError, ValueError) as e:"},{"line_number":3267,"context_line":"                    raise swift.common.exceptions.ChunkReadError(e)"},{"line_number":3268,"context_line":"                to_read -\u003d len(chunk)"},{"line_number":3269,"context_line":"                self.input_buffer +\u003d chunk"},{"line_number":3270,"context_line":"                if not chunk:"}],"source_content_type":"text/x-python","patch_set":10,"id":"e49363d6_cd497fed","line":3267,"in_reply_to":"83bc2e30_20714349","updated":"2026-07-22 12:39:40.000000000","message":"Right, it can\u0027t be a Swift Timeout, but it can be a socket.timeout that\u0027s reraised.","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"0182567143580fd78eae60759c76af31ca2b34af","unresolved":false,"context_lines":[{"line_number":3264,"context_line":"                try:"},{"line_number":3265,"context_line":"                    chunk \u003d self.wsgi_input.read(to_read)"},{"line_number":3266,"context_line":"                except (IOError, ValueError) as e:"},{"line_number":3267,"context_line":"                    raise swift.common.exceptions.ChunkReadError(e)"},{"line_number":3268,"context_line":"                to_read -\u003d len(chunk)"},{"line_number":3269,"context_line":"                self.input_buffer +\u003d chunk"},{"line_number":3270,"context_line":"                if not chunk:"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a49505c_96cc315c","line":3267,"in_reply_to":"e49363d6_cd497fed","updated":"2026-08-21 08:11:19.000000000","message":"Well, it can\u0027t be a Swift Timeout, but socket.timeout is an OSError, so the IOError  covers it.","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"}],"swift/common/utils/logs.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":331,"context_line":"            elif exc.errno \u003d\u003d errno.EPIPE:"},{"line_number":332,"context_line":"                emsg \u003d \u0027Broken pipe\u0027"},{"line_number":333,"context_line":"            else:"},{"line_number":334,"context_line":"                call \u003d self._exception"},{"line_number":335,"context_line":"        elif isinstance(exc, swift.common.exceptions.Timeout):"},{"line_number":336,"context_line":"            emsg \u003d exc.__class__.__name__"},{"line_number":337,"context_line":"            detail \u003d \u0027%ss\u0027 % exc.seconds"}],"source_content_type":"text/x-python","patch_set":2,"id":"92bf894a_9e54fee0","line":334,"updated":"2026-03-12 00:32:25.000000000","message":"Huh. So when our `Timeout` causes a socket to raise `TimeoutError`s... I think they\u0027re all going to get *this* handling, rather than hitting `elif exc.errno \u003d\u003d errno.ETIMEDOUT` :-/\n```\n% USE_EVENTLET\u003d0 python\nPython 3.12.9 (main, May 21 2025, 15:37:30) [Clang 16.0.0 (clang-1600.0.26.6)] on darwin\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n\u003e\u003e\u003e from swift.common.bufferedhttp import http_connect\n\u003e\u003e\u003e try:\n...     http_connect(\u0027192.168.50.123\u0027, 8888, \u0027d0\u0027, 0, \u0027GET\u0027, \u0027foo/bar\u0027, timeout\u003d0.001)\n... except Exception as _:\n...     e \u003d _\n...\n\u003e\u003e\u003e e\nTimeoutError(\u0027timed out\u0027)\n\u003e\u003e\u003e e.errno\n\u003e\u003e\u003e isinstance(e, OSError)\nTrue\n\u003e\u003e\u003e print(e.errno)\nNone\n```","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":331,"context_line":"            elif exc.errno \u003d\u003d errno.EPIPE:"},{"line_number":332,"context_line":"                emsg \u003d \u0027Broken pipe\u0027"},{"line_number":333,"context_line":"            else:"},{"line_number":334,"context_line":"                call \u003d self._exception"},{"line_number":335,"context_line":"        elif isinstance(exc, swift.common.exceptions.Timeout):"},{"line_number":336,"context_line":"            emsg \u003d exc.__class__.__name__"},{"line_number":337,"context_line":"            detail \u003d \u0027%ss\u0027 % exc.seconds"}],"source_content_type":"text/x-python","patch_set":2,"id":"61e606a9_b857ca1e","line":334,"in_reply_to":"92bf894a_9e54fee0","updated":"2026-03-13 16:24:43.000000000","message":"You\u0027re right, good catch! We need to check if this is a socket.timeout as well. Will include that in the next update","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"}],"swift/container/replicator.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def _fetch_and_merge_shard_ranges(self, http, broker):"},{"line_number":172,"context_line":"        http.timeout \u003d self.node_timeout"},{"line_number":173,"context_line":"        with Timeout(self.node_timeout):"},{"line_number":174,"context_line":"            response \u003d http.replicate(\u0027get_shard_ranges\u0027)"},{"line_number":175,"context_line":"        if response and is_success(response.status):"},{"line_number":176,"context_line":"            shards \u003d json.loads(response.data.decode(\u0027ascii\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"e8217607_878faaa1","line":173,"updated":"2026-03-12 00:32:25.000000000","message":"Can\u0027t say `socket\u003dhttp.sock`?","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def _fetch_and_merge_shard_ranges(self, http, broker):"},{"line_number":172,"context_line":"        http.timeout \u003d self.node_timeout"},{"line_number":173,"context_line":"        with Timeout(self.node_timeout):"},{"line_number":174,"context_line":"            response \u003d http.replicate(\u0027get_shard_ranges\u0027)"},{"line_number":175,"context_line":"        if response and is_success(response.status):"},{"line_number":176,"context_line":"            shards \u003d json.loads(response.data.decode(\u0027ascii\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"4818d691_f6bec7b9","line":173,"in_reply_to":"e8217607_878faaa1","updated":"2026-03-13 16:24:43.000000000","message":"Done","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"}],"swift/container/server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":270,"context_line":"                if account_response.status \u003d\u003d HTTP_NOT_FOUND:"},{"line_number":271,"context_line":"                    account_404s +\u003d 1"},{"line_number":272,"context_line":"                elif not is_success(account_response.status):"},{"line_number":273,"context_line":"                    self.logger.error("},{"line_number":274,"context_line":"                        \u0027ERROR Account update failed \u0027"},{"line_number":275,"context_line":"                        \u0027with %(ip)s:%(port)s/%(device)s (will retry \u0027"},{"line_number":276,"context_line":"                        \u0027later): Response %(status)s %(reason)s\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"dbddb215_19e77265","line":273,"updated":"2026-03-12 00:32:25.000000000","message":"There\u0027s a sneaky bug fix! Used to be, logging could pop the timeout! (At least, if it was slow enough.)","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":270,"context_line":"                if account_response.status \u003d\u003d HTTP_NOT_FOUND:"},{"line_number":271,"context_line":"                    account_404s +\u003d 1"},{"line_number":272,"context_line":"                elif not is_success(account_response.status):"},{"line_number":273,"context_line":"                    self.logger.error("},{"line_number":274,"context_line":"                        \u0027ERROR Account update failed \u0027"},{"line_number":275,"context_line":"                        \u0027with %(ip)s:%(port)s/%(device)s (will retry \u0027"},{"line_number":276,"context_line":"                        \u0027later): Response %(status)s %(reason)s\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"8f0d3be3_de43e81c","line":273,"in_reply_to":"41f14693_d979ef0d","updated":"2026-07-09 21:33:15.000000000","message":"\u003e Now this brings up the concern that logging is no longer covered by the timeout. Hmm...\n\nI\u0027m not worried about it -- again, I view this as a bug fix.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"74b4b8ab034c03034fe564fdbafbd03c198ae34b","unresolved":false,"context_lines":[{"line_number":270,"context_line":"                if account_response.status \u003d\u003d HTTP_NOT_FOUND:"},{"line_number":271,"context_line":"                    account_404s +\u003d 1"},{"line_number":272,"context_line":"                elif not is_success(account_response.status):"},{"line_number":273,"context_line":"                    self.logger.error("},{"line_number":274,"context_line":"                        \u0027ERROR Account update failed \u0027"},{"line_number":275,"context_line":"                        \u0027with %(ip)s:%(port)s/%(device)s (will retry \u0027"},{"line_number":276,"context_line":"                        \u0027later): Response %(status)s %(reason)s\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"0d4fb3c3_039b59ee","line":273,"in_reply_to":"8f0d3be3_de43e81c","updated":"2026-07-15 19:27:37.000000000","message":"https://review.opendev.org/c/openstack/swift/+/997112 fixed it on master.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":true,"context_lines":[{"line_number":270,"context_line":"                if account_response.status \u003d\u003d HTTP_NOT_FOUND:"},{"line_number":271,"context_line":"                    account_404s +\u003d 1"},{"line_number":272,"context_line":"                elif not is_success(account_response.status):"},{"line_number":273,"context_line":"                    self.logger.error("},{"line_number":274,"context_line":"                        \u0027ERROR Account update failed \u0027"},{"line_number":275,"context_line":"                        \u0027with %(ip)s:%(port)s/%(device)s (will retry \u0027"},{"line_number":276,"context_line":"                        \u0027later): Response %(status)s %(reason)s\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"41f14693_d979ef0d","line":273,"in_reply_to":"dbddb215_19e77265","updated":"2026-03-13 16:24:43.000000000","message":"Uh, right! That\u0027s one of the cases where this implementation slightly differs.\n\nNow this brings up the concern that logging is no longer covered by the timeout. Hmm...","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":267,"context_line":"                    timeout\u003dself.conn_timeout)"},{"line_number":268,"context_line":"                with Timeout(self.node_timeout, socket\u003dconn.sock):"},{"line_number":269,"context_line":"                    account_response \u003d conn.getresponse()"},{"line_number":270,"context_line":"                    account_response.read()"},{"line_number":271,"context_line":"                if account_response.status \u003d\u003d HTTP_NOT_FOUND:"},{"line_number":272,"context_line":"                    account_404s +\u003d 1"},{"line_number":273,"context_line":"                elif not is_success(account_response.status):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ce0d6069_e6b34f3a","line":270,"updated":"2026-07-09 21:33:15.000000000","message":"`check_time` in between?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                    timeout\u003dself.conn_timeout)"},{"line_number":268,"context_line":"                with Timeout(self.node_timeout, socket\u003dconn.sock):"},{"line_number":269,"context_line":"                    account_response \u003d conn.getresponse()"},{"line_number":270,"context_line":"                    account_response.read()"},{"line_number":271,"context_line":"                if account_response.status \u003d\u003d HTTP_NOT_FOUND:"},{"line_number":272,"context_line":"                    account_404s +\u003d 1"},{"line_number":273,"context_line":"                elif not is_success(account_response.status):"}],"source_content_type":"text/x-python","patch_set":10,"id":"623cd9c7_d164f47f","line":270,"in_reply_to":"ce0d6069_e6b34f3a","updated":"2026-07-22 12:39:40.000000000","message":"Acknowledged","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"}],"swift/container/updater.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":346,"context_line":"        with Timeout(self.node_timeout, socket\u003dconn.sock):"},{"line_number":347,"context_line":"            try:"},{"line_number":348,"context_line":"                resp \u003d conn.getresponse()"},{"line_number":349,"context_line":"                resp.read()"},{"line_number":350,"context_line":"                return resp.status"},{"line_number":351,"context_line":"            except (Exception, Timeout):"},{"line_number":352,"context_line":"                if self.logger.getEffectiveLevel() \u003c\u003d logging.DEBUG:"}],"source_content_type":"text/x-python","patch_set":10,"id":"906fb5c7_dafe524a","line":349,"updated":"2026-07-09 21:33:15.000000000","message":"`check_time`?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":346,"context_line":"        with Timeout(self.node_timeout, socket\u003dconn.sock):"},{"line_number":347,"context_line":"            try:"},{"line_number":348,"context_line":"                resp \u003d conn.getresponse()"},{"line_number":349,"context_line":"                resp.read()"},{"line_number":350,"context_line":"                return resp.status"},{"line_number":351,"context_line":"            except (Exception, Timeout):"},{"line_number":352,"context_line":"                if self.logger.getEffectiveLevel() \u003c\u003d logging.DEBUG:"}],"source_content_type":"text/x-python","patch_set":10,"id":"77d09d4b_e35f0e8a","line":349,"in_reply_to":"906fb5c7_dafe524a","updated":"2026-07-22 12:39:40.000000000","message":"Acknowledged","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"}],"swift/obj/reconstructor.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c61d0b9660fc44a44fc2699422e559ab9b330c55","unresolved":true,"context_lines":[{"line_number":919,"context_line":"                # Note: this timeout behaviour is changed. Total timeout for"},{"line_number":920,"context_line":"                # http_connect + getresponse was self.http_timeout before the"},{"line_number":921,"context_line":"                # eventlet removal refactoring, now it\u0027s http_timeout for each"},{"line_number":922,"context_line":"                # of them."},{"line_number":923,"context_line":"                conn \u003d http_connect("},{"line_number":924,"context_line":"                    node[\u0027replication_ip\u0027], node[\u0027replication_port\u0027],"},{"line_number":925,"context_line":"                    node[\u0027device\u0027], job[\u0027partition\u0027], \u0027REPLICATE\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"66bca04d_d3d3a667","line":922,"updated":"2026-03-12 00:32:25.000000000","message":"Really, it was kind of weird before -- I don\u0027t think we generally combined those two timeouts like that -- though I see you left a similar comment in the replicator.\n\nAnd we even already have a `conn_timeout` in the config ... https://review.opendev.org/c/openstack/swift/+/980178","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1311ff2e66ca6ea56a4782205038d21382f2e675","unresolved":false,"context_lines":[{"line_number":919,"context_line":"                # Note: this timeout behaviour is changed. Total timeout for"},{"line_number":920,"context_line":"                # http_connect + getresponse was self.http_timeout before the"},{"line_number":921,"context_line":"                # eventlet removal refactoring, now it\u0027s http_timeout for each"},{"line_number":922,"context_line":"                # of them."},{"line_number":923,"context_line":"                conn \u003d http_connect("},{"line_number":924,"context_line":"                    node[\u0027replication_ip\u0027], node[\u0027replication_port\u0027],"},{"line_number":925,"context_line":"                    node[\u0027device\u0027], job[\u0027partition\u0027], \u0027REPLICATE\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"2b0b83b8_da743fdd","line":922,"in_reply_to":"66bca04d_d3d3a667","updated":"2026-03-13 16:24:43.000000000","message":"Thx, will use that. Much better.","commit_id":"4d90e61e04dcf1f15a9e0215ef0e2036a52a735f"}],"swift/obj/replicator.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":691,"context_line":"                if node[\u0027region\u0027] in synced_remote_regions:"},{"line_number":692,"context_line":"                    continue"},{"line_number":693,"context_line":"                try:"},{"line_number":694,"context_line":"                    with Timeout(self.http_timeout):"},{"line_number":695,"context_line":"                        conn \u003d http_connect("},{"line_number":696,"context_line":"                            node[\u0027replication_ip\u0027], node[\u0027replication_port\u0027],"},{"line_number":697,"context_line":"                            node[\u0027device\u0027], job[\u0027partition\u0027], \u0027REPLICATE\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1182494c_3669582b","line":694,"updated":"2026-07-09 21:33:15.000000000","message":"I feel like we want to separate the overall timeout from the `conn_timeout` like we did in the reconstructor, that way we can pass `conn.sock` for the later `Timeout`","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":691,"context_line":"                if node[\u0027region\u0027] in synced_remote_regions:"},{"line_number":692,"context_line":"                    continue"},{"line_number":693,"context_line":"                try:"},{"line_number":694,"context_line":"                    with Timeout(self.http_timeout):"},{"line_number":695,"context_line":"                        conn \u003d http_connect("},{"line_number":696,"context_line":"                            node[\u0027replication_ip\u0027], node[\u0027replication_port\u0027],"},{"line_number":697,"context_line":"                            node[\u0027device\u0027], job[\u0027partition\u0027], \u0027REPLICATE\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"abe09f9a_9a3a342b","line":694,"in_reply_to":"1182494c_3669582b","updated":"2026-07-22 12:39:40.000000000","message":"Acknowledged","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"}],"swift/obj/ssync_receiver.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":121,"context_line":"        self.chunk_size \u003d chunk_size"},{"line_number":122,"context_line":"        self.timeout \u003d timeout"},{"line_number":123,"context_line":"        self.exception \u003d None"},{"line_number":124,"context_line":"        get_socket \u003d getattr(wsgi_input, \u0027get_socket\u0027, None)"},{"line_number":125,"context_line":"        self.socket \u003d get_socket() if get_socket else None"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def read_line(self, context):"}],"source_content_type":"text/x-python","patch_set":10,"id":"f5cf1154_4505eb6e","line":124,"range":{"start_line":124,"start_character":55,"end_line":124,"end_character":59},"updated":"2026-07-09 21:33:15.000000000","message":"nit: Maybe use `lambda: None` and skip the conditional on the next line?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        self.chunk_size \u003d chunk_size"},{"line_number":122,"context_line":"        self.timeout \u003d timeout"},{"line_number":123,"context_line":"        self.exception \u003d None"},{"line_number":124,"context_line":"        get_socket \u003d getattr(wsgi_input, \u0027get_socket\u0027, None)"},{"line_number":125,"context_line":"        self.socket \u003d get_socket() if get_socket else None"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def read_line(self, context):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fe2ee3c5_cc34496d","line":124,"range":{"start_line":124,"start_character":55,"end_line":124,"end_character":59},"in_reply_to":"f5cf1154_4505eb6e","updated":"2026-07-22 12:39:40.000000000","message":"Acknowledged","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"}],"swift/obj/ssync_sender.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":245,"context_line":"        connection \u003d response \u003d None"},{"line_number":246,"context_line":"        node_addr \u003d \u0027%s:%s\u0027 % (self.node[\u0027replication_ip\u0027],"},{"line_number":247,"context_line":"                               self.node[\u0027replication_port\u0027])"},{"line_number":248,"context_line":"        connection \u003d SsyncBufferedHTTPConnection(node_addr)"},{"line_number":249,"context_line":"        with exceptions.MessageTimeout("},{"line_number":250,"context_line":"                self.daemon.conn_timeout, \u0027connect send\u0027,"},{"line_number":251,"context_line":"                socket\u003dconnection.sock):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9193af4a_396d3bff","line":248,"updated":"2026-07-09 21:33:15.000000000","message":"Should we be passing a timeout here?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        connection \u003d response \u003d None"},{"line_number":246,"context_line":"        node_addr \u003d \u0027%s:%s\u0027 % (self.node[\u0027replication_ip\u0027],"},{"line_number":247,"context_line":"                               self.node[\u0027replication_port\u0027])"},{"line_number":248,"context_line":"        connection \u003d SsyncBufferedHTTPConnection(node_addr)"},{"line_number":249,"context_line":"        with exceptions.MessageTimeout("},{"line_number":250,"context_line":"                self.daemon.conn_timeout, \u0027connect send\u0027,"},{"line_number":251,"context_line":"                socket\u003dconnection.sock):"}],"source_content_type":"text/x-python","patch_set":10,"id":"afcc102c_67406a43","line":248,"in_reply_to":"9193af4a_396d3bff","updated":"2026-07-22 12:39:40.000000000","message":"Ack - I slightly refactored this.","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"}],"swift/obj/updater.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":980,"context_line":"                                  node_to_string(node, replication\u003dTrue))"},{"line_number":981,"context_line":"        except Timeout as exc:"},{"line_number":982,"context_line":"            action \u003d \u0027connecting to\u0027"},{"line_number":983,"context_line":"            if not isinstance(exc, ConnectionTimeout):"},{"line_number":984,"context_line":"                # i.e., we definitely made the request but gave up"},{"line_number":985,"context_line":"                # waiting for the response"},{"line_number":986,"context_line":"                status \u003d 499"}],"source_content_type":"text/x-python","patch_set":10,"id":"db24e1ac_d1fea32f","line":983,"range":{"start_line":983,"start_character":35,"end_line":983,"end_character":52},"updated":"2026-07-09 21:33:15.000000000","message":"I don\u0027t think this ever gets raised now.","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":980,"context_line":"                                  node_to_string(node, replication\u003dTrue))"},{"line_number":981,"context_line":"        except Timeout as exc:"},{"line_number":982,"context_line":"            action \u003d \u0027connecting to\u0027"},{"line_number":983,"context_line":"            if not isinstance(exc, ConnectionTimeout):"},{"line_number":984,"context_line":"                # i.e., we definitely made the request but gave up"},{"line_number":985,"context_line":"                # waiting for the response"},{"line_number":986,"context_line":"                status \u003d 499"}],"source_content_type":"text/x-python","patch_set":10,"id":"65ec5b23_e58588fe","line":983,"range":{"start_line":983,"start_character":35,"end_line":983,"end_character":52},"in_reply_to":"db24e1ac_d1fea32f","updated":"2026-07-22 12:39:40.000000000","message":"Done","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":2094,"context_line":"                    with Timeout(self.app.node_timeout, socket\u003dconn.sock):"},{"line_number":2095,"context_line":"                        conn.send(body)"},{"line_number":2096,"context_line":"                with Timeout(self.app.node_timeout, socket\u003dconn.sock):"},{"line_number":2097,"context_line":"                    resp \u003d conn.getresponse()"},{"line_number":2098,"context_line":"                    if (self.app.check_response(node, self.server_type, resp,"},{"line_number":2099,"context_line":"                                                method, path)"},{"line_number":2100,"context_line":"                            and not is_informational(resp.status)):"}],"source_content_type":"text/x-python","patch_set":10,"id":"427d629c_1f1d324d","line":2097,"updated":"2026-07-09 21:33:15.000000000","message":"`check_time` just after this?","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":2094,"context_line":"                    with Timeout(self.app.node_timeout, socket\u003dconn.sock):"},{"line_number":2095,"context_line":"                        conn.send(body)"},{"line_number":2096,"context_line":"                with Timeout(self.app.node_timeout, socket\u003dconn.sock):"},{"line_number":2097,"context_line":"                    resp \u003d conn.getresponse()"},{"line_number":2098,"context_line":"                    if (self.app.check_response(node, self.server_type, resp,"},{"line_number":2099,"context_line":"                                                method, path)"},{"line_number":2100,"context_line":"                            and not is_informational(resp.status)):"}],"source_content_type":"text/x-python","patch_set":10,"id":"a39b71b1_a143e218","line":2097,"in_reply_to":"427d629c_1f1d324d","updated":"2026-07-22 12:39:40.000000000","message":"Acknowledged","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"971daa67d8e5f6168fdaca469e6486781bade5c0","unresolved":true,"context_lines":[{"line_number":1961,"context_line":""},{"line_number":1962,"context_line":"        :returns: Putter instance"},{"line_number":1963,"context_line":""},{"line_number":1964,"context_line":"        :raises ConnectionTimeout: if initial connection timed out"},{"line_number":1965,"context_line":"        :raises ResponseTimeout: if header retrieval timed out"},{"line_number":1966,"context_line":"        :raises InsufficientStorage: on 507 response from node"},{"line_number":1967,"context_line":"        :raises PutterConnectError: on non-507 server error response from node"}],"source_content_type":"text/x-python","patch_set":10,"id":"0dfaabc6_70893a3c","line":1964,"range":{"start_line":1964,"start_character":16,"end_line":1964,"end_character":33},"updated":"2026-07-09 21:33:15.000000000","message":"This still getting raised? Seems like we\u0027re going to get stdlib `TimeoutError`s...","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":1961,"context_line":""},{"line_number":1962,"context_line":"        :returns: Putter instance"},{"line_number":1963,"context_line":""},{"line_number":1964,"context_line":"        :raises ConnectionTimeout: if initial connection timed out"},{"line_number":1965,"context_line":"        :raises ResponseTimeout: if header retrieval timed out"},{"line_number":1966,"context_line":"        :raises InsufficientStorage: on 507 response from node"},{"line_number":1967,"context_line":"        :raises PutterConnectError: on non-507 server error response from node"}],"source_content_type":"text/x-python","patch_set":10,"id":"f1f7a083_b77b0526","line":1964,"range":{"start_line":1964,"start_character":16,"end_line":1964,"end_character":33},"in_reply_to":"0dfaabc6_70893a3c","updated":"2026-07-22 12:39:40.000000000","message":"Yes - ResponseTimeout inherits `Timeout.__exit__`, which turns a raw socket timeout back into ResponseTimeout","commit_id":"56fbf23a338f48a630951ddc52b2b34e38be30d6"}],"test/unit/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c382745ba0be788868edc348eaa9aa0d5136112a","unresolved":true,"context_lines":[{"line_number":1065,"context_line":"        if kwargs.get(\u0027slow_connect\u0027, False):"},{"line_number":1066,"context_line":"            # Previously slept 0.1s so a ConnectionTimeout would fire; that"},{"line_number":1067,"context_line":"            # context manager is gone now, so raise it directly."},{"line_number":1068,"context_line":"            raise exceptions.ConnectionTimeout()"},{"line_number":1069,"context_line":"        if \u0027give_content_type\u0027 in kwargs:"},{"line_number":1070,"context_line":"            if len(args) \u003e\u003d 7 and \u0027Content-Type\u0027 in args[6]:"},{"line_number":1071,"context_line":"                kwargs[\u0027give_content_type\u0027](args[6][\u0027Content-Type\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"c6643baa_666a3e08","line":1068,"updated":"2026-07-13 19:31:22.000000000","message":"I don\u0027t like this, having tests `raise ConnectionTimeout` when nothing under `swift/` does a `with ConnectionTimeout(...):` -- shouldn\u0027t this `raise TimeoutError` instead, from stdlib?\n\nProbably doesn\u0027t make a huge difference in prod -- I think the main thing is that logging will hit https://github.com/openstack/swift/blob/2.38.0/swift/common/utils/logs.py#L329-L330 instead of https://github.com/openstack/swift/blob/2.38.0/swift/common/utils/logs.py#L335-L340","commit_id":"4ea9fbbf39121862d90ddf037c7893fe5f2825ec"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a6dd0008907a56bd9914bdd2ba4ac19dc83057a6","unresolved":false,"context_lines":[{"line_number":1065,"context_line":"        if kwargs.get(\u0027slow_connect\u0027, False):"},{"line_number":1066,"context_line":"            # Previously slept 0.1s so a ConnectionTimeout would fire; that"},{"line_number":1067,"context_line":"            # context manager is gone now, so raise it directly."},{"line_number":1068,"context_line":"            raise exceptions.ConnectionTimeout()"},{"line_number":1069,"context_line":"        if \u0027give_content_type\u0027 in kwargs:"},{"line_number":1070,"context_line":"            if len(args) \u003e\u003d 7 and \u0027Content-Type\u0027 in args[6]:"},{"line_number":1071,"context_line":"                kwargs[\u0027give_content_type\u0027](args[6][\u0027Content-Type\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"acd58113_e1f22bcb","line":1068,"in_reply_to":"c6643baa_666a3e08","updated":"2026-07-22 12:39:40.000000000","message":"Done","commit_id":"4ea9fbbf39121862d90ddf037c7893fe5f2825ec"}]}
