)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3ae24de45f3be75f5d56a4cf4cc2bfcacfff425a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"e00aa9a6_dfaeef1d","updated":"2022-03-10 15:36:47.000000000","message":"Thank you for working on this feature!!\nI\u0027ll start working on a patch in the Cinder nvmet target to be able to test it.","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"60800069a47b6394797913c47aa80fd2ae5a246e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"7aebcd1f_1d04f342","updated":"2022-04-21 11:43:41.000000000","message":"I haven\u0027t reviewed all the code, but I have tested the code with a custom LVM+nvmet patch and these are some of the things I\u0027ve observed.","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3f145cb12a9565424c1d4b36a3570e9950a84c6f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"eae89077_5a6adad1","updated":"2022-05-11 11:23:28.000000000","message":"Thank you for the effort!\n\nCode looks good except for the native_multipath_supported issue on the get_connector_properties and the unrelated agent code.","commit_id":"2a2a0f4b2d2bcd852a7870c856a39e435207f40f"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6e28c9598eba7a6b71094fd58337cc0193a1520f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"46967367_95062425","updated":"2022-05-24 12:36:42.000000000","message":"There are some nits that can be left for future improvements, the downvote is because there is a case where the code could be returning that it is not connected to a portal when it is (L577 of nvmeof.py file).\n\nI think I missed it in previous reviews.","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"fddb8c5c98b6f4149b49e81d1ec0450f976b8f3f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"b391d947_934b97c4","updated":"2022-06-02 13:18:50.000000000","message":"@Lior: note about a suggested followup for the release note inline.\n\nCode and tests LGTM.  Kioxia CI hasn\u0027t responded since PS 10; would be good to see that at least we\u0027re not introducing a regression.  (SPDK, which also uses the nvmeof connector, is not responding, but that\u0027s beyond our control.)","commit_id":"f9633f271e87c53a5828d72239e1e852b729e2a4"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f9aeb805bfc0e493081302eac34b738250dcae9e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"50597f04_18d0c3c5","updated":"2022-05-27 08:39:21.000000000","message":"Thank you for your work. I tested it in devstack and it works as expected.\nI\u0027ll rebase my other nvmeof fixes on top of this patch.","commit_id":"f9633f271e87c53a5828d72239e1e852b729e2a4"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"535606d131571178dfd7e3e0334106bf8b9fac45","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"228cd745_9ff861ea","in_reply_to":"50597f04_18d0c3c5","updated":"2022-05-27 08:48:44.000000000","message":"Gorka, Thank you for all of your helpful and important notes and comments during this code review,","commit_id":"f9633f271e87c53a5828d72239e1e852b729e2a4"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"5092bde11afede2523d7fed57e7b99ac788c98f9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"83ab6b6a_75f9f65b","in_reply_to":"b391d947_934b97c4","updated":"2022-06-02 13:30:38.000000000","message":"I had noticed that as well and sent an email about that to our relevant team - the CI server was down and they brought it up.","commit_id":"f9633f271e87c53a5828d72239e1e852b729e2a4"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"0436501286cb1f69c54c8f9ccb013851eeeb7134","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"454dc9f9_bae15b06","updated":"2022-06-02 21:36:43.000000000","message":"All I did was fix the yaml syntax in the release note.\n\n+1 while waiting for Kioxia CI to respond (it may be configured to only run after Zuul gives a +1)","commit_id":"73206c455d412fea0169d743964d3939632e6061"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"032adcd9c19546322df133cf55f31cbc27e7f368","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"aa2584aa_fa0f1b7a","updated":"2022-06-02 18:55:02.000000000","message":"Fixed the indentation in the release note yaml file.","commit_id":"73206c455d412fea0169d743964d3939632e6061"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"2d0bddb61d657e0d0ab0ca197d37fe5cfa6dd20c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"f8256a80_04fee6d7","in_reply_to":"454dc9f9_bae15b06","updated":"2022-06-03 07:31:32.000000000","message":"Thanks Brian for that.\nI had pinged KIOXIA CI team again for that.","commit_id":"73206c455d412fea0169d743964d3939632e6061"},{"author":{"_account_id":20813,"name":"Sofia Enriquez","email":"lsofia.enriquez@gmail.com","username":"enriquetaso"},"change_message_id":"f46b690c70c34f029498d1e767fbec73647d09e5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"284acd4c_83360d89","updated":"2022-06-06 13:12:14.000000000","message":"KIOXIA CI: Build succeeded.","commit_id":"4d0103dddbd12f1901f8eff7e5ddff59e399a2a6"}],"os_brick/initiator/connectors/nvmeof.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3ae24de45f3be75f5d56a4cf4cc2bfcacfff425a","unresolved":true,"context_lines":[{"line_number":112,"context_line":"        if nqn:"},{"line_number":113,"context_line":"            ret[\u0027nqn\u0027] \u003d nqn"},{"line_number":114,"context_line":"        if nvme_native_multipath:"},{"line_number":115,"context_line":"            ret[\u0027nvme_native_multipath\u0027] \u003d True"},{"line_number":116,"context_line":"        return ret"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _get_host_uuid(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"86595823_ae569c42","line":115,"updated":"2022-03-10 15:36:47.000000000","message":"-1: I think we should always return this, that way is easy to tell that the connector was generated by the newer connector code.","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"39b7ac5cdc1dbe95f16f1aee758ed1fce3c54b2e","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        if nqn:"},{"line_number":113,"context_line":"            ret[\u0027nqn\u0027] \u003d nqn"},{"line_number":114,"context_line":"        if nvme_native_multipath:"},{"line_number":115,"context_line":"            ret[\u0027nvme_native_multipath\u0027] \u003d True"},{"line_number":116,"context_line":"        return ret"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _get_host_uuid(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"204a2637_e702c3d5","line":115,"in_reply_to":"86595823_ae569c42","updated":"2022-03-14 12:24:09.000000000","message":"Ack","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3ae24de45f3be75f5d56a4cf4cc2bfcacfff425a","unresolved":true,"context_lines":[{"line_number":154,"context_line":"        try:"},{"line_number":155,"context_line":"            out, err \u003d self._execute("},{"line_number":156,"context_line":"                \u0027cat\u0027, \u0027/sys/module/nvme_core/parameters/multipath\u0027,"},{"line_number":157,"context_line":"                root_helper\u003dself._root_helper, run_as_root\u003dTrue)"},{"line_number":158,"context_line":"            if out.strip() \u003d\u003d \u0027Y\u0027:"},{"line_number":159,"context_line":"                return True"},{"line_number":160,"context_line":"        except putils.ProcessExecutionError as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf07b76b_5a313f30","line":157,"updated":"2022-03-10 15:36:47.000000000","message":"-1: This doesn\u0027t need to be run as root, any user can read it, so we should read it from Python.","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"39b7ac5cdc1dbe95f16f1aee758ed1fce3c54b2e","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        try:"},{"line_number":155,"context_line":"            out, err \u003d self._execute("},{"line_number":156,"context_line":"                \u0027cat\u0027, \u0027/sys/module/nvme_core/parameters/multipath\u0027,"},{"line_number":157,"context_line":"                root_helper\u003dself._root_helper, run_as_root\u003dTrue)"},{"line_number":158,"context_line":"            if out.strip() \u003d\u003d \u0027Y\u0027:"},{"line_number":159,"context_line":"                return True"},{"line_number":160,"context_line":"        except putils.ProcessExecutionError as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"efff9eaa_c305b574","line":157,"in_reply_to":"bf07b76b_5a313f30","updated":"2022-03-14 12:24:09.000000000","message":"Ack","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3ae24de45f3be75f5d56a4cf4cc2bfcacfff425a","unresolved":true,"context_lines":[{"line_number":337,"context_line":"            return self._connect_volume_replicated(connection_properties)"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        current_nvme_devices \u003d self._get_nvme_devices()"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        device_info \u003d {\u0027type\u0027: \u0027block\u0027}"},{"line_number":342,"context_line":"        conn_nqn \u003d connection_properties[\u0027nqn\u0027]"},{"line_number":343,"context_line":"        target_portal \u003d connection_properties[\u0027target_portal\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"e76fb5a6_c38e66f4","line":340,"updated":"2022-03-10 15:36:47.000000000","message":"-1: Unnecessary change","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"39b7ac5cdc1dbe95f16f1aee758ed1fce3c54b2e","unresolved":false,"context_lines":[{"line_number":337,"context_line":"            return self._connect_volume_replicated(connection_properties)"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        current_nvme_devices \u003d self._get_nvme_devices()"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        device_info \u003d {\u0027type\u0027: \u0027block\u0027}"},{"line_number":342,"context_line":"        conn_nqn \u003d connection_properties[\u0027nqn\u0027]"},{"line_number":343,"context_line":"        target_portal \u003d connection_properties[\u0027target_portal\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"f926e176_c83e85ac","line":340,"in_reply_to":"e76fb5a6_c38e66f4","updated":"2022-03-14 12:24:09.000000000","message":"Ack","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3ae24de45f3be75f5d56a4cf4cc2bfcacfff425a","unresolved":true,"context_lines":[{"line_number":425,"context_line":"        \"\"\""},{"line_number":426,"context_line":"        if connection_properties.get(\u0027vol_uuid\u0027):  # compatibility"},{"line_number":427,"context_line":"            return self._extend_volume_replicated(connection_properties)"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"        volume_paths \u003d self.get_volume_paths(connection_properties)"},{"line_number":430,"context_line":"        if volume_paths:"},{"line_number":431,"context_line":"            if connection_properties.get(\u0027volume_nguid\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5da024c1_1d6f725a","line":428,"updated":"2022-03-10 15:36:47.000000000","message":"-1: Unnecessary change","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"39b7ac5cdc1dbe95f16f1aee758ed1fce3c54b2e","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        \"\"\""},{"line_number":426,"context_line":"        if connection_properties.get(\u0027vol_uuid\u0027):  # compatibility"},{"line_number":427,"context_line":"            return self._extend_volume_replicated(connection_properties)"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"        volume_paths \u003d self.get_volume_paths(connection_properties)"},{"line_number":430,"context_line":"        if volume_paths:"},{"line_number":431,"context_line":"            if connection_properties.get(\u0027volume_nguid\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"d6512030_0b03d44d","line":428,"in_reply_to":"5da024c1_1d6f725a","updated":"2022-03-14 12:24:09.000000000","message":"Ack","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3ae24de45f3be75f5d56a4cf4cc2bfcacfff425a","unresolved":true,"context_lines":[{"line_number":527,"context_line":""},{"line_number":528,"context_line":"    def _connect_target_volume(self, target_nqn, vol_uuid, portals):"},{"line_number":529,"context_line":"        try:"},{"line_number":530,"context_line":"            NVMeOFConnector.get_nvme_controllers(self, target_nqn)"},{"line_number":531,"context_line":"            NVMeOFConnector.rescan(self, target_nqn, vol_uuid)"},{"line_number":532,"context_line":"        except exception.VolumeDeviceNotFound:"},{"line_number":533,"context_line":"            if not NVMeOFConnector.connect_to_portals(self, target_nqn,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7c4ae282_393143a8","line":530,"updated":"2022-03-10 15:36:47.000000000","message":"-1: It\u0027s not enough that 1 controller is connected, because there may be others connections that need to be done.\n\nExample:\n\n- There are 4 portals and there are issues in the paths to 3 of them.\n- So the first attach only connects to 1 location out of 4.\n- All paths recover now.\n- Any following connections will NOT try the other 3 portals.","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":34550,"name":"Gili Buzaglo","email":"gili.buzaglo@kioxia.com","username":"gilib"},"change_message_id":"f708db6578cc01d2ad411abd09d7356cf4171297","unresolved":true,"context_lines":[{"line_number":527,"context_line":""},{"line_number":528,"context_line":"    def _connect_target_volume(self, target_nqn, vol_uuid, portals):"},{"line_number":529,"context_line":"        try:"},{"line_number":530,"context_line":"            NVMeOFConnector.get_nvme_controllers(self, target_nqn)"},{"line_number":531,"context_line":"            NVMeOFConnector.rescan(self, target_nqn, vol_uuid)"},{"line_number":532,"context_line":"        except exception.VolumeDeviceNotFound:"},{"line_number":533,"context_line":"            if not NVMeOFConnector.connect_to_portals(self, target_nqn,"}],"source_content_type":"text/x-python","patch_set":5,"id":"83204bca_ee9506a0","line":530,"in_reply_to":"7c4ae282_393143a8","updated":"2022-03-14 11:35:11.000000000","message":"Agree, we should call connect_to_portal anyway and inside we should check if the controller exist before trying to connect","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"39b7ac5cdc1dbe95f16f1aee758ed1fce3c54b2e","unresolved":false,"context_lines":[{"line_number":527,"context_line":""},{"line_number":528,"context_line":"    def _connect_target_volume(self, target_nqn, vol_uuid, portals):"},{"line_number":529,"context_line":"        try:"},{"line_number":530,"context_line":"            NVMeOFConnector.get_nvme_controllers(self, target_nqn)"},{"line_number":531,"context_line":"            NVMeOFConnector.rescan(self, target_nqn, vol_uuid)"},{"line_number":532,"context_line":"        except exception.VolumeDeviceNotFound:"},{"line_number":533,"context_line":"            if not NVMeOFConnector.connect_to_portals(self, target_nqn,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ebd9df4_d0f2f037","line":530,"in_reply_to":"83204bca_ee9506a0","updated":"2022-03-14 12:24:09.000000000","message":"Ack","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3ae24de45f3be75f5d56a4cf4cc2bfcacfff425a","unresolved":true,"context_lines":[{"line_number":531,"context_line":"            NVMeOFConnector.rescan(self, target_nqn, vol_uuid)"},{"line_number":532,"context_line":"        except exception.VolumeDeviceNotFound:"},{"line_number":533,"context_line":"            if not NVMeOFConnector.connect_to_portals(self, target_nqn,"},{"line_number":534,"context_line":"                                                      portals):"},{"line_number":535,"context_line":"                LOG.error(\"No successful connections to: %s\", target_nqn)"},{"line_number":536,"context_line":"                raise exception.VolumeDeviceNotFound(device\u003dtarget_nqn)"},{"line_number":537,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"58c17f3e_4a80612e","line":534,"updated":"2022-03-10 15:36:47.000000000","message":"-1: Unnecessary change","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"39b7ac5cdc1dbe95f16f1aee758ed1fce3c54b2e","unresolved":false,"context_lines":[{"line_number":531,"context_line":"            NVMeOFConnector.rescan(self, target_nqn, vol_uuid)"},{"line_number":532,"context_line":"        except exception.VolumeDeviceNotFound:"},{"line_number":533,"context_line":"            if not NVMeOFConnector.connect_to_portals(self, target_nqn,"},{"line_number":534,"context_line":"                                                      portals):"},{"line_number":535,"context_line":"                LOG.error(\"No successful connections to: %s\", target_nqn)"},{"line_number":536,"context_line":"                raise exception.VolumeDeviceNotFound(device\u003dtarget_nqn)"},{"line_number":537,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"0dbfae17_0d3a750b","line":534,"in_reply_to":"58c17f3e_4a80612e","updated":"2022-03-14 12:24:09.000000000","message":"Ack","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3ae24de45f3be75f5d56a4cf4cc2bfcacfff425a","unresolved":true,"context_lines":[{"line_number":536,"context_line":"                raise exception.VolumeDeviceNotFound(device\u003dtarget_nqn)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        dev_path \u003d NVMeOFConnector.get_nvme_device_path(self, target_nqn,"},{"line_number":539,"context_line":"                                                        vol_uuid)"},{"line_number":540,"context_line":"        if not dev_path:"},{"line_number":541,"context_line":"            LOG.error(\"Target %s volume %s not found\", target_nqn, vol_uuid)"},{"line_number":542,"context_line":"            raise exception.VolumeDeviceNotFound(device\u003dvol_uuid)"}],"source_content_type":"text/x-python","patch_set":5,"id":"4ba500f4_a6868914","line":539,"updated":"2022-03-10 15:36:47.000000000","message":"-1: Unnecessary change","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"39b7ac5cdc1dbe95f16f1aee758ed1fce3c54b2e","unresolved":false,"context_lines":[{"line_number":536,"context_line":"                raise exception.VolumeDeviceNotFound(device\u003dtarget_nqn)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        dev_path \u003d NVMeOFConnector.get_nvme_device_path(self, target_nqn,"},{"line_number":539,"context_line":"                                                        vol_uuid)"},{"line_number":540,"context_line":"        if not dev_path:"},{"line_number":541,"context_line":"            LOG.error(\"Target %s volume %s not found\", target_nqn, vol_uuid)"},{"line_number":542,"context_line":"            raise exception.VolumeDeviceNotFound(device\u003dvol_uuid)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3c07e966_46822cd9","line":539,"in_reply_to":"4ba500f4_a6868914","updated":"2022-03-14 12:24:09.000000000","message":"Ack","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3ae24de45f3be75f5d56a4cf4cc2bfcacfff425a","unresolved":true,"context_lines":[{"line_number":546,"context_line":"    def connect_to_portals(executor, target_nqn, target_portals):"},{"line_number":547,"context_line":"        \"\"\"connect to any of NVMe-oF target portals\"\"\""},{"line_number":548,"context_line":"        any_connect \u003d False"},{"line_number":549,"context_line":"        native_multipath_supported \u003d executor._is_native_multipath_supported()"},{"line_number":550,"context_line":"        for portal in target_portals:"},{"line_number":551,"context_line":"            portal_address \u003d portal[0]"},{"line_number":552,"context_line":"            portal_port \u003d portal[1]"}],"source_content_type":"text/x-python","patch_set":5,"id":"8eb6ef20_e6ad4d8f","line":549,"updated":"2022-03-10 15:36:47.000000000","message":"-1: If I\u0027m not mistaken native multipath support cannot be enabled without a reboot, so we can just load this once and keep it a class attribute so we don\u0027t need to load it in all the executions.","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"39b7ac5cdc1dbe95f16f1aee758ed1fce3c54b2e","unresolved":false,"context_lines":[{"line_number":546,"context_line":"    def connect_to_portals(executor, target_nqn, target_portals):"},{"line_number":547,"context_line":"        \"\"\"connect to any of NVMe-oF target portals\"\"\""},{"line_number":548,"context_line":"        any_connect \u003d False"},{"line_number":549,"context_line":"        native_multipath_supported \u003d executor._is_native_multipath_supported()"},{"line_number":550,"context_line":"        for portal in target_portals:"},{"line_number":551,"context_line":"            portal_address \u003d portal[0]"},{"line_number":552,"context_line":"            portal_port \u003d portal[1]"}],"source_content_type":"text/x-python","patch_set":5,"id":"27c0aa2e_740881a9","line":549,"in_reply_to":"8eb6ef20_e6ad4d8f","updated":"2022-03-14 12:24:09.000000000","message":"Ack","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":34550,"name":"Gili Buzaglo","email":"gili.buzaglo@kioxia.com","username":"gilib"},"change_message_id":"f708db6578cc01d2ad411abd09d7356cf4171297","unresolved":true,"context_lines":[{"line_number":583,"context_line":"                            root_helper\u003dexecutor._root_helper)"},{"line_number":584,"context_line":"                        if \u0027live\u0027 not in state:"},{"line_number":585,"context_line":"                            LOG.debug(\"nvmeof ctrl device not live: %s\", ctrl)"},{"line_number":586,"context_line":"                            raise exception.VolumeDeviceNotFound(device\u003dctrl)"},{"line_number":587,"context_line":"                        nvme_controllers.append(ctrl[ctrl.rfind(\u0027/\u0027) + 1:])"},{"line_number":588,"context_line":"            except putils.ProcessExecutionError as e:"},{"line_number":589,"context_line":"                LOG.exception(e)"}],"source_content_type":"text/x-python","patch_set":5,"id":"85ed077a_ed303758","line":586,"updated":"2022-03-14 11:35:11.000000000","message":"get_nvme_controllers should return all live controllers, and fail only if no live controller is found","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"39b7ac5cdc1dbe95f16f1aee758ed1fce3c54b2e","unresolved":false,"context_lines":[{"line_number":583,"context_line":"                            root_helper\u003dexecutor._root_helper)"},{"line_number":584,"context_line":"                        if \u0027live\u0027 not in state:"},{"line_number":585,"context_line":"                            LOG.debug(\"nvmeof ctrl device not live: %s\", ctrl)"},{"line_number":586,"context_line":"                            raise exception.VolumeDeviceNotFound(device\u003dctrl)"},{"line_number":587,"context_line":"                        nvme_controllers.append(ctrl[ctrl.rfind(\u0027/\u0027) + 1:])"},{"line_number":588,"context_line":"            except putils.ProcessExecutionError as e:"},{"line_number":589,"context_line":"                LOG.exception(e)"}],"source_content_type":"text/x-python","patch_set":5,"id":"648fec94_0415ce34","line":586,"in_reply_to":"85ed077a_ed303758","updated":"2022-03-14 12:24:09.000000000","message":"Ack","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3ae24de45f3be75f5d56a4cf4cc2bfcacfff425a","unresolved":true,"context_lines":[{"line_number":594,"context_line":"    @staticmethod"},{"line_number":595,"context_line":"    @utils.retry(exception.VolumeDeviceNotFound, retries\u003d5)"},{"line_number":596,"context_line":"    def get_nvme_device_path(executor, target_nqn, vol_uuid):"},{"line_number":597,"context_line":"        nvme_ctrls \u003d NVMeOFConnector.get_nvme_controllers(executor, target_nqn)"},{"line_number":598,"context_line":"        LOG.debug(\"[!] nvme_ctrl: %s\", nvme_ctrls)"},{"line_number":599,"context_line":"        for nvme_ctrl in nvme_ctrls:"},{"line_number":600,"context_line":"            uuid_paths \u003d glob.glob(\u0027/sys/class/block/\u0027 + nvme_ctrl + \u0027n*/uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5814be26_d059c207","line":597,"updated":"2022-03-10 15:36:47.000000000","message":"?: We should already have this information from earlier, right?","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"39b7ac5cdc1dbe95f16f1aee758ed1fce3c54b2e","unresolved":false,"context_lines":[{"line_number":594,"context_line":"    @staticmethod"},{"line_number":595,"context_line":"    @utils.retry(exception.VolumeDeviceNotFound, retries\u003d5)"},{"line_number":596,"context_line":"    def get_nvme_device_path(executor, target_nqn, vol_uuid):"},{"line_number":597,"context_line":"        nvme_ctrls \u003d NVMeOFConnector.get_nvme_controllers(executor, target_nqn)"},{"line_number":598,"context_line":"        LOG.debug(\"[!] nvme_ctrl: %s\", nvme_ctrls)"},{"line_number":599,"context_line":"        for nvme_ctrl in nvme_ctrls:"},{"line_number":600,"context_line":"            uuid_paths \u003d glob.glob(\u0027/sys/class/block/\u0027 + nvme_ctrl + \u0027n*/uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"75ce300a_b2e1124b","line":597,"in_reply_to":"5814be26_d059c207","updated":"2022-03-14 12:24:09.000000000","message":"Ack","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3ae24de45f3be75f5d56a4cf4cc2bfcacfff425a","unresolved":true,"context_lines":[{"line_number":861,"context_line":""},{"line_number":862,"context_line":"    @staticmethod"},{"line_number":863,"context_line":"    def rescan(executor, target_nqn, vol_uuid):"},{"line_number":864,"context_line":"        nvme_ctrls \u003d NVMeOFConnector.get_nvme_controllers(executor, target_nqn)"},{"line_number":865,"context_line":"        for nvme_ctrl in nvme_ctrls:"},{"line_number":866,"context_line":"            ctr_device \u003d (NVMeOFConnector.get_search_path() + nvme_ctrl)"},{"line_number":867,"context_line":"            nvme_command \u003d (\u0027ns-rescan\u0027, ctr_device)"}],"source_content_type":"text/x-python","patch_set":5,"id":"44e29346_02365586","line":864,"updated":"2022-03-10 15:36:47.000000000","message":"-1: We should get the controllers once, and then use it everywhere, right?","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"39b7ac5cdc1dbe95f16f1aee758ed1fce3c54b2e","unresolved":false,"context_lines":[{"line_number":861,"context_line":""},{"line_number":862,"context_line":"    @staticmethod"},{"line_number":863,"context_line":"    def rescan(executor, target_nqn, vol_uuid):"},{"line_number":864,"context_line":"        nvme_ctrls \u003d NVMeOFConnector.get_nvme_controllers(executor, target_nqn)"},{"line_number":865,"context_line":"        for nvme_ctrl in nvme_ctrls:"},{"line_number":866,"context_line":"            ctr_device \u003d (NVMeOFConnector.get_search_path() + nvme_ctrl)"},{"line_number":867,"context_line":"            nvme_command \u003d (\u0027ns-rescan\u0027, ctr_device)"}],"source_content_type":"text/x-python","patch_set":5,"id":"c95ca5ad_1f3651ca","line":864,"in_reply_to":"44e29346_02365586","updated":"2022-03-14 12:24:09.000000000","message":"Ack","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3ae24de45f3be75f5d56a4cf4cc2bfcacfff425a","unresolved":true,"context_lines":[{"line_number":864,"context_line":"        nvme_ctrls \u003d NVMeOFConnector.get_nvme_controllers(executor, target_nqn)"},{"line_number":865,"context_line":"        for nvme_ctrl in nvme_ctrls:"},{"line_number":866,"context_line":"            ctr_device \u003d (NVMeOFConnector.get_search_path() + nvme_ctrl)"},{"line_number":867,"context_line":"            nvme_command \u003d (\u0027ns-rescan\u0027, ctr_device)"},{"line_number":868,"context_line":"            try:"},{"line_number":869,"context_line":"                NVMeOFConnector.run_nvme_cli(executor, nvme_command)"},{"line_number":870,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"08240394_9f7353c1","line":867,"updated":"2022-03-10 15:36:47.000000000","message":"?: Have you tested this with a controller that is reconnecting due to network issues?  I believe this would fail either on the first request or the second one, I don\u0027t remember.","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"39b7ac5cdc1dbe95f16f1aee758ed1fce3c54b2e","unresolved":true,"context_lines":[{"line_number":864,"context_line":"        nvme_ctrls \u003d NVMeOFConnector.get_nvme_controllers(executor, target_nqn)"},{"line_number":865,"context_line":"        for nvme_ctrl in nvme_ctrls:"},{"line_number":866,"context_line":"            ctr_device \u003d (NVMeOFConnector.get_search_path() + nvme_ctrl)"},{"line_number":867,"context_line":"            nvme_command \u003d (\u0027ns-rescan\u0027, ctr_device)"},{"line_number":868,"context_line":"            try:"},{"line_number":869,"context_line":"                NVMeOFConnector.run_nvme_cli(executor, nvme_command)"},{"line_number":870,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"42c23098_77e4440d","line":867,"in_reply_to":"08240394_9f7353c1","updated":"2022-03-14 12:24:09.000000000","message":"It\u0027s not related to the multipath change but I understood right this all rescan function should raise any exception?","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"60800069a47b6394797913c47aa80fd2ae5a246e","unresolved":false,"context_lines":[{"line_number":864,"context_line":"        nvme_ctrls \u003d NVMeOFConnector.get_nvme_controllers(executor, target_nqn)"},{"line_number":865,"context_line":"        for nvme_ctrl in nvme_ctrls:"},{"line_number":866,"context_line":"            ctr_device \u003d (NVMeOFConnector.get_search_path() + nvme_ctrl)"},{"line_number":867,"context_line":"            nvme_command \u003d (\u0027ns-rescan\u0027, ctr_device)"},{"line_number":868,"context_line":"            try:"},{"line_number":869,"context_line":"                NVMeOFConnector.run_nvme_cli(executor, nvme_command)"},{"line_number":870,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"76ec5c0a_3ad0de53","line":867,"in_reply_to":"42c23098_77e4440d","updated":"2022-04-21 11:43:41.000000000","message":"What I mean is that blindly doing a rescan below will fail if the particular path is reconnecting due to network issues, and we\u0027ll end up with a long exception trace instead of a message saying that the particular path is down.\n\nit\u0027s a nit, not a big deal.","commit_id":"3d0a31f8b9b20258cdaa02c30db322fe538c8276"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"60800069a47b6394797913c47aa80fd2ae5a246e","unresolved":true,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"g_host \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class NVMeOFConnector(base.BaseLinuxConnector):"}],"source_content_type":"text/x-python","patch_set":7,"id":"68c91676_7d9a0e75","line":42,"updated":"2022-04-21 11:43:41.000000000","message":"-1: This g_host global variable has been added since patchset #5 and it doesn\u0027t seem to be part of the multipathing effort.  It looks related to the agent work.","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"3d76f7cb0d7e47f5ac2be9f73d015c280b54ca61","unresolved":true,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"g_host \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class NVMeOFConnector(base.BaseLinuxConnector):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9c06b2b8_1c449a60","line":42,"in_reply_to":"68c91676_7d9a0e75","updated":"2022-04-25 11:27:47.000000000","message":"Yes, it\u0027s for the agent.\nIs it a problem to add also this change here?","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"cbfe8d52526d523312d2d690799dae926c6ecd88","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"g_host \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class NVMeOFConnector(base.BaseLinuxConnector):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ea80e499_64c7c8b2","line":42,"in_reply_to":"97e3057d_02147fa2","updated":"2022-05-11 12:18:54.000000000","message":"Ack","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3f145cb12a9565424c1d4b36a3570e9950a84c6f","unresolved":true,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"g_host \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class NVMeOFConnector(base.BaseLinuxConnector):"}],"source_content_type":"text/x-python","patch_set":7,"id":"97e3057d_02147fa2","line":42,"in_reply_to":"9c06b2b8_1c449a60","updated":"2022-05-11 11:23:28.000000000","message":"-1: It would be ok if it were to add ANA support for the agent, but it looks like in this case it has nothing to do with ANA, which is the objective of the patch.","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"b4c11d2c11454c975d7fd21bd7d6cb88062fd7a1","unresolved":true,"context_lines":[{"line_number":56,"context_line":"            device_scan_attempts\u003ddevice_scan_attempts,"},{"line_number":57,"context_line":"            *args, **kwargs)"},{"line_number":58,"context_line":"        self.use_multipath \u003d use_multipath"},{"line_number":59,"context_line":"        NVMeOFConnector.native_multipath_supported \u003d \\"},{"line_number":60,"context_line":"            NVMeOFConnector._is_native_multipath_supported(self)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"b50b4e74_038021de","line":59,"updated":"2022-04-25 09:32:22.000000000","message":"-1: Since we don\u0027t check the current value we are checking it on every single connection (because a new connector is created).  We should only check the system if the class attribute value is None.","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"3d76f7cb0d7e47f5ac2be9f73d015c280b54ca61","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            device_scan_attempts\u003ddevice_scan_attempts,"},{"line_number":57,"context_line":"            *args, **kwargs)"},{"line_number":58,"context_line":"        self.use_multipath \u003d use_multipath"},{"line_number":59,"context_line":"        NVMeOFConnector.native_multipath_supported \u003d \\"},{"line_number":60,"context_line":"            NVMeOFConnector._is_native_multipath_supported(self)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"48dcb1ab_4d589e81","line":59,"in_reply_to":"b50b4e74_038021de","updated":"2022-04-25 11:27:47.000000000","message":"Ack","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"60800069a47b6394797913c47aa80fd2ae5a246e","unresolved":true,"context_lines":[{"line_number":57,"context_line":"            *args, **kwargs)"},{"line_number":58,"context_line":"        self.use_multipath \u003d use_multipath"},{"line_number":59,"context_line":"        NVMeOFConnector.native_multipath_supported \u003d \\"},{"line_number":60,"context_line":"            NVMeOFConnector._is_native_multipath_supported(self)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @staticmethod"},{"line_number":63,"context_line":"    def get_search_path():"}],"source_content_type":"text/x-python","patch_set":7,"id":"a1600496_95dcedf2","line":60,"updated":"2022-04-21 11:43:41.000000000","message":"nit: Maybe a warning here for the case where we were asked to do multipathing (it\u0027s not enforced) but we cannot do multipathing because native multipathing is not enabled.","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"3d76f7cb0d7e47f5ac2be9f73d015c280b54ca61","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            *args, **kwargs)"},{"line_number":58,"context_line":"        self.use_multipath \u003d use_multipath"},{"line_number":59,"context_line":"        NVMeOFConnector.native_multipath_supported \u003d \\"},{"line_number":60,"context_line":"            NVMeOFConnector._is_native_multipath_supported(self)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @staticmethod"},{"line_number":63,"context_line":"    def get_search_path():"}],"source_content_type":"text/x-python","patch_set":7,"id":"7108ff65_90af3711","line":60,"in_reply_to":"a1600496_95dcedf2","updated":"2022-04-25 11:27:47.000000000","message":"Ack","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3f145cb12a9565424c1d4b36a3570e9950a84c6f","unresolved":true,"context_lines":[{"line_number":119,"context_line":"            ret[\u0027nqn\u0027] \u003d nqn"},{"line_number":120,"context_line":"        g_host \u003d kwargs.get(\u0027host\u0027, None)"},{"line_number":121,"context_line":"        ret[\u0027nvme_native_multipath\u0027] \u003d \\"},{"line_number":122,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":123,"context_line":"        return ret"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _get_host_uuid(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"296e2ec7_6b551855","line":122,"range":{"start_line":122,"start_character":12,"end_line":122,"end_character":27},"updated":"2022-05-11 11:23:28.000000000","message":"-1: cls","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"cbfe8d52526d523312d2d690799dae926c6ecd88","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            ret[\u0027nqn\u0027] \u003d nqn"},{"line_number":120,"context_line":"        g_host \u003d kwargs.get(\u0027host\u0027, None)"},{"line_number":121,"context_line":"        ret[\u0027nvme_native_multipath\u0027] \u003d \\"},{"line_number":122,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":123,"context_line":"        return ret"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _get_host_uuid(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"4ba34892_c3404fa9","line":122,"range":{"start_line":122,"start_character":12,"end_line":122,"end_character":27},"in_reply_to":"296e2ec7_6b551855","updated":"2022-05-11 12:18:54.000000000","message":"Ack","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"60800069a47b6394797913c47aa80fd2ae5a246e","unresolved":true,"context_lines":[{"line_number":120,"context_line":"        g_host \u003d kwargs.get(\u0027host\u0027, None)"},{"line_number":121,"context_line":"        ret[\u0027nvme_native_multipath\u0027] \u003d \\"},{"line_number":122,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":123,"context_line":"        return ret"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _get_host_uuid(self):"},{"line_number":126,"context_line":"        cmd \u003d (\u0027findmnt\u0027, \u0027/\u0027, \u0027-n\u0027, \u0027-o\u0027, \u0027SOURCE\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"57be651e_1a87e4bb","line":123,"updated":"2022-04-21 11:43:41.000000000","message":"-1: In theory we should fail if we receive the enforce_multipath parameter se to True but the system doesn\u0027t support ANA.\n\nUnfortunately we cannot do that, because then we could break existing systems that are just using iSCSI/FC multipathing and don\u0027t care about this one.\n\nOn this same topic, it doesn\u0027t make sense that if we only use NVMe-oF connections and we want multipathing we need to install and run multipathd or Nova will fail to do the connection.\n\nI think for now we should raise a warning here if we were requested to enforce multipathing but native multipathing is not supported, to at least make it clear WHY it\u0027s not doing multipathing.  That way at least the blame won\u0027t be on the os-brick code and will help operators.\n\nI\u0027ll see if I can propose a patch to change our approach to the whole enforce multipathing feature to make it more reasonable.","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6e28c9598eba7a6b71094fd58337cc0193a1520f","unresolved":true,"context_lines":[{"line_number":120,"context_line":"        g_host \u003d kwargs.get(\u0027host\u0027, None)"},{"line_number":121,"context_line":"        ret[\u0027nvme_native_multipath\u0027] \u003d \\"},{"line_number":122,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":123,"context_line":"        return ret"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _get_host_uuid(self):"},{"line_number":126,"context_line":"        cmd \u003d (\u0027findmnt\u0027, \u0027/\u0027, \u0027-n\u0027, \u0027-o\u0027, \u0027SOURCE\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ed737f13_dae12ae4","line":123,"in_reply_to":"4f8fdf1d_8db0e4e3","updated":"2022-05-24 12:36:42.000000000","message":"In my opinion we should remove L121-123 for now, so method get_connector_properties doesn\u0027t log the warning.\n\nThat way deployments that only use iSCSI or FC with multipathing won\u0027t be seeing this warning on every single attach.","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"cbfe8d52526d523312d2d690799dae926c6ecd88","unresolved":true,"context_lines":[{"line_number":120,"context_line":"        g_host \u003d kwargs.get(\u0027host\u0027, None)"},{"line_number":121,"context_line":"        ret[\u0027nvme_native_multipath\u0027] \u003d \\"},{"line_number":122,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":123,"context_line":"        return ret"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _get_host_uuid(self):"},{"line_number":126,"context_line":"        cmd \u003d (\u0027findmnt\u0027, \u0027/\u0027, \u0027-n\u0027, \u0027-o\u0027, \u0027SOURCE\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"4f8fdf1d_8db0e4e3","line":123,"in_reply_to":"50518f37_d129f2ea","updated":"2022-05-11 12:18:54.000000000","message":"So, should we revert the whole enforce_multipath usage here and not log any warrning regards in get_connector_properties?","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"3d76f7cb0d7e47f5ac2be9f73d015c280b54ca61","unresolved":true,"context_lines":[{"line_number":120,"context_line":"        g_host \u003d kwargs.get(\u0027host\u0027, None)"},{"line_number":121,"context_line":"        ret[\u0027nvme_native_multipath\u0027] \u003d \\"},{"line_number":122,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":123,"context_line":"        return ret"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _get_host_uuid(self):"},{"line_number":126,"context_line":"        cmd \u003d (\u0027findmnt\u0027, \u0027/\u0027, \u0027-n\u0027, \u0027-o\u0027, \u0027SOURCE\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5fa982a7_7351190a","line":123,"in_reply_to":"57be651e_1a87e4bb","updated":"2022-04-25 11:27:47.000000000","message":"Do we have the enforce_multipath parameter from kwargs?","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3f145cb12a9565424c1d4b36a3570e9950a84c6f","unresolved":true,"context_lines":[{"line_number":120,"context_line":"        g_host \u003d kwargs.get(\u0027host\u0027, None)"},{"line_number":121,"context_line":"        ret[\u0027nvme_native_multipath\u0027] \u003d \\"},{"line_number":122,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":123,"context_line":"        return ret"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _get_host_uuid(self):"},{"line_number":126,"context_line":"        cmd \u003d (\u0027findmnt\u0027, \u0027/\u0027, \u0027-n\u0027, \u0027-o\u0027, \u0027SOURCE\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"50518f37_d129f2ea","line":123,"in_reply_to":"5fa982a7_7351190a","updated":"2022-05-11 11:23:28.000000000","message":"Yes we have it: https://opendev.org/openstack/os-brick/src/commit/2ec42175f49dc61c006fc5f646e29e32449be59b/os_brick/initiator/connector.py#L239\n\nBut I have to facepalm, because I\u0027m not sure now that my request was such a good idea.\n\nIf we issue that warning here we\u0027ll be seeing this warning on ALL systems, even those that are not using NVMe-oF devices.\n\nThe warning on L64 does not have this issue, because at that point we know that the caller is actually using the nvmeof connector.","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"4a475dc8204813587269429de0a92c6212428333","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        g_host \u003d kwargs.get(\u0027host\u0027, None)"},{"line_number":121,"context_line":"        ret[\u0027nvme_native_multipath\u0027] \u003d \\"},{"line_number":122,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":123,"context_line":"        return ret"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _get_host_uuid(self):"},{"line_number":126,"context_line":"        cmd \u003d (\u0027findmnt\u0027, \u0027/\u0027, \u0027-n\u0027, \u0027-o\u0027, \u0027SOURCE\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dbd82671_e4300917","line":123,"in_reply_to":"ed737f13_dae12ae4","updated":"2022-05-24 13:45:12.000000000","message":"Ack","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"60800069a47b6394797913c47aa80fd2ae5a246e","unresolved":true,"context_lines":[{"line_number":157,"context_line":"                out \u003d \"\""},{"line_number":158,"context_line":"        return out.strip()"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    @staticmethod"},{"line_number":161,"context_line":"    def _is_native_multipath_supported(executor):"},{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            out, err \u003d executor._execute("},{"line_number":164,"context_line":"                \u0027cat\u0027, \u0027/sys/module/nvme_core/parameters/multipath\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3378b94b_3d0ae807","line":161,"range":{"start_line":160,"start_character":0,"end_line":161,"end_character":49},"updated":"2022-04-21 11:43:41.000000000","message":"-1: Sorry, I\u0027m against this, as I believe it makes the code harder to read. In my mind it\u0027s not **any** \"executor\" it\u0027s self.","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"1441daa32f5706bbfc957139e081ad3ee4cf3c44","unresolved":true,"context_lines":[{"line_number":157,"context_line":"                out \u003d \"\""},{"line_number":158,"context_line":"        return out.strip()"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    @staticmethod"},{"line_number":161,"context_line":"    def _is_native_multipath_supported(executor):"},{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            out, err \u003d executor._execute("},{"line_number":164,"context_line":"                \u0027cat\u0027, \u0027/sys/module/nvme_core/parameters/multipath\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"e3765901_67fe81de","line":161,"range":{"start_line":160,"start_character":0,"end_line":161,"end_character":49},"in_reply_to":"3378b94b_3d0ae807","updated":"2022-04-25 09:30:46.000000000","message":"I see now that my comment is not very clear.  What I mean to say is that it should not be a static method but a normal instance method.\n\ndef _is_native_multipath_supported(self):","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"3d76f7cb0d7e47f5ac2be9f73d015c280b54ca61","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                out \u003d \"\""},{"line_number":158,"context_line":"        return out.strip()"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    @staticmethod"},{"line_number":161,"context_line":"    def _is_native_multipath_supported(executor):"},{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            out, err \u003d executor._execute("},{"line_number":164,"context_line":"                \u0027cat\u0027, \u0027/sys/module/nvme_core/parameters/multipath\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"2308e71b_1137ecf4","line":161,"range":{"start_line":160,"start_character":0,"end_line":161,"end_character":49},"in_reply_to":"e3765901_67fe81de","updated":"2022-04-25 11:27:47.000000000","message":"Ack","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"60800069a47b6394797913c47aa80fd2ae5a246e","unresolved":true,"context_lines":[{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            out, err \u003d executor._execute("},{"line_number":164,"context_line":"                \u0027cat\u0027, \u0027/sys/module/nvme_core/parameters/multipath\u0027,"},{"line_number":165,"context_line":"                root_helper\u003dexecutor._root_helper, run_as_root\u003dFalse)"},{"line_number":166,"context_line":"            if out.strip() \u003d\u003d \u0027Y\u0027:"},{"line_number":167,"context_line":"                return True"},{"line_number":168,"context_line":"        except putils.ProcessExecutionError as e:"}],"source_content_type":"text/x-python","patch_set":7,"id":"b28f76cb_10b94974","line":165,"updated":"2022-04-21 11:43:41.000000000","message":"-1: By reading from python I meant:\n\n  try:\n      with open(\u0027/sys/module/nvme_core/parameters/multipath\u0027, \u0027rt\u0027) as f:\n          return f.read().strip() \u003d\u003d \u0027Y\u0027\n  except putils.ProcessExecutionError as e:\n      LOG.exception(e)","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"3d76f7cb0d7e47f5ac2be9f73d015c280b54ca61","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            out, err \u003d executor._execute("},{"line_number":164,"context_line":"                \u0027cat\u0027, \u0027/sys/module/nvme_core/parameters/multipath\u0027,"},{"line_number":165,"context_line":"                root_helper\u003dexecutor._root_helper, run_as_root\u003dFalse)"},{"line_number":166,"context_line":"            if out.strip() \u003d\u003d \u0027Y\u0027:"},{"line_number":167,"context_line":"                return True"},{"line_number":168,"context_line":"        except putils.ProcessExecutionError as e:"}],"source_content_type":"text/x-python","patch_set":7,"id":"7155cebc_b6ae1fe8","line":165,"in_reply_to":"b28f76cb_10b94974","updated":"2022-04-25 11:27:47.000000000","message":"Ack","commit_id":"a49ab19d54d5661f544d931e649655193cbf6044"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3f145cb12a9565424c1d4b36a3570e9950a84c6f","unresolved":true,"context_lines":[{"line_number":124,"context_line":"        g_host \u003d kwargs.get(\u0027host\u0027, None)"},{"line_number":125,"context_line":"        enforce_multipath \u003d kwargs.get(\u0027enforce_multipath\u0027, False)"},{"line_number":126,"context_line":"        ret[\u0027nvme_native_multipath\u0027] \u003d \\"},{"line_number":127,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":128,"context_line":"        if enforce_multipath and not \\"},{"line_number":129,"context_line":"                NVMeOFConnector.native_multipath_supported:"},{"line_number":130,"context_line":"            LOG.warning(\u0027native multipath is not enabled\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bb6d0da7_90333a9d","line":127,"range":{"start_line":127,"start_character":28,"end_line":127,"end_character":54},"updated":"2022-05-11 11:23:28.000000000","message":"-1: We cannot blindly use the class attribute here, because in general this method is called before instantiating this class, so on the first time this method is called it will return None as the value.\n\nOnce the connector is instantiated for the first time (for example to connect a volume) the value will be correct.\n\nWe can solve this by changing the \"_is_native_multipath_supported\" to something that checks the class attribute and only looks for it if it\u0027s not set.\n\neg:\n\n  def __init__(...):\n     self._set_native_multipath_supported()\n     if self.use_multipath and not \\\n             NVMeOFConnector.native_multipath_supported:\n         LOG.warning(\u0027native multipath is not enabled\u0027)\n\n\n  def get_connector_properties(...):\n         . . .\n      ret[\u0027nvme_native_multipath\u0027] \u003d cls._set_native_multipath_supported()\n         . . .\n\n  @classmethod\n  def _set_native_multipath_supported(cls):\n      if cls.native_multipath_supported is None:\n          cls.native_multipath_supported \u003d cls._is_native_multipath_supported()\n      return cls.native_multipath_supported\n\n\nWe can even include the _is_native_multipath_supported code in the set method.","commit_id":"2a2a0f4b2d2bcd852a7870c856a39e435207f40f"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"cbfe8d52526d523312d2d690799dae926c6ecd88","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        g_host \u003d kwargs.get(\u0027host\u0027, None)"},{"line_number":125,"context_line":"        enforce_multipath \u003d kwargs.get(\u0027enforce_multipath\u0027, False)"},{"line_number":126,"context_line":"        ret[\u0027nvme_native_multipath\u0027] \u003d \\"},{"line_number":127,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":128,"context_line":"        if enforce_multipath and not \\"},{"line_number":129,"context_line":"                NVMeOFConnector.native_multipath_supported:"},{"line_number":130,"context_line":"            LOG.warning(\u0027native multipath is not enabled\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"d578c85d_d572d23e","line":127,"range":{"start_line":127,"start_character":28,"end_line":127,"end_character":54},"in_reply_to":"bb6d0da7_90333a9d","updated":"2022-05-11 12:18:54.000000000","message":"Ack","commit_id":"2a2a0f4b2d2bcd852a7870c856a39e435207f40f"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3f145cb12a9565424c1d4b36a3570e9950a84c6f","unresolved":true,"context_lines":[{"line_number":165,"context_line":"                out \u003d \"\""},{"line_number":166,"context_line":"        return out.strip()"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _is_native_multipath_supported(self):"},{"line_number":169,"context_line":"        try:"},{"line_number":170,"context_line":"            with open(\u0027/sys/module/nvme_core/parameters/multipath\u0027, \u0027rt\u0027) as f:"},{"line_number":171,"context_line":"                return f.read().strip() \u003d\u003d \u0027Y\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"4392f9a5_2b3ac643","line":168,"range":{"start_line":168,"start_character":0,"end_line":168,"end_character":45},"updated":"2022-05-11 11:23:28.000000000","message":"nit: Now that we have changed how we read the file we could change this to a static method, since we don\u0027t make any use of the parameter.","commit_id":"2a2a0f4b2d2bcd852a7870c856a39e435207f40f"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"cbfe8d52526d523312d2d690799dae926c6ecd88","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                out \u003d \"\""},{"line_number":166,"context_line":"        return out.strip()"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _is_native_multipath_supported(self):"},{"line_number":169,"context_line":"        try:"},{"line_number":170,"context_line":"            with open(\u0027/sys/module/nvme_core/parameters/multipath\u0027, \u0027rt\u0027) as f:"},{"line_number":171,"context_line":"                return f.read().strip() \u003d\u003d \u0027Y\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"ed10d540_b422db95","line":168,"range":{"start_line":168,"start_character":0,"end_line":168,"end_character":45},"in_reply_to":"4392f9a5_2b3ac643","updated":"2022-05-11 12:18:54.000000000","message":"Ack","commit_id":"2a2a0f4b2d2bcd852a7870c856a39e435207f40f"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6e28c9598eba7a6b71094fd58337cc0193a1520f","unresolved":true,"context_lines":[{"line_number":518,"context_line":"    def _extend_volume_replicated(self, connection_properties):"},{"line_number":519,"context_line":"        volume_replicas \u003d connection_properties.get(\u0027volume_replicas\u0027)"},{"line_number":520,"context_line":"        replica_count \u003d connection_properties.get(\u0027replica_count\u0027)"},{"line_number":521,"context_line":"        target_nqn \u003d None"},{"line_number":522,"context_line":"        vol_uuid \u003d None"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"        if volume_replicas and replica_count \u003e 1:"},{"line_number":525,"context_line":"            device_path \u003d \u0027/dev/md/\u0027 + connection_properties[\u0027alias\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"f9957a75_0f022f01","line":522,"range":{"start_line":521,"start_character":0,"end_line":522,"end_character":23},"updated":"2022-05-24 12:36:42.000000000","message":"nit: This could go inside the else clause on L528","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"4a475dc8204813587269429de0a92c6212428333","unresolved":false,"context_lines":[{"line_number":518,"context_line":"    def _extend_volume_replicated(self, connection_properties):"},{"line_number":519,"context_line":"        volume_replicas \u003d connection_properties.get(\u0027volume_replicas\u0027)"},{"line_number":520,"context_line":"        replica_count \u003d connection_properties.get(\u0027replica_count\u0027)"},{"line_number":521,"context_line":"        target_nqn \u003d None"},{"line_number":522,"context_line":"        vol_uuid \u003d None"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"        if volume_replicas and replica_count \u003e 1:"},{"line_number":525,"context_line":"            device_path \u003d \u0027/dev/md/\u0027 + connection_properties[\u0027alias\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"6fb31d70_21bc0678","line":522,"range":{"start_line":521,"start_character":0,"end_line":522,"end_character":23},"in_reply_to":"f9957a75_0f022f01","updated":"2022-05-24 13:45:12.000000000","message":"Ack","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6e28c9598eba7a6b71094fd58337cc0193a1520f","unresolved":true,"context_lines":[{"line_number":573,"context_line":"                                                   nvme_ctrls):"},{"line_number":574,"context_line":"                if no_multipath:"},{"line_number":575,"context_line":"                    break"},{"line_number":576,"context_line":"                else:"},{"line_number":577,"context_line":"                    continue"},{"line_number":578,"context_line":"            if portal[2] \u003d\u003d \u0027RoCEv2\u0027:"},{"line_number":579,"context_line":"                portal_transport \u003d \u0027rdma\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a442053_8db48600","line":576,"range":{"start_line":576,"start_character":16,"end_line":576,"end_character":20},"updated":"2022-05-24 12:36:42.000000000","message":"nit: No need for else, because the break jumps to L578","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"4a475dc8204813587269429de0a92c6212428333","unresolved":false,"context_lines":[{"line_number":573,"context_line":"                                                   nvme_ctrls):"},{"line_number":574,"context_line":"                if no_multipath:"},{"line_number":575,"context_line":"                    break"},{"line_number":576,"context_line":"                else:"},{"line_number":577,"context_line":"                    continue"},{"line_number":578,"context_line":"            if portal[2] \u003d\u003d \u0027RoCEv2\u0027:"},{"line_number":579,"context_line":"                portal_transport \u003d \u0027rdma\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"b898d090_3bc4bf02","line":576,"range":{"start_line":576,"start_character":16,"end_line":576,"end_character":20},"in_reply_to":"1a442053_8db48600","updated":"2022-05-24 13:45:12.000000000","message":"Ack","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6e28c9598eba7a6b71094fd58337cc0193a1520f","unresolved":true,"context_lines":[{"line_number":574,"context_line":"                if no_multipath:"},{"line_number":575,"context_line":"                    break"},{"line_number":576,"context_line":"                else:"},{"line_number":577,"context_line":"                    continue"},{"line_number":578,"context_line":"            if portal[2] \u003d\u003d \u0027RoCEv2\u0027:"},{"line_number":579,"context_line":"                portal_transport \u003d \u0027rdma\u0027"},{"line_number":580,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"4d3253c8_04693698","line":577,"updated":"2022-05-24 12:36:42.000000000","message":"-1: This should mark that the connection exists:\n\n  any_connect \u003d True","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"4a475dc8204813587269429de0a92c6212428333","unresolved":false,"context_lines":[{"line_number":574,"context_line":"                if no_multipath:"},{"line_number":575,"context_line":"                    break"},{"line_number":576,"context_line":"                else:"},{"line_number":577,"context_line":"                    continue"},{"line_number":578,"context_line":"            if portal[2] \u003d\u003d \u0027RoCEv2\u0027:"},{"line_number":579,"context_line":"                portal_transport \u003d \u0027rdma\u0027"},{"line_number":580,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"034fab67_91e42735","line":577,"in_reply_to":"4d3253c8_04693698","updated":"2022-05-24 13:45:12.000000000","message":"No, we return true only in case any new connection had been done here.\nI will replace the variable name to any_new_connect.","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6e28c9598eba7a6b71094fd58337cc0193a1520f","unresolved":true,"context_lines":[{"line_number":593,"context_line":""},{"line_number":594,"context_line":"    @staticmethod"},{"line_number":595,"context_line":"    def is_portal_connected(portal_address, portal_port, nvme_ctrls):"},{"line_number":596,"context_line":"        address \u003d \"traddr\u003d{traddr},trsvcid\u003d{trsvcid}\".format(traddr\u003d"},{"line_number":597,"context_line":"                                                             portal_address,"},{"line_number":598,"context_line":"                                                             trsvcid\u003d"},{"line_number":599,"context_line":"                                                             portal_port)"},{"line_number":600,"context_line":"        if address in nvme_ctrls:"},{"line_number":601,"context_line":"            return True"},{"line_number":602,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":12,"id":"38875126_64d2fc39","line":599,"range":{"start_line":596,"start_character":0,"end_line":599,"end_character":73},"updated":"2022-05-24 12:36:42.000000000","message":"nit:\n\n        address \u003d f\"traddr\u003d{portal_address},trsvcid\u003d{portal_port}\"","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"4a475dc8204813587269429de0a92c6212428333","unresolved":false,"context_lines":[{"line_number":593,"context_line":""},{"line_number":594,"context_line":"    @staticmethod"},{"line_number":595,"context_line":"    def is_portal_connected(portal_address, portal_port, nvme_ctrls):"},{"line_number":596,"context_line":"        address \u003d \"traddr\u003d{traddr},trsvcid\u003d{trsvcid}\".format(traddr\u003d"},{"line_number":597,"context_line":"                                                             portal_address,"},{"line_number":598,"context_line":"                                                             trsvcid\u003d"},{"line_number":599,"context_line":"                                                             portal_port)"},{"line_number":600,"context_line":"        if address in nvme_ctrls:"},{"line_number":601,"context_line":"            return True"},{"line_number":602,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":12,"id":"3d12d608_f667704d","line":599,"range":{"start_line":596,"start_character":0,"end_line":599,"end_character":73},"in_reply_to":"38875126_64d2fc39","updated":"2022-05-24 13:45:12.000000000","message":"Ack","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6e28c9598eba7a6b71094fd58337cc0193a1520f","unresolved":true,"context_lines":[{"line_number":597,"context_line":"                                                             portal_address,"},{"line_number":598,"context_line":"                                                             trsvcid\u003d"},{"line_number":599,"context_line":"                                                             portal_port)"},{"line_number":600,"context_line":"        if address in nvme_ctrls:"},{"line_number":601,"context_line":"            return True"},{"line_number":602,"context_line":"        return False"},{"line_number":603,"context_line":""},{"line_number":604,"context_line":"    @staticmethod"},{"line_number":605,"context_line":"    def get_nvme_controllers(executor, target_nqn):"}],"source_content_type":"text/x-python","patch_set":12,"id":"468ff1fe_62b49ef2","line":602,"range":{"start_line":600,"start_character":0,"end_line":602,"end_character":20},"updated":"2022-05-24 12:36:42.000000000","message":"nit:\n\n return address in nvme_ctrls","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"4a475dc8204813587269429de0a92c6212428333","unresolved":false,"context_lines":[{"line_number":597,"context_line":"                                                             portal_address,"},{"line_number":598,"context_line":"                                                             trsvcid\u003d"},{"line_number":599,"context_line":"                                                             portal_port)"},{"line_number":600,"context_line":"        if address in nvme_ctrls:"},{"line_number":601,"context_line":"            return True"},{"line_number":602,"context_line":"        return False"},{"line_number":603,"context_line":""},{"line_number":604,"context_line":"    @staticmethod"},{"line_number":605,"context_line":"    def get_nvme_controllers(executor, target_nqn):"}],"source_content_type":"text/x-python","patch_set":12,"id":"4f826956_e9871a8e","line":602,"range":{"start_line":600,"start_character":0,"end_line":602,"end_character":20},"in_reply_to":"468ff1fe_62b49ef2","updated":"2022-05-24 13:45:12.000000000","message":"Ack","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6e28c9598eba7a6b71094fd58337cc0193a1520f","unresolved":true,"context_lines":[{"line_number":626,"context_line":"                            root_helper\u003dexecutor._root_helper)"},{"line_number":627,"context_line":"                        if \u0027live\u0027 in state:"},{"line_number":628,"context_line":"                            address, _err \u003d \\"},{"line_number":629,"context_line":"                                executor._execute(\u0027cat\u0027, ctrl + \u0027/address\u0027,"},{"line_number":630,"context_line":"                                                  run_as_root\u003dTrue,"},{"line_number":631,"context_line":"                                                  root_helper\u003d"},{"line_number":632,"context_line":"                                                  executor._root_helper)"},{"line_number":633,"context_line":"                            ctrl_name \u003d ctrl[ctrl.rfind(\u0027/\u0027) + 1:]"},{"line_number":634,"context_line":"                            LOG.debug(\"[!] address: %s|%s\", address, ctrl_name)"},{"line_number":635,"context_line":"                            nvme_controllers[address.strip()] \u003d ctrl_name"}],"source_content_type":"text/x-python","patch_set":12,"id":"f620b924_29098293","line":632,"range":{"start_line":629,"start_character":0,"end_line":632,"end_character":72},"updated":"2022-05-24 12:36:42.000000000","message":"nit: Address is readable by everyone on the system, so we don\u0027t need privileged access to read it and we can read it in Python instead of running a subcommand.","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"4a475dc8204813587269429de0a92c6212428333","unresolved":false,"context_lines":[{"line_number":626,"context_line":"                            root_helper\u003dexecutor._root_helper)"},{"line_number":627,"context_line":"                        if \u0027live\u0027 in state:"},{"line_number":628,"context_line":"                            address, _err \u003d \\"},{"line_number":629,"context_line":"                                executor._execute(\u0027cat\u0027, ctrl + \u0027/address\u0027,"},{"line_number":630,"context_line":"                                                  run_as_root\u003dTrue,"},{"line_number":631,"context_line":"                                                  root_helper\u003d"},{"line_number":632,"context_line":"                                                  executor._root_helper)"},{"line_number":633,"context_line":"                            ctrl_name \u003d ctrl[ctrl.rfind(\u0027/\u0027) + 1:]"},{"line_number":634,"context_line":"                            LOG.debug(\"[!] address: %s|%s\", address, ctrl_name)"},{"line_number":635,"context_line":"                            nvme_controllers[address.strip()] \u003d ctrl_name"}],"source_content_type":"text/x-python","patch_set":12,"id":"c06ce89b_e2f2f618","line":632,"range":{"start_line":629,"start_character":0,"end_line":632,"end_character":72},"in_reply_to":"f620b924_29098293","updated":"2022-05-24 13:45:12.000000000","message":"Ack","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6e28c9598eba7a6b71094fd58337cc0193a1520f","unresolved":true,"context_lines":[{"line_number":630,"context_line":"                                                  run_as_root\u003dTrue,"},{"line_number":631,"context_line":"                                                  root_helper\u003d"},{"line_number":632,"context_line":"                                                  executor._root_helper)"},{"line_number":633,"context_line":"                            ctrl_name \u003d ctrl[ctrl.rfind(\u0027/\u0027) + 1:]"},{"line_number":634,"context_line":"                            LOG.debug(\"[!] address: %s|%s\", address, ctrl_name)"},{"line_number":635,"context_line":"                            nvme_controllers[address.strip()] \u003d ctrl_name"},{"line_number":636,"context_line":"                        else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"bd86bc16_4448c87d","line":633,"range":{"start_line":633,"start_character":40,"end_line":633,"end_character":66},"updated":"2022-05-24 12:36:42.000000000","message":"nit:\n\n  ctrl_name \u003d os.path.basename(ctrl)","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"4a475dc8204813587269429de0a92c6212428333","unresolved":false,"context_lines":[{"line_number":630,"context_line":"                                                  run_as_root\u003dTrue,"},{"line_number":631,"context_line":"                                                  root_helper\u003d"},{"line_number":632,"context_line":"                                                  executor._root_helper)"},{"line_number":633,"context_line":"                            ctrl_name \u003d ctrl[ctrl.rfind(\u0027/\u0027) + 1:]"},{"line_number":634,"context_line":"                            LOG.debug(\"[!] address: %s|%s\", address, ctrl_name)"},{"line_number":635,"context_line":"                            nvme_controllers[address.strip()] \u003d ctrl_name"},{"line_number":636,"context_line":"                        else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"f3c0c8fb_0872266c","line":633,"range":{"start_line":633,"start_character":40,"end_line":633,"end_character":66},"in_reply_to":"bd86bc16_4448c87d","updated":"2022-05-24 13:45:12.000000000","message":"Ack","commit_id":"ad2bc618fae467af1655e5e73765a4e859bb3bee"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"fddb8c5c98b6f4149b49e81d1ec0450f976b8f3f","unresolved":true,"context_lines":[{"line_number":561,"context_line":"        # check if the controller exist before trying to connect"},{"line_number":562,"context_line":"        # in multipath connect all given target portals"},{"line_number":563,"context_line":"        any_new_connect \u003d False"},{"line_number":564,"context_line":"        no_multipath \u003d not executor.use_multipath or not \\"},{"line_number":565,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":566,"context_line":"        for portal in target_portals:"},{"line_number":567,"context_line":"            portal_address \u003d portal[0]"},{"line_number":568,"context_line":"            portal_port \u003d portal[1]"}],"source_content_type":"text/x-python","patch_set":16,"id":"092fce13_3c903ab3","line":565,"range":{"start_line":564,"start_character":0,"end_line":565,"end_character":54},"updated":"2022-06-02 13:18:50.000000000","message":"Sometimes you can\u0027t avoid using a \\, but this might be more readable as:\n\n        no_multipath \u003d (not executor.use_multipath\n                        or not NVMeOFConnector.native_multipath_supported)\n\n(Not saying you need to change this, just something to keep in mind for future patches.)","commit_id":"f9633f271e87c53a5828d72239e1e852b729e2a4"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"5092bde11afede2523d7fed57e7b99ac788c98f9","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        # check if the controller exist before trying to connect"},{"line_number":562,"context_line":"        # in multipath connect all given target portals"},{"line_number":563,"context_line":"        any_new_connect \u003d False"},{"line_number":564,"context_line":"        no_multipath \u003d not executor.use_multipath or not \\"},{"line_number":565,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":566,"context_line":"        for portal in target_portals:"},{"line_number":567,"context_line":"            portal_address \u003d portal[0]"},{"line_number":568,"context_line":"            portal_port \u003d portal[1]"}],"source_content_type":"text/x-python","patch_set":16,"id":"eacd954e_17fbfdef","line":565,"range":{"start_line":564,"start_character":0,"end_line":565,"end_character":54},"in_reply_to":"092fce13_3c903ab3","updated":"2022-06-02 13:30:38.000000000","message":"Ack","commit_id":"f9633f271e87c53a5828d72239e1e852b729e2a4"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"822a732e768f71c06de60af3f887b9756479f038","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        # check if the controller exist before trying to connect"},{"line_number":562,"context_line":"        # in multipath connect all given target portals"},{"line_number":563,"context_line":"        any_new_connect \u003d False"},{"line_number":564,"context_line":"        no_multipath \u003d not executor.use_multipath or not \\"},{"line_number":565,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":566,"context_line":"        for portal in target_portals:"},{"line_number":567,"context_line":"            portal_address \u003d portal[0]"},{"line_number":568,"context_line":"            portal_port \u003d portal[1]"}],"source_content_type":"text/x-python","patch_set":16,"id":"1c104d8c_5d8c095d","line":565,"range":{"start_line":564,"start_character":0,"end_line":565,"end_character":54},"in_reply_to":"1879ad24_ab8418be","updated":"2022-06-06 09:15:50.000000000","message":"I don\u0027t see the Kioxia CI voting in the patch.","commit_id":"f9633f271e87c53a5828d72239e1e852b729e2a4"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"dd274795260584e5072acf653307c49bf0404597","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        # check if the controller exist before trying to connect"},{"line_number":562,"context_line":"        # in multipath connect all given target portals"},{"line_number":563,"context_line":"        any_new_connect \u003d False"},{"line_number":564,"context_line":"        no_multipath \u003d not executor.use_multipath or not \\"},{"line_number":565,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":566,"context_line":"        for portal in target_portals:"},{"line_number":567,"context_line":"            portal_address \u003d portal[0]"},{"line_number":568,"context_line":"            portal_port \u003d portal[1]"}],"source_content_type":"text/x-python","patch_set":16,"id":"350ccf32_bc5b446a","line":565,"range":{"start_line":564,"start_character":0,"end_line":565,"end_character":54},"in_reply_to":"1c104d8c_5d8c095d","updated":"2022-06-06 09:21:35.000000000","message":"KIOXIA CI\nBuild succeeded.\n\nkumoscale-nvmeof-tempest http://104.254.65.37/refs-changes-00-830800-20/1654501625 : SUCCESS in 17m 26s","commit_id":"f9633f271e87c53a5828d72239e1e852b729e2a4"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"547da5518608dbb9a6edea6118290b9d07b7a801","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        # check if the controller exist before trying to connect"},{"line_number":562,"context_line":"        # in multipath connect all given target portals"},{"line_number":563,"context_line":"        any_new_connect \u003d False"},{"line_number":564,"context_line":"        no_multipath \u003d not executor.use_multipath or not \\"},{"line_number":565,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":566,"context_line":"        for portal in target_portals:"},{"line_number":567,"context_line":"            portal_address \u003d portal[0]"},{"line_number":568,"context_line":"            portal_port \u003d portal[1]"}],"source_content_type":"text/x-python","patch_set":16,"id":"1879ad24_ab8418be","line":565,"range":{"start_line":564,"start_character":0,"end_line":565,"end_character":54},"in_reply_to":"e860b30a_da6f9674","updated":"2022-06-06 08:08:56.000000000","message":"KIOXIA CI Build succeeded.","commit_id":"f9633f271e87c53a5828d72239e1e852b729e2a4"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"6b1773056984336032604a928abf8ddc1cccfb34","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        # check if the controller exist before trying to connect"},{"line_number":562,"context_line":"        # in multipath connect all given target portals"},{"line_number":563,"context_line":"        any_new_connect \u003d False"},{"line_number":564,"context_line":"        no_multipath \u003d not executor.use_multipath or not \\"},{"line_number":565,"context_line":"            NVMeOFConnector.native_multipath_supported"},{"line_number":566,"context_line":"        for portal in target_portals:"},{"line_number":567,"context_line":"            portal_address \u003d portal[0]"},{"line_number":568,"context_line":"            portal_port \u003d portal[1]"}],"source_content_type":"text/x-python","patch_set":16,"id":"e860b30a_da6f9674","line":565,"range":{"start_line":564,"start_character":0,"end_line":565,"end_character":54},"in_reply_to":"eacd954e_17fbfdef","updated":"2022-06-06 06:11:51.000000000","message":"Brian, Gorka,\nI had just uploded this change in order to invoke KIOXIA CI.\nPlease wait with your review till we see it is running.","commit_id":"f9633f271e87c53a5828d72239e1e852b729e2a4"}],"releasenotes/notes/multipath-nvme-f77a53eb2717a44c.yaml":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"fddb8c5c98b6f4149b49e81d1ec0450f976b8f3f","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Phase 1 (Native) implementation of NVMeoF Multipathing."},{"line_number":5,"context_line":"    See cinder-specs/specs/yoga/nvme-multipath"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"1b046ad8_f730c4db","line":5,"range":{"start_line":5,"start_character":8,"end_line":5,"end_character":46},"updated":"2022-06-02 13:18:50.000000000","message":"Since \"Phase 1\" is a cinder thing (not an NVMeoF standard thing), it would be good to have this be a link to the spec so a reader can determine what this means.  I won\u0027t hold up this patch, you can do it as a quick followup.\n\n  See the `NVMeoF Multipathing\n  \u003chttps://specs.openstack.org/openstack/cinder-specs/specs/yoga/nvme-multipath.html\u003e`_\n  spec for details.","commit_id":"f9633f271e87c53a5828d72239e1e852b729e2a4"},{"author":{"_account_id":34173,"name":"Lior Friedman","display_name":"Lior Friedman","email":"lior.friedman@kioxia.com","username":"liorf95"},"change_message_id":"5092bde11afede2523d7fed57e7b99ac788c98f9","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Phase 1 (Native) implementation of NVMeoF Multipathing."},{"line_number":5,"context_line":"    See cinder-specs/specs/yoga/nvme-multipath"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"375ef609_a92e8b94","line":5,"range":{"start_line":5,"start_character":8,"end_line":5,"end_character":46},"in_reply_to":"1b046ad8_f730c4db","updated":"2022-06-02 13:30:38.000000000","message":"Ack","commit_id":"f9633f271e87c53a5828d72239e1e852b729e2a4"}]}
