)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"d90364da4277de4e6ddd199ae4afe0e9bd62d0d4","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Kota Tsuyuzaki \u003ctsuyuzaki.kota@lab.ntt.co.jp\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-08-15 19:02:38 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add capability for crazy things"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I3aa27d4df5bb151c09003a98209c7ccf91d25828"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"3ac371cc_81b86212","line":7,"updated":"2016-08-18 15:07:56.000000000","message":"Can you please add a description of what these crazy things might be :-)\ne.g. enable storlet invocation with multiple input sources. Also, do you envision this for all verbs? GET, PUT, COPY?","commit_id":"be88075872120b030f268529ac3181cb015a7ed1"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"f02a5f529307eeea7f44d630e80854c99dbee0f3","unresolved":false,"context_lines":[{"line_number":50,"context_line":"unfortunately."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"TODO (it could be in follow up):"},{"line_number":53,"context_line":"- Description docs for the new API"},{"line_number":54,"context_line":"- More tests with/without X-Storlet-Run-On-Proxy"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"Change-Id: I3aa27d4df5bb151c09003a98209c7ccf91d25828"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"7a8ec9b2_45200af8","line":53,"updated":"2016-09-20 09:45:56.000000000","message":"In the docs I will mention that the feature is for the GET, COPY verbs (not PUT)","commit_id":"7891c115f86b69e1c0874bdeffdcc2c25bec7038"}],"Engine/swift/storlet_gateway/gateways/docker/gateway.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ab579acc40adde7dc656836d0c535cc90d7e70d4","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                raise ValueError(\u0027Mandatory parameter is missing\u0027"},{"line_number":175,"context_line":"                                 \u0027: {0}\u0027.format(md))"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def invocation_flow(self, sreq, extra_sources\u003dNone):"},{"line_number":178,"context_line":"        \"\"\""},{"line_number":179,"context_line":"        Invoke the backend protocl with gateway"},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_1798601b","line":177,"range":{"start_line":177,"start_character":36,"end_line":177,"end_character":54},"updated":"2016-09-17 05:20:50.000000000","message":"IMO, it looks better to include extra_sources to StorletRequest.\nStorletRequest is used to manage input/output data to/from gateway module, and it\u0027s better to manager all of i/o using it.","commit_id":"72202721e87af3347564726c457e3a6b9a1b09cd"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"57f88c836e030c51a9f70b3c3f4f9ae80ddb2001","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                raise ValueError(\u0027Mandatory parameter is missing\u0027"},{"line_number":175,"context_line":"                                 \u0027: {0}\u0027.format(md))"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def invocation_flow(self, sreq, extra_sources\u003dNone):"},{"line_number":178,"context_line":"        \"\"\""},{"line_number":179,"context_line":"        Invoke the backend protocl with gateway"},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_5c9479e7","line":177,"range":{"start_line":177,"start_character":36,"end_line":177,"end_character":54},"in_reply_to":"7a8ec9b2_1798601b","updated":"2016-09-20 02:32:32.000000000","message":"I don\u0027t have clear memory for the reason for this but what I can tell you is that it was hard to do that with current storlets implementation. The main reason is hard complicated  StorletRequest class instantiation using build_storlet_request at [1]. I think we still have to make it clean (basically, sort of \"avoiding options\" and \"preparing everything at init\").\n\nAfter I make this like current one, I\u0027m getting it\u0027s not so worse because it is straight forward to parse gateway and handler. i.e. handler prepares the sources and pass it to gateway at the invocation if it exists. With current way, I think we can move the functionality to the request class easily.\n\nHow do you think of?\n\n1: https://github.com/openstack/storlets/blob/master/Engine/swift/storlet_middleware/handlers/base.py#L448-L474","commit_id":"72202721e87af3347564726c457e3a6b9a1b09cd"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"c70e73d272bb20861d42f6a33a303be9764e9f58","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                raise ValueError(\u0027Mandatory parameter is missing\u0027"},{"line_number":175,"context_line":"                                 \u0027: {0}\u0027.format(md))"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def invocation_flow(self, sreq, extra_sources\u003dNone):"},{"line_number":178,"context_line":"        \"\"\""},{"line_number":179,"context_line":"        Invoke the backend protocl with gateway"},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_0c463cbf","line":177,"range":{"start_line":177,"start_character":36,"end_line":177,"end_character":54},"in_reply_to":"7a8ec9b2_5c9479e7","updated":"2016-09-20 04:30:44.000000000","message":"\u003e basically, sort of \"avoiding options\" and \"preparing everything at init\"\n\nThe reason why I add \"options\" in StorletRequest.__init__ is that I\u0027d like to consider another type of gateway class, which requires different parameters for invocation.\nI know this makes the things little bit complicated. Maybe we need to discuss how we consider extendability of gateways, before we clean up existing codes around this.\n\n\u003e With current way, I think we can move the functionality to the request class easily.\n\nI agree. Maybe we can do that after cleaning up StorletRequest class.","commit_id":"72202721e87af3347564726c457e3a6b9a1b09cd"}],"Engine/swift/storlet_gateway/gateways/docker/runtime.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"81d3560804377a08a3728d0a544e1a05fe7380fc","unresolved":false,"context_lines":[{"line_number":531,"context_line":"                                as data stream"},{"line_number":532,"context_line":"    \"\"\""},{"line_number":533,"context_line":"    def __init__(self, srequest, storlet_pipe_path, storlet_logger_path,"},{"line_number":534,"context_line":"                 timeout, extra_sources\u003dNone, logger\u003dNone):"},{"line_number":535,"context_line":"        self.srequest \u003d srequest"},{"line_number":536,"context_line":"        self.storlet_pipe_path \u003d storlet_pipe_path"},{"line_number":537,"context_line":"        self.storlet_logger_path \u003d storlet_logger_path"}],"source_content_type":"text/x-python","patch_set":18,"id":"1ac06dbe_ce0ae978","line":534,"range":{"start_line":534,"start_character":26,"end_line":534,"end_character":39},"updated":"2016-08-23 04:43:11.000000000","message":"There are two possible ways to pass extra_sources\n\n1. Pass extra_sources to InvocationProtocol.\n2. Add extra_sources to StorletRequest, and pass its instance to invoke.\n\nIMO, (2) makes sense to me, because we can handle all data sources in the one place.","commit_id":"be88075872120b030f268529ac3181cb015a7ed1"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"81d3560804377a08a3728d0a544e1a05fe7380fc","unresolved":false,"context_lines":[{"line_number":826,"context_line":"        try:"},{"line_number":827,"context_line":"            yield writer"},{"line_number":828,"context_line":"        except OSError as e:"},{"line_number":829,"context_line":"            if self.logger:"},{"line_number":830,"context_line":"                self.logger.exception(\u0027opening fd failed: %s\u0027, e.message)"},{"line_number":831,"context_line":"            raise"},{"line_number":832,"context_line":"        finally:"}],"source_content_type":"text/x-python","patch_set":18,"id":"1ac06dbe_4ef1d994","line":829,"range":{"start_line":829,"start_character":12,"end_line":829,"end_character":27},"updated":"2016-08-23 04:43:11.000000000","message":"Do we need this if block?","commit_id":"be88075872120b030f268529ac3181cb015a7ed1"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"81d3560804377a08a3728d0a544e1a05fe7380fc","unresolved":false,"context_lines":[{"line_number":827,"context_line":"            yield writer"},{"line_number":828,"context_line":"        except OSError as e:"},{"line_number":829,"context_line":"            if self.logger:"},{"line_number":830,"context_line":"                self.logger.exception(\u0027opening fd failed: %s\u0027, e.message)"},{"line_number":831,"context_line":"            raise"},{"line_number":832,"context_line":"        finally:"},{"line_number":833,"context_line":"            writer.close()"}],"source_content_type":"text/x-python","patch_set":18,"id":"1ac06dbe_ae016d6c","line":830,"range":{"start_line":830,"start_character":16,"end_line":830,"end_character":73},"updated":"2016-08-23 04:43:11.000000000","message":"We don\u0027t need to pass e.message, if we use logger.exception.","commit_id":"be88075872120b030f268529ac3181cb015a7ed1"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ab579acc40adde7dc656836d0c535cc90d7e70d4","unresolved":false,"context_lines":[{"line_number":578,"context_line":"                        FDMetadata(SBUS_FD_OUTPUT_OBJECT_METADATA).to_dict(),"},{"line_number":579,"context_line":"                        FDMetadata(SBUS_FD_LOGGER).to_dict()]"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"        for fd_metadata in self.extra_data_sources:"},{"line_number":582,"context_line":"            fds_metadata.append(FDMetadata(SBUS_FD_INPUT_OBJECT).to_dict())"},{"line_number":583,"context_line":"        return fds_metadata"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"    @contextmanager"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_579e6807","line":582,"range":{"start_line":581,"start_character":0,"end_line":582,"end_character":75},"updated":"2016-09-17 05:20:50.000000000","message":"As far as I understand, we don\u0027t pass metadata about extra sources to storlet. Is there any reasons for that?","commit_id":"72202721e87af3347564726c457e3a6b9a1b09cd"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"57f88c836e030c51a9f70b3c3f4f9ae80ddb2001","unresolved":false,"context_lines":[{"line_number":578,"context_line":"                        FDMetadata(SBUS_FD_OUTPUT_OBJECT_METADATA).to_dict(),"},{"line_number":579,"context_line":"                        FDMetadata(SBUS_FD_LOGGER).to_dict()]"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"        for fd_metadata in self.extra_data_sources:"},{"line_number":582,"context_line":"            fds_metadata.append(FDMetadata(SBUS_FD_INPUT_OBJECT).to_dict())"},{"line_number":583,"context_line":"        return fds_metadata"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"    @contextmanager"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_bca3bd4e","line":582,"range":{"start_line":581,"start_character":0,"end_line":582,"end_character":75},"in_reply_to":"7a8ec9b2_579e6807","updated":"2016-09-20 02:32:32.000000000","message":"I think you know the reason. we need same length between fds_metadata and remote_fds, right? Otherwise, [1] your wrote doesn\u0027t work, does it? (if storlet_md or in_md is shorter than in_fds, we will loose the extra fds... i thought)\n\nI might be missing something though.\n\n1: https://github.com/openstack/storlets/blob/master/Engine/agent/storlet_daemon/daemon.py#L187","commit_id":"72202721e87af3347564726c457e3a6b9a1b09cd"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"c70e73d272bb20861d42f6a33a303be9764e9f58","unresolved":false,"context_lines":[{"line_number":578,"context_line":"                        FDMetadata(SBUS_FD_OUTPUT_OBJECT_METADATA).to_dict(),"},{"line_number":579,"context_line":"                        FDMetadata(SBUS_FD_LOGGER).to_dict()]"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"        for fd_metadata in self.extra_data_sources:"},{"line_number":582,"context_line":"            fds_metadata.append(FDMetadata(SBUS_FD_INPUT_OBJECT).to_dict())"},{"line_number":583,"context_line":"        return fds_metadata"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"    @contextmanager"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a8ec9b2_8cd5ecba","line":582,"range":{"start_line":581,"start_character":0,"end_line":582,"end_character":75},"in_reply_to":"7a8ec9b2_bca3bd4e","updated":"2016-09-20 04:30:44.000000000","message":"What I\u0027d like to say here is that we can pass the metadata of extra sources as we do for main source in line 567-569.\nDoes it make sense to you?","commit_id":"72202721e87af3347564726c457e3a6b9a1b09cd"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"f02a5f529307eeea7f44d630e80854c99dbee0f3","unresolved":false,"context_lines":[{"line_number":776,"context_line":"            for source in self.extra_data_sources:"},{"line_number":777,"context_line":"                # NOTE(kota_): not sure right now if using eventlet.spawn_n is"},{"line_number":778,"context_line":"                #              right way. GreenPool is better? I don\u0027t get"},{"line_number":779,"context_line":"                #              whole for the dead lock described in above."},{"line_number":780,"context_line":"                self._wait_for_write_with_timeout(source[\u0027write_fd\u0027])"},{"line_number":781,"context_line":"                eventlet.spawn_n(self._write_input_data,"},{"line_number":782,"context_line":"                                 source[\u0027write_fd\u0027],"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a8ec9b2_b0be76d2","line":779,"updated":"2016-09-20 09:45:56.000000000","message":"Middleware                      Storlet\nStorlet input        input_data_write_fd  --\u003e   input_data_read_fd\n\nStorlet output      data_fd_read            \u003c--   data_fd_write\n\n1. If we are not using a different thread for the writing, it means that we do not get to line 785-788 unlit we are done writing all the input data to input_data_wirte_fd \n2. If we do not get to line 788, then self.data_read_fd does not get consumed (if we get there the WSGI framework will start iterating over it)\n3. If self.data_read_fd does not get consumed the storlet may get stuck while writing its output to data_fd_write.\n4. If the storlet gets blocked on writing to data_fd_write (and is also single threaded) it does not read from its input_data_read_fd which causes the middleware to block in the writing to input_data_write_fd.\n\nBasically, an os.pipe write end has ~1KB buffer, once you fill it, writing will block until someone reads from the other end.\n\nRegarding the green pool: I think this is a good idea, but will be more subtle to implement - why? (do correct me if my assumptions are wrong here)\npool should be initialised once, and get reused. (I assume that initialising a pool is something we do not want to do per request). The runtime class is initialised per request, so we will need to pass the pool from the middleware.\n\nEventless green pool seems to have a fixed size (which can be changed but this seems an overhead) so we may want to cap the number of extra resources (which makes perfect sense to me) and have a fixed green pool.","commit_id":"7891c115f86b69e1c0874bdeffdcc2c25bec7038"}],"Engine/swift/storlet_middleware/handlers/proxy.py":[{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"d90364da4277de4e6ddd199ae4afe0e9bd62d0d4","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            self.request.headers[\u0027X-Storlet-\u0027 + key] \u003d val"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def gather_extra_sources(self):"},{"line_number":204,"context_line":"        # (kota_): I know this is a crazy hack to set the resp"},{"line_number":205,"context_line":"        # dinamically so that this is a temprorary way to make sure"},{"line_number":206,"context_line":"        # the capability, this aboslutely needs cleanup more genelic"},{"line_number":207,"context_line":"        if \u0027X-Storlet-Extra-Resources\u0027 in self.request.headers:"}],"source_content_type":"text/x-python","patch_set":18,"id":"3ac371cc_065c887b","line":204,"updated":"2016-08-18 15:07:56.000000000","message":"Not sure I am following the remark on dynamically changing the response. Does this have to do with multiple sub_requests?","commit_id":"be88075872120b030f268529ac3181cb015a7ed1"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"d90364da4277de4e6ddd199ae4afe0e9bd62d0d4","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                        \u0027GET\u0027, \u0027/\u0027.join(swift_path),"},{"line_number":220,"context_line":"                        agent\u003d\u0027ST\u0027)"},{"line_number":221,"context_line":"                    sub_resp \u003d sub_req.get_response(self.app)"},{"line_number":222,"context_line":"                    # TODO(kota_): make this in another green thread"},{"line_number":223,"context_line":"                    # expicially, in parallel with primary GET"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"                    self.extra_sources.append("}],"source_content_type":"text/x-python","patch_set":18,"id":"3ac371cc_e14f9668","line":222,"updated":"2016-08-18 15:07:56.000000000","message":"It seems that since we want to pass all app_iters to the same storlet, we need to get them before we get to the storlet, so I am not sure why we want here an additional thread. I guess that the semantics should be: If an Extra resource is not available, then we fail the request altogether.","commit_id":"be88075872120b030f268529ac3181cb015a7ed1"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"d90364da4277de4e6ddd199ae4afe0e9bd62d0d4","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                    # expicially, in parallel with primary GET"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"                    self.extra_sources.append("},{"line_number":226,"context_line":"                        self._build_storlet_request("},{"line_number":227,"context_line":"                            self.request, sub_resp.headers,"},{"line_number":228,"context_line":"                            sub_resp.app_iter))"},{"line_number":229,"context_line":"            except ValueError:"}],"source_content_type":"text/x-python","patch_set":18,"id":"3ac371cc_210ecee4","line":226,"updated":"2016-08-18 15:07:56.000000000","message":"Seems like there is a lot of redundancy in having a strolet request per extra source. Seems like we need an additional type of a storlet request","commit_id":"be88075872120b030f268529ac3181cb015a7ed1"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"f02a5f529307eeea7f44d630e80854c99dbee0f3","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            self.request.headers[\u0027X-Storlet-\u0027 + key] \u003d val"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def gather_extra_sources(self):"},{"line_number":204,"context_line":"        # (kota_): I know this is a crazy hack to set the resp"},{"line_number":205,"context_line":"        # dinamically so that this is a temprorary way to make sure"},{"line_number":206,"context_line":"        # the capability, this aboslutely needs cleanup more genelic"},{"line_number":207,"context_line":"        if \u0027X-Storlet-Extra-Resources\u0027 in self.request.headers:"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a8ec9b2_1303b710","line":204,"updated":"2016-09-20 09:45:56.000000000","message":"Let me see if I get this right:\nA more generic code would use a common call to gather the extra sources, where on the proxy node it will use sub_requests and on the object node it will use internal client?","commit_id":"7891c115f86b69e1c0874bdeffdcc2c25bec7038"}],"StorletSamples/java/MultiInputStorlet/src/org/openstack/storlet/MultiInputStorlet.java":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ab579acc40adde7dc656836d0c535cc90d7e70d4","unresolved":false,"context_lines":[{"line_number":35,"context_line":"import org.openstack.storlet.common.StorletUtils;"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"public class MultiInputStorlet implements IStorlet {"},{"line_number":38,"context_line":"\t@Override"},{"line_number":39,"context_line":"\tpublic void invoke(ArrayList\u003cStorletInputStream\u003e inputStreams,"},{"line_number":40,"context_line":"\t\t\tArrayList\u003cStorletOutputStream\u003e outputStreams,"},{"line_number":41,"context_line":"\t\t\tMap\u003cString, String\u003e parameters, StorletLogger log)"}],"source_content_type":"text/x-java","patch_set":23,"id":"7a8ec9b2_77a1a445","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":1},"updated":"2016-09-17 05:20:50.000000000","message":"Please expand all these tabs.","commit_id":"72202721e87af3347564726c457e3a6b9a1b09cd"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"57f88c836e030c51a9f70b3c3f4f9ae80ddb2001","unresolved":false,"context_lines":[{"line_number":35,"context_line":"import org.openstack.storlet.common.StorletUtils;"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"public class MultiInputStorlet implements IStorlet {"},{"line_number":38,"context_line":"\t@Override"},{"line_number":39,"context_line":"\tpublic void invoke(ArrayList\u003cStorletInputStream\u003e inputStreams,"},{"line_number":40,"context_line":"\t\t\tArrayList\u003cStorletOutputStream\u003e outputStreams,"},{"line_number":41,"context_line":"\t\t\tMap\u003cString, String\u003e parameters, StorletLogger log)"}],"source_content_type":"text/x-java","patch_set":23,"id":"7a8ec9b2_9c3a81e6","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":1},"in_reply_to":"7a8ec9b2_77a1a445","updated":"2016-09-20 02:32:32.000000000","message":"You mean, tab -\u003e 4 spaces? Will do.","commit_id":"72202721e87af3347564726c457e3a6b9a1b09cd"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"c70e73d272bb20861d42f6a33a303be9764e9f58","unresolved":false,"context_lines":[{"line_number":35,"context_line":"import org.openstack.storlet.common.StorletUtils;"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"public class MultiInputStorlet implements IStorlet {"},{"line_number":38,"context_line":"\t@Override"},{"line_number":39,"context_line":"\tpublic void invoke(ArrayList\u003cStorletInputStream\u003e inputStreams,"},{"line_number":40,"context_line":"\t\t\tArrayList\u003cStorletOutputStream\u003e outputStreams,"},{"line_number":41,"context_line":"\t\t\tMap\u003cString, String\u003e parameters, StorletLogger log)"}],"source_content_type":"text/x-java","patch_set":23,"id":"7a8ec9b2_6ce7c0ac","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":1},"in_reply_to":"7a8ec9b2_9c3a81e6","updated":"2016-09-20 04:30:44.000000000","message":"Yes! thx!","commit_id":"72202721e87af3347564726c457e3a6b9a1b09cd"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"f02a5f529307eeea7f44d630e80854c99dbee0f3","unresolved":false,"context_lines":[{"line_number":63,"context_line":"         */"},{"line_number":64,"context_line":"        log.emitLog(\"Let\u0027s concat, anyway\");"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        /*"},{"line_number":67,"context_line":"         * 1) If the output stream is StorletObjectOutputStream we are in a GET"},{"line_number":68,"context_line":"         * or PUT scenario where we copy the data and metadata into it. 2) If"},{"line_number":69,"context_line":"         * the output stream is StorletContainerHandle we are in a Storlet batch"}],"source_content_type":"text/x-java","patch_set":26,"id":"7a8ec9b2_a5862e63","line":66,"updated":"2016-09-20 09:45:56.000000000","message":"I guess the comment here is outdated. I will delete it in with the doc patch (and its source :-))","commit_id":"7891c115f86b69e1c0874bdeffdcc2c25bec7038"},{"author":{"_account_id":11317,"name":"Eran Rom","email":"eran@itsonlyme.name","username":"eranr"},"change_message_id":"f02a5f529307eeea7f44d630e80854c99dbee0f3","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                log.emitLog(\"Falied to close input steram \" + e.getMessage());"},{"line_number":123,"context_line":"            }"},{"line_number":124,"context_line":"        }"},{"line_number":125,"context_line":"        log.emitLog(\"IdentityStorlet Invocation done\");"},{"line_number":126,"context_line":"    }"},{"line_number":127,"context_line":"}"}],"source_content_type":"text/x-java","patch_set":26,"id":"7a8ec9b2_65e4263b","line":125,"updated":"2016-09-20 09:45:56.000000000","message":"Now I know the source for this :-)","commit_id":"7891c115f86b69e1c0874bdeffdcc2c25bec7038"}]}
