)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"3c5199bba77206ba26731962af1f79d9e98f5fc1","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Mitsuhiro Tanino \u003cmitsuhiro.tanino@hds.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-06-08 19:51:51 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Wait exit of child processes via ProcessLauncher when they recieve SIGKILL"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"After introducing commit Ie51669bd278288b768311ddf56ad31a2f28cc7ab,"},{"line_number":10,"context_line":"child processes which are launched via ProcessLauncher are always"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3afb71cf_c6f41b5c","line":7,"updated":"2015-06-10 13:32:36.000000000","message":"s/SIGKILL/SIGTERM","commit_id":"ce2d68ed007c9934a6696290ad28db9c5a27bef4"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"816d5f25e3094bf86705dc576d57f675e5a52553","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This patch reverts the above commit and adds functionallity to"},{"line_number":16,"context_line":"choose shutdown way \"wait exit\" for graceful shutdown or"},{"line_number":17,"context_line":"\"forcibly kill\" when they careate service object."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I50f57a605edf226b0c4e93234930df9c37209474"},{"line_number":20,"context_line":"Closes-bug: 1463132"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3afb71cf_9c531d17","line":17,"updated":"2015-06-10 09:40:16.000000000","message":"nit: careate -\u003e create","commit_id":"ce2d68ed007c9934a6696290ad28db9c5a27bef4"}],"oslo_service/service.py":[{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"3c5199bba77206ba26731962af1f79d9e98f5fc1","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        # Setup child signal handlers differently"},{"line_number":275,"context_line":"        def _sigterm(*args):"},{"line_number":276,"context_line":"            signal.signal(signal.SIGTERM, signal.SIG_DFL)"},{"line_number":277,"context_line":"            raise SignalExit(signal.SIGTERM)"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"        def _sighup(*args):"},{"line_number":280,"context_line":"            signal.signal(signal.SIGHUP, signal.SIG_DFL)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_797068a4","line":277,"updated":"2015-06-10 13:32:36.000000000","message":"I investigated that rising SignalExit here can lead to discarding eventlet responses. Such behavior can be reproduced on nova using test script attached to bug https://bugs.launchpad.net/nova/+bug/1382390 .","commit_id":"ce2d68ed007c9934a6696290ad28db9c5a27bef4"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"816d5f25e3094bf86705dc576d57f675e5a52553","unresolved":false,"context_lines":[{"line_number":548,"context_line":"        service.start()"},{"line_number":549,"context_line":"        done.wait()"},{"line_number":550,"context_line":""},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"def launch(service, workers\u003d1):"},{"line_number":553,"context_line":"    if not isinstance(service, ServiceBase):"},{"line_number":554,"context_line":"        raise TypeError(\"Service %(service)s must be subclass of %(base)s!\""}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_9cd9dd59","line":551,"updated":"2015-06-10 09:40:16.000000000","message":"The service that we launch may not necessarily be an instance of Service class, so in L283 we will get AttributeError when trying to access service.graceful.","commit_id":"ce2d68ed007c9934a6696290ad28db9c5a27bef4"}],"oslo_service/tests/test_service.py":[{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"430b34aea558c205b388e2402eac3a530a5802d6","unresolved":false,"context_lines":[{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    def test_handle_signals_for_child(self):"},{"line_number":427,"context_line":"        svc \u003d service.Service()"},{"line_number":428,"context_line":"        launcher \u003d service.ProcessLauncher()"},{"line_number":429,"context_line":"        with mock.patch.object(signal, \u0027signal\u0027) as mock_signal:"},{"line_number":430,"context_line":"            launcher._child_process_handle_signal(svc)"},{"line_number":431,"context_line":"            mock_signal.assert_any_calls(signal.SIGTERM, \u0027_sigterm\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_5f9b5766","line":428,"updated":"2015-06-10 09:45:50.000000000","message":"You could also mock out any unrelated objects\u0027 initialization (pipe, GreenPipe, ThreadGroup, Event) so that the test doesn\u0027t do anything except testing what it is supposed to test.","commit_id":"ce2d68ed007c9934a6696290ad28db9c5a27bef4"},{"author":{"_account_id":10115,"name":"Mitsuhiro Tanino","email":"mitsuhiro.tanino@lycorp.co.jp","username":"mtanino"},"change_message_id":"d23d451b8d889381932fa6086ce9ba0788d27d7a","unresolved":false,"context_lines":[{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    def test_handle_signals_for_child(self):"},{"line_number":427,"context_line":"        svc \u003d service.Service()"},{"line_number":428,"context_line":"        launcher \u003d service.ProcessLauncher()"},{"line_number":429,"context_line":"        with mock.patch.object(signal, \u0027signal\u0027) as mock_signal:"},{"line_number":430,"context_line":"            launcher._child_process_handle_signal(svc)"},{"line_number":431,"context_line":"            mock_signal.assert_any_calls(signal.SIGTERM, \u0027_sigterm\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa32b979_d7afde92","line":428,"in_reply_to":"3afb71cf_5f9b5766","updated":"2015-06-13 04:22:03.000000000","message":"Done","commit_id":"ce2d68ed007c9934a6696290ad28db9c5a27bef4"}]}
