)]}'
{"Engine/agent/storlet_daemon/daemon.py":[{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"72cd4fc00449a64a23773f5d6dab7964bc68a4d9","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        else:"},{"line_number":67,"context_line":"            try:"},{"line_number":68,"context_line":"                self.logger.debug(\u0027Start storlet invocation\u0027)"},{"line_number":69,"context_line":"                # TODO(takashi): Implement application loading"},{"line_number":70,"context_line":"                in_fds \u003d dtg.object_in_fds"},{"line_number":71,"context_line":"                in_md \u003d dtg.object_in_metadata"},{"line_number":72,"context_line":"                out_md_fds \u003d dtg.object_metadata_out_fds"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa7ab95a_f567c2b4","line":69,"updated":"2016-08-29 10:47:11.000000000","message":"I think that doing the application loading at this point is suboptimal in terms of performance, as we will load it on each invocation. The alternative is to load the app before we fork, e.g. before we enter the main loop.\nEarlier load is also better in terms of problem resolution: We get to know there is a loading problem before we do an actual invocation of the storlet.","commit_id":"47c960ba196a545b148700304ca1036c61254897"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"a568adbc8fa2ff8e0b9915e3246e7560ca39620d","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        else:"},{"line_number":67,"context_line":"            try:"},{"line_number":68,"context_line":"                self.logger.debug(\u0027Start storlet invocation\u0027)"},{"line_number":69,"context_line":"                # TODO(takashi): Implement application loading"},{"line_number":70,"context_line":"                in_fds \u003d dtg.object_in_fds"},{"line_number":71,"context_line":"                in_md \u003d dtg.object_in_metadata"},{"line_number":72,"context_line":"                out_md_fds \u003d dtg.object_metadata_out_fds"}],"source_content_type":"text/x-python","patch_set":14,"id":"da7fb54a_f6c906ae","line":69,"in_reply_to":"fa7ab95a_f567c2b4","updated":"2016-09-02 17:20:23.000000000","message":"Done","commit_id":"47c960ba196a545b148700304ca1036c61254897"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ad7ef030c6886f8752c38cef3133ded51925394c","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        else:"},{"line_number":67,"context_line":"            try:"},{"line_number":68,"context_line":"                self.logger.debug(\u0027Start storlet invocation\u0027)"},{"line_number":69,"context_line":"                # TODO(takashi): Implement application loading"},{"line_number":70,"context_line":"                in_fds \u003d dtg.object_in_fds"},{"line_number":71,"context_line":"                in_md \u003d dtg.object_in_metadata"},{"line_number":72,"context_line":"                out_md_fds \u003d dtg.object_metadata_out_fds"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa7ab95a_8089c477","line":69,"in_reply_to":"fa7ab95a_f567c2b4","updated":"2016-08-29 14:11:10.000000000","message":"Makes sense to me. I will consider that point in my next commit, thanks!","commit_id":"47c960ba196a545b148700304ca1036c61254897"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"72cd4fc00449a64a23773f5d6dab7964bc68a4d9","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @command_handler"},{"line_number":89,"context_line":"    def descriptor(self, dtg):"},{"line_number":90,"context_line":"        # TODO(takashi): Do we really need this?"},{"line_number":91,"context_line":"        self.logger.error(\u0027Descriptor operation is not implemented\u0027)"},{"line_number":92,"context_line":"        raise NotImplementedError()"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"fa7ab95a_f88b3966","line":90,"updated":"2016-08-29 10:47:11.000000000","message":"At this point we do not need it. Lets leave NotImplementedError. This was used for having the ability for storlets to create new objects. With Kota\u0027s current \u0027crazy stuff\u0027 we may just want to implement this :-)","commit_id":"47c960ba196a545b148700304ca1036c61254897"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"a568adbc8fa2ff8e0b9915e3246e7560ca39620d","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @command_handler"},{"line_number":89,"context_line":"    def descriptor(self, dtg):"},{"line_number":90,"context_line":"        # TODO(takashi): Do we really need this?"},{"line_number":91,"context_line":"        self.logger.error(\u0027Descriptor operation is not implemented\u0027)"},{"line_number":92,"context_line":"        raise NotImplementedError()"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"da7fb54a_d6d40249","line":90,"in_reply_to":"fa7ab95a_f88b3966","updated":"2016-09-02 17:20:23.000000000","message":"Done","commit_id":"47c960ba196a545b148700304ca1036c61254897"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ad7ef030c6886f8752c38cef3133ded51925394c","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @command_handler"},{"line_number":89,"context_line":"    def descriptor(self, dtg):"},{"line_number":90,"context_line":"        # TODO(takashi): Do we really need this?"},{"line_number":91,"context_line":"        self.logger.error(\u0027Descriptor operation is not implemented\u0027)"},{"line_number":92,"context_line":"        raise NotImplementedError()"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"fa7ab95a_a0c888a9","line":90,"in_reply_to":"fa7ab95a_f88b3966","updated":"2016-08-29 14:11:10.000000000","message":"Thanks for your help! I\u0027ll update my comment, based on your information.","commit_id":"47c960ba196a545b148700304ca1036c61254897"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"72cd4fc00449a64a23773f5d6dab7964bc68a4d9","unresolved":false,"context_lines":[{"line_number":240,"context_line":"    factory \u003d Daemon(storlet_name, sbus_path, logger, pool_size)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    # Start the main loop"},{"line_number":243,"context_line":"    return factory.main_loop(container_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa7ab95a_5897c539","line":243,"updated":"2016-08-29 10:47:11.000000000","message":"do we need to do here some cleanup? In the Java daemon we terminate the pool. Perhaps we need the equivalent here, to make sure all child processes exit.","commit_id":"47c960ba196a545b148700304ca1036c61254897"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"a568adbc8fa2ff8e0b9915e3246e7560ca39620d","unresolved":false,"context_lines":[{"line_number":240,"context_line":"    factory \u003d Daemon(storlet_name, sbus_path, logger, pool_size)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    # Start the main loop"},{"line_number":243,"context_line":"    return factory.main_loop(container_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"da7fb54a_16cf4ab1","line":243,"in_reply_to":"fa7ab95a_5897c539","updated":"2016-09-02 17:20:23.000000000","message":"Done","commit_id":"47c960ba196a545b148700304ca1036c61254897"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ad7ef030c6886f8752c38cef3133ded51925394c","unresolved":false,"context_lines":[{"line_number":240,"context_line":"    factory \u003d Daemon(storlet_name, sbus_path, logger, pool_size)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    # Start the main loop"},{"line_number":243,"context_line":"    return factory.main_loop(container_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa7ab95a_2019d822","line":243,"in_reply_to":"fa7ab95a_5897c539","updated":"2016-08-29 14:11:10.000000000","message":"Good catch, thanks!. We surely need to take care about process termination here.\n\nI still need some more consideration about process management, but I\u0027ll include that point.","commit_id":"47c960ba196a545b148700304ca1036c61254897"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"b4f55a19c861d5c9bfbe7bb3df94321699d6cd4c","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                    # TODO(takashi): Can we skip checking the remaining ones?"},{"line_number":64,"context_line":"                    terminated.append(task_id)"},{"line_number":65,"context_line":"                else:"},{"line_number":66,"context_line":"                    self.logger.exception(\u0027Failed to get the status of \u0027"},{"line_number":67,"context_line":"                                          \u0027the subprocess with pid %d\u0027 %"},{"line_number":68,"context_line":"                                          daemon_pid)"},{"line_number":69,"context_line":"        for task_id in terminated:"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_1a2cba49","line":66,"updated":"2016-09-04 14:11:07.000000000","message":"Will this log give us err.errno? I think yes, but just want to make sure","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ea48b327e4a23c47777ee5d9306efdad43434085","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                    # TODO(takashi): Can we skip checking the remaining ones?"},{"line_number":64,"context_line":"                    terminated.append(task_id)"},{"line_number":65,"context_line":"                else:"},{"line_number":66,"context_line":"                    self.logger.exception(\u0027Failed to get the status of \u0027"},{"line_number":67,"context_line":"                                          \u0027the subprocess with pid %d\u0027 %"},{"line_number":68,"context_line":"                                          daemon_pid)"},{"line_number":69,"context_line":"        for task_id in terminated:"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_bbce6b81","line":66,"in_reply_to":"9a89bdaa_1a2cba49","updated":"2016-09-05 05:51:28.000000000","message":"Yes. It is included in a traceback message.","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"b4f55a19c861d5c9bfbe7bb3df94321699d6cd4c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        self.logger.debug(\u0027Wait until all of the subprocesses are \u0027"},{"line_number":113,"context_line":"                          \u0027terminated\u0027)"},{"line_number":114,"context_line":"        while len(self.task_id_to_pid):"},{"line_number":115,"context_line":"            self._wait_child_process()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @command_handler"},{"line_number":118,"context_line":"    def halt(self, dtg):"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_da9fb25d","line":115,"updated":"2016-09-04 14:11:07.000000000","message":"The _wait_child_process is a \u0027graceful\u0027 mechanism. Might be that in the case of existing the main loop we do not want to be graceful and just kill everything, or put some timeout.","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ea48b327e4a23c47777ee5d9306efdad43434085","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        self.logger.debug(\u0027Wait until all of the subprocesses are \u0027"},{"line_number":113,"context_line":"                          \u0027terminated\u0027)"},{"line_number":114,"context_line":"        while len(self.task_id_to_pid):"},{"line_number":115,"context_line":"            self._wait_child_process()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @command_handler"},{"line_number":118,"context_line":"    def halt(self, dtg):"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_3b041b7d","line":115,"in_reply_to":"9a89bdaa_da9fb25d","updated":"2016-09-05 05:51:28.000000000","message":"Timeout mechanism makes sense to me.\nIMO, we need to consider about the timeout mechanism about agent, so I\u0027ll add the timeout after we decide how we implement this.\n\nIMO, we can use eventlet as a dependency for agent modules, and user eventlet.Timeout, as we do for server side modules.","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"b4f55a19c861d5c9bfbe7bb3df94321699d6cd4c","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def _safe_close_fd(self, fd):"},{"line_number":122,"context_line":"        try:"},{"line_number":123,"context_line":"            os.close(fd)"},{"line_number":124,"context_line":"        except OSError as err:"},{"line_number":125,"context_line":"            if err.errno !\u003d errno.EBADF:"},{"line_number":126,"context_line":"                raise"},{"line_number":127,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_1a375ab1","line":124,"updated":"2016-09-04 14:11:07.000000000","message":"Should we log here something?","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"cfd14d36cea7379a1495234d07461fd4caa81f3d","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def _safe_close_fd(self, fd):"},{"line_number":122,"context_line":"        try:"},{"line_number":123,"context_line":"            os.close(fd)"},{"line_number":124,"context_line":"        except OSError as err:"},{"line_number":125,"context_line":"            if err.errno !\u003d errno.EBADF:"},{"line_number":126,"context_line":"                raise"},{"line_number":127,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_cfe09bcf","line":124,"in_reply_to":"9a89bdaa_1a375ab1","updated":"2016-09-06 08:25:18.000000000","message":"Done","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ea48b327e4a23c47777ee5d9306efdad43434085","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def _safe_close_fd(self, fd):"},{"line_number":122,"context_line":"        try:"},{"line_number":123,"context_line":"            os.close(fd)"},{"line_number":124,"context_line":"        except OSError as err:"},{"line_number":125,"context_line":"            if err.errno !\u003d errno.EBADF:"},{"line_number":126,"context_line":"                raise"},{"line_number":127,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_7be783e4","line":124,"in_reply_to":"9a89bdaa_1a375ab1","updated":"2016-09-05 05:51:28.000000000","message":"seems better. thanks!","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"b4f55a19c861d5c9bfbe7bb3df94321699d6cd4c","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            self._safe_close_fd(logger_fd)"},{"line_number":162,"context_line":"        else:"},{"line_number":163,"context_line":"            try:"},{"line_number":164,"context_line":"                self.logger.debug(\u0027Start storlet invocation\u0027)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"                self.logger.debug(\u0027in_fds:%s in_md:%s out_md_fds:%s out_fds:%s\u0027"},{"line_number":167,"context_line":"                                  % (in_fds, in_md, out_md_fds, out_fds))"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_91d8baf1","line":164,"updated":"2016-09-04 14:11:07.000000000","message":"So I guess this is a temporary \u0027identity storlet\u0027 overwritten by https://review.openstack.org/363303","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ea48b327e4a23c47777ee5d9306efdad43434085","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            self._safe_close_fd(logger_fd)"},{"line_number":162,"context_line":"        else:"},{"line_number":163,"context_line":"            try:"},{"line_number":164,"context_line":"                self.logger.debug(\u0027Start storlet invocation\u0027)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"                self.logger.debug(\u0027in_fds:%s in_md:%s out_md_fds:%s out_fds:%s\u0027"},{"line_number":167,"context_line":"                                  % (in_fds, in_md, out_md_fds, out_fds))"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_9bb0c7f6","line":164,"in_reply_to":"9a89bdaa_91d8baf1","updated":"2016-09-05 05:51:28.000000000","message":"You are right.\nThis is just returning metadata/object without any changes inside storlet daemon itself.","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"b4f55a19c861d5c9bfbe7bb3df94321699d6cd4c","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            if not pid:"},{"line_number":215,"context_line":"                outfile.write(\u0027BAD\u0027)"},{"line_number":216,"context_line":"            else:"},{"line_number":217,"context_line":"                os.kill(pid)"},{"line_number":218,"context_line":"                outfile.write(\u0027OK\u0027)"},{"line_number":219,"context_line":"        return False"},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_7a46a624","line":217,"updated":"2016-09-04 14:11:07.000000000","message":"Do we need to call self._remove_pid(pid) here?","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"cfd14d36cea7379a1495234d07461fd4caa81f3d","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            if not pid:"},{"line_number":215,"context_line":"                outfile.write(\u0027BAD\u0027)"},{"line_number":216,"context_line":"            else:"},{"line_number":217,"context_line":"                os.kill(pid)"},{"line_number":218,"context_line":"                outfile.write(\u0027OK\u0027)"},{"line_number":219,"context_line":"        return False"},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_0fb443cf","line":217,"in_reply_to":"9a89bdaa_7a46a624","updated":"2016-09-06 08:25:18.000000000","message":"Done","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ea48b327e4a23c47777ee5d9306efdad43434085","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            if not pid:"},{"line_number":215,"context_line":"                outfile.write(\u0027BAD\u0027)"},{"line_number":216,"context_line":"            else:"},{"line_number":217,"context_line":"                os.kill(pid)"},{"line_number":218,"context_line":"                outfile.write(\u0027OK\u0027)"},{"line_number":219,"context_line":"        return False"},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_fbad5389","line":217,"in_reply_to":"9a89bdaa_7a46a624","updated":"2016-09-05 05:51:28.000000000","message":"Yes. This may cause error in duplicated call for cancel, so I will fix this soon.\n\nAlso, IMO we need to put try-except around os.kill. I\u0027ll also do that addition in my coming patch.","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"b4f55a19c861d5c9bfbe7bb3df94321699d6cd4c","unresolved":false,"context_lines":[{"line_number":341,"context_line":"    SBus.start_logger(\"DEBUG\", container_id\u003dcontainer_id)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    # Impersonate the swift user"},{"line_number":344,"context_line":"    pw \u003d pwd.getpwnam(\u0027swift\u0027)"},{"line_number":345,"context_line":"    os.setresgid(pw.pw_gid, pw.pw_gid, pw.pw_gid)"},{"line_number":346,"context_line":"    os.setresuid(pw.pw_uid, pw.pw_uid, pw.pw_uid)"},{"line_number":347,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_b16cde9d","line":344,"updated":"2016-09-04 14:11:07.000000000","message":"While it cannot hurt, I wonder if this is redundant, given that the factory already impersonates the user \u0027swift\u0027","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ea48b327e4a23c47777ee5d9306efdad43434085","unresolved":false,"context_lines":[{"line_number":341,"context_line":"    SBus.start_logger(\"DEBUG\", container_id\u003dcontainer_id)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    # Impersonate the swift user"},{"line_number":344,"context_line":"    pw \u003d pwd.getpwnam(\u0027swift\u0027)"},{"line_number":345,"context_line":"    os.setresgid(pw.pw_gid, pw.pw_gid, pw.pw_gid)"},{"line_number":346,"context_line":"    os.setresuid(pw.pw_uid, pw.pw_uid, pw.pw_uid)"},{"line_number":347,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_5b7e3fe5","line":344,"in_reply_to":"9a89bdaa_b16cde9d","updated":"2016-09-05 05:51:28.000000000","message":"Although it is redundant, it can make the things more safe, because we can make sure about the process user.\n\nIMO, we had better read a setting about process user, and inpersonate it both in storlet-daemon and storlet-daemon-factory.","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"}],"Engine/swift/storlet_gateway/gateways/docker/runtime.py":[{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"b4f55a19c861d5c9bfbe7bb3df94321699d6cd4c","unresolved":false,"context_lines":[{"line_number":637,"context_line":"        if (rc \u003c 0):"},{"line_number":638,"context_line":"            raise StorletRuntimeException(\"Failed to send execute command\")"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"        self._close_remote_side_descriptors()"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        self._wait_for_read_with_timeout(self.execution_str_read_fd)"},{"line_number":643,"context_line":"        # TODO(kota_): need an assertion for task_id format"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a89bdaa_5afe426c","line":640,"updated":"2016-09-04 14:11:07.000000000","message":"nice catch!","commit_id":"b6ae3be9cfa4d641217714b6dad3679243679972"}]}
