)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cbd6c8bbecb415fa60f87ef8a9843c8937a6810d","unresolved":true,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Add a new keepalive_timeout option to give proxies a way to drop these"},{"line_number":15,"context_line":"established-but-idle connections without impacting active connections"},{"line_number":16,"context_line":"(as may happen when reducing client_timeout). Note that the *first*"},{"line_number":17,"context_line":"request on the socket gets a full client_timeout to send the request"},{"line_number":18,"context_line":"line."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: Ib5bb84fa3f8a4b9c062d58c8d3689e7030d9feb3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"c07fe88b_439ec498","line":18,"range":{"start_line":16,"start_character":46,"end_line":18,"end_character":5},"updated":"2023-02-21 19:34:49.000000000","message":"Still not sure whether I like this carve-out or not.","commit_id":"e325506b8ee372fcdffd72dd83e5cbf526141c11"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f246dd58c53cc32ed10e40d2b49782af39fc94ce","unresolved":true,"context_lines":[{"line_number":14,"context_line":"Add a new keepalive_timeout option to give proxies a way to drop these"},{"line_number":15,"context_line":"established-but-idle connections without impacting active connections"},{"line_number":16,"context_line":"(as may happen when reducing client_timeout). Note that this requires"},{"line_number":17,"context_line":"eventlet 0.33.4 or later."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: Ib5bb84fa3f8a4b9c062d58c8d3689e7030d9feb3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"aa9141af_39c307bc","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":15},"updated":"2023-04-21 16:50:45.000000000","message":"Note to reviewers: There has not yet been an eventlet release to include this feature. You may want to install from master, like\n\n    pip install git+https://github.com/eventlet/eventlet.git","commit_id":"469c38e9fb91bf383e92fd697eceb07f30316030"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"590b7d30f7dbf575c6f91bfb18c4d16f81b4075e","unresolved":true,"context_lines":[{"line_number":14,"context_line":"Add a new keepalive_timeout option to give proxies a way to drop these"},{"line_number":15,"context_line":"established-but-idle connections without impacting active connections"},{"line_number":16,"context_line":"(as may happen when reducing client_timeout). Note that this requires"},{"line_number":17,"context_line":"eventlet 0.33.4 or later."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: Ib5bb84fa3f8a4b9c062d58c8d3689e7030d9feb3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"b8f0f0c2_8ec0ef88","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":15},"in_reply_to":"aa9141af_39c307bc","updated":"2023-05-08 18:12:04.000000000","message":"Bah -- if you\u0027ve already got eventlet 0.33.3 installed from PyPI, you may need to do something more like\n```\npip install --upgrade --force-reinstall git+https://github.com/eventlet/eventlet.git\n```","commit_id":"469c38e9fb91bf383e92fd697eceb07f30316030"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"65212c18dd6161add86cdb5c7a4a411e94fbd1a0","unresolved":true,"context_lines":[{"line_number":16,"context_line":"(as may happen when reducing client_timeout). Note that this requires"},{"line_number":17,"context_line":"eventlet 0.33.4 or later."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: Ib5bb84fa3f8a4b9c062d58c8d3689e7030d9feb3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"0cda0217_8e90aea0","line":19,"updated":"2023-04-28 17:31:26.000000000","message":"I should probably include a\n\n    Partial-Bug: #1390087\n\nSee https://bugs.launchpad.net/swift/+bug/1390087","commit_id":"469c38e9fb91bf383e92fd697eceb07f30316030"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c24dc5b367adda5267b9bc8222957e9c8a7baab8","unresolved":true,"context_lines":[{"line_number":16,"context_line":"(as may happen when reducing client_timeout). Note that this requires"},{"line_number":17,"context_line":"eventlet 0.33.4 or later."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: Ib5bb84fa3f8a4b9c062d58c8d3689e7030d9feb3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"d87a5d07_fad8d0c4","line":19,"in_reply_to":"0cda0217_8e90aea0","updated":"2023-05-08 07:14:34.000000000","message":"yeah, you might as well. Wow, that\u0027s an old bug!","commit_id":"469c38e9fb91bf383e92fd697eceb07f30316030"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"6de14c5625053252f7ba8cbfaf0835ffeb51e88f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"39f49652_fe13dd05","updated":"2023-02-15 01:13:35.000000000","message":"This looks a little insane, on two counts. I\u0027m not even putting -1 to this, I must be not reading it in right frame of mind.\n1. Flopping timeouts on every read? Really?\n2. The parameter\u0027s name is keepalive but its action is timeout. In normal circumstances, keepalive is smaller than timeout, so that it can forestall the timeout. It\u0027s a gotcha you\u0027re embedding.","commit_id":"42fac0903e5e23bcb0ee8b0375d1afcb8fb50387"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c115ad072a71f66d6390c8d6ed3fc6e674bc82a2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e62b9c90_3bf0c8ea","updated":"2023-02-17 13:51:18.000000000","message":"This might be more reasonable than I imagined at first glance.  We need to do something - so we\u0027re looking for the best option we have RIGHT NOW.\n\nThe eventlet alternative still has some other issues:\n\nhttps://github.com/eventlet/eventlet/pull/788\n\nOTOH, I guess this patch still has some issues too:\n\nE               AttributeError: \u0027_io.BytesIO\u0027 object has no attribute \u0027_sock\u0027\n","commit_id":"42fac0903e5e23bcb0ee8b0375d1afcb8fb50387"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0110d9e5c04d840239d2953c3dca78eab638d9f8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"69d30fff_820c422b","in_reply_to":"39f49652_fe13dd05","updated":"2023-02-15 17:30:50.000000000","message":"It *is* a little insane -- probably better as an eventlet patch: https://github.com/eventlet/eventlet/pull/788\n\nBut:\n\n- Timeouts are only getting flopped every time we read *a request line* -- and that\u0027s for the sake of eventlet, anyway -- the actual low-level socket object will stay nonblocking this whole time.\n- I\u0027m thinking \"keepalive\" in the HTTP sense, rather than TCP sense. It was an unfortunate conflation of ideas :-( `idle_timeout` would probably be better...","commit_id":"42fac0903e5e23bcb0ee8b0375d1afcb8fb50387"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"da69ffb94789d7e63f3b2cf1ccd8707bfb2c79da","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"85e8cc40_8c2d4765","in_reply_to":"e62b9c90_3bf0c8ea","updated":"2023-02-17 16:43:46.000000000","message":"Eh, that\u0027s a test/mock issue. I\u0027ll fix it up today.","commit_id":"42fac0903e5e23bcb0ee8b0375d1afcb8fb50387"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b3e14ac7a25c8ad36a96e40959f0695ff7c70b20","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"67c35969_358c6a8d","updated":"2023-02-21 19:00:03.000000000","message":"I think this is reasonable\n\nThe common.wsgi keepalive_timeout config optoin plumbing should be easy to test\n\nI\u0027m curious if we could capture the settimeout somehow in a unittest or even test the keep alive expiration behavior in a functest or in-process test.","commit_id":"e325506b8ee372fcdffd72dd83e5cbf526141c11"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c24dc5b367adda5267b9bc8222957e9c8a7baab8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"679d3c6b_2a86787f","updated":"2023-05-08 07:14:34.000000000","message":"Currently digging into this. I have recreated the issue in my VSAIO that I initally saw. Problem still exists (obviously) without the patch. Applying patch it still exists. Add a value, still exists.. Just installed the later version of eventlet.. still seems to be \"stuck\".. but no doubt I\u0027ve missed something.. maybe it hasn\u0027t probably reloaded with the upstream eventlet properly.\nSo will keep going. Not going to -1 until I confirm it isn\u0027t a user (matt) error :P","commit_id":"469c38e9fb91bf383e92fd697eceb07f30316030"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"700ac23299db37da4315b017182e40deec64ab8b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"5de2165e_1d0597bd","updated":"2023-04-19 06:14:17.000000000","message":"I was disappointed to see timeout-setting on every read, but now that eventlet does it anyway, precisely for our use case, might as well just use that feature.","commit_id":"469c38e9fb91bf383e92fd697eceb07f30316030"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f0a28a49b27ecdc0746b92a01894594a735a1a0c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"e92daacd_fef8606b","updated":"2023-05-09 01:39:07.000000000","message":"OK, I got it working. Because there isn\u0027t a  0.33.4 tagged yet, forcing an upgrade was enough to push it to the latest master (so it\u0027ll say 0.33.3) but when double checking the file contained Tim\u0027s upstream patch.\n\nOn the recreated issue, the pipelined requests of a bad client hold up all connections. But then I set keepalive_timeout to something like 1 (just to see if it\u0027ll work), and sure enough it started processing all the requests. Awesome work Tim!","commit_id":"469c38e9fb91bf383e92fd697eceb07f30316030"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"590b7d30f7dbf575c6f91bfb18c4d16f81b4075e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"e6ffd5f6_40c915cc","in_reply_to":"679d3c6b_2a86787f","updated":"2023-05-08 18:12:04.000000000","message":"Did you remember to constrain `max_clients`? I started poking at this again today, and forgot to do that for longer than I\u0027d care to admit.\n\nAre you hitting the eventlet server directly, or is there another layer in between (like haproxy or something)? I know I was getting confused sometimes doing a `sudo lsof -i :8080` and still seeing a bunch of ESTABLISHED connections after turning on `keepalive_timeout`, but it was *from haproxy\u0027s perspective*; the number of ESTABLISHED connections from *swift\u0027s* perspective stayed constrained by `max_clients`. There\u0027s probably more tuning I can/should do for my haproxy to ensure (1) the backend connections get cleaned up more promptly and (2) that the backend close gets propagated back to the client more quickly, if only to ensure I don\u0027t run out of file descriptors.","commit_id":"469c38e9fb91bf383e92fd697eceb07f30316030"}],"etc/proxy-server.conf-sample":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c115ad072a71f66d6390c8d6ed3fc6e674bc82a2","unresolved":true,"context_lines":[{"line_number":90,"context_line":"#"},{"line_number":91,"context_line":"# Timeout to use when looking for pipelined requests. Set to zero to disable"},{"line_number":92,"context_line":"# request pipelining. Defaults to client_timeout."},{"line_number":93,"context_line":"# keepalive_timeout \u003d"},{"line_number":94,"context_line":"#"},{"line_number":95,"context_line":"# Note: enabling evenlet_debug might reveal sensitive information, for example"},{"line_number":96,"context_line":"# signatures for temp urls"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"c8e00b89_d3a1393c","line":93,"updated":"2023-02-17 13:51:18.000000000","message":"i think it\u0027s a good idea to have this timeout configured differently from the client_timeout","commit_id":"42fac0903e5e23bcb0ee8b0375d1afcb8fb50387"}],"swift/common/http_protocol.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c115ad072a71f66d6390c8d6ed3fc6e674bc82a2","unresolved":true,"context_lines":[{"line_number":228,"context_line":"        if self.server.keepalive and isinstance(self.server.keepalive,"},{"line_number":229,"context_line":"                                                (int, float)):"},{"line_number":230,"context_line":"            # eventlet expects keepalive to be True or False, but we can"},{"line_number":231,"context_line":"            # hijack it to carry our separate timeout"},{"line_number":232,"context_line":"            if six.PY2:"},{"line_number":233,"context_line":"                self.rfile._sock.settimeout(self.server.keepalive)"},{"line_number":234,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ece4dd19_c7e5bb85","line":231,"updated":"2023-02-17 13:51:18.000000000","message":"that\u0027s kind of a neat trick if it works","commit_id":"42fac0903e5e23bcb0ee8b0375d1afcb8fb50387"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c115ad072a71f66d6390c8d6ed3fc6e674bc82a2","unresolved":true,"context_lines":[{"line_number":240,"context_line":"            self.conn_state[2] \u003d wsgi.STATE_REQUEST"},{"line_number":241,"context_line":"        if self.server.keepalive and isinstance(self.server.keepalive,"},{"line_number":242,"context_line":"                                                (int, float)):"},{"line_number":243,"context_line":"            # since we changed the timeout above, we need put it back"},{"line_number":244,"context_line":"            if six.PY2:"},{"line_number":245,"context_line":"                self.rfile._sock.settimeout(self.server.socket_timeout)"},{"line_number":246,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"4521d7b5_e08892af","line":243,"updated":"2023-02-17 13:51:18.000000000","message":"maybe the reset would look better in a finally block","commit_id":"42fac0903e5e23bcb0ee8b0375d1afcb8fb50387"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"da69ffb94789d7e63f3b2cf1ccd8707bfb2c79da","unresolved":true,"context_lines":[{"line_number":240,"context_line":"            self.conn_state[2] \u003d wsgi.STATE_REQUEST"},{"line_number":241,"context_line":"        if self.server.keepalive and isinstance(self.server.keepalive,"},{"line_number":242,"context_line":"                                                (int, float)):"},{"line_number":243,"context_line":"            # since we changed the timeout above, we need put it back"},{"line_number":244,"context_line":"            if six.PY2:"},{"line_number":245,"context_line":"                self.rfile._sock.settimeout(self.server.socket_timeout)"},{"line_number":246,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"bfbe1f5a_37a27f8e","line":243,"in_reply_to":"4521d7b5_e08892af","updated":"2023-02-17 16:43:46.000000000","message":"*shrug* Sure; I\u0027m respinning anyway. I think state of the socket is (or *should be*) moot if there was an exception, though -- we can\u0027t really trust the HTTP framing any more, so we want/need eventlet to just shut it down.","commit_id":"42fac0903e5e23bcb0ee8b0375d1afcb8fb50387"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cbd6c8bbecb415fa60f87ef8a9843c8937a6810d","unresolved":true,"context_lines":[{"line_number":229,"context_line":"    @contextmanager"},{"line_number":230,"context_line":"    def updated_timeout(self, new_timeout):"},{"line_number":231,"context_line":"        if isinstance(new_timeout, bool) or not self.requests_read:"},{"line_number":232,"context_line":"            # Not started via swift.common.wsgi.run_server, or first"},{"line_number":233,"context_line":"            # request on the socket -- keep existing client_timeout"},{"line_number":234,"context_line":"            yield"},{"line_number":235,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":2,"id":"d28555f1_cf7ecb45","line":232,"range":{"start_line":232,"start_character":14,"end_line":232,"end_character":58},"updated":"2023-02-21 19:34:49.000000000","message":"This was the trouble with the in-process func tests on the last patch -- not sure why it only affected py2, though...","commit_id":"e325506b8ee372fcdffd72dd83e5cbf526141c11"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b3e14ac7a25c8ad36a96e40959f0695ff7c70b20","unresolved":true,"context_lines":[{"line_number":239,"context_line":"        if new_timeout \u003d\u003d old_timeout:"},{"line_number":240,"context_line":"            # No change -- no-op"},{"line_number":241,"context_line":"            yield"},{"line_number":242,"context_line":"            return"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"        sock.settimeout(new_timeout)"},{"line_number":245,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"fe9cb740_48636801","line":242,"updated":"2023-02-21 19:00:03.000000000","message":"this is all fine\n\nI sort of thought maybe the state was a little messy - like we\u0027re passing in attributes as params, and isinstance and if PY2 checking every request - but nothing jumped out as obviously better.","commit_id":"e325506b8ee372fcdffd72dd83e5cbf526141c11"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b3e14ac7a25c8ad36a96e40959f0695ff7c70b20","unresolved":true,"context_lines":[{"line_number":256,"context_line":"        # See https://github.com/eventlet/eventlet/pull/590"},{"line_number":257,"context_line":"        if self.pre_shutdown_bugfix_eventlet:"},{"line_number":258,"context_line":"            self.conn_state[2] \u003d wsgi.STATE_REQUEST"},{"line_number":259,"context_line":"        self.requests_read +\u003d 1"},{"line_number":260,"context_line":"        return got"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    def handle_one_request(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"46b3557b_557e7f54","line":259,"updated":"2023-02-21 19:00:03.000000000","message":"omg, this state is per-connection?  that\u0027s awesome!  We could even say which accounts are doing pipelined requets and how long they wait between them - this is excellent.","commit_id":"e325506b8ee372fcdffd72dd83e5cbf526141c11"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cbd6c8bbecb415fa60f87ef8a9843c8937a6810d","unresolved":true,"context_lines":[{"line_number":256,"context_line":"        # See https://github.com/eventlet/eventlet/pull/590"},{"line_number":257,"context_line":"        if self.pre_shutdown_bugfix_eventlet:"},{"line_number":258,"context_line":"            self.conn_state[2] \u003d wsgi.STATE_REQUEST"},{"line_number":259,"context_line":"        self.requests_read +\u003d 1"},{"line_number":260,"context_line":"        return got"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    def handle_one_request(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"23a142cc_20a4f176","line":259,"in_reply_to":"46b3557b_557e7f54","updated":"2023-02-21 19:34:49.000000000","message":"Yeah, I\u0027ve got a plan to also add something like `keepalive_max_requests` so we can ensure no connection gets to tie up a slot on the GreenPool indefinitely.","commit_id":"e325506b8ee372fcdffd72dd83e5cbf526141c11"}]}
