)]}'
{"swift/common/daemon.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"43b80b0145f341a50d0e7c0a86e1878e69cd3b1c","unresolved":false,"context_lines":[{"line_number":294,"context_line":"        sys.exit(e)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    # patch eventlet/logging early"},{"line_number":297,"context_line":"    utils.monkey_patch()"},{"line_number":298,"context_line":"    if not eventlet_disabled():"},{"line_number":299,"context_line":"        eventlet.hubs.use_hub(utils.get_hub())"},{"line_number":300,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"4adaa572_839678e4","line":297,"updated":"2025-09-25 19:19:02.000000000","message":"Should this go in the `if` too? Oh, I guess we still want to patch logging to have a `notice` level...","commit_id":"211a6477c1da58d78edfd8d3e06a01e6c475d224"}],"swift/common/db_replicator.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"43b80b0145f341a50d0e7c0a86e1878e69cd3b1c","unresolved":true,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from swift.common.utils import eventlet_disabled"},{"line_number":28,"context_line":"if not eventlet_disabled():"},{"line_number":29,"context_line":"    from eventlet import Timeout, sleep, GreenPool"},{"line_number":30,"context_line":"    from eventlet.green import subprocess"},{"line_number":31,"context_line":"else:"},{"line_number":32,"context_line":"    from swift.common.exceptions import Timeout"}],"source_content_type":"text/x-python","patch_set":6,"id":"63bb0688_945b8f63","line":29,"range":{"start_line":29,"start_character":41,"end_line":29,"end_character":50},"updated":"2025-09-25 19:19:02.000000000","message":"We have no `GreenPool` anymore -- won\u0027t that cause trouble in `Replicator.__init__`?","commit_id":"211a6477c1da58d78edfd8d3e06a01e6c475d224"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"43b80b0145f341a50d0e7c0a86e1878e69cd3b1c","unresolved":true,"context_lines":[{"line_number":68,"context_line":"    import eventlet.hubs"},{"line_number":69,"context_line":"else:"},{"line_number":70,"context_line":"    class GreenPool:"},{"line_number":71,"context_line":"        pass"},{"line_number":72,"context_line":"    from swift.common.exceptions import Timeout"},{"line_number":73,"context_line":"    from time import sleep"},{"line_number":74,"context_line":"    import socket"}],"source_content_type":"text/x-python","patch_set":6,"id":"94703404_7e4ce8ed","line":71,"updated":"2025-09-25 19:19:02.000000000","message":"Do you have a sense yet for whether we\u0027ll need to implement this with threads ourselves or can we use something like `concurrent.futures.ThreadPoolExecutor`? Maybe we end up making more of an adapter...","commit_id":"211a6477c1da58d78edfd8d3e06a01e6c475d224"}],"swift/common/utils/logs.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"43b80b0145f341a50d0e7c0a86e1878e69cd3b1c","unresolved":true,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"def logging_monkey_patch():"},{"line_number":62,"context_line":"    # explicitly patch the logging lock"},{"line_number":63,"context_line":"    logging._lock \u003d logging.threading.RLock()"},{"line_number":64,"context_line":"    # setup notice level logging"},{"line_number":65,"context_line":"    logging.addLevelName(NOTICE, \u0027NOTICE\u0027)"},{"line_number":66,"context_line":"    SysLogHandler.priority_map[\u0027NOTICE\u0027] \u003d \u0027notice\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"a5dad1fe_75ea004e","line":63,"updated":"2025-09-25 19:19:02.000000000","message":"I *think* we only need this when eventlet is enabled.","commit_id":"211a6477c1da58d78edfd8d3e06a01e6c475d224"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"43b80b0145f341a50d0e7c0a86e1878e69cd3b1c","unresolved":true,"context_lines":[{"line_number":66,"context_line":"    SysLogHandler.priority_map[\u0027NOTICE\u0027] \u003d \u0027notice\u0027"},{"line_number":67,"context_line":"    # Trying to log threads while monkey-patched can lead to deadlocks; see"},{"line_number":68,"context_line":"    # https://bugs.launchpad.net/swift/+bug/1895739"},{"line_number":69,"context_line":"    logging.logThreads \u003d 0"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class PipeMutex(object):"}],"source_content_type":"text/x-python","patch_set":6,"id":"a2a756d7_0d01c337","line":69,"updated":"2025-09-25 19:19:02.000000000","message":"Maybe this, too?","commit_id":"211a6477c1da58d78edfd8d3e06a01e6c475d224"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"43b80b0145f341a50d0e7c0a86e1878e69cd3b1c","unresolved":true,"context_lines":[{"line_number":320,"context_line":"            instances \u003d (http.client.BadStatusLine,"},{"line_number":321,"context_line":"                         green_http_client.BadStatusLine)"},{"line_number":322,"context_line":"        else:"},{"line_number":323,"context_line":"            instances \u003d (http.client.BadStatusLine, )"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        if isinstance(exc, instances):"},{"line_number":326,"context_line":"            # Use error(); not really exceptional"}],"source_content_type":"text/x-python","patch_set":6,"id":"cc729bcb_5633b10e","line":323,"updated":"2025-09-25 19:19:02.000000000","message":"I\u0027m *so* looking forward to us being able to simplify this again in the future 😊","commit_id":"211a6477c1da58d78edfd8d3e06a01e6c475d224"}],"swift/common/wsgi.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"43b80b0145f341a50d0e7c0a86e1878e69cd3b1c","unresolved":true,"context_lines":[{"line_number":36,"context_line":"    from eventlet.green import socket, ssl"},{"line_number":37,"context_line":"    from eventlet.green.os import wait"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    from swift.common.http_protocol import SwiftHttpProtocol, \\"},{"line_number":40,"context_line":"        SwiftHttpProxiedProtocol"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    # Set maximum line size of message headers to be accepted."},{"line_number":43,"context_line":"    wsgi.MAX_HEADER_LINE \u003d constraints.MAX_HEADER_SIZE"}],"source_content_type":"text/x-python","patch_set":6,"id":"79d1d328_9a08cbec","line":40,"range":{"start_line":39,"start_character":43,"end_line":40,"end_character":32},"updated":"2025-09-25 19:19:02.000000000","message":"If eventlet is disabled, these aren\u0027t available -- I guess [there\u0027s a config option](https://docs.gunicorn.org/en/stable/settings.html#proxy-protocol) to get us PROXY protocol support with gunicorn -- I wonder if we\u0027re stuck with gunicorn\u0027s HTTP parsing, and how well that will mesh with our expectation that even header names can have UTF-8...","commit_id":"211a6477c1da58d78edfd8d3e06a01e6c475d224"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"43b80b0145f341a50d0e7c0a86e1878e69cd3b1c","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        try:"},{"line_number":60,"context_line":"            sock.shutdown(socket.SHUT_RDWR)"},{"line_number":61,"context_line":"        except OSError:"},{"line_number":62,"context_line":"            pass"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"from paste.deploy import loadwsgi"},{"line_number":65,"context_line":"from io import BytesIO, StringIO"}],"source_content_type":"text/x-python","patch_set":6,"id":"52dbd2fc_c9d94130","line":62,"updated":"2025-09-25 19:19:02.000000000","message":"I guess we probably don\u0027t need to worry about the possibility of an `SSL.Connection` [like eventlet does](https://github.com/eventlet/eventlet/blob/0.40.3/eventlet/greenio/base.py#L478-L480).","commit_id":"211a6477c1da58d78edfd8d3e06a01e6c475d224"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"43b80b0145f341a50d0e7c0a86e1878e69cd3b1c","unresolved":true,"context_lines":[{"line_number":225,"context_line":"                              family\u003daddress_family)"},{"line_number":226,"context_line":"            else:"},{"line_number":227,"context_line":"                sock \u003d socket.socket(address_family, socket.SOCK_STREAM)"},{"line_number":228,"context_line":"                sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)"},{"line_number":229,"context_line":"                sock.settimeout(float(conf.get(\u0027client_timeout\u0027) or 60))"},{"line_number":230,"context_line":"                sock.bind(bind_addr)"},{"line_number":231,"context_line":"                sock.listen(int(conf.get(\u0027backlog\u0027, 4096)))"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a51f54e_debc449b","line":228,"updated":"2025-09-25 19:19:02.000000000","message":"Should we set `SO_REUSEPORT`, too, like [eventlet still defaults to doing](https://github.com/eventlet/eventlet/blob/0.40.3/eventlet/convenience.py#L59-L60)?\n\nEvery time, I need to look up the differences between these options! Even after reading https://stackoverflow.com/questions/14388706/how-do-so-reuseaddr-and-so-reuseport-differ and https://lwn.net/Articles/542629/ I still come away confused...","commit_id":"211a6477c1da58d78edfd8d3e06a01e6c475d224"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"43b80b0145f341a50d0e7c0a86e1878e69cd3b1c","unresolved":true,"context_lines":[{"line_number":749,"context_line":"            if not eventlet_disabled():"},{"line_number":750,"context_line":"                eventlet.spawn_n(smother)"},{"line_number":751,"context_line":"            else:"},{"line_number":752,"context_line":"                threading.Thread(smother)"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":"        finally:"},{"line_number":755,"context_line":"            os.close(worker_state_fd)"}],"source_content_type":"text/x-python","patch_set":6,"id":"6f6c0552_f53f032b","line":752,"updated":"2025-09-25 19:19:02.000000000","message":"Needs a `.start()`, yeah?","commit_id":"211a6477c1da58d78edfd8d3e06a01e6c475d224"}]}
