)]}'
{"oslo_rootwrap/client.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"c8f37187abd980c1bf7de6b7ee75d209d1407121","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    def _shutdown(process, manager, JsonClient\u003djsonrpc.JsonClient):"},{"line_number":92,"context_line":"        # Storing JsonClient in arguments because globals are set to None"},{"line_number":93,"context_line":"        # before executing atexit routines in Python 2.x"},{"line_number":94,"context_line":"        if process.poll() is None:"},{"line_number":95,"context_line":"            LOG.info(\u0027Stopping rootwrap daemon process with pid\u003d%s\u0027,"},{"line_number":96,"context_line":"                     process.pid)"},{"line_number":97,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a22e58a_ee459317","side":"PARENT","line":94,"updated":"2017-03-14 07:00:00.000000000","message":"We also loose this check that prevents us from trying to communicate with dead process.","commit_id":"fc5b2a9995d2ba1f70226fe750f73f9e20d3906e"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"c8f37187abd980c1bf7de6b7ee75d209d1407121","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        self._finalize \u003d None"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _initialize(self):"},{"line_number":57,"context_line":"        if self._process is not None and self._process.poll() is not None:"},{"line_number":58,"context_line":"            LOG.warning(\"Leaving behind already spawned process with pid %d, \""},{"line_number":59,"context_line":"                        \"root should kill it if it\u0027s still there (I can\u0027t)\","},{"line_number":60,"context_line":"                        self._process.pid)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        process_obj \u003d subprocess.Popen(self._start_command,"},{"line_number":63,"context_line":"                                       stdin\u003dsubprocess.PIPE,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a22e58a_aed47b47","line":60,"range":{"start_line":57,"start_character":0,"end_line":60,"end_character":42},"updated":"2017-03-14 07:00:00.000000000","message":"This whole check becomes irrelevant if we daemon forks away.","commit_id":"76906fa527808734a9b5a44a537a6f6d2d82ec9d"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"6109cc9e22e088c8ac8e8fd046bdd9dd88adcfbc","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        process_obj \u003d subprocess.Popen(self._start_command,"},{"line_number":63,"context_line":"                                       stdin\u003dsubprocess.PIPE,"},{"line_number":64,"context_line":"                                       stdout\u003dsubprocess.PIPE,"},{"line_number":65,"context_line":"                                       stderr\u003dsubprocess.PIPE,"},{"line_number":66,"context_line":"                                       close_fds\u003dTrue)"},{"line_number":67,"context_line":"        LOG.debug(\"Popen for %s command has been instantiated\","},{"line_number":68,"context_line":"                  self._start_command)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a22e58a_4b585957","line":65,"updated":"2017-03-14 06:48:44.000000000","message":"You can comment out this line to get stderr from subprocess to your stderr.","commit_id":"76906fa527808734a9b5a44a537a6f6d2d82ec9d"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"6109cc9e22e088c8ac8e8fd046bdd9dd88adcfbc","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self._pid \u003d int(process_obj.stdout.readline())"},{"line_number":76,"context_line":"        authkey \u003d process_obj.stdout.read(32)"},{"line_number":77,"context_line":"        if process_obj.poll() is not None:"},{"line_number":78,"context_line":"            stderr \u003d process_obj.stderr.read()"},{"line_number":79,"context_line":"            # NOTE(yorik-sar): don\u0027t expose stdout here"},{"line_number":80,"context_line":"            raise Exception(\"Failed to spawn rootwrap process.\\nstderr:\\n%s\" %"},{"line_number":81,"context_line":"                            (stderr,))"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a22e58a_4b069921","line":78,"updated":"2017-03-14 06:48:44.000000000","message":"It seems test fails here: smth goes wrong with child process. For some reason eventlet thinks that somebody is already reading process_obj.stderr here. If you comment out this line (or rather assign smth to stderr var here) and the line #65, you should get error message in test logs.","commit_id":"76906fa527808734a9b5a44a537a6f6d2d82ec9d"}],"oslo_rootwrap/daemon.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"c8f37187abd980c1bf7de6b7ee75d209d1407121","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            stdout.flush()"},{"line_number":160,"context_line":"            sys.stderr.close()"},{"line_number":161,"context_line":"            # Follow daemon(3) style and detach from the parent"},{"line_number":162,"context_line":"            pid \u003d os.fork()"},{"line_number":163,"context_line":"            if pid:"},{"line_number":164,"context_line":"                stdout.write(socket_path.encode(\u0027utf-8\u0027) + b\u0027\\n\u0027)"},{"line_number":165,"context_line":"                stdout.write((\u0027%d\\n\u0027 % pid).encode(\u0027utf-8\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a22e58a_eef753f3","line":162,"updated":"2017-03-14 07:00:00.000000000","message":"Please use multiprocessing module abstractions instead of calling os.fork() directly. They are way safer.","commit_id":"76906fa527808734a9b5a44a537a6f6d2d82ec9d"}]}
