)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"bb5ba42bdc293b64b5cdcae13ed03e67a6abf138","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"b22befc3_57b7c2a1","updated":"2026-02-26 11:12:07.000000000","message":"@eharney@redhat.com please find my response inline.","commit_id":"517ca17bdd4b372f7c5ab8b58043e473afacafc8"},{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"2b4ff5382733e97a503b1161f5ac2ccb67fc8bba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"19fd1518_68a32b1a","updated":"2026-03-02 21:30:24.000000000","message":"Since we\u0027re using evenetlet\u0027s monkey_patch, attributes stored in a threading.local() object become local to the current green thread and not the underlying OS thread.  We can use TLS with eventlet, technically.","commit_id":"517ca17bdd4b372f7c5ab8b58043e473afacafc8"},{"author":{"_account_id":29122,"name":"Raghavendra Tilay","email":"raghavendra-uddhav.tilay@hpe.com","username":"raghavendrat"},"change_message_id":"f6f45db2f0a70af482870eb463eb34d88657d2b6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"406b9526_13a4ab9a","updated":"2026-02-25 15:56:11.000000000","message":"Thanks Eric for the comment. Please find response inline.","commit_id":"517ca17bdd4b372f7c5ab8b58043e473afacafc8"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"2f0ca701a3bdc194310e6ed40f4732a1103ec78c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"f452e98a_14a9bad7","updated":"2026-03-05 08:54:31.000000000","message":"@eharney@redhat.com please find my response inline.","commit_id":"9a7bb1d8209fc73b4bb4a991e0f7afcbe6235aac"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"879612c4ff44cd472a912bd38da1b1c296c81fda","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"ee39dfb6_39b60f2a","updated":"2026-03-06 09:40:17.000000000","message":"@eharney@redhat.com Address the review comments, please see my response inline.","commit_id":"9a150df187108bdd6a22d4d03ae31925d39f15d8"},{"author":{"_account_id":29122,"name":"Raghavendra Tilay","email":"raghavendra-uddhav.tilay@hpe.com","username":"raghavendrat"},"change_message_id":"3d9714d51ed274849d16f063a20dab879c789f40","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"a43932f2_d126ddd8","updated":"2026-03-06 11:18:26.000000000","message":"run-HPE 3PAR Storage iSCSI CI","commit_id":"9a150df187108bdd6a22d4d03ae31925d39f15d8"},{"author":{"_account_id":29122,"name":"Raghavendra Tilay","email":"raghavendra-uddhav.tilay@hpe.com","username":"raghavendrat"},"change_message_id":"b4be85d237bbba70e06e731460cc5ac113b4f273","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"88230128_62a276dd","updated":"2026-03-09 16:21:55.000000000","message":"Thank you Eric \u0026 Jon","commit_id":"4ba03acc2a18377bd92a7b3ed41f8f9c2070e826"},{"author":{"_account_id":29122,"name":"Raghavendra Tilay","email":"raghavendra-uddhav.tilay@hpe.com","username":"raghavendrat"},"change_message_id":"f8351e766c2d0565e2bc822171629c9229c4b5ed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"4f65b552_debcf340","updated":"2026-03-10 04:38:05.000000000","message":"The patch has merged. thank you all","commit_id":"4ba03acc2a18377bd92a7b3ed41f8f9c2070e826"}],"cinder/volume/drivers/hpe/hpe_3par_base.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"9525d8b4bef31d72894ca44fad179f130bca1fe7","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        # Fallback to instance-level common (used for stats, etc.)"},{"line_number":102,"context_line":"        return self.common"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def _login(self, timeout\u003dNone, array_id\u003dNone):"},{"line_number":105,"context_line":"        # Check if this thread already has an active common/client session"},{"line_number":106,"context_line":"        thread_id \u003d threading.get_ident()"},{"line_number":107,"context_line":"        if hasattr(self._local, \u0027common\u0027) and self._local.common is not None:"}],"source_content_type":"text/x-python","patch_set":9,"id":"ed1c1698_02a50e74","line":104,"updated":"2026-02-25 14:25:41.000000000","message":"I would suggest just wrapping _login() with a @synchronized decorator rather than getting into thread-local storage for this. (I think this doesn\u0027t work correctly in our eventlet model anyway, because multiple operations happening in different greenthreads will be in the same thread.)","commit_id":"517ca17bdd4b372f7c5ab8b58043e473afacafc8"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"bb5ba42bdc293b64b5cdcae13ed03e67a6abf138","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        # Fallback to instance-level common (used for stats, etc.)"},{"line_number":102,"context_line":"        return self.common"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def _login(self, timeout\u003dNone, array_id\u003dNone):"},{"line_number":105,"context_line":"        # Check if this thread already has an active common/client session"},{"line_number":106,"context_line":"        thread_id \u003d threading.get_ident()"},{"line_number":107,"context_line":"        if hasattr(self._local, \u0027common\u0027) and self._local.common is not None:"}],"source_content_type":"text/x-python","patch_set":9,"id":"b904fc0e_69ca82e1","line":104,"in_reply_to":"693f7721_7d184a9c","updated":"2026-02-26 11:12:07.000000000","message":"In addition to Raghavendra\u0027s comments, i would like to explain more about the reason for using thread-local storage approach, with thread-local storage we are trying to make self.common as local_common so each thread has its own local_common and it is not overwritten by another thread. We have seen that different thread_id is created when login/logout is called and each thread uses its own session which avoid session conflicts. \nCan you please suggest, if synchronized will help in this case, as we wish to make self.common thread safe and shouldn\u0027t be overwritten in concurrent requests and at the same time we have to consider performance as well.","commit_id":"517ca17bdd4b372f7c5ab8b58043e473afacafc8"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"156088977ebb66cf79efdaeba36605174a1c94f0","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        # Fallback to instance-level common (used for stats, etc.)"},{"line_number":102,"context_line":"        return self.common"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def _login(self, timeout\u003dNone, array_id\u003dNone):"},{"line_number":105,"context_line":"        # Check if this thread already has an active common/client session"},{"line_number":106,"context_line":"        thread_id \u003d threading.get_ident()"},{"line_number":107,"context_line":"        if hasattr(self._local, \u0027common\u0027) and self._local.common is not None:"}],"source_content_type":"text/x-python","patch_set":9,"id":"45af9d19_aa8f4fe5","line":104,"in_reply_to":"7fb2fc58_c3f06cb8","updated":"2026-03-06 19:17:55.000000000","message":"Done","commit_id":"517ca17bdd4b372f7c5ab8b58043e473afacafc8"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"f05ffc3db74060c89c1b7c790be38e722612b97a","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        # Fallback to instance-level common (used for stats, etc.)"},{"line_number":102,"context_line":"        return self.common"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def _login(self, timeout\u003dNone, array_id\u003dNone):"},{"line_number":105,"context_line":"        # Check if this thread already has an active common/client session"},{"line_number":106,"context_line":"        thread_id \u003d threading.get_ident()"},{"line_number":107,"context_line":"        if hasattr(self._local, \u0027common\u0027) and self._local.common is not None:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7fb2fc58_c3f06cb8","line":104,"in_reply_to":"b904fc0e_69ca82e1","updated":"2026-03-04 18:51:17.000000000","message":"I had missed that eventlet wraps threading.local - this looks ok.","commit_id":"517ca17bdd4b372f7c5ab8b58043e473afacafc8"},{"author":{"_account_id":29122,"name":"Raghavendra Tilay","email":"raghavendra-uddhav.tilay@hpe.com","username":"raghavendrat"},"change_message_id":"f6f45db2f0a70af482870eb463eb34d88657d2b6","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        # Fallback to instance-level common (used for stats, etc.)"},{"line_number":102,"context_line":"        return self.common"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def _login(self, timeout\u003dNone, array_id\u003dNone):"},{"line_number":105,"context_line":"        # Check if this thread already has an active common/client session"},{"line_number":106,"context_line":"        thread_id \u003d threading.get_ident()"},{"line_number":107,"context_line":"        if hasattr(self._local, \u0027common\u0027) and self._local.common is not None:"}],"source_content_type":"text/x-python","patch_set":9,"id":"693f7721_7d184a9c","line":104,"in_reply_to":"ed1c1698_02a50e74","updated":"2026-02-25 15:56:11.000000000","message":"In past one month, we performed lot of testing:\nFrom Horizon GUI \u0026 CLI, we created 20+ simultaneous volumes of various sizes (2GB to 80GB).\nAll tests have passed.\nWe have a customer escalation going on.\nIf we change design now, then it would be very challenging.","commit_id":"517ca17bdd4b372f7c5ab8b58043e473afacafc8"}],"cinder/volume/drivers/hpe/hpe_3par_common.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"f05ffc3db74060c89c1b7c790be38e722612b97a","unresolved":true,"context_lines":[{"line_number":2073,"context_line":"        latency \u003d self._get_qos_value(qos, \u0027latency\u0027)"},{"line_number":2074,"context_line":"        priority \u003d self._get_qos_value(qos, \u0027priority\u0027, \u0027normal\u0027)"},{"line_number":2075,"context_line":""},{"line_number":2076,"context_line":"        # Check if backend is AlletraMP"},{"line_number":2077,"context_line":"        is_alletra_mp \u003d self._is_alletra_mp()"},{"line_number":2078,"context_line":""},{"line_number":2079,"context_line":"        qosRule \u003d {}"},{"line_number":2080,"context_line":""},{"line_number":2081,"context_line":"        # For Alletra MP, ioMinGoal, bwMinGoalKB, latencyGoal, and priority"},{"line_number":2082,"context_line":"        # are deprecated. Only use max limits."},{"line_number":2083,"context_line":"        if is_alletra_mp:"},{"line_number":2084,"context_line":"            # For Alletra MP, at least one of maxIOPS or maxBWS must be"},{"line_number":2085,"context_line":"            # provided."},{"line_number":2086,"context_line":"            if max_io is None and max_bw is None:"}],"source_content_type":"text/x-python","patch_set":10,"id":"27cb612b_c8470c38","line":2083,"range":{"start_line":2076,"start_character":7,"end_line":2083,"end_character":25},"updated":"2026-03-04 18:51:17.000000000","message":"This alletra_mp code seems to be unrelated, is it meant to be here?  Should be in a different patch?","commit_id":"9a7bb1d8209fc73b4bb4a991e0f7afcbe6235aac"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"2f0ca701a3bdc194310e6ed40f4732a1103ec78c","unresolved":true,"context_lines":[{"line_number":2073,"context_line":"        latency \u003d self._get_qos_value(qos, \u0027latency\u0027)"},{"line_number":2074,"context_line":"        priority \u003d self._get_qos_value(qos, \u0027priority\u0027, \u0027normal\u0027)"},{"line_number":2075,"context_line":""},{"line_number":2076,"context_line":"        # Check if backend is AlletraMP"},{"line_number":2077,"context_line":"        is_alletra_mp \u003d self._is_alletra_mp()"},{"line_number":2078,"context_line":""},{"line_number":2079,"context_line":"        qosRule \u003d {}"},{"line_number":2080,"context_line":""},{"line_number":2081,"context_line":"        # For Alletra MP, ioMinGoal, bwMinGoalKB, latencyGoal, and priority"},{"line_number":2082,"context_line":"        # are deprecated. Only use max limits."},{"line_number":2083,"context_line":"        if is_alletra_mp:"},{"line_number":2084,"context_line":"            # For Alletra MP, at least one of maxIOPS or maxBWS must be"},{"line_number":2085,"context_line":"            # provided."},{"line_number":2086,"context_line":"            if max_io is None and max_bw is None:"}],"source_content_type":"text/x-python","patch_set":10,"id":"a7dfa722_63f26594","line":2083,"range":{"start_line":2076,"start_character":7,"end_line":2083,"end_character":25},"in_reply_to":"27cb612b_c8470c38","updated":"2026-03-05 08:54:31.000000000","message":"@eharney@redhat.com, since driver is common across platforms(3PAR/Primera/Alletra MP)and to accommodate different behavior for Alletra MP we added check to handle QOS. As this is for the same customer who requested for hot cust fix we handled it in same patch.","commit_id":"9a7bb1d8209fc73b4bb4a991e0f7afcbe6235aac"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"2318582cb90edf66d7047be5728cffb83f6cc3ac","unresolved":false,"context_lines":[{"line_number":2073,"context_line":"        latency \u003d self._get_qos_value(qos, \u0027latency\u0027)"},{"line_number":2074,"context_line":"        priority \u003d self._get_qos_value(qos, \u0027priority\u0027, \u0027normal\u0027)"},{"line_number":2075,"context_line":""},{"line_number":2076,"context_line":"        # Check if backend is AlletraMP"},{"line_number":2077,"context_line":"        is_alletra_mp \u003d self._is_alletra_mp()"},{"line_number":2078,"context_line":""},{"line_number":2079,"context_line":"        qosRule \u003d {}"},{"line_number":2080,"context_line":""},{"line_number":2081,"context_line":"        # For Alletra MP, ioMinGoal, bwMinGoalKB, latencyGoal, and priority"},{"line_number":2082,"context_line":"        # are deprecated. Only use max limits."},{"line_number":2083,"context_line":"        if is_alletra_mp:"},{"line_number":2084,"context_line":"            # For Alletra MP, at least one of maxIOPS or maxBWS must be"},{"line_number":2085,"context_line":"            # provided."},{"line_number":2086,"context_line":"            if max_io is None and max_bw is None:"}],"source_content_type":"text/x-python","patch_set":10,"id":"33469d3f_12bba1cc","line":2083,"range":{"start_line":2076,"start_character":7,"end_line":2083,"end_character":25},"in_reply_to":"7d2e917c_b1dfd3b7","updated":"2026-03-06 19:18:05.000000000","message":"Done","commit_id":"9a7bb1d8209fc73b4bb4a991e0f7afcbe6235aac"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"1e296062d5570d9c4dc6a6a5c5fcd79dd4b99ba6","unresolved":true,"context_lines":[{"line_number":2073,"context_line":"        latency \u003d self._get_qos_value(qos, \u0027latency\u0027)"},{"line_number":2074,"context_line":"        priority \u003d self._get_qos_value(qos, \u0027priority\u0027, \u0027normal\u0027)"},{"line_number":2075,"context_line":""},{"line_number":2076,"context_line":"        # Check if backend is AlletraMP"},{"line_number":2077,"context_line":"        is_alletra_mp \u003d self._is_alletra_mp()"},{"line_number":2078,"context_line":""},{"line_number":2079,"context_line":"        qosRule \u003d {}"},{"line_number":2080,"context_line":""},{"line_number":2081,"context_line":"        # For Alletra MP, ioMinGoal, bwMinGoalKB, latencyGoal, and priority"},{"line_number":2082,"context_line":"        # are deprecated. Only use max limits."},{"line_number":2083,"context_line":"        if is_alletra_mp:"},{"line_number":2084,"context_line":"            # For Alletra MP, at least one of maxIOPS or maxBWS must be"},{"line_number":2085,"context_line":"            # provided."},{"line_number":2086,"context_line":"            if max_io is None and max_bw is None:"}],"source_content_type":"text/x-python","patch_set":10,"id":"be0e5966_8dc6fb51","line":2083,"range":{"start_line":2076,"start_character":7,"end_line":2083,"end_character":25},"in_reply_to":"a7dfa722_63f26594","updated":"2026-03-05 16:24:36.000000000","message":"This should be in a separate patch. We want to be able to evaluate/backport/test these independently.","commit_id":"9a7bb1d8209fc73b4bb4a991e0f7afcbe6235aac"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"879612c4ff44cd472a912bd38da1b1c296c81fda","unresolved":true,"context_lines":[{"line_number":2073,"context_line":"        latency \u003d self._get_qos_value(qos, \u0027latency\u0027)"},{"line_number":2074,"context_line":"        priority \u003d self._get_qos_value(qos, \u0027priority\u0027, \u0027normal\u0027)"},{"line_number":2075,"context_line":""},{"line_number":2076,"context_line":"        # Check if backend is AlletraMP"},{"line_number":2077,"context_line":"        is_alletra_mp \u003d self._is_alletra_mp()"},{"line_number":2078,"context_line":""},{"line_number":2079,"context_line":"        qosRule \u003d {}"},{"line_number":2080,"context_line":""},{"line_number":2081,"context_line":"        # For Alletra MP, ioMinGoal, bwMinGoalKB, latencyGoal, and priority"},{"line_number":2082,"context_line":"        # are deprecated. Only use max limits."},{"line_number":2083,"context_line":"        if is_alletra_mp:"},{"line_number":2084,"context_line":"            # For Alletra MP, at least one of maxIOPS or maxBWS must be"},{"line_number":2085,"context_line":"            # provided."},{"line_number":2086,"context_line":"            if max_io is None and max_bw is None:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7d2e917c_b1dfd3b7","line":2083,"range":{"start_line":2076,"start_character":7,"end_line":2083,"end_character":25},"in_reply_to":"be0e5966_8dc6fb51","updated":"2026-03-06 09:40:17.000000000","message":"@eharney@redhat.com, we have addressed the review comment and created separate patch for qos handling under PR: https://review.opendev.org/c/openstack/cinder/+/979115. Now this current patch includes only the changes related to session handling and thread.local","commit_id":"9a7bb1d8209fc73b4bb4a991e0f7afcbe6235aac"}],"cinder/volume/drivers/hpe/hpe_3par_iscsi.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"8a17adf2ffe9f3c49cb4b3e4a5039d3e81097211","unresolved":true,"context_lines":[{"line_number":405,"context_line":"        s_key \u003d common.client.get_session_key()"},{"line_number":406,"context_line":"        LOG.debug(\"initialize_connection entry from ISCSI with session key %s \""},{"line_number":407,"context_line":"                  \"and thread id: %s\","},{"line_number":408,"context_line":"                  s_key, threading.get_ident())"},{"line_number":409,"context_line":"        try:"},{"line_number":410,"context_line":"            # If the volume has been failed over, we need to reinitialize"},{"line_number":411,"context_line":"            # iSCSI ports so they represent the new array."}],"source_content_type":"text/x-python","patch_set":7,"id":"52eb647b_19ff6ff2","line":408,"range":{"start_line":408,"start_character":25,"end_line":408,"end_character":45},"updated":"2026-02-23 15:04:16.000000000","message":"What is the purpose of this log message? When running with eventlet (as we are currently) this doesn\u0027t really mean anything.","commit_id":"84b19f57a380783275ec486aa396321f5479a4f0"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"f7fc5e0902dff7983648ef904f07b995f9306cb2","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        s_key \u003d common.client.get_session_key()"},{"line_number":406,"context_line":"        LOG.debug(\"initialize_connection entry from ISCSI with session key %s \""},{"line_number":407,"context_line":"                  \"and thread id: %s\","},{"line_number":408,"context_line":"                  s_key, threading.get_ident())"},{"line_number":409,"context_line":"        try:"},{"line_number":410,"context_line":"            # If the volume has been failed over, we need to reinitialize"},{"line_number":411,"context_line":"            # iSCSI ports so they represent the new array."}],"source_content_type":"text/x-python","patch_set":7,"id":"d15abb9a_4c59cb24","line":408,"range":{"start_line":408,"start_character":25,"end_line":408,"end_character":45},"in_reply_to":"52eb647b_19ff6ff2","updated":"2026-02-24 09:44:07.000000000","message":"@eharney@redhat.com, I have addressed review comments and removed the debug log.","commit_id":"84b19f57a380783275ec486aa396321f5479a4f0"}]}
