)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"17bd5ef5eb8af77493a1b6a055aca3e24828e098","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"fa31d9ce_1f7a6277","updated":"2017-02-14 22:47:51.000000000","message":"Let me propose an improved version of this commit message, for clarity sake:\n\nOptimize pid property in AsyncProcess class\n\nThe pid property in the the AsyncProcess process class executes command \u0027ps --ppid \u003cpid\u003e -o pid\u003d\u0027 every time the associated asynchronous process\u0027s pid is needed. This can be very heavy in high load network and compute nodes. Please see related bug.\n\nThis change optimizes the pid property to execute \u0027ps --ppid \u003cpid\u003e -o pid\u003d\u0027 only the first time it is called, memoizing the retrieved pid for future calls.\n\nCloses-Bug:1663465","commit_id":"b829de79ad58159da76c9b3819374d3e94a03d0c"}],"neutron/agent/linux/async_process.py":[{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"bc1c0f674b5d3bbe8c4e8338aa46e8d36e4213a1","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                                     self._kill_event)"},{"line_number":159,"context_line":"            self._watchers.append(watcher)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def _get_pid(self):"},{"line_number":162,"context_line":"        if self._process:"},{"line_number":163,"context_line":"            return utils.get_root_helper_child_pid("},{"line_number":164,"context_line":"                self._process.pid,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_c04b052a","line":161,"updated":"2017-02-11 03:43:37.000000000","message":"Wouldn\u0027t it be easier to keep the property and memoize the pid? In other words, modify this property to get the pid and store it in self._pid if not self._pid, otherwise return self._pid. That would also be less disruptive in the rest of the code","commit_id":"c8373c9d3851358b076dbae64fdf91b5022942af"},{"author":{"_account_id":10518,"name":"Jesse","email":"jesse@easystack.cn","username":"jesse"},"change_message_id":"5433900f5f8b0be8286d08a023f76e0d3715c7a5","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                                     self._kill_event)"},{"line_number":159,"context_line":"            self._watchers.append(watcher)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def _get_pid(self):"},{"line_number":162,"context_line":"        if self._process:"},{"line_number":163,"context_line":"            return utils.get_root_helper_child_pid("},{"line_number":164,"context_line":"                self._process.pid,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_a31c4d14","line":161,"in_reply_to":"fa31d9ce_c04b052a","updated":"2017-02-12 14:40:53.000000000","message":"Done, thanks :)","commit_id":"c8373c9d3851358b076dbae64fdf91b5022942af"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d6694850f0a1da61d8ebbd29c86e09935305a8d8","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                self._pid \u003d pid"},{"line_number":107,"context_line":"            return result"},{"line_number":108,"context_line":"        else:"},{"line_number":109,"context_line":"            return os.path.exists(\u0027/proc/%s\u0027 % self.pid)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def start(self, block\u003dFalse):"},{"line_number":112,"context_line":"        \"\"\"Launch a process and monitor it asynchronously."}],"source_content_type":"text/x-python","patch_set":8,"id":"fa31d9ce_761be71b","line":109,"range":{"start_line":109,"start_character":12,"end_line":109,"end_character":56},"updated":"2017-02-13 08:34:22.000000000","message":"\"pid_invoked_with_cmdline\" is doing this check.\n\nYoy can refactor the whole functions just reading the pid, storing if in self._pid and executing \"pid_invoked_with_cmdline\"","commit_id":"4848b6c365ece582634c8708543777a4f93fb1a2"},{"author":{"_account_id":10518,"name":"Jesse","email":"jesse@easystack.cn","username":"jesse"},"change_message_id":"c2358e8da3022b5022abc84c6b4c9bf2d71a2046","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                self._pid \u003d pid"},{"line_number":107,"context_line":"            return result"},{"line_number":108,"context_line":"        else:"},{"line_number":109,"context_line":"            return os.path.exists(\u0027/proc/%s\u0027 % self.pid)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def start(self, block\u003dFalse):"},{"line_number":112,"context_line":"        \"\"\"Launch a process and monitor it asynchronously."}],"source_content_type":"text/x-python","patch_set":8,"id":"fa31d9ce_ccb962cd","line":109,"range":{"start_line":109,"start_character":12,"end_line":109,"end_character":56},"in_reply_to":"fa31d9ce_761be71b","updated":"2017-02-13 09:37:02.000000000","message":"I think there is no need to invoke pid_invoked_with_cmdline function, I find that the get_root_helper_child_pid in self.pid will make sure the pid is the correct child\u0027s pid.\nUsing os.path.exists(\u0027/proc/%s\u0027 % self.pid) to check is the fastest way.","commit_id":"4848b6c365ece582634c8708543777a4f93fb1a2"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d6694850f0a1da61d8ebbd29c86e09935305a8d8","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @property"},{"line_number":164,"context_line":"    def pid(self):"},{"line_number":165,"context_line":"        if self._is_running:"},{"line_number":166,"context_line":"            if not self._pid:"},{"line_number":167,"context_line":"                common_utils.wait_until_true(self.is_active)"},{"line_number":168,"context_line":"            return self._pid"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa31d9ce_16b46bcf","line":165,"updated":"2017-02-13 08:34:22.000000000","message":"Now you are changing the functionality of this function.\n\nI think the comment made by Miguel Lavalle was to mantain this property just storing the pid in self._pid:\n\n        if self._process:\n            if not self._pid:\n                self._pid \u003d utils.get_root_helper_child_pid(\n                   self._process.pid,\n                   self.cmd_without_namespace,\n                   run_as_root\u003dself.run_as_root)\n            return self._pid","commit_id":"4848b6c365ece582634c8708543777a4f93fb1a2"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f499ae418f6114e5d09169a86710f2785a6cba4a","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @property"},{"line_number":164,"context_line":"    def pid(self):"},{"line_number":165,"context_line":"        if self._is_running:"},{"line_number":166,"context_line":"            if not self._pid:"},{"line_number":167,"context_line":"                common_utils.wait_until_true(self.is_active)"},{"line_number":168,"context_line":"            return self._pid"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa31d9ce_4b3b839c","line":165,"in_reply_to":"fa31d9ce_16b46bcf","updated":"2017-02-13 15:56:34.000000000","message":"Right, Rodolfo got it right. That was my point","commit_id":"4848b6c365ece582634c8708543777a4f93fb1a2"},{"author":{"_account_id":10518,"name":"Jesse","email":"jesse@easystack.cn","username":"jesse"},"change_message_id":"c2358e8da3022b5022abc84c6b4c9bf2d71a2046","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @property"},{"line_number":164,"context_line":"    def pid(self):"},{"line_number":165,"context_line":"        if self._is_running:"},{"line_number":166,"context_line":"            if not self._pid:"},{"line_number":167,"context_line":"                common_utils.wait_until_true(self.is_active)"},{"line_number":168,"context_line":"            return self._pid"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa31d9ce_6cdcf612","line":165,"in_reply_to":"fa31d9ce_16b46bcf","updated":"2017-02-13 09:37:02.000000000","message":"Yes, you are right, thanks.","commit_id":"4848b6c365ece582634c8708543777a4f93fb1a2"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d6694850f0a1da61d8ebbd29c86e09935305a8d8","unresolved":false,"context_lines":[{"line_number":164,"context_line":"    def pid(self):"},{"line_number":165,"context_line":"        if self._is_running:"},{"line_number":166,"context_line":"            if not self._pid:"},{"line_number":167,"context_line":"                common_utils.wait_until_true(self.is_active)"},{"line_number":168,"context_line":"            return self._pid"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def _get_pid(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa31d9ce_36e88fe2","line":167,"range":{"start_line":167,"start_character":15,"end_line":167,"end_character":60},"updated":"2017-02-13 08:34:22.000000000","message":"By default the timeout of this function is 60 secs. This is a lot of time.","commit_id":"4848b6c365ece582634c8708543777a4f93fb1a2"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"b027344e5e92e061174d67accc3cdc88908a522e","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def is_active(self):"},{"line_number":99,"context_line":"        if self.pid:"},{"line_number":100,"context_line":"           return os.path.exists(\u0027/proc/%s\u0027 % self.pid)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def start(self, block\u003dFalse):"},{"line_number":103,"context_line":"        \"\"\"Launch a process and monitor it asynchronously."}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_8b865b11","line":100,"updated":"2017-02-13 15:58:49.000000000","message":"Indent this line one more position to the right","commit_id":"ace1d2b647c1d33dcbd939309fb7094ca2149af6"},{"author":{"_account_id":10518,"name":"Jesse","email":"jesse@easystack.cn","username":"jesse"},"change_message_id":"8d27487fa0d53dd8668ed0bec5111647b4b99d21","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def is_active(self):"},{"line_number":99,"context_line":"        if self.pid:"},{"line_number":100,"context_line":"           return os.path.exists(\u0027/proc/%s\u0027 % self.pid)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def start(self, block\u003dFalse):"},{"line_number":103,"context_line":"        \"\"\"Launch a process and monitor it asynchronously."}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_f6825e93","line":100,"in_reply_to":"fa31d9ce_8b865b11","updated":"2017-02-13 16:25:05.000000000","message":"sorry for this carelessness","commit_id":"ace1d2b647c1d33dcbd939309fb7094ca2149af6"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"b027344e5e92e061174d67accc3cdc88908a522e","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        if self._process:"},{"line_number":157,"context_line":"            if not self._pid:"},{"line_number":158,"context_line":"                self._pid \u003d utils.get_root_helper_child_pid("},{"line_number":159,"context_line":"                   self._process.pid,"},{"line_number":160,"context_line":"                   self.cmd_without_namespace,"},{"line_number":161,"context_line":"                   run_as_root\u003dself.run_as_root)"},{"line_number":162,"context_line":"            return self._pid"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def _kill(self, kill_signal):"},{"line_number":165,"context_line":"        \"\"\"Kill the process and the associated watcher greenthreads.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_eb77d737","line":162,"range":{"start_line":159,"start_character":0,"end_line":162,"end_character":28},"updated":"2017-02-13 15:58:49.000000000","message":"Indent these lines one more position to the right","commit_id":"ace1d2b647c1d33dcbd939309fb7094ca2149af6"},{"author":{"_account_id":10518,"name":"Jesse","email":"jesse@easystack.cn","username":"jesse"},"change_message_id":"8d27487fa0d53dd8668ed0bec5111647b4b99d21","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        if self._process:"},{"line_number":157,"context_line":"            if not self._pid:"},{"line_number":158,"context_line":"                self._pid \u003d utils.get_root_helper_child_pid("},{"line_number":159,"context_line":"                   self._process.pid,"},{"line_number":160,"context_line":"                   self.cmd_without_namespace,"},{"line_number":161,"context_line":"                   run_as_root\u003dself.run_as_root)"},{"line_number":162,"context_line":"            return self._pid"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def _kill(self, kill_signal):"},{"line_number":165,"context_line":"        \"\"\"Kill the process and the associated watcher greenthreads.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_167e12ae","line":162,"range":{"start_line":159,"start_character":0,"end_line":162,"end_character":28},"in_reply_to":"fa31d9ce_eb77d737","updated":"2017-02-13 16:25:05.000000000","message":"Done","commit_id":"ace1d2b647c1d33dcbd939309fb7094ca2149af6"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"87cf7a1027339a7bd40f4633ec162f918a9c5667","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def is_active(self):"},{"line_number":99,"context_line":"        if self.pid:"},{"line_number":100,"context_line":"            return os.path.exists(\u0027/proc/%s\u0027 % self.pid)"},{"line_number":101,"context_line":"        return False"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def start(self, block\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa31d9ce_2333c815","line":100,"range":{"start_line":100,"start_character":19,"end_line":100,"end_character":56},"updated":"2017-02-13 21:25:41.000000000","message":"I would go as far as to say we don\u0027t need this. Why not just return True. pid in L156 below calls utils.get_root_helper_child_pid, which in turn calls utils.pid_invoked_with_cmdline (which we are removing from here) wich in turn does os.path.exists(\u0027/proc/%s\u0027 % pid) via get_cmdline_from_pid. Why do it again?","commit_id":"93fbbdf0f080271d588df39b3c68aa98748d3e7a"},{"author":{"_account_id":10518,"name":"Jesse","email":"jesse@easystack.cn","username":"jesse"},"change_message_id":"130c00d60a7c2e1f9e9ef26f3376a8bfb0358be9","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def is_active(self):"},{"line_number":99,"context_line":"        if self.pid:"},{"line_number":100,"context_line":"            return os.path.exists(\u0027/proc/%s\u0027 % self.pid)"},{"line_number":101,"context_line":"        return False"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def start(self, block\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa31d9ce_0e6dfd30","line":100,"range":{"start_line":100,"start_character":19,"end_line":100,"end_character":56},"in_reply_to":"fa31d9ce_2333c815","updated":"2017-02-14 08:28:30.000000000","message":"OK, it seems _watch_process will take care of the child process, if child process die, the self._pid will be None.","commit_id":"93fbbdf0f080271d588df39b3c68aa98748d3e7a"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"17bd5ef5eb8af77493a1b6a055aca3e24828e098","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self._stderr_lines \u003d eventlet.queue.LightQueue()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def is_active(self):"},{"line_number":99,"context_line":"        if self.pid:"},{"line_number":100,"context_line":"            return os.path.exists(\u0027/proc/%s\u0027 % self.pid)"},{"line_number":101,"context_line":"        return False"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def start(self, block\u003dFalse):"},{"line_number":104,"context_line":"        \"\"\"Launch a process and monitor it asynchronously."}],"source_content_type":"text/x-python","patch_set":12,"id":"fa31d9ce_c42abd8f","line":101,"range":{"start_line":99,"start_character":8,"end_line":101,"end_character":20},"updated":"2017-02-14 22:47:51.000000000","message":"@Jesse,\n\nThanks for following up. Yes, your are right. I tested PS11 in my local system and the stop method in L119 never returns (if called with block\u003dTrue) when run_as_root is false. The reason is that is_active will continue returning True forever. Given this, I recommend restoring is_active to its original state. pid_invoked_with_cmdline essentially does two things: os.path.exists(\u0027/proc/%s\u0027 % pid) and read the command line from the file. In this change you are doing half of it so we might as well do the whole thing. This has the benefit of focusing this patchset in the optimization you want, which is to avoid executing ps --ppid every time the pid is needed","commit_id":"b829de79ad58159da76c9b3819374d3e94a03d0c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f193e84970ced2980468952b4eb91c4cf91e9097","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        pid \u003d self.pid"},{"line_number":169,"context_line":"        if pid:"},{"line_number":170,"context_line":"            self._is_running \u003d False"},{"line_number":171,"context_line":"            self._pid \u003d None"},{"line_number":172,"context_line":"            self._kill_process(pid, kill_signal)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        # Halt the greenthreads if they weren\u0027t already."}],"source_content_type":"text/x-python","patch_set":13,"id":"da36d5c6_7765f2df","line":171,"updated":"2017-02-19 05:41:53.000000000","message":"unrelated - but why not set _process to None here too?","commit_id":"aa32431ef114c1807dee60a4be7ef57f4d1d67e7"},{"author":{"_account_id":10518,"name":"Jesse","email":"jesse@easystack.cn","username":"jesse"},"change_message_id":"2a708936bb84bad43331873c6f8a6cf698976ebe","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        pid \u003d self.pid"},{"line_number":169,"context_line":"        if pid:"},{"line_number":170,"context_line":"            self._is_running \u003d False"},{"line_number":171,"context_line":"            self._pid \u003d None"},{"line_number":172,"context_line":"            self._kill_process(pid, kill_signal)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        # Halt the greenthreads if they weren\u0027t already."}],"source_content_type":"text/x-python","patch_set":13,"id":"da36d5c6_b9093097","line":171,"in_reply_to":"da36d5c6_7765f2df","updated":"2017-02-27 17:11:29.000000000","message":"I don\u0027t want to break the original logic.\nIf we invoke self.stop(block\u003dtrue), the statement common_utils.wait_until_true(lambda: not self.is_active()) will use self._process.id in self.pid to check whether the process is killed by \u0027ps\u0027 command.","commit_id":"aa32431ef114c1807dee60a4be7ef57f4d1d67e7"}],"neutron/tests/unit/agent/linux/test_async_process.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"273986df6444b73b4554edd3eed008358d577a8c","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        ])"},{"line_number":57,"context_line":"        self.assertEqual(len(proc._watchers), 2)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def test__pid(self):"},{"line_number":60,"context_line":"        pid \u003d 1"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        class FakeProcess(object):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a1ced50_67394af2","line":59,"updated":"2017-03-21 08:54:30.000000000","message":"You should make two tests:\n1) With _pid \u003d None, and check get_root_helper_child_pid is called.\n2) With _pid !\u003d None, and check get_root_helper_child_pid is not called.","commit_id":"81781aa2180545099719c91e6b42363e5e2fbb1f"},{"author":{"_account_id":10518,"name":"Jesse","email":"jesse@easystack.cn","username":"jesse"},"change_message_id":"0b9f4dbd9c61281fff7f2a714c1b04627b87aad6","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        ])"},{"line_number":57,"context_line":"        self.assertEqual(len(proc._watchers), 2)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def test__pid(self):"},{"line_number":60,"context_line":"        pid \u003d 1"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        class FakeProcess(object):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a1ced50_4cc06e7d","line":59,"in_reply_to":"1a1ced50_67394af2","updated":"2017-03-23 18:10:53.000000000","message":"Done","commit_id":"81781aa2180545099719c91e6b42363e5e2fbb1f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"273986df6444b73b4554edd3eed008358d577a8c","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def test__pid(self):"},{"line_number":60,"context_line":"        pid \u003d 1"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        class FakeProcess(object):"},{"line_number":63,"context_line":"            def __init__(self, pid):"},{"line_number":64,"context_line":"                self.pid \u003d pid"},{"line_number":65,"context_line":"        self.proc._process \u003d FakeProcess(pid)"},{"line_number":66,"context_line":"        with mock.patch.object(utils, \u0027get_root_helper_child_pid\u0027,"},{"line_number":67,"context_line":"                               return_value\u003dpid):"},{"line_number":68,"context_line":"            self.assertEqual(self.proc.pid, 1)"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a1ced50_e791baf2","line":65,"range":{"start_line":62,"start_character":0,"end_line":65,"end_character":45},"updated":"2017-03-21 08:54:30.000000000","message":"You can avoid this just mocking self.proc._process.pid","commit_id":"81781aa2180545099719c91e6b42363e5e2fbb1f"},{"author":{"_account_id":10518,"name":"Jesse","email":"jesse@easystack.cn","username":"jesse"},"change_message_id":"0b9f4dbd9c61281fff7f2a714c1b04627b87aad6","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def test__pid(self):"},{"line_number":60,"context_line":"        pid \u003d 1"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        class FakeProcess(object):"},{"line_number":63,"context_line":"            def __init__(self, pid):"},{"line_number":64,"context_line":"                self.pid \u003d pid"},{"line_number":65,"context_line":"        self.proc._process \u003d FakeProcess(pid)"},{"line_number":66,"context_line":"        with mock.patch.object(utils, \u0027get_root_helper_child_pid\u0027,"},{"line_number":67,"context_line":"                               return_value\u003dpid):"},{"line_number":68,"context_line":"            self.assertEqual(self.proc.pid, 1)"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a1ced50_cc3a9e98","line":65,"range":{"start_line":62,"start_character":0,"end_line":65,"end_character":45},"in_reply_to":"1a1ced50_e791baf2","updated":"2017-03-23 18:10:53.000000000","message":"Done","commit_id":"81781aa2180545099719c91e6b42363e5e2fbb1f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"273986df6444b73b4554edd3eed008358d577a8c","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        self.proc._process \u003d FakeProcess(pid)"},{"line_number":66,"context_line":"        with mock.patch.object(utils, \u0027get_root_helper_child_pid\u0027,"},{"line_number":67,"context_line":"                               return_value\u003dpid):"},{"line_number":68,"context_line":"            self.assertEqual(self.proc.pid, 1)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def test__handle_process_error_kills_with_respawn(self):"},{"line_number":71,"context_line":"        with mock.patch.object(self.proc, \u0027_kill\u0027) as kill:"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a1ced50_476a8eef","line":68,"range":{"start_line":68,"start_character":12,"end_line":68,"end_character":46},"updated":"2017-03-21 08:54:30.000000000","message":"You should check self.proc._pid too","commit_id":"81781aa2180545099719c91e6b42363e5e2fbb1f"},{"author":{"_account_id":10518,"name":"Jesse","email":"jesse@easystack.cn","username":"jesse"},"change_message_id":"0b9f4dbd9c61281fff7f2a714c1b04627b87aad6","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        self.proc._process \u003d FakeProcess(pid)"},{"line_number":66,"context_line":"        with mock.patch.object(utils, \u0027get_root_helper_child_pid\u0027,"},{"line_number":67,"context_line":"                               return_value\u003dpid):"},{"line_number":68,"context_line":"            self.assertEqual(self.proc.pid, 1)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def test__handle_process_error_kills_with_respawn(self):"},{"line_number":71,"context_line":"        with mock.patch.object(self.proc, \u0027_kill\u0027) as kill:"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a1ced50_2c4a5228","line":68,"range":{"start_line":68,"start_character":12,"end_line":68,"end_character":46},"in_reply_to":"1a1ced50_476a8eef","updated":"2017-03-23 18:10:53.000000000","message":"Done","commit_id":"81781aa2180545099719c91e6b42363e5e2fbb1f"}]}
