)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":30555,"name":"Fernando Ferraz","display_name":"Fernando Ferraz","email":"fesilva@redhat.com","username":"fernandoperches"},"change_message_id":"a9f06fdd6d932b72b30ab32073f7349e61fce1b9","unresolved":true,"context_lines":[{"line_number":10,"context_line":"A few cinder volume clone operations failed during bulk clone creation."},{"line_number":11,"context_line":"Added retry logic to ensure the NetApp driver retries any failed clone"},{"line_number":12,"context_line":"operations."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I734ade0fc9c938c15eb46e3b74e44c843c71d3e3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"88db3d1c_0a13a99c","line":13,"updated":"2025-06-05 11:27:21.000000000","message":"I see a launchpad bug [1] has been created for this, but the ``Closes-Bug`` tag is missing in the commit message. \n\nCloses-Bug: #2101859\n\n[1] https://bugs.launchpad.net/cinder/+bug/2112245","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"7d362c3ca1c315a100e39b36a4735c6b77475d7f","unresolved":false,"context_lines":[{"line_number":10,"context_line":"A few cinder volume clone operations failed during bulk clone creation."},{"line_number":11,"context_line":"Added retry logic to ensure the NetApp driver retries any failed clone"},{"line_number":12,"context_line":"operations."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I734ade0fc9c938c15eb46e3b74e44c843c71d3e3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3caf5b33_f01d33fd","line":13,"in_reply_to":"88db3d1c_0a13a99c","updated":"2025-06-15 12:01:27.000000000","message":"Done","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"9de4148393fa6d8276d2dee2631185b5f9329c27","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"255aa56b_7e88732a","updated":"2025-06-02 14:33:29.000000000","message":"recheck","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"3b0ed6c12f097b226893005a493b5470514e5338","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d7b5519e_398189c7","updated":"2025-06-02 08:35:38.000000000","message":"recheck","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"7d362c3ca1c315a100e39b36a4735c6b77475d7f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ea94f5a3_787d5ee2","updated":"2025-06-15 12:01:27.000000000","message":"Thanks for review comments, I incorporated the most of the review comments. Feel free to re-open the comment if you are not agree on my reply.","commit_id":"09ddf90131ce3e49556c83b9339b6364f73d8e4d"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"154676d2a8236f22d8537a9b45bd5ee1d55e339b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"52d60ee1_5c948d40","updated":"2025-06-16 04:51:09.000000000","message":"recheck","commit_id":"09ddf90131ce3e49556c83b9339b6364f73d8e4d"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"efb36919948feaace07a677d03a40c42c9cbe389","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"d01968ca_f88ee9d2","updated":"2025-06-16 11:17:11.000000000","message":"-1 to add the condition of \"device busy\" when retrying.","commit_id":"633412215a3621f9e83a63df4c7e9b8a1b70dbcf"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"a50ed065ba102f1bfbf87e0ef18ec4fc4d359ff4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"61e3a9c8_6c7e7b51","updated":"2025-06-16 11:17:39.000000000","message":"also fix the pep8 issue","commit_id":"633412215a3621f9e83a63df4c7e9b8a1b70dbcf"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"d18e4839ec8423dce1ec03f71b7cd55a25305731","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"11cb1e17_52a306c2","in_reply_to":"61e3a9c8_6c7e7b51","updated":"2025-06-22 05:33:28.000000000","message":"pip8 is not failing due to my code, failures are common. Even locally when I get the latest master build it is failing with same error. I think someone from DevOps team should fix the issue.","commit_id":"633412215a3621f9e83a63df4c7e9b8a1b70dbcf"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"83d988a8c6ca378883defa6937be8692cc9c3d81","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"f8965ff3_c9ead472","in_reply_to":"d01968ca_f88ee9d2","updated":"2025-06-21 19:16:03.000000000","message":"Added the condition for device busy.","commit_id":"633412215a3621f9e83a63df4c7e9b8a1b70dbcf"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"5220d1c3bcc2d237f9960250fdce764672d67ac6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"0047eac3_7d557e8c","updated":"2025-06-23 14:24:30.000000000","message":"For pip8 below patch has raised by Rajat \n\nhttps://review.opendev.org/c/openstack/cinder/+/953108","commit_id":"699e0d779af3a96712343bffb9d7a80061010719"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"43e329fb817012878cc2ce522719209b172b3fbe","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"85f2e55c_7e65d4e5","updated":"2025-06-23 15:08:13.000000000","message":"Looks okay to me.","commit_id":"699e0d779af3a96712343bffb9d7a80061010719"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"9ba02eeee33af9707562cea257c1c4b7f89d9d21","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b029e6fb_a396e7a8","updated":"2025-06-23 13:18:33.000000000","message":"the failure in pep8 looks unrelated to this change\n\n2025-06-21 19:08:33.485878 | ubuntu-noble | ./cinder/api/api_utils.py:28:1: I300 TYPE_CHECKING block should have one newline above.\n2025-06-21 19:08:33.485975 | ubuntu-noble | ./cinder/api/common.py:32:1: I300 TYPE_CHECKING block should have one newline above.\n2025-06-21 19:08:33.486003 | ubuntu-noble | ./cinder/cmd/backup.py:48:1: I300 TYPE_CHECKING block should have one newline above.\n2025-06-21 19:08:33.486027 | ubuntu-noble | ./cinder/cmd/volume.py:52:1: I300 TYPE_CHECKING block should have one newline above.","commit_id":"699e0d779af3a96712343bffb9d7a80061010719"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"deef160cf2c3fded8d6703f5317ac8e098e65f69","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b4080446_5d655079","in_reply_to":"b029e6fb_a396e7a8","updated":"2025-06-23 13:35:03.000000000","message":"yes, there are not related my changes. Even I am seeing the same issue with master branch. Get the master code and run the pip8 and hitting the same issue.","commit_id":"699e0d779af3a96712343bffb9d7a80061010719"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"a0089cdd0214f79d350b61c76bb08668b6ec4548","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"090a7b1c_c0d310ba","updated":"2025-06-24 15:02:03.000000000","message":"Based on Gireesh\u0027s comment, NetApp CI is undergoing some issues and he has tested all the workflows to verify there is no regression and the code is working as expected, so updating my vote here.","commit_id":"1ec7b48fde2c1deb02ba554c1ed964c467b58b87"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"f1186a309315e1b2d8586bb9721395315d5c6064","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"d98a249e_327cf6bb","updated":"2025-06-27 14:36:36.000000000","message":"Code \u0026 tests LGTM, but please get the NetApp CI up and running.  In addition to giving us automated feedback for review, it protects NetApp by detecting breaking changes elsewhere in the code.\n\nOrdinarily we\u0027d like to see new options documented in the release note, but I don\u0027t think you actually want operators messing with these without consulting with NetApp first, so that\u0027s OK.","commit_id":"1ec7b48fde2c1deb02ba554c1ed964c467b58b87"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"d4a1da1c39b9978e60a6f1212cd751cd049fb4d6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"2f029e7b_b58b4aad","updated":"2025-06-24 12:47:42.000000000","message":"Code LGTM.\nI\u0027m not too happy with the UT as we are calling the retry method explicitly but the test should be, call the clone method and it triggers the retry method which we can assert. Also the config values are untested. This can be done as a followup.\nThird party CI is not running before so I\u0027m leaving a +1 until that\u0027s in place.","commit_id":"1ec7b48fde2c1deb02ba554c1ed964c467b58b87"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"973ac52cc6cdd511f133959479e838ef5e3afcaf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"782e67fc_3dcaecdc","updated":"2025-06-24 07:28:12.000000000","message":"Looks good.","commit_id":"1ec7b48fde2c1deb02ba554c1ed964c467b58b87"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"4c47ae1432fc629a90ef9311a0c976ec09f5e9cf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"4b877e10_c33c37c4","updated":"2025-06-24 04:36:35.000000000","message":"recheck","commit_id":"1ec7b48fde2c1deb02ba554c1ed964c467b58b87"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"260fb6c5b43609b3484625fe440ddf07ba964bc8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"050720df_480052e0","updated":"2025-06-27 18:56:27.000000000","message":"recheck\n\npy310 unit test job failed in swift backup tests","commit_id":"1ec7b48fde2c1deb02ba554c1ed964c467b58b87"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"ee6d15a8f6baefa07a4f4815c56d96b0b711dca5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"89dff7ec_f741d487","in_reply_to":"2f029e7b_b58b4aad","updated":"2025-06-24 14:28:40.000000000","message":"code changes is very minimal, if you see the code the possibility of regression is zero as this code will be only trigger when we hit the exception with device busy error. I have tested below workflow and all the workflow are passing \n1. positive- Create the lun clone, lun clone creation for cider volume should be successful.\n2. Create the cinder volume, we hit the exception with device busy error, code will try LUN clone creation 2-3 times (To get the device busy error we are setting some fiji points on ONTAP). In 4th try, we are clearing the fiji point on ONTAP and LUN clone creation is successful. So, during this testing we are tested the config value (retry interval)\n3. Create the LUN clone, but we keep getting a \u0027device busy\u0027 error. The LUN clone creation will fail and show an error after the configured timeout period. .(Here we are testing timeout config parameter)\n\nI agree, NetApp CI should run but there is some issue with our CI infra and we are fixing those and it will take some time.","commit_id":"1ec7b48fde2c1deb02ba554c1ed964c467b58b87"}],"cinder/volume/drivers/netapp/dataontap/block_cmode.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"4387765fd0916935c1b157531d01eeb21e24d055","unresolved":true,"context_lines":[{"line_number":286,"context_line":"        \"\"\"Retry lun clone creation when ONTAP throws device busy error\"\"\""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        timeout \u003d self.configuration.safe_get(\u0027netapp_lun_clone_busy_timeout\u0027)"},{"line_number":289,"context_line":"        interval \u003d 5"},{"line_number":290,"context_line":"        retries \u003d int((timeout / interval))"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        @utils.retry(netapp_api.NaApiError, interval\u003dinterval,"}],"source_content_type":"text/x-python","patch_set":1,"id":"51b9eee9_fa1cfa39","line":289,"range":{"start_line":289,"start_character":8,"end_line":289,"end_character":20},"updated":"2025-06-05 06:38:16.000000000","message":"why is this not configurable?","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"b3f34577fb824f13f58fa6a18601d91bd652f266","unresolved":true,"context_lines":[{"line_number":286,"context_line":"        \"\"\"Retry lun clone creation when ONTAP throws device busy error\"\"\""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        timeout \u003d self.configuration.safe_get(\u0027netapp_lun_clone_busy_timeout\u0027)"},{"line_number":289,"context_line":"        interval \u003d 5"},{"line_number":290,"context_line":"        retries \u003d int((timeout / interval))"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        @utils.retry(netapp_api.NaApiError, interval\u003dinterval,"}],"source_content_type":"text/x-python","patch_set":1,"id":"a30a195d_72862ffc","line":289,"range":{"start_line":289,"start_character":8,"end_line":289,"end_character":20},"in_reply_to":"51b9eee9_fa1cfa39","updated":"2025-06-05 11:43:13.000000000","message":"I wouldn\u0027t make this configurable -- best practice would be to use exponential backoff instead w/ the backoff_rate parameter for @utils.retry.","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"7d362c3ca1c315a100e39b36a4735c6b77475d7f","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        \"\"\"Retry lun clone creation when ONTAP throws device busy error\"\"\""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        timeout \u003d self.configuration.safe_get(\u0027netapp_lun_clone_busy_timeout\u0027)"},{"line_number":289,"context_line":"        interval \u003d 5"},{"line_number":290,"context_line":"        retries \u003d int((timeout / interval))"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        @utils.retry(netapp_api.NaApiError, interval\u003dinterval,"}],"source_content_type":"text/x-python","patch_set":1,"id":"adf52d4d_c885f4d1","line":289,"range":{"start_line":289,"start_character":8,"end_line":289,"end_character":20},"in_reply_to":"a30a195d_72862ffc","updated":"2025-06-15 12:01:27.000000000","message":"Eric, thanks for the comment. I discussed with team and they suggested using exponential backoff can delay grows exponentially, the total retry time can become very long.\n\nFor example, after 5 retries with a base delay of 1 second and a backoff rate of 2, the wait before the last retry is 16 seconds, and total wait time accumulates significantly.\n\nONTAP side also, this issue can be resolved with 20-30 secs if user keep re-trying.\nSo, setting backoff_rate\u003d1 should be fine here.\n\n\nRajat, I made interval as configurable","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":30555,"name":"Fernando Ferraz","display_name":"Fernando Ferraz","email":"fesilva@redhat.com","username":"fernandoperches"},"change_message_id":"bfa6e94ad32aad727af4ba2b3707194ead849369","unresolved":true,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        timeout \u003d self.configuration.safe_get(\u0027netapp_lun_clone_busy_timeout\u0027)"},{"line_number":289,"context_line":"        interval \u003d 5"},{"line_number":290,"context_line":"        retries \u003d int((timeout / interval))"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        @utils.retry(netapp_api.NaApiError, interval\u003dinterval,"},{"line_number":293,"context_line":"                     retries \u003d retries, backoff_rate\u003d1)"}],"source_content_type":"text/x-python","patch_set":1,"id":"33b05e1d_5ad3df81","line":290,"updated":"2025-06-05 11:40:09.000000000","message":"The inner parentheses are redundant and can be removed.","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"7d362c3ca1c315a100e39b36a4735c6b77475d7f","unresolved":false,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        timeout \u003d self.configuration.safe_get(\u0027netapp_lun_clone_busy_timeout\u0027)"},{"line_number":289,"context_line":"        interval \u003d 5"},{"line_number":290,"context_line":"        retries \u003d int((timeout / interval))"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        @utils.retry(netapp_api.NaApiError, interval\u003dinterval,"},{"line_number":293,"context_line":"                     retries \u003d retries, backoff_rate\u003d1)"}],"source_content_type":"text/x-python","patch_set":1,"id":"e167a612_2112e558","line":290,"in_reply_to":"33b05e1d_5ad3df81","updated":"2025-06-15 12:01:27.000000000","message":"Done","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"4387765fd0916935c1b157531d01eeb21e24d055","unresolved":true,"context_lines":[{"line_number":289,"context_line":"        interval \u003d 5"},{"line_number":290,"context_line":"        retries \u003d int((timeout / interval))"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        @utils.retry(netapp_api.NaApiError, interval\u003dinterval,"},{"line_number":293,"context_line":"                     retries \u003d retries, backoff_rate\u003d1)"},{"line_number":294,"context_line":"        def _retry():"},{"line_number":295,"context_line":"            self.zapi_client.clone_lun("}],"source_content_type":"text/x-python","patch_set":1,"id":"1af95769_9736b53a","line":292,"range":{"start_line":292,"start_character":21,"end_line":292,"end_character":42},"updated":"2025-06-05 06:38:16.000000000","message":"what happens if we error out for some other reason than the \"Device busy\"?\nHow do we differentiate between the different errors clubbed under the umbrella \"NaApiError\" exception?\nsuppose someone deletes the LUN in the backend while this is going on and we receive LUNNotFound error but we still retry here?","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"83d988a8c6ca378883defa6937be8692cc9c3d81","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        interval \u003d 5"},{"line_number":290,"context_line":"        retries \u003d int((timeout / interval))"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        @utils.retry(netapp_api.NaApiError, interval\u003dinterval,"},{"line_number":293,"context_line":"                     retries \u003d retries, backoff_rate\u003d1)"},{"line_number":294,"context_line":"        def _retry():"},{"line_number":295,"context_line":"            self.zapi_client.clone_lun("}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3a3ed6_1a816643","line":292,"range":{"start_line":292,"start_character":21,"end_line":292,"end_character":42},"in_reply_to":"0e080bd4_e9f7c9e5","updated":"2025-06-21 19:16:03.000000000","message":"Thanks @Rajat Dhasmana, I discussed with team and they suggested to having exception message alone is sufficient for if condition. So, instead of adding both the message and error code, I am only used the exception message in the if condition.","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"6d63f32b438e1907d02fd17585c54f7979cc597b","unresolved":true,"context_lines":[{"line_number":289,"context_line":"        interval \u003d 5"},{"line_number":290,"context_line":"        retries \u003d int((timeout / interval))"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        @utils.retry(netapp_api.NaApiError, interval\u003dinterval,"},{"line_number":293,"context_line":"                     retries \u003d retries, backoff_rate\u003d1)"},{"line_number":294,"context_line":"        def _retry():"},{"line_number":295,"context_line":"            self.zapi_client.clone_lun("}],"source_content_type":"text/x-python","patch_set":1,"id":"0e080bd4_e9f7c9e5","line":292,"range":{"start_line":292,"start_character":21,"end_line":292,"end_character":42},"in_reply_to":"1179dea7_4bd384be","updated":"2025-06-20 07:57:35.000000000","message":"For the fixed interval retries, it looks good to me","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"7d362c3ca1c315a100e39b36a4735c6b77475d7f","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        interval \u003d 5"},{"line_number":290,"context_line":"        retries \u003d int((timeout / interval))"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        @utils.retry(netapp_api.NaApiError, interval\u003dinterval,"},{"line_number":293,"context_line":"                     retries \u003d retries, backoff_rate\u003d1)"},{"line_number":294,"context_line":"        def _retry():"},{"line_number":295,"context_line":"            self.zapi_client.clone_lun("}],"source_content_type":"text/x-python","patch_set":1,"id":"77ab8a8b_9df17166","line":292,"range":{"start_line":292,"start_character":21,"end_line":292,"end_character":42},"in_reply_to":"1af95769_9736b53a","updated":"2025-06-15 12:01:27.000000000","message":"If you see, I am calling this method (_retry()) form _clone_lun() method. The method will get called only when\n- ONTAP ZAPI throw netapp_api.NaApiError exception and \n- Exception message have only \"device busy\" error message.\n\nIf above 2 conditions matched we are retrying the same in _retry() method, after some retry, based on timeout, ZAPI will throw the same exception.\n\nYes, during the retry operation, if the LUN is deleted (although the likelihood of deletion during the retry is very low), the operation might also attempt to retry for this case.","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"efb36919948feaace07a677d03a40c42c9cbe389","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        interval \u003d 5"},{"line_number":290,"context_line":"        retries \u003d int((timeout / interval))"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        @utils.retry(netapp_api.NaApiError, interval\u003dinterval,"},{"line_number":293,"context_line":"                     retries \u003d retries, backoff_rate\u003d1)"},{"line_number":294,"context_line":"        def _retry():"},{"line_number":295,"context_line":"            self.zapi_client.clone_lun("}],"source_content_type":"text/x-python","patch_set":1,"id":"84eb5807_8fe3c507","line":292,"range":{"start_line":292,"start_character":21,"end_line":292,"end_character":42},"in_reply_to":"77ab8a8b_9df17166","updated":"2025-06-16 11:17:11.000000000","message":"The deletion of LUN is just an example, there could be other scenarios as well.\nMy concern is that we should not retry if we have any other exception than \"device busy\" otherwise we are just waiting in the operation for no reason even though we can fail fast.\nIt would be better to add a similar check as L#252 before L#308","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"4b97ccf35cd3962fdc830b27d75871a3694e8ea3","unresolved":true,"context_lines":[{"line_number":289,"context_line":"        interval \u003d 5"},{"line_number":290,"context_line":"        retries \u003d int((timeout / interval))"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        @utils.retry(netapp_api.NaApiError, interval\u003dinterval,"},{"line_number":293,"context_line":"                     retries \u003d retries, backoff_rate\u003d1)"},{"line_number":294,"context_line":"        def _retry():"},{"line_number":295,"context_line":"            self.zapi_client.clone_lun("}],"source_content_type":"text/x-python","patch_set":1,"id":"1179dea7_4bd384be","line":292,"range":{"start_line":292,"start_character":21,"end_line":292,"end_character":42},"in_reply_to":"84eb5807_8fe3c507","updated":"2025-06-19 18:15:50.000000000","message":"Sure @Rajat Dhasmana, As all the NetApp API is throwing netapp_api.NaApiError so I have change my code base on exception message and error code. Are you fine with below code, instead of using retry utility, I have written my logic for retry.\nIf you are ok with below code, I can replace retry code with below.\n\ndef _retry_clone_lun(self, volume, name, new_name, space_reserved,\n                         qos_policy_group_name\u003dNone, src_block\u003d0,\n                         dest_block\u003d0, block_count\u003d0,\n                         source_snapshot\u003dNone, is_snapshot\u003dFalse,\n                         qos_policy_group_is_adaptive\u003dFalse):\n        \"\"\"Retry lun clone creation when ONTAP throws device busy error\"\"\"\n\n        timeout \u003d self.configuration.safe_get(\u0027netapp_lun_clone_busy_timeout\u0027)\n        interval \u003d self.configuration.safe_get(\u0027netapp_lun_clone_busy_interval\u0027)\n        retries \u003d int(timeout / interval)\n\n        for attempt in range(1, retries + 1):\n            try:\n                self.zapi_client.clone_lun(\n                    volume, name, new_name, space_reserved,\n                    qos_policy_group_name\u003dqos_policy_group_name,\n                    src_block\u003dsrc_block, dest_block\u003ddest_block,\n                    block_count\u003dblock_count,\n                    source_snapshot\u003dsource_snapshot,\n                    is_snapshot\u003dis_snapshot,\n                    qos_policy_group_is_adaptive\u003dqos_policy_group_is_adaptive,\n                )\n            except netapp_api.NaApiError as e:\n                if \u0027Device busy\u0027 in e.message and e.code \u003d\u003d netapp_api.EDEVICE_BUSY:\n                    LOG.info(f\"Attempt {attempt} failed with device busy error (code-{netapp_api.EDEVICE_BUSY}). Retrying after {interval} seconds...\")\n                    if attempt \u003d\u003d retries:\n                        msg \u003d _(f\"Timed out after {retries} retry for LUN clone creation\")\n                        raise na_utils.NetAppDriverException(msg)\n                    time.sleep(interval)\n                else:\n                    raise netapp_api.NaApiError(e.code, e.message)","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"4387765fd0916935c1b157531d01eeb21e24d055","unresolved":true,"context_lines":[{"line_number":304,"context_line":"        try:"},{"line_number":305,"context_line":"            _retry()"},{"line_number":306,"context_line":"        except netapp_api.NaApiError:"},{"line_number":307,"context_line":"            msg \u003d _(\"Timed out after many retry for LUN clone creation\")"},{"line_number":308,"context_line":"            raise na_utils.NetAppDriverException(msg)"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def _get_fc_target_wwpns(self, include_partner\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":1,"id":"dcfc974a_f612c97a","line":307,"range":{"start_line":307,"start_character":37,"end_line":307,"end_character":41},"updated":"2025-06-05 06:38:16.000000000","message":"we already know the number of retries so better to add it to the log message","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"efb36919948feaace07a677d03a40c42c9cbe389","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        try:"},{"line_number":305,"context_line":"            _retry()"},{"line_number":306,"context_line":"        except netapp_api.NaApiError:"},{"line_number":307,"context_line":"            msg \u003d _(\"Timed out after many retry for LUN clone creation\")"},{"line_number":308,"context_line":"            raise na_utils.NetAppDriverException(msg)"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def _get_fc_target_wwpns(self, include_partner\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":1,"id":"73681de7_54302cf2","line":307,"range":{"start_line":307,"start_character":37,"end_line":307,"end_character":41},"in_reply_to":"2c690765_346a62fa","updated":"2025-06-16 11:17:11.000000000","message":"Still i would insist replacing \"many\" with the actual number as that\u0027s more helpful to the end user/operator","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"7d362c3ca1c315a100e39b36a4735c6b77475d7f","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        try:"},{"line_number":305,"context_line":"            _retry()"},{"line_number":306,"context_line":"        except netapp_api.NaApiError:"},{"line_number":307,"context_line":"            msg \u003d _(\"Timed out after many retry for LUN clone creation\")"},{"line_number":308,"context_line":"            raise na_utils.NetAppDriverException(msg)"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def _get_fc_target_wwpns(self, include_partner\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":1,"id":"2c690765_346a62fa","line":307,"range":{"start_line":307,"start_character":37,"end_line":307,"end_character":41},"in_reply_to":"dcfc974a_f612c97a","updated":"2025-06-15 12:01:27.000000000","message":"The _retry() function is decorated with @utils.retry, which internally handles retries and print this below message on each retry \n\nvolume.drivers.netapp.dataontap.block_cmode.NetAppBlockStorageCmodeLibrary._retry_clone_lun.\u003clocals\u003e._retry\u0027 after 15.240(s), this was the 2nd time calling it\n\nI have to change whole retry logic (instead of using the @utils.retry, I have to use the for loop) to print the number of retry.","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"43e329fb817012878cc2ce522719209b172b3fbe","unresolved":true,"context_lines":[{"line_number":288,"context_line":"        timeout \u003d self.configuration.safe_get(\u0027netapp_lun_clone_busy_timeout\u0027)"},{"line_number":289,"context_line":"        interval \u003d self.configuration.safe_get("},{"line_number":290,"context_line":"            \u0027netapp_lun_clone_busy_interval\u0027)"},{"line_number":291,"context_line":"        retries \u003d int(timeout / interval)"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        for attempt in range(1, retries + 1):"},{"line_number":294,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"fea1a364_9ff27a70","line":291,"updated":"2025-06-23 15:08:13.000000000","message":"Please add some comments on the code explaining logic behind retries, timeout and interval.","commit_id":"699e0d779af3a96712343bffb9d7a80061010719"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"88065acb2ef02b251dd6d9cdb95453a9f4207a6d","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        timeout \u003d self.configuration.safe_get(\u0027netapp_lun_clone_busy_timeout\u0027)"},{"line_number":289,"context_line":"        interval \u003d self.configuration.safe_get("},{"line_number":290,"context_line":"            \u0027netapp_lun_clone_busy_interval\u0027)"},{"line_number":291,"context_line":"        retries \u003d int(timeout / interval)"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        for attempt in range(1, retries + 1):"},{"line_number":294,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"8702571c_9f561e36","line":291,"in_reply_to":"fea1a364_9ff27a70","updated":"2025-06-24 02:32:59.000000000","message":"Added the comments.","commit_id":"699e0d779af3a96712343bffb9d7a80061010719"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"c3d4fc431bf40dfaecb27c111b72f1cbe23f8edc","unresolved":true,"context_lines":[{"line_number":247,"context_line":"                is_snapshot\u003dis_snapshot,"},{"line_number":248,"context_line":"                qos_policy_group_is_adaptive\u003dqos_policy_group_is_adaptive,"},{"line_number":249,"context_line":"            )"},{"line_number":250,"context_line":"        except netapp_api.NaApiError as e:"},{"line_number":251,"context_line":"            with excutils.save_and_reraise_exception() as exc_context:"},{"line_number":252,"context_line":"                if \u0027Device busy\u0027 in e.message:"},{"line_number":253,"context_line":"                    self._retry_clone_lun("}],"source_content_type":"text/x-python","patch_set":6,"id":"951ccf58_7bcfdd30","line":250,"updated":"2025-06-25 20:43:03.000000000","message":"I just want to note a design alternative would place the exception handling and retry logic within the zapi_client.clone_lun() function itself, rather than placing the retry burden on the caller.","commit_id":"1ec7b48fde2c1deb02ba554c1ed964c467b58b87"}],"cinder/volume/drivers/netapp/options.py":[{"author":{"_account_id":30555,"name":"Fernando Ferraz","display_name":"Fernando Ferraz","email":"fesilva@redhat.com","username":"fernandoperches"},"change_message_id":"7e4367b56d7f119d42714d64d768572edeb9860b","unresolved":true,"context_lines":[{"line_number":260,"context_line":"                     \u0027configured to use iSCSI or FC.\u0027)),"},{"line_number":261,"context_line":"    cfg.IntOpt(\u0027netapp_lun_clone_busy_timeout\u0027,"},{"line_number":262,"context_line":"               min\u003d0,"},{"line_number":263,"context_line":"               default\u003d60,  # 60 seconds"},{"line_number":264,"context_line":"               help\u003d\u0027Specifies the maximum time (in seconds) to retry\u0027"},{"line_number":265,"context_line":"                    \u0027 the LUN clone operation when an ONTAP \"device busy\"\u0027"},{"line_number":266,"context_line":"                    \u0027 error occurs.\u0027)]"}],"source_content_type":"text/x-python","patch_set":1,"id":"b9b46254_bb1043a0","line":263,"updated":"2025-06-05 11:33:43.000000000","message":"NIT: the \"help\" already explains the values for ``netapp_lun_clone_busy_timeout`` are in seconds. This comment isn\u0027t really necessary.","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"7d362c3ca1c315a100e39b36a4735c6b77475d7f","unresolved":false,"context_lines":[{"line_number":260,"context_line":"                     \u0027configured to use iSCSI or FC.\u0027)),"},{"line_number":261,"context_line":"    cfg.IntOpt(\u0027netapp_lun_clone_busy_timeout\u0027,"},{"line_number":262,"context_line":"               min\u003d0,"},{"line_number":263,"context_line":"               default\u003d60,  # 60 seconds"},{"line_number":264,"context_line":"               help\u003d\u0027Specifies the maximum time (in seconds) to retry\u0027"},{"line_number":265,"context_line":"                    \u0027 the LUN clone operation when an ONTAP \"device busy\"\u0027"},{"line_number":266,"context_line":"                    \u0027 error occurs.\u0027)]"}],"source_content_type":"text/x-python","patch_set":1,"id":"8de4180c_0ccb417e","line":263,"in_reply_to":"b9b46254_bb1043a0","updated":"2025-06-15 12:01:27.000000000","message":"Done","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"}],"releasenotes/notes/bug-2112245-bulk-vms-creation-device-issue-b9d82f7a826c9f2b.yaml":[{"author":{"_account_id":30555,"name":"Fernando Ferraz","display_name":"Fernando Ferraz","email":"fesilva@redhat.com","username":"fernandoperches"},"change_message_id":"a9f06fdd6d932b72b30ab32073f7349e61fce1b9","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    A few cinder volume clone operations failed during bulk clone creation."},{"line_number":5,"context_line":"    Added retry logic to ensure the NetApp driver retries any failed clone"},{"line_number":6,"context_line":"    operations. Refer bug"},{"line_number":7,"context_line":"    `Launchpad bug #2112245 \u003chttps://bugs.launchpad.net/cinder/+bug/2112245\u003e`_"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"616a635d_f137525e","line":4,"updated":"2025-06-05 11:27:21.000000000","message":"There is a standard format for adding bug fixes to release notes; please check patches [1][2] for references.\n\n[1] https://review.opendev.org/c/openstack/cinder/+/945631/3/releasenotes/notes/pure_lacp_iscsi-34678bdb98fa6bab.yaml\n\n[2] https://review.opendev.org/c/openstack/cinder/+/946995/7/releasenotes/notes/fix-nfs-vol-from-snapshot-654a07d25a33bf7d.yaml","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"7d362c3ca1c315a100e39b36a4735c6b77475d7f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    A few cinder volume clone operations failed during bulk clone creation."},{"line_number":5,"context_line":"    Added retry logic to ensure the NetApp driver retries any failed clone"},{"line_number":6,"context_line":"    operations. Refer bug"},{"line_number":7,"context_line":"    `Launchpad bug #2112245 \u003chttps://bugs.launchpad.net/cinder/+bug/2112245\u003e`_"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"4121c710_1a06b7e7","line":4,"in_reply_to":"616a635d_f137525e","updated":"2025-06-15 12:01:27.000000000","message":"Done","commit_id":"0e9e6d7b3f29b519984acd1a28cebc07d737ed4f"}]}
