)]}'
{"cinder/volume/drivers/hitachi/hbsd_fc.py":[{"author":{"_account_id":30555,"name":"Fernando Ferraz","display_name":"Fernando Ferraz","email":"fesilva@redhat.com","username":"fernandoperches"},"change_message_id":"202f9edbc46668ec4eb00a01297d7d4afc4ba24a","unresolved":true,"context_lines":[{"line_number":64,"context_line":"        1.0.0 - Initial driver."},{"line_number":65,"context_line":"        1.1.0 - Add manage_existing/manage_existing_get_size/unmanage methods"},{"line_number":66,"context_line":"        2.0.0 - Major redesign of the driver. This version requires the REST"},{"line_number":67,"context_line":"                API for communication with the storage backend."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    \"\"\""},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5e4a5a89_83452d85","line":67,"updated":"2021-09-03 17:40:25.000000000","message":"should you bump your history here since you included a new feature?","commit_id":"b074a5ebeeb317849d8e7211c838d7b0c96a7b0a"},{"author":{"_account_id":16373,"name":"Kazumasa Nomura","email":"kazumasa.nomura.rx@hitachi.com","username":"knomura"},"change_message_id":"24780c1c4c1a647b3f3f82b121d5638060406823","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        1.0.0 - Initial driver."},{"line_number":65,"context_line":"        1.1.0 - Add manage_existing/manage_existing_get_size/unmanage methods"},{"line_number":66,"context_line":"        2.0.0 - Major redesign of the driver. This version requires the REST"},{"line_number":67,"context_line":"                API for communication with the storage backend."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    \"\"\""},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"6cd19a5b_c2e317cc","line":67,"in_reply_to":"5e4a5a89_83452d85","updated":"2021-09-07 15:05:19.000000000","message":"Done","commit_id":"b074a5ebeeb317849d8e7211c838d7b0c96a7b0a"}],"cinder/volume/drivers/hitachi/hbsd_iscsi.py":[{"author":{"_account_id":30555,"name":"Fernando Ferraz","display_name":"Fernando Ferraz","email":"fesilva@redhat.com","username":"fernandoperches"},"change_message_id":"202f9edbc46668ec4eb00a01297d7d4afc4ba24a","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        1.0.0 - Initial driver."},{"line_number":51,"context_line":"        1.1.0 - Add manage_existing/manage_existing_get_size/unmanage methods"},{"line_number":52,"context_line":"        2.0.0 - Major redesign of the driver. This version requires the REST"},{"line_number":53,"context_line":"                API for communication with the storage backend."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    \"\"\""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"586465d5_dccffc1f","line":53,"updated":"2021-09-03 17:40:25.000000000","message":"should you bump your history here since you included a new feature?","commit_id":"b074a5ebeeb317849d8e7211c838d7b0c96a7b0a"},{"author":{"_account_id":16373,"name":"Kazumasa Nomura","email":"kazumasa.nomura.rx@hitachi.com","username":"knomura"},"change_message_id":"24780c1c4c1a647b3f3f82b121d5638060406823","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        1.0.0 - Initial driver."},{"line_number":51,"context_line":"        1.1.0 - Add manage_existing/manage_existing_get_size/unmanage methods"},{"line_number":52,"context_line":"        2.0.0 - Major redesign of the driver. This version requires the REST"},{"line_number":53,"context_line":"                API for communication with the storage backend."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    \"\"\""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"712e06ab_6d3179dc","line":53,"in_reply_to":"586465d5_dccffc1f","updated":"2021-09-07 15:05:19.000000000","message":"Done","commit_id":"b074a5ebeeb317849d8e7211c838d7b0c96a7b0a"}],"cinder/volume/drivers/hitachi/hbsd_rest.py":[{"author":{"_account_id":30555,"name":"Fernando Ferraz","display_name":"Fernando Ferraz","email":"fesilva@redhat.com","username":"fernandoperches"},"change_message_id":"2a76aceaa77e5e9b6a008bd81e8f7611a3be2cd7","unresolved":true,"context_lines":[{"line_number":827,"context_line":"        for obj in objs:"},{"line_number":828,"context_line":"            loop \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":829,"context_line":"                _delete_group_obj, group, obj, is_snapshot)"},{"line_number":830,"context_line":"            event \u003d loop.start(interval\u003d0)"},{"line_number":831,"context_line":"            events.append(event)"},{"line_number":832,"context_line":"        for e in events:"},{"line_number":833,"context_line":"            obj_update \u003d e.wait()"}],"source_content_type":"text/x-python","patch_set":3,"id":"b6e72772_acc61406","line":830,"updated":"2021-09-03 19:18:08.000000000","message":"this isn\u0027t probably a problem but wondering if a interval of 0 would flood your storage APIs... Also, this could run eternally if you never get a success from delete_volume/delete_snapshot, since you don\u0027t have any kind of timeout. A timeout using FixedIntervalWithTimeoutLoopingCall with a driver specific configuration to let users tell how long to wait for this operation would help in this case. Considering the deadline for the feature freeze, I wouldn\u0027t oppose to work on this in a follow up patch but would like to know other\u0027s opinions.","commit_id":"c17f970f1d47209dfdcba732fe25ab1ea9a83555"},{"author":{"_account_id":16373,"name":"Kazumasa Nomura","email":"kazumasa.nomura.rx@hitachi.com","username":"knomura"},"change_message_id":"64e2ec49fdcf34d9fab55a4f76e91f6590a86c84","unresolved":false,"context_lines":[{"line_number":827,"context_line":"        for obj in objs:"},{"line_number":828,"context_line":"            loop \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":829,"context_line":"                _delete_group_obj, group, obj, is_snapshot)"},{"line_number":830,"context_line":"            event \u003d loop.start(interval\u003d0)"},{"line_number":831,"context_line":"            events.append(event)"},{"line_number":832,"context_line":"        for e in events:"},{"line_number":833,"context_line":"            obj_update \u003d e.wait()"}],"source_content_type":"text/x-python","patch_set":3,"id":"ae64ebdb_051d6cf3","line":830,"in_reply_to":"b6e72772_acc61406","updated":"2021-09-06 19:23:19.000000000","message":"The FixedIntervalLoopingCall is usually used for looping function call and the interval argument means the interval of repeated calls.\nOn the other hands, we use FixedIntervalLoopingCall for calling _delete_group_obj() in parallel on the child process. the _delete_group_obj() always ends with a single call.\nSo the value of the interval argument does not affect the operation of the Hitachi driver, and I think 0 is not a problem.","commit_id":"c17f970f1d47209dfdcba732fe25ab1ea9a83555"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d594f9a679900f851f80143b31c5c1ebc6225b55","unresolved":true,"context_lines":[{"line_number":825,"context_line":"            raise loopingcall.LoopingCallDone(obj_update)"},{"line_number":826,"context_line":""},{"line_number":827,"context_line":"        for obj in objs:"},{"line_number":828,"context_line":"            loop \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":829,"context_line":"                _delete_group_obj, group, obj, is_snapshot)"},{"line_number":830,"context_line":"            event \u003d loop.start(interval\u003d0)"},{"line_number":831,"context_line":"            events.append(event)"},{"line_number":832,"context_line":"        for e in events:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1d09aad1_7bee19bc","line":829,"range":{"start_line":828,"start_character":0,"end_line":829,"end_character":59},"updated":"2021-09-14 09:31:41.000000000","message":"I\u0027m not a fan of using a looping call for something that doesn\u0027t loop, using a normal thread from the threading module seems more reasonable.","commit_id":"36e00875772a80cda6ece752a202333bd911e8e6"},{"author":{"_account_id":16373,"name":"Kazumasa Nomura","email":"kazumasa.nomura.rx@hitachi.com","username":"knomura"},"change_message_id":"df11607a73c11ea7f13a36ce397a1e9b06d4c9cb","unresolved":false,"context_lines":[{"line_number":825,"context_line":"            raise loopingcall.LoopingCallDone(obj_update)"},{"line_number":826,"context_line":""},{"line_number":827,"context_line":"        for obj in objs:"},{"line_number":828,"context_line":"            loop \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":829,"context_line":"                _delete_group_obj, group, obj, is_snapshot)"},{"line_number":830,"context_line":"            event \u003d loop.start(interval\u003d0)"},{"line_number":831,"context_line":"            events.append(event)"},{"line_number":832,"context_line":"        for e in events:"}],"source_content_type":"text/x-python","patch_set":4,"id":"0dc3bc52_c2d1cdca","line":829,"range":{"start_line":828,"start_character":0,"end_line":829,"end_character":59},"in_reply_to":"1d09aad1_7bee19bc","updated":"2021-09-14 15:00:37.000000000","message":"I will consider whether the driver can use a normal thread. After investigation, I will submit the other patch.","commit_id":"36e00875772a80cda6ece752a202333bd911e8e6"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"df01c1d0c698c09b27533fa7e0ade701ad538032","unresolved":true,"context_lines":[{"line_number":827,"context_line":"        for obj in objs:"},{"line_number":828,"context_line":"            loop \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":829,"context_line":"                _delete_group_obj, group, obj, is_snapshot)"},{"line_number":830,"context_line":"            event \u003d loop.start(interval\u003d0)"},{"line_number":831,"context_line":"            events.append(event)"},{"line_number":832,"context_line":"        for e in events:"},{"line_number":833,"context_line":"            obj_update \u003d e.wait()"}],"source_content_type":"text/x-python","patch_set":4,"id":"e1d5e79d_0cf3273c","line":830,"updated":"2021-09-12 02:16:40.000000000","message":"I want to follow up on Fernando\u0027s question on an earlier patch set.  What you\u0027re doing here is putting each obj delete into its own loopingcall so that you can spawn them in parallel, but they\u0027ll never actually loop because you raise a LoopingCallDone unconditionally at the end of _delete_group_obj().  stop_on_exception is True by default for start(), so if an exception you\u0027re not looking for occurs, the loopingcall will terminate.  But then I think that exception will be re-raised when you call e.wait() below, which could mean that you don\u0027t complete processing the \"for e in events\" loop below.  I guess I\u0027m worried that if you have a group of 5 items, the first 2 are deleted and the third raises an Exception you\u0027re not looking for, this function won\u0027t return and the model_update won\u0027t happen, and some deleted items won\u0027t have their status changed.  So while I think you\u0027re right that you don\u0027t have to worry about a nonterminating loop, this is kind of a nonstandard use of the loopingcall, and I\u0027m not how safe this pattern you\u0027re using is.  You\u0027re doing a similar thing in create_group_from_src, but that\u0027s happening in a try block where you  save and reraise the exception after doing some other processing.\n\nI\u0027m not saying that you have to do the same thing here, I just want to make sure you\u0027ve thought about this.","commit_id":"36e00875772a80cda6ece752a202333bd911e8e6"},{"author":{"_account_id":16373,"name":"Kazumasa Nomura","email":"kazumasa.nomura.rx@hitachi.com","username":"knomura"},"change_message_id":"df11607a73c11ea7f13a36ce397a1e9b06d4c9cb","unresolved":true,"context_lines":[{"line_number":827,"context_line":"        for obj in objs:"},{"line_number":828,"context_line":"            loop \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":829,"context_line":"                _delete_group_obj, group, obj, is_snapshot)"},{"line_number":830,"context_line":"            event \u003d loop.start(interval\u003d0)"},{"line_number":831,"context_line":"            events.append(event)"},{"line_number":832,"context_line":"        for e in events:"},{"line_number":833,"context_line":"            obj_update \u003d e.wait()"}],"source_content_type":"text/x-python","patch_set":4,"id":"31cbac15_0b4eddf3","line":830,"in_reply_to":"090fe78f_52be97f8","updated":"2021-09-14 15:00:37.000000000","message":"I agree with Gorka. I will submit the other patch to catch all exceptions or change to using normal thread.","commit_id":"36e00875772a80cda6ece752a202333bd911e8e6"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"28b6f29a00d4cf9424c76b23bbc90167b73da513","unresolved":true,"context_lines":[{"line_number":827,"context_line":"        for obj in objs:"},{"line_number":828,"context_line":"            loop \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":829,"context_line":"                _delete_group_obj, group, obj, is_snapshot)"},{"line_number":830,"context_line":"            event \u003d loop.start(interval\u003d0)"},{"line_number":831,"context_line":"            events.append(event)"},{"line_number":832,"context_line":"        for e in events:"},{"line_number":833,"context_line":"            obj_update \u003d e.wait()"}],"source_content_type":"text/x-python","patch_set":4,"id":"940cb133_bd12251c","line":830,"in_reply_to":"61cc738c_004bf416","updated":"2021-09-13 16:23:01.000000000","message":"OK, you know your backend better than I do, and I assume you\u0027ve tested this code carefully.  You\u0027ve obviously thought about it, which was the point of the question, so I don\u0027t think this is an issue that should delay the patch.","commit_id":"36e00875772a80cda6ece752a202333bd911e8e6"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d594f9a679900f851f80143b31c5c1ebc6225b55","unresolved":true,"context_lines":[{"line_number":827,"context_line":"        for obj in objs:"},{"line_number":828,"context_line":"            loop \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":829,"context_line":"                _delete_group_obj, group, obj, is_snapshot)"},{"line_number":830,"context_line":"            event \u003d loop.start(interval\u003d0)"},{"line_number":831,"context_line":"            events.append(event)"},{"line_number":832,"context_line":"        for e in events:"},{"line_number":833,"context_line":"            obj_update \u003d e.wait()"}],"source_content_type":"text/x-python","patch_set":4,"id":"090fe78f_52be97f8","line":830,"in_reply_to":"940cb133_bd12251c","updated":"2021-09-14 09:31:41.000000000","message":"I think it would be best to either have a catch all exceptions on the wait, or have it on the _delete_group_obj, just to be sure, because even if today we are 100% sure that no other exception will happen, this may change in the future if we change delete_snapshot or delete_volume, and we may miss it and introduce a bug.","commit_id":"36e00875772a80cda6ece752a202333bd911e8e6"},{"author":{"_account_id":16373,"name":"Kazumasa Nomura","email":"kazumasa.nomura.rx@hitachi.com","username":"knomura"},"change_message_id":"ae32671cbe79242a6f06e6ae45a0a2a25e92eab3","unresolved":true,"context_lines":[{"line_number":827,"context_line":"        for obj in objs:"},{"line_number":828,"context_line":"            loop \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":829,"context_line":"                _delete_group_obj, group, obj, is_snapshot)"},{"line_number":830,"context_line":"            event \u003d loop.start(interval\u003d0)"},{"line_number":831,"context_line":"            events.append(event)"},{"line_number":832,"context_line":"        for e in events:"},{"line_number":833,"context_line":"            obj_update \u003d e.wait()"}],"source_content_type":"text/x-python","patch_set":4,"id":"61cc738c_004bf416","line":830,"in_reply_to":"e1d5e79d_0cf3273c","updated":"2021-09-13 15:58:35.000000000","message":"Hitachi driver\u0027s _delete_group() calls delete_volume() and delete_snapshot(). When an error occurs in these functions, raises one of the following exceptions: utils.HBSDError, exception.VolumeIsBusy, exception.SnapshotIsBusy. No other unexpected exceptions are raised, except for syntax errors and so on. Since the exceptions that delete_volume() and delete_snapshot() may output are caught and processed by _delete_group_obj(), I think that there is no problem.\nOn the other hand, create_group_from_src() raises an exception by itself when one of volume creation fails (hbsd_rest.py # 890). I am using the try sentence to catch this exception and are doing rollback processing to delete the created volume.","commit_id":"36e00875772a80cda6ece752a202333bd911e8e6"}],"cinder/volume/drivers/hitachi/hbsd_utils.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"532b74bc392ca55793ee2fab1e3f9bc9d3ac3ad2","unresolved":true,"context_lines":[{"line_number":571,"context_line":""},{"line_number":572,"context_line":"def get_exception_msg(exc):"},{"line_number":573,"context_line":"    return exc.msg if isinstance("},{"line_number":574,"context_line":"        exc, exception.CinderException) else exc.args[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"88a6ae7f_c00b555d","line":574,"range":{"start_line":574,"start_character":45,"end_line":574,"end_character":56},"updated":"2021-09-02 16:29:10.000000000","message":"how do you know this won\u0027t cause an IndexError?","commit_id":"b074a5ebeeb317849d8e7211c838d7b0c96a7b0a"},{"author":{"_account_id":16373,"name":"Kazumasa Nomura","email":"kazumasa.nomura.rx@hitachi.com","username":"knomura"},"change_message_id":"663a70687a14dddd765e7002fb48e846b1d014c0","unresolved":false,"context_lines":[{"line_number":571,"context_line":""},{"line_number":572,"context_line":"def get_exception_msg(exc):"},{"line_number":573,"context_line":"    return exc.msg if isinstance("},{"line_number":574,"context_line":"        exc, exception.CinderException) else exc.args[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"0a5983a7_ea3cfb7d","line":574,"range":{"start_line":574,"start_character":45,"end_line":574,"end_character":56},"in_reply_to":"88a6ae7f_c00b555d","updated":"2021-09-03 16:12:48.000000000","message":"Done","commit_id":"b074a5ebeeb317849d8e7211c838d7b0c96a7b0a"}]}
