)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e6a1f11e56a296d86edebb3ecfb93f538171455","unresolved":false,"context_lines":[{"line_number":10,"context_line":"early.  I think all tests should pass at this point."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"TODO: make SIGUSR1 do a seamless daemon reload and figure out how to"},{"line_number":13,"context_line":"test that (functests? probetests?)"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I3e5229d2fb04be67e53533ff65b0870038accbb7"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3fa7e38b_29736550","line":13,"range":{"start_line":13,"start_character":22,"end_line":13,"end_character":32},"updated":"2019-10-25 19:57:41.000000000","message":"Sure sounds like a probe test to me -- pretty similar to https://github.com/openstack/swift/blob/master/test/probe/test_signals.py","commit_id":"b8a5b2d0cd9cf51ec578a0de9f766290c6a19cf1"}],"swift/common/wsgi.py":[{"author":{"_account_id":13852,"name":"Romain LE DISEZ","email":"romain.le-disez@corp.ovh.com","username":"rledisez"},"change_message_id":"a1538f3c3e504cea022b27173a2904d6bf9b8662","unresolved":false,"context_lines":[{"line_number":1283,"context_line":"        child_pid \u003d os.fork()"},{"line_number":1284,"context_line":"        if child_pid:"},{"line_number":1285,"context_line":"            # parent; set env var for fds and reexec ourselves"},{"line_number":1286,"context_line":"            os.close(read_fd)"},{"line_number":1287,"context_line":"            os.putenv(NOTIFY_FD_ENV_KEY, str(write_fd))"},{"line_number":1288,"context_line":"            myself \u003d os.path.realpath(sys.argv[0])"},{"line_number":1289,"context_line":"            logger.info(\"Old server PID\u003d%d re\u0027execing as: %r\","}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_a4a7f750","line":1286,"updated":"2019-11-06 08:39:13.000000000","message":"The listening sockets should be gracefully shutdown before execv() is called. Otherwise, the parent is accepting connections right before killing itself to exec the new binary.","commit_id":"c7253361900d2b9ea51a293c7bbd70f5d16dd9a3"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"b94fe5f6ceccb3f308bdf85967c30fa28217412a","unresolved":false,"context_lines":[{"line_number":1283,"context_line":"        child_pid \u003d os.fork()"},{"line_number":1284,"context_line":"        if child_pid:"},{"line_number":1285,"context_line":"            # parent; set env var for fds and reexec ourselves"},{"line_number":1286,"context_line":"            os.close(read_fd)"},{"line_number":1287,"context_line":"            os.putenv(NOTIFY_FD_ENV_KEY, str(write_fd))"},{"line_number":1288,"context_line":"            myself \u003d os.path.realpath(sys.argv[0])"},{"line_number":1289,"context_line":"            logger.info(\"Old server PID\u003d%d re\u0027execing as: %r\","}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_ce36bb52","line":1286,"in_reply_to":"3fa7e38b_59e625b3","updated":"2019-11-07 18:21:10.000000000","message":"The parent never calls accept() on the listen sockets, so this is not an issue.  In fact, closing the sockets instead of letting close-on-exec close them introduced a (very slim) window of client connection error.  So this should definitely be left as it is in the patch and not changed.","commit_id":"c7253361900d2b9ea51a293c7bbd70f5d16dd9a3"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"b94fe5f6ceccb3f308bdf85967c30fa28217412a","unresolved":false,"context_lines":[{"line_number":1283,"context_line":"        child_pid \u003d os.fork()"},{"line_number":1284,"context_line":"        if child_pid:"},{"line_number":1285,"context_line":"            # parent; set env var for fds and reexec ourselves"},{"line_number":1286,"context_line":"            os.close(read_fd)"},{"line_number":1287,"context_line":"            os.putenv(NOTIFY_FD_ENV_KEY, str(write_fd))"},{"line_number":1288,"context_line":"            myself \u003d os.path.realpath(sys.argv[0])"},{"line_number":1289,"context_line":"            logger.info(\"Old server PID\u003d%d re\u0027execing as: %r\","}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_ae31ff5b","line":1286,"in_reply_to":"3fa7e38b_a4a7f750","updated":"2019-11-07 18:21:10.000000000","message":"Done","commit_id":"c7253361900d2b9ea51a293c7bbd70f5d16dd9a3"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"800acb225a294047776e085fa7fc744c901a3f1b","unresolved":false,"context_lines":[{"line_number":1283,"context_line":"        child_pid \u003d os.fork()"},{"line_number":1284,"context_line":"        if child_pid:"},{"line_number":1285,"context_line":"            # parent; set env var for fds and reexec ourselves"},{"line_number":1286,"context_line":"            os.close(read_fd)"},{"line_number":1287,"context_line":"            os.putenv(NOTIFY_FD_ENV_KEY, str(write_fd))"},{"line_number":1288,"context_line":"            myself \u003d os.path.realpath(sys.argv[0])"},{"line_number":1289,"context_line":"            logger.info(\"Old server PID\u003d%d re\u0027execing as: %r\","}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_59e625b3","line":1286,"in_reply_to":"3fa7e38b_a4a7f750","updated":"2019-11-06 16:20:32.000000000","message":"Oh, right, of course!  The old listen sockets should be closed in the parent prior to the exec, and then I can cut out the `set_close_on_exec_on_listen_sockets()` stuff too!","commit_id":"c7253361900d2b9ea51a293c7bbd70f5d16dd9a3"},{"author":{"_account_id":13852,"name":"Romain LE DISEZ","email":"romain.le-disez@corp.ovh.com","username":"rledisez"},"change_message_id":"a1538f3c3e504cea022b27173a2904d6bf9b8662","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"            myself \u003d os.path.realpath(sys.argv[0])"},{"line_number":1289,"context_line":"            logger.info(\"Old server PID\u003d%d re\u0027execing as: %r\","},{"line_number":1290,"context_line":"                        orig_server_pid, [myself] + list(sys.argv))"},{"line_number":1291,"context_line":"            os.execv(myself, sys.argv)"},{"line_number":1292,"context_line":"            logger.error(\u0027Somehow lived past os.execv()?!\u0027)"},{"line_number":1293,"context_line":"            exit(\u0027Somehow lived past os.execv()?!\u0027)"},{"line_number":1294,"context_line":"        elif child_pid \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_1f91749b","line":1291,"updated":"2019-11-06 08:39:13.000000000","message":"I\u0027m wondering how we can avoid downtime if the new process does not start (eg: config mistake). I don\u0027t know yet how we could do. Right now it just exits and the service is down.","commit_id":"c7253361900d2b9ea51a293c7bbd70f5d16dd9a3"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"b94fe5f6ceccb3f308bdf85967c30fa28217412a","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"            myself \u003d os.path.realpath(sys.argv[0])"},{"line_number":1289,"context_line":"            logger.info(\"Old server PID\u003d%d re\u0027execing as: %r\","},{"line_number":1290,"context_line":"                        orig_server_pid, [myself] + list(sys.argv))"},{"line_number":1291,"context_line":"            os.execv(myself, sys.argv)"},{"line_number":1292,"context_line":"            logger.error(\u0027Somehow lived past os.execv()?!\u0027)"},{"line_number":1293,"context_line":"            exit(\u0027Somehow lived past os.execv()?!\u0027)"},{"line_number":1294,"context_line":"        elif child_pid \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_8e38c33b","line":1291,"in_reply_to":"3fa7e38b_1f91749b","updated":"2019-11-07 18:21:10.000000000","message":"Done","commit_id":"c7253361900d2b9ea51a293c7bbd70f5d16dd9a3"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"800acb225a294047776e085fa7fc744c901a3f1b","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"            myself \u003d os.path.realpath(sys.argv[0])"},{"line_number":1289,"context_line":"            logger.info(\"Old server PID\u003d%d re\u0027execing as: %r\","},{"line_number":1290,"context_line":"                        orig_server_pid, [myself] + list(sys.argv))"},{"line_number":1291,"context_line":"            os.execv(myself, sys.argv)"},{"line_number":1292,"context_line":"            logger.error(\u0027Somehow lived past os.execv()?!\u0027)"},{"line_number":1293,"context_line":"            exit(\u0027Somehow lived past os.execv()?!\u0027)"},{"line_number":1294,"context_line":"        elif child_pid \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_d9f9b54e","line":1291,"in_reply_to":"3fa7e38b_1f91749b","updated":"2019-11-06 16:20:32.000000000","message":"That\u0027s no different than the old SIGHUP case and dealing with that is out of scope for this code.","commit_id":"c7253361900d2b9ea51a293c7bbd70f5d16dd9a3"},{"author":{"_account_id":13852,"name":"Romain LE DISEZ","email":"romain.le-disez@corp.ovh.com","username":"rledisez"},"change_message_id":"a1538f3c3e504cea022b27173a2904d6bf9b8662","unresolved":false,"context_lines":[{"line_number":1290,"context_line":"                        orig_server_pid, [myself] + list(sys.argv))"},{"line_number":1291,"context_line":"            os.execv(myself, sys.argv)"},{"line_number":1292,"context_line":"            logger.error(\u0027Somehow lived past os.execv()?!\u0027)"},{"line_number":1293,"context_line":"            exit(\u0027Somehow lived past os.execv()?!\u0027)"},{"line_number":1294,"context_line":"        elif child_pid \u003d\u003d 0:"},{"line_number":1295,"context_line":"            # child"},{"line_number":1296,"context_line":"            os.close(write_fd)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_2469c7f7","line":1293,"updated":"2019-11-06 08:39:13.000000000","message":"Being here means the execv() failed. Would it raise an exception? In either cases, I prefer the process to continue running than to quit. Just need to find a proper way to notify the operator that the reload failed.","commit_id":"c7253361900d2b9ea51a293c7bbd70f5d16dd9a3"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"800acb225a294047776e085fa7fc744c901a3f1b","unresolved":false,"context_lines":[{"line_number":1290,"context_line":"                        orig_server_pid, [myself] + list(sys.argv))"},{"line_number":1291,"context_line":"            os.execv(myself, sys.argv)"},{"line_number":1292,"context_line":"            logger.error(\u0027Somehow lived past os.execv()?!\u0027)"},{"line_number":1293,"context_line":"            exit(\u0027Somehow lived past os.execv()?!\u0027)"},{"line_number":1294,"context_line":"        elif child_pid \u003d\u003d 0:"},{"line_number":1295,"context_line":"            # child"},{"line_number":1296,"context_line":"            os.close(write_fd)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_d98e95d0","line":1293,"in_reply_to":"3fa7e38b_2469c7f7","updated":"2019-11-06 16:20:32.000000000","message":"If the exec failed, something is _seriously_ wrong and continuing to run will almost certainly cause more trouble than exiting.\n\nThe operator already has to be able to deal with the server not being up (consider old SIGHUP \"reload\" case with a bad new config).  So this is no new burden.  If we can\u0027t exec, we probably can\u0027t continue to do anything safe or good by continuing to run.","commit_id":"c7253361900d2b9ea51a293c7bbd70f5d16dd9a3"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"b94fe5f6ceccb3f308bdf85967c30fa28217412a","unresolved":false,"context_lines":[{"line_number":1290,"context_line":"                        orig_server_pid, [myself] + list(sys.argv))"},{"line_number":1291,"context_line":"            os.execv(myself, sys.argv)"},{"line_number":1292,"context_line":"            logger.error(\u0027Somehow lived past os.execv()?!\u0027)"},{"line_number":1293,"context_line":"            exit(\u0027Somehow lived past os.execv()?!\u0027)"},{"line_number":1294,"context_line":"        elif child_pid \u003d\u003d 0:"},{"line_number":1295,"context_line":"            # child"},{"line_number":1296,"context_line":"            os.close(write_fd)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_4e42cbad","line":1293,"in_reply_to":"3fa7e38b_d98e95d0","updated":"2019-11-07 18:21:10.000000000","message":"Done","commit_id":"c7253361900d2b9ea51a293c7bbd70f5d16dd9a3"}],"test/probe/test_signals.py":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"547b955138d82c54769a2adc93ef3ea80ed9cfc0","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        resp \u003d self.finish_write_req(conn)"},{"line_number":142,"context_line":"        self.check_write_resp(resp)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        # After this, we\u0027re in a funny spot. With eventlet 0.22.0, the"},{"line_number":145,"context_line":"        # connection\u0027s now closed, but with prior versions we could keep"},{"line_number":146,"context_line":"        # going indefinitely. See https://bugs.launchpad.net/swift/+bug/1792615"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        # Close our connections, to make sure old eventlet shuts down"},{"line_number":149,"context_line":"        conn.close()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_f0d605c5","line":146,"range":{"start_line":144,"start_character":10,"end_line":146,"end_character":79},"updated":"2019-11-06 16:29:35.000000000","message":"the seamless reload does not get around this issue, correct?","commit_id":"c7253361900d2b9ea51a293c7bbd70f5d16dd9a3"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"b94fe5f6ceccb3f308bdf85967c30fa28217412a","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        resp \u003d self.finish_write_req(conn)"},{"line_number":142,"context_line":"        self.check_write_resp(resp)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        # After this, we\u0027re in a funny spot. With eventlet 0.22.0, the"},{"line_number":145,"context_line":"        # connection\u0027s now closed, but with prior versions we could keep"},{"line_number":146,"context_line":"        # going indefinitely. See https://bugs.launchpad.net/swift/+bug/1792615"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        # Close our connections, to make sure old eventlet shuts down"},{"line_number":149,"context_line":"        conn.close()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_0e1613a9","line":146,"range":{"start_line":144,"start_character":10,"end_line":146,"end_character":79},"in_reply_to":"3fa7e38b_1c5c1b4b","updated":"2019-11-07 18:21:10.000000000","message":"Done","commit_id":"c7253361900d2b9ea51a293c7bbd70f5d16dd9a3"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"61d828495071b5603ea560e08a787ea5bf0ac3ca","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        resp \u003d self.finish_write_req(conn)"},{"line_number":142,"context_line":"        self.check_write_resp(resp)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        # After this, we\u0027re in a funny spot. With eventlet 0.22.0, the"},{"line_number":145,"context_line":"        # connection\u0027s now closed, but with prior versions we could keep"},{"line_number":146,"context_line":"        # going indefinitely. See https://bugs.launchpad.net/swift/+bug/1792615"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        # Close our connections, to make sure old eventlet shuts down"},{"line_number":149,"context_line":"        conn.close()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_1c5c1b4b","line":146,"range":{"start_line":144,"start_character":10,"end_line":146,"end_character":79},"in_reply_to":"3fa7e38b_f0d605c5","updated":"2019-11-06 17:35:33.000000000","message":"That\u0027s correct.  Note, though, that eventlet itself currently has a bug that makes it not even implement its own new behavior correctly: https://github.com/eventlet/eventlet/pull/590\n\nThis patch includes some code to work around that, though, since it\u0027s possible.","commit_id":"c7253361900d2b9ea51a293c7bbd70f5d16dd9a3"}]}
