)]}'
{"Engine/swift/storlet_gateway/storlet_runtime.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"92259df6dac8237a3e74e0dbd603ae6b53b5de78","unresolved":false,"context_lines":[{"line_number":484,"context_line":""},{"line_number":485,"context_line":"    def _prepare_invocation_descriptors(self):"},{"line_number":486,"context_line":"        # Add the input stream"},{"line_number":487,"context_line":"        self._add_input_stream(self.srequest.stream)"},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"        # Add the output stream"},{"line_number":490,"context_line":"        self.data_read_fd, self.data_write_fd \u003d os.pipe()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a1b2928_6befe1b0","line":487,"range":{"start_line":487,"start_character":8,"end_line":487,"end_character":52},"updated":"2016-04-11 04:31:21.000000000","message":"_add_input_stream seems to have different interfaces between base class (StorletInvocationProtocol and StorletInvocationGETProtocol), and this fix causes error in GET/PUT Protocol, I think.","commit_id":"1fcf5924ae4210407a4697f3ecbf64d0a17aa7ed"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"796493917e4e8318c36c62340581a1ee842d74d7","unresolved":false,"context_lines":[{"line_number":488,"context_line":""},{"line_number":489,"context_line":"    def _prepare_invocation_descriptors(self):"},{"line_number":490,"context_line":"        # Add the input stream"},{"line_number":491,"context_line":"        self._add_input_stream(self.input_stream)"},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"        # Add the output stream"},{"line_number":494,"context_line":"        self.data_read_fd, self.data_write_fd \u003d os.pipe()"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_8c4d0d9c","line":491,"updated":"2016-05-03 08:10:47.000000000","message":"Nice refactoring.","commit_id":"89579bcd0ae16fa40e858ba69b847a59acdf0e7c"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"796493917e4e8318c36c62340581a1ee842d74d7","unresolved":false,"context_lines":[{"line_number":544,"context_line":""},{"line_number":545,"context_line":"        self._wait_for_read_with_timeout(self.execution_str_read_fd)"},{"line_number":546,"context_line":"        self.task_id \u003d os.read(self.execution_str_read_fd, 10)"},{"line_number":547,"context_line":"        os.close(self.execution_str_read_fd)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"    def __init__(self, srequest, storlet_pipe_path, storlet_logger_path,"},{"line_number":550,"context_line":"                 timeout):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_0c5a9d50","line":547,"updated":"2016-05-03 08:10:47.000000000","message":"Yep, seems better here!","commit_id":"89579bcd0ae16fa40e858ba69b847a59acdf0e7c"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"796493917e4e8318c36c62340581a1ee842d74d7","unresolved":false,"context_lines":[{"line_number":586,"context_line":"            with StorletTimeout(self.timeout):"},{"line_number":587,"context_line":"                r, w, e \u003d select.select([fd], [], [])"},{"line_number":588,"context_line":"        except StorletTimeout:"},{"line_number":589,"context_line":"            exc_type, exc_value, exc_traceback \u003d sys.exc_info()"},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"            # When there is a task already running, we should cancel it."},{"line_number":592,"context_line":"            if self.task_id:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_ac93a9ff","line":589,"updated":"2016-05-03 08:10:47.000000000","message":"Good catch, I saw this \u0027crashes\u0027 in the log :-)","commit_id":"89579bcd0ae16fa40e858ba69b847a59acdf0e7c"}],"tests/unit/swift/storlet_gateway/test_storlet_runtime.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"92259df6dac8237a3e74e0dbd603ae6b53b5de78","unresolved":false,"context_lines":[{"line_number":323,"context_line":"                    self.protocol._invoke()"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"            for _pipe in pipes:"},{"line_number":326,"context_line":"                # Oh my, _pipe[0] is not closed yet."},{"line_number":327,"context_line":"                # self.assertTrue(_pipe[0].closed)"},{"line_number":328,"context_line":"                self.assertTrue(_pipe[1].closed)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a1b2928_abe1f9d2","line":327,"range":{"start_line":326,"start_character":16,"end_line":327,"end_character":50},"updated":"2016-04-11 04:31:21.000000000","message":"Please make sure that this is not a bug, but the expected behavior.\nRead fds are not closed inside _invoke, and closed \"outside\" _invoke.\n\nmetadata_read_fd and execution_str_read_fd are closed in communicate.\n# I noticed now I should make sure about ProxyProtocol now.\n\ndate_read_fd is not closed in communicate, because we should still read body content from that fd. It is passed to StorletDockerGateway.IterLike, and closed after reading all data.","commit_id":"1fcf5924ae4210407a4697f3ecbf64d0a17aa7ed"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"212418ef3ea33711169d2b49fc2489bb152ac265","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        storlet_request \u003d DockerStorletRequest("},{"line_number":300,"context_line":"            \u0027test_account\u0027, Request.blank(\u0027/\u0027), {})"},{"line_number":301,"context_line":"        # TODO(kota_): need better way"},{"line_number":302,"context_line":"        storlet_request.stream \u003d StringIO()"},{"line_number":303,"context_line":"        self.protocol \u003d \\"},{"line_number":304,"context_line":"            storlet_gateway.storlet_runtime.StorletInvocationProtocol("},{"line_number":305,"context_line":"                storlet_request, self.pipe_path, self.log_file, 1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a18252c_ccaecf84","line":302,"range":{"start_line":302,"start_character":8,"end_line":302,"end_character":43},"updated":"2016-04-13 05:24:37.000000000","message":"just note\n\nIn StorletGETRequest, we pass a file descriptor as stream, while in other request pattern(SLO, COPY, PUT), we pass an iterator. So when we add tests for GETProtocol, we should be careful about that.\n\nI think we have to fix StorletGETRequest to use an iterator instead of a file descriptor, to avoid confusing deference.\nThe following patch[1] is still WIP state, but I think it will be help for doing that.\n\n[1] https://review.openstack.org/#/c/294406/","commit_id":"2d6edaae10d79fa43da59e2330779fa6be293db4"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"45f0944e3c462d5a7ed402f5422e62406345da07","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        storlet_request \u003d DockerStorletRequest("},{"line_number":300,"context_line":"            \u0027test_account\u0027, Request.blank(\u0027/\u0027), {})"},{"line_number":301,"context_line":"        # TODO(kota_): need better way"},{"line_number":302,"context_line":"        storlet_request.stream \u003d StringIO()"},{"line_number":303,"context_line":"        self.protocol \u003d \\"},{"line_number":304,"context_line":"            storlet_gateway.storlet_runtime.StorletInvocationProtocol("},{"line_number":305,"context_line":"                storlet_request, self.pipe_path, self.log_file, 1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a18252c_177a94f1","line":302,"range":{"start_line":302,"start_character":8,"end_line":302,"end_character":43},"in_reply_to":"5a18252c_ccaecf84","updated":"2016-04-13 06:27:24.000000000","message":"Ah yeah, [1] is what I would *really* like to do in the future work. To avoid breaking anything, I wrote up this test at first. And exactly, it\u0027s worse the different instance in a variable among child classes (i.e. GETRequest vs any others), I think we need to clean up for this. OK, I will make a comment.","commit_id":"2d6edaae10d79fa43da59e2330779fa6be293db4"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"212418ef3ea33711169d2b49fc2489bb152ac265","unresolved":false,"context_lines":[{"line_number":311,"context_line":"            except OSError:"},{"line_number":312,"context_line":"                pass"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def test_invocation_protocol(self):"},{"line_number":315,"context_line":"        # os.pipe will be called 3 times"},{"line_number":316,"context_line":"        pipe_called \u003d 3"},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a18252c_8cd217ff","line":314,"range":{"start_line":314,"start_character":8,"end_line":314,"end_character":32},"updated":"2016-04-13 05:24:37.000000000","message":"Do you intend the test for just invoke function, or a more general test?","commit_id":"2d6edaae10d79fa43da59e2330779fa6be293db4"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"a6c295932167144a6fb3c53694f3e674b8096c96","unresolved":false,"context_lines":[{"line_number":311,"context_line":"            except OSError:"},{"line_number":312,"context_line":"                pass"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def test_invocation_protocol(self):"},{"line_number":315,"context_line":"        # os.pipe will be called 3 times"},{"line_number":316,"context_line":"        pipe_called \u003d 3"},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a18252c_d235cada","line":314,"range":{"start_line":314,"start_character":8,"end_line":314,"end_character":32},"in_reply_to":"5a18252c_377190e1","updated":"2016-04-13 06:34:21.000000000","message":"OK, so this test is the test case for general part of invocation functions in each Protocol classes. That makes sense to me. Thanks!","commit_id":"2d6edaae10d79fa43da59e2330779fa6be293db4"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"45f0944e3c462d5a7ed402f5422e62406345da07","unresolved":false,"context_lines":[{"line_number":311,"context_line":"            except OSError:"},{"line_number":312,"context_line":"                pass"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def test_invocation_protocol(self):"},{"line_number":315,"context_line":"        # os.pipe will be called 3 times"},{"line_number":316,"context_line":"        pipe_called \u003d 3"},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a18252c_377190e1","line":314,"range":{"start_line":314,"start_character":8,"end_line":314,"end_character":32},"in_reply_to":"5a18252c_8cd217ff","updated":"2016-04-13 06:27:24.000000000","message":"To be honest, I would like to make all methods for InvocationProtocol but as you know, there is context difference among child classes\u0027 methods (e.g. communicate) and it makes us difficult to write general test cases absolutely.\n\nIn my plan, we land this to keep the base invocation protocol syntax, and then, merge any others as possible to fit *THIS BASE*, and then, make more tests for them.\n\nHow do you think of?","commit_id":"2d6edaae10d79fa43da59e2330779fa6be293db4"}]}
