)]}'
{"nova/virt/libvirt/driver.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"995d6f99dcbe51952b16db40a56d4f646863b747","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        self._fc_wwpns \u003d None"},{"line_number":413,"context_line":"        self._caps \u003d None"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        self._pid_cache \u003d collections.defaultdict(set)"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        self.firewall_driver \u003d firewall.load_driver("},{"line_number":418,"context_line":"            DEFAULT_FIREWALL_DRIVER,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_a34c3dc9","line":415,"updated":"2015-07-10 17:08:23.000000000","message":"This should be called _copy_pid_cache or something I think. It would be confusing to get more things in here than just the copy ones as we wouldn\u0027t know which to kill and when.","commit_id":"d6053139987e3a8e711504f779431ed80dd61447"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"74aafb8e086df625df444a4e6e73b3031adbdb6e","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        self._fc_wwpns \u003d None"},{"line_number":413,"context_line":"        self._caps \u003d None"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        self._pid_cache \u003d collections.defaultdict(set)"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        self.firewall_driver \u003d firewall.load_driver("},{"line_number":418,"context_line":"            DEFAULT_FIREWALL_DRIVER,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_26335b64","line":415,"in_reply_to":"ba3cc151_a34c3dc9","updated":"2015-07-10 17:26:47.000000000","message":"Done","commit_id":"d6053139987e3a8e711504f779431ed80dd61447"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"995d6f99dcbe51952b16db40a56d4f646863b747","unresolved":false,"context_lines":[{"line_number":6811,"context_line":"            remaining_path \u003d target_del"},{"line_number":6812,"context_line":"            try:"},{"line_number":6813,"context_line":"                # Delete processes if running"},{"line_number":6814,"context_line":"                if instance.uuid in self._pid_cache:"},{"line_number":6815,"context_line":"                    for pid in self._pid_cache[instance.uuid]:"},{"line_number":6816,"context_line":"                        try:"},{"line_number":6817,"context_line":"                            # Check if the process is alive."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_e3d9e5f5","line":6814,"updated":"2015-07-10 17:08:23.000000000","message":"It\u0027s a defaultdict, so why this extra check?","commit_id":"d6053139987e3a8e711504f779431ed80dd61447"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"74aafb8e086df625df444a4e6e73b3031adbdb6e","unresolved":false,"context_lines":[{"line_number":6811,"context_line":"            remaining_path \u003d target_del"},{"line_number":6812,"context_line":"            try:"},{"line_number":6813,"context_line":"                # Delete processes if running"},{"line_number":6814,"context_line":"                if instance.uuid in self._pid_cache:"},{"line_number":6815,"context_line":"                    for pid in self._pid_cache[instance.uuid]:"},{"line_number":6816,"context_line":"                        try:"},{"line_number":6817,"context_line":"                            # Check if the process is alive."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_06f41785","line":6814,"in_reply_to":"ba3cc151_e3d9e5f5","updated":"2015-07-10 17:26:47.000000000","message":"Done","commit_id":"d6053139987e3a8e711504f779431ed80dd61447"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"995d6f99dcbe51952b16db40a56d4f646863b747","unresolved":false,"context_lines":[{"line_number":6815,"context_line":"                    for pid in self._pid_cache[instance.uuid]:"},{"line_number":6816,"context_line":"                        try:"},{"line_number":6817,"context_line":"                            # Check if the process is alive."},{"line_number":6818,"context_line":"                            os.kill(pid, 0)"},{"line_number":6819,"context_line":"                        except OSError:"},{"line_number":6820,"context_line":"                            # Raised if process is not alive, no action required"},{"line_number":6821,"context_line":"                            # in this case."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_83f1f96c","line":6818,"updated":"2015-07-10 17:08:23.000000000","message":"If it\u0027s alive you\u0027re just going to kill it anyway, so why do this? It\u0027s not like you log something if it\u0027s not running, I don\u0027t see the point.","commit_id":"d6053139987e3a8e711504f779431ed80dd61447"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"74aafb8e086df625df444a4e6e73b3031adbdb6e","unresolved":false,"context_lines":[{"line_number":6815,"context_line":"                    for pid in self._pid_cache[instance.uuid]:"},{"line_number":6816,"context_line":"                        try:"},{"line_number":6817,"context_line":"                            # Check if the process is alive."},{"line_number":6818,"context_line":"                            os.kill(pid, 0)"},{"line_number":6819,"context_line":"                        except OSError:"},{"line_number":6820,"context_line":"                            # Raised if process is not alive, no action required"},{"line_number":6821,"context_line":"                            # in this case."}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_26fcbb71","line":6818,"in_reply_to":"ba3cc151_83f1f96c","updated":"2015-07-10 17:26:47.000000000","message":"Done","commit_id":"d6053139987e3a8e711504f779431ed80dd61447"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"995d6f99dcbe51952b16db40a56d4f646863b747","unresolved":false,"context_lines":[{"line_number":6822,"context_line":"                            pass"},{"line_number":6823,"context_line":"                        else:"},{"line_number":6824,"context_line":"                            # Kill the process"},{"line_number":6825,"context_line":"                            os.kill(pid, signal.SIGKILL)"},{"line_number":6826,"context_line":""},{"line_number":6827,"context_line":"                    # Remove the instance_uuid: pid from cache"},{"line_number":6828,"context_line":"                    del self._pid_cache[instance.uuid]"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_8366d927","line":6825,"updated":"2015-07-10 17:08:23.000000000","message":"Is this really necessary? By default rsync uses .part files and killing it like this will prevent it from cleaning up. I guess that only affects the receiving side, which should do the cleanup once it receives the connection reset, but either way, this doesn\u0027t seem necessary.\n\nAlso, even with SIGKILL, we can\u0027t be sure the process is gone. If it\u0027s waiting on NFS stuff or something it could still be hanging around. Perhaps it would be better to try a couple SIGTERMs, then a SIGKILL if it doesn\u0027t exit, and log the failure if it\u0027s still not gone after that?","commit_id":"d6053139987e3a8e711504f779431ed80dd61447"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"74aafb8e086df625df444a4e6e73b3031adbdb6e","unresolved":false,"context_lines":[{"line_number":6822,"context_line":"                            pass"},{"line_number":6823,"context_line":"                        else:"},{"line_number":6824,"context_line":"                            # Kill the process"},{"line_number":6825,"context_line":"                            os.kill(pid, signal.SIGKILL)"},{"line_number":6826,"context_line":""},{"line_number":6827,"context_line":"                    # Remove the instance_uuid: pid from cache"},{"line_number":6828,"context_line":"                    del self._pid_cache[instance.uuid]"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_c6d62ff1","line":6825,"in_reply_to":"ba3cc151_8366d927","updated":"2015-07-10 17:26:47.000000000","message":"So https://lwn.net/Articles/288056/ claims that NFS syscalls will result in process being killable, but the more general point stands. I think we should consider that this is a security fix so we should catch most of the issues with as little change as possible.\n\nWhat do you think we should do?","commit_id":"d6053139987e3a8e711504f779431ed80dd61447"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"995d6f99dcbe51952b16db40a56d4f646863b747","unresolved":false,"context_lines":[{"line_number":6825,"context_line":"                            os.kill(pid, signal.SIGKILL)"},{"line_number":6826,"context_line":""},{"line_number":6827,"context_line":"                    # Remove the instance_uuid: pid from cache"},{"line_number":6828,"context_line":"                    del self._pid_cache[instance.uuid]"},{"line_number":6829,"context_line":""},{"line_number":6830,"context_line":"                shutil.rmtree(target_del)"},{"line_number":6831,"context_line":"            except OSError as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_032169b4","line":6828,"updated":"2015-07-10 17:08:23.000000000","message":"This will leave an empty set() in the dict for every instance we\u0027ve ever had here, right? IMHO, we should clean those up when they\u0027re empty so that we\u0027re not just keeping lots of empty sets in the dict/memory over time.","commit_id":"d6053139987e3a8e711504f779431ed80dd61447"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"74aafb8e086df625df444a4e6e73b3031adbdb6e","unresolved":false,"context_lines":[{"line_number":6825,"context_line":"                            os.kill(pid, signal.SIGKILL)"},{"line_number":6826,"context_line":""},{"line_number":6827,"context_line":"                    # Remove the instance_uuid: pid from cache"},{"line_number":6828,"context_line":"                    del self._pid_cache[instance.uuid]"},{"line_number":6829,"context_line":""},{"line_number":6830,"context_line":"                shutil.rmtree(target_del)"},{"line_number":6831,"context_line":"            except OSError as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba3cc151_e693335b","line":6828,"in_reply_to":"ba3cc151_032169b4","updated":"2015-07-10 17:26:47.000000000","message":"I don\u0027t think so, it will just remove it to be created again on access","commit_id":"d6053139987e3a8e711504f779431ed80dd61447"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"55be44d2ebcf25dd217958bda352d1e87e300fb6","unresolved":false,"context_lines":[{"line_number":6303,"context_line":"            :param cleanup: True/False, if True removes pid from cache"},{"line_number":6304,"context_line":"            \"\"\""},{"line_number":6305,"context_line":"            if cleanup and instance.uuid in self._pid_cache:"},{"line_number":6306,"context_line":"                del self._pid_cache[instance.uuid]"},{"line_number":6307,"context_line":"            elif pid:"},{"line_number":6308,"context_line":"                self._pid_cache[instance.uuid].add(pid)"},{"line_number":6309,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_8677c79e","line":6306,"updated":"2015-07-10 17:13:01.000000000","message":"This should be .pop\u0027ed as well for the same reason as below.","commit_id":"15dc8c9145262afada5410afae4e55b8a39dd6b2"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"04e85c822eac3f9c44f815158f31deebbac90ba4","unresolved":false,"context_lines":[{"line_number":6303,"context_line":"            :param cleanup: True/False, if True removes pid from cache"},{"line_number":6304,"context_line":"            \"\"\""},{"line_number":6305,"context_line":"            if cleanup and instance.uuid in self._pid_cache:"},{"line_number":6306,"context_line":"                del self._pid_cache[instance.uuid]"},{"line_number":6307,"context_line":"            elif pid:"},{"line_number":6308,"context_line":"                self._pid_cache[instance.uuid].add(pid)"},{"line_number":6309,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_0622d701","line":6306,"in_reply_to":"ba3cc151_8677c79e","updated":"2015-07-10 17:27:10.000000000","message":"Done","commit_id":"15dc8c9145262afada5410afae4e55b8a39dd6b2"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"55be44d2ebcf25dd217958bda352d1e87e300fb6","unresolved":false,"context_lines":[{"line_number":6824,"context_line":"                            os.kill(pid, signal.SIGKILL)"},{"line_number":6825,"context_line":""},{"line_number":6826,"context_line":"                    # Remove the instance_uuid: pid from cache"},{"line_number":6827,"context_line":"                    del self._pid_cache[instance.uuid]"},{"line_number":6828,"context_line":""},{"line_number":6829,"context_line":"                shutil.rmtree(target_del)"},{"line_number":6830,"context_line":"            except OSError as e:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_465a1f2c","line":6827,"updated":"2015-07-10 17:13:01.000000000","message":"This should be .pop(instance.uuid, None) in case somehow this was deleted before reaching here.  Since the callback can also remove uuids.","commit_id":"15dc8c9145262afada5410afae4e55b8a39dd6b2"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"04e85c822eac3f9c44f815158f31deebbac90ba4","unresolved":false,"context_lines":[{"line_number":6824,"context_line":"                            os.kill(pid, signal.SIGKILL)"},{"line_number":6825,"context_line":""},{"line_number":6826,"context_line":"                    # Remove the instance_uuid: pid from cache"},{"line_number":6827,"context_line":"                    del self._pid_cache[instance.uuid]"},{"line_number":6828,"context_line":""},{"line_number":6829,"context_line":"                shutil.rmtree(target_del)"},{"line_number":6830,"context_line":"            except OSError as e:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_460f7f88","line":6827,"in_reply_to":"ba3cc151_465a1f2c","updated":"2015-07-10 17:27:10.000000000","message":"Done","commit_id":"15dc8c9145262afada5410afae4e55b8a39dd6b2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5d20959d22b079ac4aa85104f0a569eac5e200b4","unresolved":false,"context_lines":[{"line_number":6287,"context_line":"                pass"},{"line_number":6288,"context_line":"        return shared_storage"},{"line_number":6289,"context_line":""},{"line_number":6290,"context_line":"    def _store_pid(self, instance):"},{"line_number":6291,"context_line":"        def _callback(pid\u003dNone, cleanup\u003dFalse):"},{"line_number":6292,"context_line":"            \"\"\"Stores/removes pid of process."},{"line_number":6293,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba3cc151_fc3502db","line":6290,"updated":"2015-07-10 17:57:36.000000000","message":"This isn\u0027t an instance object, it\u0027s the subprocess.Popen object result:\n\nhttps://review.openstack.org/#/c/190472/4/oslo_concurrency/processutils.py","commit_id":"5cd1ade5c9fa52f8a6fa26abf899cce23c800421"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"44be09f49293eab4862fd8435d1b2baada90937c","unresolved":false,"context_lines":[{"line_number":6287,"context_line":"                pass"},{"line_number":6288,"context_line":"        return shared_storage"},{"line_number":6289,"context_line":""},{"line_number":6290,"context_line":"    def _store_pid(self, instance):"},{"line_number":6291,"context_line":"        def _callback(pid\u003dNone, cleanup\u003dFalse):"},{"line_number":6292,"context_line":"            \"\"\"Stores/removes pid of process."},{"line_number":6293,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba3cc151_fc466220","line":6290,"in_reply_to":"ba3cc151_fc3502db","updated":"2015-07-10 18:03:05.000000000","message":"Nevermind, this is fine.","commit_id":"5cd1ade5c9fa52f8a6fa26abf899cce23c800421"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"44be09f49293eab4862fd8435d1b2baada90937c","unresolved":false,"context_lines":[{"line_number":6288,"context_line":"        return shared_storage"},{"line_number":6289,"context_line":""},{"line_number":6290,"context_line":"    def _store_pid(self, instance):"},{"line_number":6291,"context_line":"        def _callback(pid\u003dNone, cleanup\u003dFalse):"},{"line_number":6292,"context_line":"            \"\"\"Stores/removes pid of process."},{"line_number":6293,"context_line":""},{"line_number":6294,"context_line":"            If processes are running for a given instance, then all these"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba3cc151_fc6d029a","line":6291,"updated":"2015-07-10 18:03:05.000000000","message":"This is just going to be the popen object, so looks like we can get the pid from that:\n\nhttps://docs.python.org/2/library/subprocess.html#popen-objects\n\nI don\u0027t think cleanup would ever be True though.","commit_id":"5cd1ade5c9fa52f8a6fa26abf899cce23c800421"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fa843d6cdfae0013ac5e2f2acdb8011cc41a4609","unresolved":false,"context_lines":[{"line_number":6813,"context_line":"                for pid in self._copy_pid_cache[instance.uuid]:"},{"line_number":6814,"context_line":"                    try:"},{"line_number":6815,"context_line":"                        # Try to kill the process"},{"line_number":6816,"context_line":"                        os.kill(pid, signal.SIGKILL)"},{"line_number":6817,"context_line":"                    except OSError:"},{"line_number":6818,"context_line":"                        # Raised if process is not alive, no action"},{"line_number":6819,"context_line":"                        # required in this case."}],"source_content_type":"text/x-python","patch_set":4,"id":"ba3cc151_dcad9eeb","line":6816,"updated":"2015-07-10 18:02:41.000000000","message":"I still think this is bad form to KILL a thing before trying to TERM it and let it cleanup. However, looking through rsync, I don\u0027t see that it creates anything locally so I guess this isn\u0027t likely to leave any residue.","commit_id":"5cd1ade5c9fa52f8a6fa26abf899cce23c800421"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fa843d6cdfae0013ac5e2f2acdb8011cc41a4609","unresolved":false,"context_lines":[{"line_number":6831,"context_line":"                                 instance\u003dinstance)"},{"line_number":6832,"context_line":""},{"line_number":6833,"context_line":"                # Remove the instance_uuid: pid from cache"},{"line_number":6834,"context_line":"                self._copy_pid_cache.pop(instance.uuid, None)"},{"line_number":6835,"context_line":""},{"line_number":6836,"context_line":"                shutil.rmtree(target_del)"},{"line_number":6837,"context_line":"            except OSError as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba3cc151_3c5b6af8","line":6834,"updated":"2015-07-10 18:02:41.000000000","message":"I think we could have the case where we are iterating during cleanup while something is still running and miss some pids here. Probably better to pre-pop it before we iterate and assert that nothing has inserted anything after we\u0027ve removed the files.\n\nProbably not worth delaying this over, but... sloppy process accounting is what got us here in the first place...","commit_id":"5cd1ade5c9fa52f8a6fa26abf899cce23c800421"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"07b6ba5d5d83ba4fca7893246af058792d3dc6eb","unresolved":false,"context_lines":[{"line_number":6288,"context_line":"        return shared_storage"},{"line_number":6289,"context_line":""},{"line_number":6290,"context_line":"    def _store_pid(self, instance):"},{"line_number":6291,"context_line":"        def _callback(popen\u003dNone, cleanup\u003dFalse):"},{"line_number":6292,"context_line":"            \"\"\"Stores/removes pid of process."},{"line_number":6293,"context_line":""},{"line_number":6294,"context_line":"            If processes are running for a given instance, then all these"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_dc24be0f","line":6291,"updated":"2015-07-10 18:09:57.000000000","message":"Where is cleanup ever set to True?","commit_id":"ab2e31d399399a5012a9817d0d3142d4b49d3d8e"}],"nova/virt/libvirt/utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"56115948a8145f653db4897a36a092450b4b02e9","unresolved":false,"context_lines":[{"line_number":297,"context_line":"    :param dest: Destination path"},{"line_number":298,"context_line":"    :param host: Remote host"},{"line_number":299,"context_line":"    :param receive: Reverse the rsync direction"},{"line_number":300,"context_line":"    :on_command_execute: Callback method to store pid of the process"},{"line_number":301,"context_line":"    \"\"\""},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    if not host:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_862fc73d","line":300,"updated":"2015-07-10 17:17:55.000000000","message":"It\u0027s just a callback, the actual impl (storing the pid of the process or logging \u0027hello world\u0027) is up to the caller.","commit_id":"15dc8c9145262afada5410afae4e55b8a39dd6b2"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"04e85c822eac3f9c44f815158f31deebbac90ba4","unresolved":false,"context_lines":[{"line_number":297,"context_line":"    :param dest: Destination path"},{"line_number":298,"context_line":"    :param host: Remote host"},{"line_number":299,"context_line":"    :param receive: Reverse the rsync direction"},{"line_number":300,"context_line":"    :on_command_execute: Callback method to store pid of the process"},{"line_number":301,"context_line":"    \"\"\""},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    if not host:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_867ca7ec","line":300,"in_reply_to":"ba3cc151_862fc73d","updated":"2015-07-10 17:27:10.000000000","message":"Done","commit_id":"15dc8c9145262afada5410afae4e55b8a39dd6b2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5d20959d22b079ac4aa85104f0a569eac5e200b4","unresolved":false,"context_lines":[{"line_number":297,"context_line":"    :param dest: Destination path"},{"line_number":298,"context_line":"    :param host: Remote host"},{"line_number":299,"context_line":"    :param receive: Reverse the rsync direction"},{"line_number":300,"context_line":"    :on_command_execute: Callback method that will be passed the command pid"},{"line_number":301,"context_line":"    \"\"\""},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    if not host:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba3cc151_1c5546f9","line":300,"updated":"2015-07-10 17:57:36.000000000","message":"It\u0027s passed the subprocess.Popen obj result:\n\nhttps://review.openstack.org/#/c/190472/4/oslo_concurrency/processutils.py","commit_id":"5cd1ade5c9fa52f8a6fa26abf899cce23c800421"}]}
