)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c31c08a553a962ccceacded4d7bd0b25f89436d4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e77a885d_48fcb030","updated":"2022-10-28 14:50:23.000000000","message":"no tests broke, I guess that\u0027s... good?","commit_id":"4d6070471799ffda301c3fa66f30120e32a158ad"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"39691c974ab5a31962c2f41e6db1d604d0fbd238","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"95a4909e_7805fb4e","updated":"2022-11-10 09:26:27.000000000","message":"This is looking pretty cool. I do like that we start them in parellel. We are checking in the same order and failing if one fails.. but that is just as it is today, so not an issue.\n\nNice work Tim.\n\nObviously leaving a TODO isn\u0027t great, but this is making things much better in my opinion.","commit_id":"f08b8e0af215ca987b7a014e6c1f5907a4df7824"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3a4d8a2728380a782d9aff5ff6728f93102178b2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"65375738_060b103d","updated":"2022-11-14 16:27:40.000000000","message":"matt likes it - i guess it\u0027s good enough","commit_id":"f08b8e0af215ca987b7a014e6c1f5907a4df7824"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"78f21c8b4544bcca2568bdb36a18f39a56f0b55d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"2af98ea2_17186bb6","updated":"2022-11-08 17:29:22.000000000","message":"recheck\n\nRolling upgrade job is now non-voting: https://review.opendev.org/c/openstack/swift/+/863929","commit_id":"f08b8e0af215ca987b7a014e6c1f5907a4df7824"}],"swift/common/wsgi.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c31c08a553a962ccceacded4d7bd0b25f89436d4","unresolved":true,"context_lines":[{"line_number":971,"context_line":""},{"line_number":972,"context_line":"        :param socket sock: The listen socket for the worker just started."},{"line_number":973,"context_line":"        :param server_idx: The socket\u0027s server_idx as yielded by"},{"line_number":974,"context_line":"                           :py:meth:`new_worker_socks`."},{"line_number":975,"context_line":"        :param int pid: The new worker process\u0027 PID"},{"line_number":976,"context_line":"        \"\"\""},{"line_number":977,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ac6c52f6_86f37f18","line":974,"updated":"2022-10-28 14:50:23.000000000","message":"I guess this method doesn\u0027t have any real effect, but something about the docstring sounds wrong.","commit_id":"4d6070471799ffda301c3fa66f30120e32a158ad"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"14e6741d6b201c7355dd95809947e260c4fdbfe2","unresolved":true,"context_lines":[{"line_number":971,"context_line":""},{"line_number":972,"context_line":"        :param socket sock: The listen socket for the worker just started."},{"line_number":973,"context_line":"        :param server_idx: The socket\u0027s server_idx as yielded by"},{"line_number":974,"context_line":"                           :py:meth:`new_worker_socks`."},{"line_number":975,"context_line":"        :param int pid: The new worker process\u0027 PID"},{"line_number":976,"context_line":"        \"\"\""},{"line_number":977,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"758540dc_9c551934","line":974,"in_reply_to":"ac6c52f6_86f37f18","updated":"2022-10-28 15:59:11.000000000","message":"\u003e this method doesn\u0027t have any real effect\n\nYeah -- ServersPerPortStrategy.new_worker_socks() does all of its yields without looking at tracking_data. It matters for WorkersStrategy.new_worker_socks() though!\n\n\u003e something about the docstring sounds wrong\n\nI should\u0027ve updated it in the related change :-/","commit_id":"4d6070471799ffda301c3fa66f30120e32a158ad"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c31c08a553a962ccceacded4d7bd0b25f89436d4","unresolved":true,"context_lines":[{"line_number":1127,"context_line":"            else:"},{"line_number":1128,"context_line":"                os.close(write_fd)"},{"line_number":1129,"context_line":"                new_workers[pid] \u003d read_fd"},{"line_number":1130,"context_line":"                strategy.register_worker_start(sock, sock_info, pid)"},{"line_number":1131,"context_line":""},{"line_number":1132,"context_line":"        for pid, read_fd in new_workers.items():"},{"line_number":1133,"context_line":"            worker_status \u003d os.read(read_fd, 30)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bde660d2_5898ddfd","line":1130,"updated":"2022-10-28 14:50:23.000000000","message":"hrmm, before we didn\u0027t call this until the worker responded ready...","commit_id":"4d6070471799ffda301c3fa66f30120e32a158ad"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"39691c974ab5a31962c2f41e6db1d604d0fbd238","unresolved":true,"context_lines":[{"line_number":1127,"context_line":"            else:"},{"line_number":1128,"context_line":"                os.close(write_fd)"},{"line_number":1129,"context_line":"                new_workers[pid] \u003d read_fd"},{"line_number":1130,"context_line":"                strategy.register_worker_start(sock, sock_info, pid)"},{"line_number":1131,"context_line":""},{"line_number":1132,"context_line":"        for pid, read_fd in new_workers.items():"},{"line_number":1133,"context_line":"            worker_status \u003d os.read(read_fd, 30)"}],"source_content_type":"text/x-python","patch_set":1,"id":"4f6233db_61b3e7ab","line":1130,"in_reply_to":"58ea0b4f_d1dc0c17","updated":"2022-11-10 09:26:27.000000000","message":"I guess this fine, so long as if the new worker process does die, the missing pid will be detected and cleaned up as a dead worker next time round. Which we should get on line 1144 in the parent I believe.","commit_id":"4d6070471799ffda301c3fa66f30120e32a158ad"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"14e6741d6b201c7355dd95809947e260c4fdbfe2","unresolved":true,"context_lines":[{"line_number":1127,"context_line":"            else:"},{"line_number":1128,"context_line":"                os.close(write_fd)"},{"line_number":1129,"context_line":"                new_workers[pid] \u003d read_fd"},{"line_number":1130,"context_line":"                strategy.register_worker_start(sock, sock_info, pid)"},{"line_number":1131,"context_line":""},{"line_number":1132,"context_line":"        for pid, read_fd in new_workers.items():"},{"line_number":1133,"context_line":"            worker_status \u003d os.read(read_fd, 30)"}],"source_content_type":"text/x-python","patch_set":1,"id":"58ea0b4f_d1dc0c17","line":1130,"in_reply_to":"bde660d2_5898ddfd","updated":"2022-10-28 15:59:11.000000000","message":"There are two significant things:\n\n- Because of the way we\u0027ve got WorkersStrategy.new_worker_socks() implemented, we need to call this while iterating strategy.new_worker_socks().\n- We need to make sure that workers are ready before calling strategy.signal_ready(). (It doesn\u0027t have to be *all* workers -- see the remaining TODO below -- but all workers is sufficient.)\n\nPreviously, we\u0027d check readiness as we were forking, since it seemed cheap enough (on my VSAIO with workers\u003d4, reloading would take ~10s before this change, and usually I\u0027d run that with workers\u003d1 or 2) and I didn\u0027t see much need for an extra loop.","commit_id":"4d6070471799ffda301c3fa66f30120e32a158ad"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c31c08a553a962ccceacded4d7bd0b25f89436d4","unresolved":true,"context_lines":[{"line_number":1131,"context_line":""},{"line_number":1132,"context_line":"        for pid, read_fd in new_workers.items():"},{"line_number":1133,"context_line":"            worker_status \u003d os.read(read_fd, 30)"},{"line_number":1134,"context_line":"            os.close(read_fd)"},{"line_number":1135,"context_line":"            if worker_status !\u003d b\u0027ready\u0027:"},{"line_number":1136,"context_line":"                raise Exception("},{"line_number":1137,"context_line":"                    \u0027worker %d did not start normally: %r\u0027 %"}],"source_content_type":"text/x-python","patch_set":1,"id":"533f97bf_de9ebe9f","line":1134,"updated":"2022-10-28 14:50:23.000000000","message":"oic, we keep each read_fd for each pid\n\nI wonder how stable this iteration is wrt startup order, and if it matters if we read/close oldest first?","commit_id":"4d6070471799ffda301c3fa66f30120e32a158ad"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"14e6741d6b201c7355dd95809947e260c4fdbfe2","unresolved":false,"context_lines":[{"line_number":1131,"context_line":""},{"line_number":1132,"context_line":"        for pid, read_fd in new_workers.items():"},{"line_number":1133,"context_line":"            worker_status \u003d os.read(read_fd, 30)"},{"line_number":1134,"context_line":"            os.close(read_fd)"},{"line_number":1135,"context_line":"            if worker_status !\u003d b\u0027ready\u0027:"},{"line_number":1136,"context_line":"                raise Exception("},{"line_number":1137,"context_line":"                    \u0027worker %d did not start normally: %r\u0027 %"}],"source_content_type":"text/x-python","patch_set":1,"id":"d4f5ab0c_f0b4de40","line":1134,"in_reply_to":"533f97bf_de9ebe9f","updated":"2022-10-28 15:59:11.000000000","message":"\u003e how stable this iteration is wrt startup order\n\nOn the py3s we care about, very stable -- you get insertion order. See https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-compactdict and https://mail.python.org/pipermail/python-dev/2017-December/151283.html -- it\u0027s part of the language spec now.\n\n\u003e if it matters if we read/close oldest first\n\nNope, doesn\u0027t matter anyway.","commit_id":"4d6070471799ffda301c3fa66f30120e32a158ad"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c31c08a553a962ccceacded4d7bd0b25f89436d4","unresolved":true,"context_lines":[{"line_number":1135,"context_line":"            if worker_status !\u003d b\u0027ready\u0027:"},{"line_number":1136,"context_line":"                raise Exception("},{"line_number":1137,"context_line":"                    \u0027worker %d did not start normally: %r\u0027 %"},{"line_number":1138,"context_line":"                    (pid, worker_status))"},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"        # TODO: signal_ready() as soon as we have at least one new worker for"},{"line_number":1141,"context_line":"        # each port, instead of waiting for all of them"}],"source_content_type":"text/x-python","patch_set":1,"id":"479ee79d_59ea1179","line":1138,"updated":"2022-10-28 14:50:23.000000000","message":"it doesn\u0027t seem like this formatting change is tested - but i\u0027m not sure this block was tested before either.","commit_id":"4d6070471799ffda301c3fa66f30120e32a158ad"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"14e6741d6b201c7355dd95809947e260c4fdbfe2","unresolved":true,"context_lines":[{"line_number":1135,"context_line":"            if worker_status !\u003d b\u0027ready\u0027:"},{"line_number":1136,"context_line":"                raise Exception("},{"line_number":1137,"context_line":"                    \u0027worker %d did not start normally: %r\u0027 %"},{"line_number":1138,"context_line":"                    (pid, worker_status))"},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"        # TODO: signal_ready() as soon as we have at least one new worker for"},{"line_number":1141,"context_line":"        # each port, instead of waiting for all of them"}],"source_content_type":"text/x-python","patch_set":1,"id":"f7acac67_22224969","line":1138,"in_reply_to":"479ee79d_59ea1179","updated":"2022-10-28 15:59:11.000000000","message":"I\u0027m not sure it actually *happens* in practice -- we\u0027ve already checked config up at L1071. Maybe if somebody gets oom-killed or the OS runs out of file descriptors? Or a config file that\u0027s referenced by conf (keymaster.conf, say) changes in an invalid way between that check and actual start-up?","commit_id":"4d6070471799ffda301c3fa66f30120e32a158ad"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"39691c974ab5a31962c2f41e6db1d604d0fbd238","unresolved":true,"context_lines":[{"line_number":1135,"context_line":"            if worker_status !\u003d b\u0027ready\u0027:"},{"line_number":1136,"context_line":"                raise Exception("},{"line_number":1137,"context_line":"                    \u0027worker %d did not start normally: %r\u0027 %"},{"line_number":1138,"context_line":"                    (pid, worker_status))"},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"        # TODO: signal_ready() as soon as we have at least one new worker for"},{"line_number":1141,"context_line":"        # each port, instead of waiting for all of them"}],"source_content_type":"text/x-python","patch_set":1,"id":"ed420e63_b9868dfa","line":1138,"in_reply_to":"f7acac67_22224969","updated":"2022-11-10 09:26:27.000000000","message":"At the moment we raise an exception and bail as soon an any fails. which I guess will change when you address the todo on 1129. \nSpeaking of the todo on 1129, when dicts are ordered (like py3) we\u0027re always checking them in order. The order we get them is sorted (host, port) pairs from the ServersPerPort strat. I wonder if we need the ServersPerPort to instead yield them round robin style, we get can get to a fully listening server faster?","commit_id":"4d6070471799ffda301c3fa66f30120e32a158ad"}]}
