)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"575d1487f180a95da7d9a0be2e2a28bd0de5706f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"035bc4e0_5096faeb","updated":"2022-08-18 19:37:08.000000000","message":"recheck\n\ncinder-plugin-ceph-tempest POST_FAILURE","commit_id":"69e013d0552593afc513c019a574c5be9186330d"},{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"823d3c011f0521b41a5f90e49961b8f7a3a12910","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"6c04b489_70bc892c","updated":"2023-02-08 16:20:27.000000000","message":"Just some thoughts and questions, nothing major, overall the logic and\nstruture look sound to me.\n","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"},{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"740ac45b40b438d0868648f8d5f69a5c2f4712fb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"d66df24f_d6efac8f","updated":"2023-02-08 16:24:56.000000000","message":"Oh yes, also there\u0027s no bug reference, should there be a spec?  I\u0027m not\nsure but I wonder.\n","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"470f11d5c0abc378b4408821e1df88750d73e8f7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"de6a622e_d4c8bb26","updated":"2023-02-15 00:19:04.000000000","message":"recheck\n\n{1} cinder_tempest_plugin.scenario.test_volume_multiattach.VolumeMultiattachTests.test_multiattach_data_integrity [116.705684s] ... FAILED\n    urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host\u003d\u0027158.69.64.150\u0027, port\u003d443): Read timed out. (read timeout\u003d60)\n","commit_id":"ed42901d7ee18cea21f5b7b64652c54e9c7ac273"},{"author":{"_account_id":20813,"name":"Sofia Enriquez","email":"lsofia.enriquez@gmail.com","username":"enriquetaso"},"change_message_id":"84754c794f75356fd12b7f46d0bbc40bda43770f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"7beb39fd_510bd06b","updated":"2023-02-17 15:16:08.000000000","message":"Hi Pete, thanks for working on this. I\u0027m still reviewing this patch. ","commit_id":"fe9dce3961f1072c5c994469c7d89141a6596516"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"c132f638c52daed32e001385aa8f7b1a0632de22","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"56c2c9bc_5df516d2","updated":"2023-03-01 11:44:06.000000000","message":"Thanks for working on this Pete, I\u0027ve two major comments that needs to be addressed. One in RPC and one in releasenote.","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"99aa932f403a0a4883380b3d98bdca4709678c27","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"a9e87b8a_d72c10fe","updated":"2023-03-02 22:07:53.000000000","message":"The comment in RPC file is not addressed.","commit_id":"fc3d913d0c497c204c7b5be8a30ddbabea44e20f"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"d1157002b7a2691f644c52b9710a18b30ff2ddba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"ee6e824a_b8afc05d","updated":"2023-03-15 23:52:28.000000000","message":"few nits but we can address them in a followup. bumping priority since this needs to go into RC2. Thanks Pete for addressing my comments!","commit_id":"a2fec00a100969a1c723ab0a286560d3a9d15790"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"6e030d51dd5b234451ad1d481fa0321a67c3b479","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"14c34632_6cfe6fc0","updated":"2023-03-16 01:42:56.000000000","message":"LGTM","commit_id":"477b1342747ddeb3ab9a586b33c06f1e51f37df8"},{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"91aa54a87adb0de0c7abd3bec5c6c0881191d07d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"31a85d1b_8e3c30b4","updated":"2023-03-16 14:38:55.000000000","message":"Thanks for making these changes, looks good to me.\n","commit_id":"477b1342747ddeb3ab9a586b33c06f1e51f37df8"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"9385ec4018a8e38484a654bd99862997d2f0b639","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"e87cb6da_b3fae0a0","updated":"2023-03-16 16:35:29.000000000","message":"This looks good to go!","commit_id":"477b1342747ddeb3ab9a586b33c06f1e51f37df8"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"29dffe1b26acb45928927369f916727ca032b827","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"9ca0be4f_2971c7dd","updated":"2023-03-16 03:09:05.000000000","message":"recheck\n\nopenstack-tox-py39 powermax unit test failure","commit_id":"477b1342747ddeb3ab9a586b33c06f1e51f37df8"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"61738f8483c15fc829904aa96bb74a1c03163cb9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"526c82c5_12fc280c","updated":"2023-03-16 12:28:45.000000000","message":"recheck identity failure in tempest-integrated-storage\n\n","commit_id":"477b1342747ddeb3ab9a586b33c06f1e51f37df8"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"7b1914149f1f8862bfbe66dc15e58a882d1f8da7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"be06858d_179383ac","updated":"2023-03-17 09:51:26.000000000","message":"recheck py39 failure\n\nstrange error in powermax test\n\ncinder.tests.unit.volume.drivers.dell_emc.powermax.test_powermax_rest.PowerMaxRestTest.test_check_force\ntesttools.matchers._impl.MismatchError: \u0027false\u0027 !\u003d \u0027true\u0027","commit_id":"477b1342747ddeb3ab9a586b33c06f1e51f37df8"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"44203a6e721e65063f41aed65edc8656f2d17e1e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"73c17cca_00c0464b","updated":"2023-03-17 16:43:13.000000000","message":"recheck there is some problem with how global values are used in powermax tests but we can\u0027t fix them all now so hope gate will not encounter it after recheck since it\u0027s random","commit_id":"477b1342747ddeb3ab9a586b33c06f1e51f37df8"},{"author":{"_account_id":33609,"name":"XuQi","display_name":"Inori","email":"xuq.fnstxz@fujitsu.com","username":"inori"},"change_message_id":"e64cd8500e0f9c9428a027f7abc86caeffd72370","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"3c801844_5ae45093","updated":"2023-03-16 02:59:46.000000000","message":"run-Fujitsu ETERNUS CI","commit_id":"477b1342747ddeb3ab9a586b33c06f1e51f37df8"},{"author":{"_account_id":33609,"name":"XuQi","display_name":"Inori","email":"xuq.fnstxz@fujitsu.com","username":"inori"},"change_message_id":"cb455a6190cab20e609847aeb5e6d62fd0ac1450","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"65da11ca_dc86ce96","updated":"2023-03-16 06:08:03.000000000","message":"run-Fujitsu ETERNUS CI","commit_id":"477b1342747ddeb3ab9a586b33c06f1e51f37df8"},{"author":{"_account_id":33609,"name":"XuQi","display_name":"Inori","email":"xuq.fnstxz@fujitsu.com","username":"inori"},"change_message_id":"acc4ceee12ea2b073992e8023e93c1e9e26daf46","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"b58fbd7c_9859b9d1","updated":"2023-03-16 05:36:50.000000000","message":"run-Fujitsu ETERNUS CI","commit_id":"477b1342747ddeb3ab9a586b33c06f1e51f37df8"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"cec775b3ea24ee8f9adc0e1de37b89fa1107b623","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"c317b23e_7bfbb607","in_reply_to":"6d08331a_c7fb0f0f","updated":"2023-03-17 20:22:33.000000000","message":"I was mostly relying on luck to get the changes in in-time. but yes, the correct way is to rebase this patch with the test fixes and ensure gate will run smoothly.","commit_id":"477b1342747ddeb3ab9a586b33c06f1e51f37df8"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"f20006b555dedb666837eeb210790dd98ff7a75f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"6d08331a_c7fb0f0f","in_reply_to":"73c17cca_00c0464b","updated":"2023-03-17 19:24:15.000000000","message":"Wait, no. This is not going to help unless I re-base to incorporate the PowerMax fix. Give me a few.","commit_id":"477b1342747ddeb3ab9a586b33c06f1e51f37df8"}],"cinder/backup/api.py":[{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"823d3c011f0521b41a5f90e49961b8f7a3a12910","unresolved":true,"context_lines":[{"line_number":404,"context_line":"                     \"backup %(backup_id)s.\","},{"line_number":405,"context_line":"                     {\u0027size\u0027: size, \u0027backup_id\u0027: backup_id})"},{"line_number":406,"context_line":"            volume \u003d self.volume_api.create(context, size, name, description)"},{"line_number":407,"context_line":"            fresh_volume \u003d True"},{"line_number":408,"context_line":"            volume_id \u003d volume[\u0027id\u0027]"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"            while True:"}],"source_content_type":"text/x-python","patch_set":7,"id":"8c5126f2_be53bb92","line":407,"updated":"2023-02-08 16:20:27.000000000","message":"Two minor things:\n\n1. could fresh be an attribute of the volume object, or that too\ndifficult as it would propogate to the DB and make this too messy?\n\n2. it occurs that naming something like \u0027is_fresh\u0027 would convey the\nboolean nature of the parameter, but that\u0027s just a thought.","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"6c5444233980f5012fa65161c5411d5eb818830f","unresolved":true,"context_lines":[{"line_number":404,"context_line":"                     \"backup %(backup_id)s.\","},{"line_number":405,"context_line":"                     {\u0027size\u0027: size, \u0027backup_id\u0027: backup_id})"},{"line_number":406,"context_line":"            volume \u003d self.volume_api.create(context, size, name, description)"},{"line_number":407,"context_line":"            fresh_volume \u003d True"},{"line_number":408,"context_line":"            volume_id \u003d volume[\u0027id\u0027]"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"            while True:"}],"source_content_type":"text/x-python","patch_set":7,"id":"e15e655c_fde6ba62","line":407,"in_reply_to":"8c5126f2_be53bb92","updated":"2023-02-13 22:12:25.000000000","message":"1. I hoped to get by without changing the scheme of volume objects or adding a meta key because this flag is only operative from the moment the backup process takes the volume into custody to the moment the restore is complete. If the restore fails, the volume has to be destroyed and re-created.\n\n2. How about volume_is_fresh?","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"52e5742335b04668e822d8b6eca23eb0ceeaea20","unresolved":true,"context_lines":[{"line_number":404,"context_line":"                     \"backup %(backup_id)s.\","},{"line_number":405,"context_line":"                     {\u0027size\u0027: size, \u0027backup_id\u0027: backup_id})"},{"line_number":406,"context_line":"            volume \u003d self.volume_api.create(context, size, name, description)"},{"line_number":407,"context_line":"            fresh_volume \u003d True"},{"line_number":408,"context_line":"            volume_id \u003d volume[\u0027id\u0027]"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"            while True:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fe7cdec2_d93701c4","line":407,"in_reply_to":"a4b256f2_bd5ea392","updated":"2023-02-17 16:08:41.000000000","message":"How about a docstring in cinder/backup/rpcapi.py?","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"},{"author":{"_account_id":20813,"name":"Sofia Enriquez","email":"lsofia.enriquez@gmail.com","username":"enriquetaso"},"change_message_id":"77075275a6165fe98cbf9e5acf7376eb68b29a0b","unresolved":true,"context_lines":[{"line_number":404,"context_line":"                     \"backup %(backup_id)s.\","},{"line_number":405,"context_line":"                     {\u0027size\u0027: size, \u0027backup_id\u0027: backup_id})"},{"line_number":406,"context_line":"            volume \u003d self.volume_api.create(context, size, name, description)"},{"line_number":407,"context_line":"            fresh_volume \u003d True"},{"line_number":408,"context_line":"            volume_id \u003d volume[\u0027id\u0027]"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"            while True:"}],"source_content_type":"text/x-python","patch_set":7,"id":"a4b256f2_bd5ea392","line":407,"in_reply_to":"e15e655c_fde6ba62","updated":"2023-02-17 15:17:31.000000000","message":"Maybe it\u0027s a idiot suggestion but I think we should write/document this somewhere.","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"c132f638c52daed32e001385aa8f7b1a0632de22","unresolved":false,"context_lines":[{"line_number":404,"context_line":"                     \"backup %(backup_id)s.\","},{"line_number":405,"context_line":"                     {\u0027size\u0027: size, \u0027backup_id\u0027: backup_id})"},{"line_number":406,"context_line":"            volume \u003d self.volume_api.create(context, size, name, description)"},{"line_number":407,"context_line":"            volume_is_fresh \u003d True"},{"line_number":408,"context_line":"            volume_id \u003d volume[\u0027id\u0027]"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"            while True:"}],"source_content_type":"text/x-python","patch_set":10,"id":"846a934f_ec5f9db7","line":407,"range":{"start_line":407,"start_character":12,"end_line":407,"end_character":27},"updated":"2023-03-01 11:44:06.000000000","message":"not a big fan of this name, would\u0027ve preferred is_new_volume or is_existing_volume more but looking at the places where this convention is used, I don\u0027t have major concerns with this name either.","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e03e94476eaad35dc1e9eadda2c715a0021693a5","unresolved":false,"context_lines":[{"line_number":404,"context_line":"                     \"backup %(backup_id)s.\","},{"line_number":405,"context_line":"                     {\u0027size\u0027: size, \u0027backup_id\u0027: backup_id})"},{"line_number":406,"context_line":"            volume \u003d self.volume_api.create(context, size, name, description)"},{"line_number":407,"context_line":"            volume_is_fresh \u003d True"},{"line_number":408,"context_line":"            volume_id \u003d volume[\u0027id\u0027]"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"            while True:"}],"source_content_type":"text/x-python","patch_set":10,"id":"8390303c_8dcc66f7","line":407,"range":{"start_line":407,"start_character":12,"end_line":407,"end_character":27},"in_reply_to":"846a934f_ec5f9db7","updated":"2023-03-02 06:37:52.000000000","message":"Although it\u0027s academic, I wanted to keep the door open for a volume that is not \"new\", but is zeroed and can be used, or re-used (with a TRIM operation, for example).","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"}],"cinder/backup/chunkeddriver.py":[{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"823d3c011f0521b41a5f90e49961b8f7a3a12910","unresolved":true,"context_lines":[{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        self._finalize_backup(backup, container, object_meta, object_sha256)"},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"    def _write_nonzero(self, volume_file, volume_offset, decompressed):"},{"line_number":669,"context_line":"        \"\"\"Write non-zero parts of `decompressed` into `volume_file`.\"\"\""},{"line_number":670,"context_line":"        chunk_length \u003d 1024 * 1024"},{"line_number":671,"context_line":"        for chunk_offset in range(0, len(decompressed), chunk_length):"}],"source_content_type":"text/x-python","patch_set":7,"id":"2207cb5e_5faf8ab9","line":668,"updated":"2023-02-08 16:20:27.000000000","message":"I might have put this in volume utils as well, nothing specific to the\nchunkeddriver, just a thought.","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"6c5444233980f5012fa65161c5411d5eb818830f","unresolved":true,"context_lines":[{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        self._finalize_backup(backup, container, object_meta, object_sha256)"},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"    def _write_nonzero(self, volume_file, volume_offset, decompressed):"},{"line_number":669,"context_line":"        \"\"\"Write non-zero parts of `decompressed` into `volume_file`.\"\"\""},{"line_number":670,"context_line":"        chunk_length \u003d 1024 * 1024"},{"line_number":671,"context_line":"        for chunk_offset in range(0, len(decompressed), chunk_length):"}],"source_content_type":"text/x-python","patch_set":7,"id":"eb8eb8e2_0a0ad940","line":668,"in_reply_to":"2207cb5e_5faf8ab9","updated":"2023-02-13 22:12:25.000000000","message":"I avoid this because I use \u0027*\u0027 command in vim. If I have to, then sure.","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e03e94476eaad35dc1e9eadda2c715a0021693a5","unresolved":true,"context_lines":[{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        self._finalize_backup(backup, container, object_meta, object_sha256)"},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"    def _write_nonzero(self, volume_file, volume_offset, decompressed):"},{"line_number":669,"context_line":"        \"\"\"Write non-zero parts of `decompressed` into `volume_file`.\"\"\""},{"line_number":670,"context_line":"        chunk_length \u003d 1024 * 1024"},{"line_number":671,"context_line":"        for chunk_offset in range(0, len(decompressed), chunk_length):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9ae18dcf_6b1e90bb","line":668,"in_reply_to":"eb8eb8e2_0a0ad940","updated":"2023-03-02 06:37:52.000000000","message":"I am gradually coming around now that I made them into standalone functions, not methods.","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"c132f638c52daed32e001385aa8f7b1a0632de22","unresolved":false,"context_lines":[{"line_number":670,"context_line":"        chunk_length \u003d 1024 * 1024"},{"line_number":671,"context_line":"        for chunk_offset in range(0, len(decompressed), chunk_length):"},{"line_number":672,"context_line":"            chunk_end \u003d chunk_offset + chunk_length"},{"line_number":673,"context_line":"            chunk \u003d decompressed[chunk_offset:chunk_end]"},{"line_number":674,"context_line":"            # The len(chunk) may be smaller than chunk_length. It\u0027s okay."},{"line_number":675,"context_line":"            if not volume_utils.is_all_zero(chunk):"},{"line_number":676,"context_line":"                volume_file.seek(volume_offset + chunk_offset)"}],"source_content_type":"text/x-python","patch_set":10,"id":"b46287ad_5df405a8","line":673,"range":{"start_line":673,"start_character":46,"end_line":673,"end_character":55},"updated":"2023-03-01 11:44:06.000000000","message":"NOTE: even if chunk_end exceed the len(decompressed) value, python has smart handling and will only assign the last possible index and won\u0027t error out.\n\n\u003e\u003e\u003e li \u003d [1,2,3,4,5]\n\u003e\u003e\u003e print(li[0:100])\n[1, 2, 3, 4, 5]","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e03e94476eaad35dc1e9eadda2c715a0021693a5","unresolved":false,"context_lines":[{"line_number":670,"context_line":"        chunk_length \u003d 1024 * 1024"},{"line_number":671,"context_line":"        for chunk_offset in range(0, len(decompressed), chunk_length):"},{"line_number":672,"context_line":"            chunk_end \u003d chunk_offset + chunk_length"},{"line_number":673,"context_line":"            chunk \u003d decompressed[chunk_offset:chunk_end]"},{"line_number":674,"context_line":"            # The len(chunk) may be smaller than chunk_length. It\u0027s okay."},{"line_number":675,"context_line":"            if not volume_utils.is_all_zero(chunk):"},{"line_number":676,"context_line":"                volume_file.seek(volume_offset + chunk_offset)"}],"source_content_type":"text/x-python","patch_set":10,"id":"f7aa895f_24940a26","line":673,"range":{"start_line":673,"start_character":46,"end_line":673,"end_character":55},"in_reply_to":"b46287ad_5df405a8","updated":"2023-03-02 06:37:52.000000000","message":"Okay. I am relying on this behavior, so I don\u0027t have anything to add. However, let\u0027s talk about the seeking just below...","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"c132f638c52daed32e001385aa8f7b1a0632de22","unresolved":false,"context_lines":[{"line_number":673,"context_line":"            chunk \u003d decompressed[chunk_offset:chunk_end]"},{"line_number":674,"context_line":"            # The len(chunk) may be smaller than chunk_length. It\u0027s okay."},{"line_number":675,"context_line":"            if not volume_utils.is_all_zero(chunk):"},{"line_number":676,"context_line":"                volume_file.seek(volume_offset + chunk_offset)"},{"line_number":677,"context_line":"                volume_file.write(chunk)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"    def _restore_v1(self, backup, volume_id, metadata, volume_file,"}],"source_content_type":"text/x-python","patch_set":10,"id":"d80fb7d1_c913946b","line":676,"range":{"start_line":676,"start_character":28,"end_line":676,"end_character":32},"updated":"2023-03-01 11:44:06.000000000","message":"seek also has that smart handling that it will point to the last char even if the offset provided exceed chars in file.\n\n\u003e\u003e\u003e fi.seek(10)\n10\n\u003e\u003e\u003e for f in fi:\n...     print(f)\n... \n3\n\n\u003e\u003e\u003e fi.seek(10)\n10\n\u003e\u003e\u003e for f in fi:\n...     print(f)\n... \n3","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"99aa932f403a0a4883380b3d98bdca4709678c27","unresolved":false,"context_lines":[{"line_number":673,"context_line":"            chunk \u003d decompressed[chunk_offset:chunk_end]"},{"line_number":674,"context_line":"            # The len(chunk) may be smaller than chunk_length. It\u0027s okay."},{"line_number":675,"context_line":"            if not volume_utils.is_all_zero(chunk):"},{"line_number":676,"context_line":"                volume_file.seek(volume_offset + chunk_offset)"},{"line_number":677,"context_line":"                volume_file.write(chunk)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"    def _restore_v1(self, backup, volume_id, metadata, volume_file,"}],"source_content_type":"text/x-python","patch_set":10,"id":"b264bdc2_378728e6","line":676,"range":{"start_line":676,"start_character":28,"end_line":676,"end_character":32},"in_reply_to":"017bdbc1_ab56168e","updated":"2023-03-02 22:07:53.000000000","message":"The volume attachment part and the way to open the volume is determined in the backup manager[1] so it should be same for all backup drivers and I don\u0027t think backup drivers are doing anything additional to open the volume file in a different way (unless I\u0027m missing something here).\n\n[1] https://github.com/openstack/cinder/blob/a53ff6727a42a7730e27772b64cfd511194721e1/cinder/backup/manager.py#L751","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e03e94476eaad35dc1e9eadda2c715a0021693a5","unresolved":false,"context_lines":[{"line_number":673,"context_line":"            chunk \u003d decompressed[chunk_offset:chunk_end]"},{"line_number":674,"context_line":"            # The len(chunk) may be smaller than chunk_length. It\u0027s okay."},{"line_number":675,"context_line":"            if not volume_utils.is_all_zero(chunk):"},{"line_number":676,"context_line":"                volume_file.seek(volume_offset + chunk_offset)"},{"line_number":677,"context_line":"                volume_file.write(chunk)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"    def _restore_v1(self, backup, volume_id, metadata, volume_file,"}],"source_content_type":"text/x-python","patch_set":10,"id":"017bdbc1_ab56168e","line":676,"range":{"start_line":676,"start_character":28,"end_line":676,"end_character":32},"in_reply_to":"d80fb7d1_c913946b","updated":"2023-03-02 06:37:52.000000000","message":"First of all, I don\u0027t understand what the code example has to do with the patch.\n\nThat aside, I don\u0027t agree with the statement \"it will point to the last char even if the offset provided exceed chars in file\". The ability to write a sparse file in Python depends on how file was opened. Look:\n\n\u003e\u003e\u003e import os\n\u003e\u003e\u003e with open(\"xxx\",\u0027ba\u0027) as f:\n...     f.seek(10)\n...     f.write(b\u00271\u0027)\n... \n10\n1\n\u003e\u003e\u003e os.stat(\u0027xxx\u0027).st_size\n1\n\u003e\u003e\u003e with open(\"xxx\",\u0027bw\u0027) as f:\n...     f.seek(10)\n...     f.write(b\u00272\u0027)\n... \n10\n1\n\u003e\u003e\u003e os.stat(\u0027xxx\u0027).st_size\n11\n\u003e\u003e\u003e \n\nWith that in mind, I have determined that volumes are opened correctly for my code to work. I have created sparse volumes and computed the checksums of their contents. Then, I backed them up, restored, verified sparseness, and verified the checksums. The data after the holes was restored at correct offsets. I suppose I could screw up these manual tests, but I also added automated unit tests for this.\n\nDo you think this is unsafe versus some of the drivers opening volumes in such a manner (with \u0027a\u0027) that they can get corrupted upon restore?","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"c132f638c52daed32e001385aa8f7b1a0632de22","unresolved":true,"context_lines":[{"line_number":733,"context_line":"                          compression_algorithm)"},{"line_number":734,"context_line":"                decompressed \u003d decompressor.decompress(body)"},{"line_number":735,"context_line":"                body \u003d None  # Allow Python to free it"},{"line_number":736,"context_line":"                if volume_is_fresh:"},{"line_number":737,"context_line":"                    self._write_nonzero(volume_file, obj[\u0027offset\u0027],"},{"line_number":738,"context_line":"                                        decompressed)"},{"line_number":739,"context_line":"                else:"},{"line_number":740,"context_line":"                    volume_file.seek(obj[\u0027offset\u0027])"},{"line_number":741,"context_line":"                    volume_file.write(decompressed)"},{"line_number":742,"context_line":"                decompressed \u003d None  # Allow Python to free it"},{"line_number":743,"context_line":"            else:"},{"line_number":744,"context_line":"                if volume_is_fresh:"},{"line_number":745,"context_line":"                    self._write_nonzero(volume_file, obj[\u0027offset\u0027], body)"},{"line_number":746,"context_line":"                else:"},{"line_number":747,"context_line":"                    volume_file.seek(obj[\u0027offset\u0027])"},{"line_number":748,"context_line":"                    volume_file.write(body)"},{"line_number":749,"context_line":"                body \u003d None  # Allow Python to free it"},{"line_number":750,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"cc3ca9c4_70dc74ed","line":747,"range":{"start_line":736,"start_character":0,"end_line":747,"end_character":51},"updated":"2023-03-01 11:44:06.000000000","message":"nit: would\u0027ve been better as a separate function\n\n    def _write_volume(is_fresh, volume_file, offset, content):\n        if is_fresh:\n            self._write_nonzero(volume_file, offset, content)\n        else:\n            volume_file.seek(offset)\n            volume_file.write(content)\n\nand here we would call it,\n\n    if decompressor is not None:\n        content \u003d decompressed\n    else:\n        content \u003d body\n    self._write_volume(volume_is_fresh, volume_file, obj[\u0027offset\u0027], content)\n    content \u003d body \u003d decompressed \u003d None","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e03e94476eaad35dc1e9eadda2c715a0021693a5","unresolved":false,"context_lines":[{"line_number":733,"context_line":"                          compression_algorithm)"},{"line_number":734,"context_line":"                decompressed \u003d decompressor.decompress(body)"},{"line_number":735,"context_line":"                body \u003d None  # Allow Python to free it"},{"line_number":736,"context_line":"                if volume_is_fresh:"},{"line_number":737,"context_line":"                    self._write_nonzero(volume_file, obj[\u0027offset\u0027],"},{"line_number":738,"context_line":"                                        decompressed)"},{"line_number":739,"context_line":"                else:"},{"line_number":740,"context_line":"                    volume_file.seek(obj[\u0027offset\u0027])"},{"line_number":741,"context_line":"                    volume_file.write(decompressed)"},{"line_number":742,"context_line":"                decompressed \u003d None  # Allow Python to free it"},{"line_number":743,"context_line":"            else:"},{"line_number":744,"context_line":"                if volume_is_fresh:"},{"line_number":745,"context_line":"                    self._write_nonzero(volume_file, obj[\u0027offset\u0027], body)"},{"line_number":746,"context_line":"                else:"},{"line_number":747,"context_line":"                    volume_file.seek(obj[\u0027offset\u0027])"},{"line_number":748,"context_line":"                    volume_file.write(body)"},{"line_number":749,"context_line":"                body \u003d None  # Allow Python to free it"},{"line_number":750,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"49c640bc_fe0efeca","line":747,"range":{"start_line":736,"start_character":0,"end_line":747,"end_character":51},"in_reply_to":"cc3ca9c4_70dc74ed","updated":"2023-03-02 06:37:52.000000000","message":"Done\n\nGenerally I\u0027m not a big fan of a coding style that involves a gazillion of tiny functions, but allright. It kind of makes sense here.","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"d1157002b7a2691f644c52b9710a18b30ff2ddba","unresolved":true,"context_lines":[{"line_number":78,"context_line":"            volume_file.write(chunk)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"def _write_volume(volume_is_fresh, volume_file, volume_offset, content):"},{"line_number":82,"context_line":"    if volume_is_fresh:"},{"line_number":83,"context_line":"        _write_nonzero(volume_file, volume_offset, content)"},{"line_number":84,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"996491d0_3037f8eb","line":81,"range":{"start_line":81,"start_character":18,"end_line":81,"end_character":33},"updated":"2023-03-15 23:52:28.000000000","message":"volume_is_new?\nbut we can do it in a followup","commit_id":"a2fec00a100969a1c723ab0a286560d3a9d15790"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e375567451b419b27d1745f8c66842a2c0b97859","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            volume_file.write(chunk)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"def _write_volume(volume_is_fresh, volume_file, volume_offset, content):"},{"line_number":82,"context_line":"    if volume_is_fresh:"},{"line_number":83,"context_line":"        _write_nonzero(volume_file, volume_offset, content)"},{"line_number":84,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"e3759ce0_b4548146","line":81,"range":{"start_line":81,"start_character":18,"end_line":81,"end_character":33},"in_reply_to":"996491d0_3037f8eb","updated":"2023-03-16 00:36:38.000000000","message":"Done","commit_id":"a2fec00a100969a1c723ab0a286560d3a9d15790"}],"cinder/backup/driver.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"d1157002b7a2691f644c52b9710a18b30ff2ddba","unresolved":true,"context_lines":[{"line_number":374,"context_line":"        return"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    @abc.abstractmethod"},{"line_number":377,"context_line":"    def restore(self, backup, volume_id, volume_file, volume_is_fresh):"},{"line_number":378,"context_line":"        \"\"\"Restore a saved backup."},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        Some I/O operations may block greenthreads, so in order to prevent"}],"source_content_type":"text/x-python","patch_set":15,"id":"df9018dc_382054cf","line":377,"range":{"start_line":377,"start_character":54,"end_line":377,"end_character":69},"updated":"2023-03-15 23:52:28.000000000","message":"volume_is_new","commit_id":"a2fec00a100969a1c723ab0a286560d3a9d15790"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e375567451b419b27d1745f8c66842a2c0b97859","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        return"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    @abc.abstractmethod"},{"line_number":377,"context_line":"    def restore(self, backup, volume_id, volume_file, volume_is_fresh):"},{"line_number":378,"context_line":"        \"\"\"Restore a saved backup."},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        Some I/O operations may block greenthreads, so in order to prevent"}],"source_content_type":"text/x-python","patch_set":15,"id":"a3c9fe72_13110de1","line":377,"range":{"start_line":377,"start_character":54,"end_line":377,"end_character":69},"in_reply_to":"df9018dc_382054cf","updated":"2023-03-16 00:36:38.000000000","message":"Done","commit_id":"a2fec00a100969a1c723ab0a286560d3a9d15790"}],"cinder/backup/drivers/__init__.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ac57b61ef06ceaef6844f832ded9098770aa9067","unresolved":true,"context_lines":[{"line_number":16,"context_line":"from __future__ import annotations"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def is_all_zero(chunk: bytes) -\u003e bool:"},{"line_number":20,"context_line":"    \"\"\"Return true is the chunk of bytes is all zeroes.\"\"\""},{"line_number":21,"context_line":"    # This is not optimized at all. See what Knuth said about it."},{"line_number":22,"context_line":"    return sum(chunk) \u003d\u003d 0"}],"source_content_type":"text/x-python","patch_set":4,"id":"bb500381_afb7aa6e","line":19,"updated":"2022-12-06 13:49:15.000000000","message":"This would be better placed in volume/volume_utils.py (or a new similar backup/backup_utils.py).","commit_id":"8580697b6db9d643882ccb6454e76f0c17c581dd"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"28bed8dd17d80951425fcd1b387f4401a775a214","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from __future__ import annotations"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def is_all_zero(chunk: bytes) -\u003e bool:"},{"line_number":20,"context_line":"    \"\"\"Return true is the chunk of bytes is all zeroes.\"\"\""},{"line_number":21,"context_line":"    # This is not optimized at all. See what Knuth said about it."},{"line_number":22,"context_line":"    return sum(chunk) \u003d\u003d 0"}],"source_content_type":"text/x-python","patch_set":4,"id":"857e01c1_399958d3","line":19,"in_reply_to":"bb500381_afb7aa6e","updated":"2022-12-06 15:34:20.000000000","message":"Done","commit_id":"8580697b6db9d643882ccb6454e76f0c17c581dd"}],"cinder/backup/drivers/ceph.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ac57b61ef06ceaef6844f832ded9098770aa9067","unresolved":true,"context_lines":[{"line_number":1347,"context_line":"            LOG.error(msg)"},{"line_number":1348,"context_line":"            raise exception.BackupOperationError(msg)"},{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":"    def restore2(self,"},{"line_number":1351,"context_line":"                 backup: \u0027objects.Backup\u0027,"},{"line_number":1352,"context_line":"                 volume_id: str,"},{"line_number":1353,"context_line":"                 volume_file: linuxrbd.RBDVolumeIOWrapper,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1b2ecca5_e9cae75d","line":1350,"range":{"start_line":1350,"start_character":8,"end_line":1350,"end_character":16},"updated":"2022-12-06 13:49:15.000000000","message":"I\u0027m not seeing why it\u0027s necessary to make a \"restore2\" method, surely we can just keep this as \"restore\"?","commit_id":"8580697b6db9d643882ccb6454e76f0c17c581dd"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"27d116f3f3fd801d556e294cdc3908b5049db566","unresolved":true,"context_lines":[{"line_number":1347,"context_line":"            LOG.error(msg)"},{"line_number":1348,"context_line":"            raise exception.BackupOperationError(msg)"},{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":"    def restore2(self,"},{"line_number":1351,"context_line":"                 backup: \u0027objects.Backup\u0027,"},{"line_number":1352,"context_line":"                 volume_id: str,"},{"line_number":1353,"context_line":"                 volume_file: linuxrbd.RBDVolumeIOWrapper,"}],"source_content_type":"text/x-python","patch_set":4,"id":"c296ca35_42a37aee","line":1350,"range":{"start_line":1350,"start_character":8,"end_line":1350,"end_character":16},"in_reply_to":"0a20e18e_78b7f683","updated":"2022-12-07 16:13:56.000000000","message":"We don\u0027t provide any real API guarantees for out of tree drivers -- for volume drivers, anyone doing that just has to update them when needed.\n\nI\u0027m not sure any out-of-tree backup drivers exist, I don\u0027t recall any ever coming up.","commit_id":"8580697b6db9d643882ccb6454e76f0c17c581dd"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"28bed8dd17d80951425fcd1b387f4401a775a214","unresolved":true,"context_lines":[{"line_number":1347,"context_line":"            LOG.error(msg)"},{"line_number":1348,"context_line":"            raise exception.BackupOperationError(msg)"},{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":"    def restore2(self,"},{"line_number":1351,"context_line":"                 backup: \u0027objects.Backup\u0027,"},{"line_number":1352,"context_line":"                 volume_id: str,"},{"line_number":1353,"context_line":"                 volume_file: linuxrbd.RBDVolumeIOWrapper,"}],"source_content_type":"text/x-python","patch_set":4,"id":"0a20e18e_78b7f683","line":1350,"range":{"start_line":1350,"start_character":8,"end_line":1350,"end_character":16},"in_reply_to":"1b2ecca5_e9cae75d","updated":"2022-12-06 15:34:20.000000000","message":"Do we have any out-of-tree partner drivers?\n\nI was able to keep restore() for the RPC, where it\u0027s versioned, and there aren\u0027t external implementors.","commit_id":"8580697b6db9d643882ccb6454e76f0c17c581dd"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a017bd38336cedc111ade2d450e695ddf28048b8","unresolved":true,"context_lines":[{"line_number":1347,"context_line":"            LOG.error(msg)"},{"line_number":1348,"context_line":"            raise exception.BackupOperationError(msg)"},{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":"    def restore2(self,"},{"line_number":1351,"context_line":"                 backup: \u0027objects.Backup\u0027,"},{"line_number":1352,"context_line":"                 volume_id: str,"},{"line_number":1353,"context_line":"                 volume_file: linuxrbd.RBDVolumeIOWrapper,"}],"source_content_type":"text/x-python","patch_set":4,"id":"a88492eb_bf50ae64","line":1350,"range":{"start_line":1350,"start_character":8,"end_line":1350,"end_character":16},"in_reply_to":"c296ca35_42a37aee","updated":"2022-12-10 01:00:12.000000000","message":"I see, that makes things simpler. Also, resolves all the XXX markers.","commit_id":"8580697b6db9d643882ccb6454e76f0c17c581dd"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"c132f638c52daed32e001385aa8f7b1a0632de22","unresolved":false,"context_lines":[{"line_number":442,"context_line":"            else:"},{"line_number":443,"context_line":"                dest.write(data)"},{"line_number":444,"context_line":"                dest.flush()"},{"line_number":445,"context_line":"                action \u003d \"Transferred\""},{"line_number":446,"context_line":"            delta \u003d (time.time() - before)"},{"line_number":447,"context_line":"            rate \u003d (self.chunk_size / delta) / 1024"},{"line_number":448,"context_line":"            LOG.debug(\"%(action)s chunk %(chunk)s of %(chunks)s (%(rate)dK/s)\","}],"source_content_type":"text/x-python","patch_set":10,"id":"e236bd72_259fb245","line":445,"range":{"start_line":445,"start_character":25,"end_line":445,"end_character":38},"updated":"2023-03-01 11:44:06.000000000","message":"we generally use constants for these purposes but since this is only used in a log message, this should be fine","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e03e94476eaad35dc1e9eadda2c715a0021693a5","unresolved":false,"context_lines":[{"line_number":442,"context_line":"            else:"},{"line_number":443,"context_line":"                dest.write(data)"},{"line_number":444,"context_line":"                dest.flush()"},{"line_number":445,"context_line":"                action \u003d \"Transferred\""},{"line_number":446,"context_line":"            delta \u003d (time.time() - before)"},{"line_number":447,"context_line":"            rate \u003d (self.chunk_size / delta) / 1024"},{"line_number":448,"context_line":"            LOG.debug(\"%(action)s chunk %(chunk)s of %(chunks)s (%(rate)dK/s)\","}],"source_content_type":"text/x-python","patch_set":10,"id":"412e732a_457ca8e7","line":445,"range":{"start_line":445,"start_character":25,"end_line":445,"end_character":38},"in_reply_to":"e236bd72_259fb245","updated":"2023-03-02 06:37:52.000000000","message":"A constant would be an overkill. If it were in a couple of modules, at least, I\u0027d consider it.","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"}],"cinder/backup/manager.py":[{"author":{"_account_id":20813,"name":"Sofia Enriquez","email":"lsofia.enriquez@gmail.com","username":"enriquetaso"},"change_message_id":"84754c794f75356fd12b7f46d0bbc40bda43770f","unresolved":true,"context_lines":[{"line_number":607,"context_line":"        return False"},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"    @utils.limit_operations"},{"line_number":610,"context_line":"    def restore_backup(self, context, backup, volume_id, volume_is_fresh):"},{"line_number":611,"context_line":"        \"\"\"Restore volume backups from configured backup service.\"\"\""},{"line_number":612,"context_line":"        context.message_resource_id \u003d backup.id"},{"line_number":613,"context_line":"        context.message_resource_type \u003d message_field.Resource.VOLUME_BACKUP"}],"source_content_type":"text/x-python","patch_set":9,"id":"cb53727a_581aa645","line":610,"range":{"start_line":610,"start_character":57,"end_line":610,"end_character":72},"updated":"2023-02-17 15:16:08.000000000","message":":-1: I think it would be nice to have some description of `volume_is_fresh` in the doctring.","commit_id":"fe9dce3961f1072c5c994469c7d89141a6596516"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e03e94476eaad35dc1e9eadda2c715a0021693a5","unresolved":false,"context_lines":[{"line_number":607,"context_line":"        return False"},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"    @utils.limit_operations"},{"line_number":610,"context_line":"    def restore_backup(self, context, backup, volume_id, volume_is_fresh):"},{"line_number":611,"context_line":"        \"\"\"Restore volume backups from configured backup service.\"\"\""},{"line_number":612,"context_line":"        context.message_resource_id \u003d backup.id"},{"line_number":613,"context_line":"        context.message_resource_type \u003d message_field.Resource.VOLUME_BACKUP"}],"source_content_type":"text/x-python","patch_set":9,"id":"560a1991_a422c3bf","line":610,"range":{"start_line":610,"start_character":57,"end_line":610,"end_character":72},"in_reply_to":"cb53727a_581aa645","updated":"2023-03-02 06:37:52.000000000","message":"Done","commit_id":"fe9dce3961f1072c5c994469c7d89141a6596516"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"c132f638c52daed32e001385aa8f7b1a0632de22","unresolved":true,"context_lines":[{"line_number":613,"context_line":"        :param context: RequestContext for the restore operation"},{"line_number":614,"context_line":"        :param backup: Backup that we\u0027re restoring"},{"line_number":615,"context_line":"        :param volume_id: The ID of the volume into which we\u0027re restoring"},{"line_number":616,"context_line":"        :param volume_is_fresh: The volume does not have stale data, so"},{"line_number":617,"context_line":"                                sparse backups can be restored as such."},{"line_number":618,"context_line":"        \"\"\""},{"line_number":619,"context_line":"        context.message_resource_id \u003d backup.id"},{"line_number":620,"context_line":"        context.message_resource_type \u003d message_field.Resource.VOLUME_BACKUP"}],"source_content_type":"text/x-python","patch_set":10,"id":"7fa2e81b_d0c4f4ed","line":617,"range":{"start_line":616,"start_character":32,"end_line":617,"end_character":71},"updated":"2023-03-01 11:44:06.000000000","message":"I think a better description would be,\n\n:param volume_is_fresh: Whether we are restoring into a new volume or an existing volume. True value means it is a new volume and False means otherwise.","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"07a7fd0316f062da1a0fa1514df0fd1859ed1dc2","unresolved":true,"context_lines":[{"line_number":613,"context_line":"        :param context: RequestContext for the restore operation"},{"line_number":614,"context_line":"        :param backup: Backup that we\u0027re restoring"},{"line_number":615,"context_line":"        :param volume_id: The ID of the volume into which we\u0027re restoring"},{"line_number":616,"context_line":"        :param volume_is_fresh: The volume does not have stale data, so"},{"line_number":617,"context_line":"                                sparse backups can be restored as such."},{"line_number":618,"context_line":"        \"\"\""},{"line_number":619,"context_line":"        context.message_resource_id \u003d backup.id"},{"line_number":620,"context_line":"        context.message_resource_type \u003d message_field.Resource.VOLUME_BACKUP"}],"source_content_type":"text/x-python","patch_set":10,"id":"b6c6f982_3d9bf322","line":617,"range":{"start_line":616,"start_character":32,"end_line":617,"end_character":71},"in_reply_to":"1a0a2556_f05bf3c1","updated":"2023-03-04 00:41:44.000000000","message":"Well it\u0027s how the freshness is calculated today.\n\nWe can replace \"fresh\" with something like \"safe\", if that helps. I can see a problem with \"fresh\" is that it\u0027s not self-explanatory and literally means \"new\" for some people. But then \"safe\" is in such a common use that we need a whole phrase, such as \"volume_is_safe_for_sparse_restore\".\n\nYou planted seeds of doubt here for sure. Jon didn\u0027t like it either, but he agreed that \"volume_is_fresh\" was probably the least worst.\n\nP.S. How about \"volume_sparse_ok\" ... ? Not very English but concise at least.","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e03e94476eaad35dc1e9eadda2c715a0021693a5","unresolved":true,"context_lines":[{"line_number":613,"context_line":"        :param context: RequestContext for the restore operation"},{"line_number":614,"context_line":"        :param backup: Backup that we\u0027re restoring"},{"line_number":615,"context_line":"        :param volume_id: The ID of the volume into which we\u0027re restoring"},{"line_number":616,"context_line":"        :param volume_is_fresh: The volume does not have stale data, so"},{"line_number":617,"context_line":"                                sparse backups can be restored as such."},{"line_number":618,"context_line":"        \"\"\""},{"line_number":619,"context_line":"        context.message_resource_id \u003d backup.id"},{"line_number":620,"context_line":"        context.message_resource_type \u003d message_field.Resource.VOLUME_BACKUP"}],"source_content_type":"text/x-python","patch_set":10,"id":"fc2bd5ca_b8fa9358","line":617,"range":{"start_line":616,"start_character":32,"end_line":617,"end_character":71},"in_reply_to":"7fa2e81b_d0c4f4ed","updated":"2023-03-02 06:37:52.000000000","message":"I still do not agree on this. Volume being new is not equivalent to volume being safe to restore sparse.","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"99aa932f403a0a4883380b3d98bdca4709678c27","unresolved":true,"context_lines":[{"line_number":613,"context_line":"        :param context: RequestContext for the restore operation"},{"line_number":614,"context_line":"        :param backup: Backup that we\u0027re restoring"},{"line_number":615,"context_line":"        :param volume_id: The ID of the volume into which we\u0027re restoring"},{"line_number":616,"context_line":"        :param volume_is_fresh: The volume does not have stale data, so"},{"line_number":617,"context_line":"                                sparse backups can be restored as such."},{"line_number":618,"context_line":"        \"\"\""},{"line_number":619,"context_line":"        context.message_resource_id \u003d backup.id"},{"line_number":620,"context_line":"        context.message_resource_type \u003d message_field.Resource.VOLUME_BACKUP"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a0a2556_f05bf3c1","line":617,"range":{"start_line":616,"start_character":32,"end_line":617,"end_character":71},"in_reply_to":"fc2bd5ca_b8fa9358","updated":"2023-03-02 22:07:53.000000000","message":"I don\u0027t understand, isn\u0027t this the same reasoning we used in the API layer to assign value to this parameter?\n\n    if volume_id is None:\n        ...\n        volume_is_fresh \u003d True # new volume case\n    else:\n        ...\n        volume_is_fresh \u003d False # existing volume case\n\nhttps://review.opendev.org/c/openstack/cinder/+/852654/11/cinder/backup/api.py#407","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"}],"cinder/backup/rpcapi.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"c132f638c52daed32e001385aa8f7b1a0632de22","unresolved":true,"context_lines":[{"line_number":71,"context_line":"                       volume_is_fresh):"},{"line_number":72,"context_line":"        LOG.debug(\"restore_backup in rpcapi backup_id %s\", backup.id)"},{"line_number":73,"context_line":"        cctxt \u003d self._get_cctxt(server\u003dbackup_host)"},{"line_number":74,"context_line":"        cctxt.cast(ctxt, \u0027restore_backup\u0027, backup\u003dbackup,"},{"line_number":75,"context_line":"                   volume_id\u003dvolume_id, volume_is_fresh\u003dvolume_is_fresh)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def delete_backup(self, ctxt, backup):"},{"line_number":78,"context_line":"        LOG.debug(\"delete_backup rpcapi backup_id %s\", backup.id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"56e2bfd1_7d5286ee","line":75,"range":{"start_line":74,"start_character":8,"end_line":75,"end_character":72},"updated":"2023-03-01 11:44:06.000000000","message":"we could run into a case where the API is new and backup service is old. Although the API will send the parameter to backup service (via RPC), it will error out since it wouldn\u0027t recognize this new parameter.\nWe need handling here for the case where RPC_API_VERSION \u003c 2.4 then we need to call restore_backup with old format i.e. without volume_is_fresh parameter.","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"99aa932f403a0a4883380b3d98bdca4709678c27","unresolved":true,"context_lines":[{"line_number":71,"context_line":"                       volume_is_fresh):"},{"line_number":72,"context_line":"        LOG.debug(\"restore_backup in rpcapi backup_id %s\", backup.id)"},{"line_number":73,"context_line":"        cctxt \u003d self._get_cctxt(server\u003dbackup_host)"},{"line_number":74,"context_line":"        cctxt.cast(ctxt, \u0027restore_backup\u0027, backup\u003dbackup,"},{"line_number":75,"context_line":"                   volume_id\u003dvolume_id, volume_is_fresh\u003dvolume_is_fresh)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def delete_backup(self, ctxt, backup):"},{"line_number":78,"context_line":"        LOG.debug(\"delete_backup rpcapi backup_id %s\", backup.id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"b5b1796e_935836ec","line":75,"range":{"start_line":74,"start_character":8,"end_line":75,"end_character":72},"in_reply_to":"56e2bfd1_7d5286ee","updated":"2023-03-02 22:07:53.000000000","message":"This is still not addressed. I will summarize again if I wasn\u0027t clear with my comment. We don\u0027t want to send the new parameter volume_is_fresh if the backup service is old and doesn\u0027t support this. We can do something like,\n\n    cctxt \u003d self._get_cctxt(server\u003dbackup_host, version\u003d(\u00272.4\u0027, \u00272.0\u0027))\n    if not cctxt.can_send_version(\u00272.4\u0027):\n        cctxt.cast(ctxt, \u0027restore_backup\u0027, backup\u003dbackup,\n                   volume_id\u003dvolume_id)\n    else:\n        cctxt.cast(ctxt, \u0027restore_backup\u0027, backup\u003dbackup,\n                   volume_id\u003dvolume_id, volume_is_fresh\u003dvolume_is_fresh)\n\nrefer to this example,\n\nhttps://github.com/openstack/cinder/blob/a53ff6727a42a7730e27772b64cfd511194721e1/cinder/volume/rpcapi.py#L225-L227","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"07a7fd0316f062da1a0fa1514df0fd1859ed1dc2","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                       volume_is_fresh):"},{"line_number":72,"context_line":"        LOG.debug(\"restore_backup in rpcapi backup_id %s\", backup.id)"},{"line_number":73,"context_line":"        cctxt \u003d self._get_cctxt(server\u003dbackup_host)"},{"line_number":74,"context_line":"        cctxt.cast(ctxt, \u0027restore_backup\u0027, backup\u003dbackup,"},{"line_number":75,"context_line":"                   volume_id\u003dvolume_id, volume_is_fresh\u003dvolume_is_fresh)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def delete_backup(self, ctxt, backup):"},{"line_number":78,"context_line":"        LOG.debug(\"delete_backup rpcapi backup_id %s\", backup.id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"aa954158_789a7115","line":75,"range":{"start_line":74,"start_character":8,"end_line":75,"end_character":72},"in_reply_to":"b5b1796e_935836ec","updated":"2023-03-04 00:41:44.000000000","message":"I am very sorry that I missed that. Thanks for re-checking on the 2nd pass.\n\nI added the test too, let\u0027s hope it works and I\u0027ll be watching Zuul.","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"d1157002b7a2691f644c52b9710a18b30ff2ddba","unresolved":true,"context_lines":[{"line_number":70,"context_line":"    def restore_backup(self, ctxt, backup_host, backup, volume_id,"},{"line_number":71,"context_line":"                       volume_is_new):"},{"line_number":72,"context_line":"        LOG.debug(\"restore_backup in rpcapi backup_id %s\", backup.id)"},{"line_number":73,"context_line":"        cctxt \u003d self._get_cctxt(server\u003dbackup_host)"},{"line_number":74,"context_line":"        if self.client.can_send_version(\u00272.4\u0027):"},{"line_number":75,"context_line":"            cctxt.cast(ctxt, \u0027restore_backup\u0027, backup\u003dbackup,"},{"line_number":76,"context_line":"                       volume_id\u003dvolume_id, volume_is_new\u003dvolume_is_new)"}],"source_content_type":"text/x-python","patch_set":15,"id":"f62cf348_2ba26617","line":73,"range":{"start_line":73,"start_character":16,"end_line":73,"end_character":51},"updated":"2023-03-15 23:52:28.000000000","message":"we are creating a client with version set as RPC_DEFAULT_VERSION i.e. 2.0 in this case. but that is also done in other past version bumps and it works.\nIdeally this should\u0027ve been self._get_cctxt(server\u003dbackup_host, version\u003d(\u00272.4\u0027, \u00272.0\u0027)) but i don\u0027t think that matters and it will work.","commit_id":"a2fec00a100969a1c723ab0a286560d3a9d15790"}],"cinder/tests/unit/backup/test_chunkeddriver.py":[{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"823d3c011f0521b41a5f90e49961b8f7a3a12910","unresolved":true,"context_lines":[{"line_number":465,"context_line":"            self.volume, parent_id\u003dself.backup.id)"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        with mock.patch.object(self.driver, \u0027put_metadata\u0027) as mock_put:"},{"line_number":468,"context_line":"            self.driver.restore(backup, self.volume, volume_file, False)"},{"line_number":469,"context_line":"            self.assertEqual(2, mock_put.call_count)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        restore_test.assert_called()"}],"source_content_type":"text/x-python","patch_set":7,"id":"bb92a4a8_5b7bf04d","line":468,"updated":"2023-02-08 16:20:27.000000000","message":"I don\u0027t see coverage for when volume_fresh is True, am I missing it?","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"6c5444233980f5012fa65161c5411d5eb818830f","unresolved":true,"context_lines":[{"line_number":465,"context_line":"            self.volume, parent_id\u003dself.backup.id)"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        with mock.patch.object(self.driver, \u0027put_metadata\u0027) as mock_put:"},{"line_number":468,"context_line":"            self.driver.restore(backup, self.volume, volume_file, False)"},{"line_number":469,"context_line":"            self.assertEqual(2, mock_put.call_count)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        restore_test.assert_called()"}],"source_content_type":"text/x-python","patch_set":7,"id":"73ac8f9d_58c86ae4","line":468,"in_reply_to":"bb92a4a8_5b7bf04d","updated":"2023-02-13 22:12:25.000000000","message":"I hoped the test in test_backup_posix.py covered it. That said, it seems like an obscure place. The test is there because it\u0027s one back-end that is easy to mock for almost-functional test: actual files get written.\n\nThere\u0027s also a plumbing of the volume_is_fresh nee fresh_volume from the top down to driver. At least partially the test in test_rpcapi.py takes care of it.","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"}],"cinder/tests/unit/backup/test_rpcapi.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"d1157002b7a2691f644c52b9710a18b30ff2ddba","unresolved":true,"context_lines":[{"line_number":41,"context_line":"                           backup\u003dself.fake_backup_obj)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def test_restore_backup(self):"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        self._test_rpc_api(\u0027restore_backup\u0027,"},{"line_number":46,"context_line":"                           rpc_method\u003d\u0027cast\u0027,"},{"line_number":47,"context_line":"                           server\u003d\u0027fake_volume_host\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"93db8566_b9c30c03","line":44,"updated":"2023-03-15 23:52:28.000000000","message":"nit: unrelated change","commit_id":"a2fec00a100969a1c723ab0a286560d3a9d15790"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e375567451b419b27d1745f8c66842a2c0b97859","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                           backup\u003dself.fake_backup_obj)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def test_restore_backup(self):"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        self._test_rpc_api(\u0027restore_backup\u0027,"},{"line_number":46,"context_line":"                           rpc_method\u003d\u0027cast\u0027,"},{"line_number":47,"context_line":"                           server\u003d\u0027fake_volume_host\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"96ccd3f9_d9723e4f","line":44,"in_reply_to":"93db8566_b9c30c03","updated":"2023-03-16 00:36:38.000000000","message":"Done","commit_id":"a2fec00a100969a1c723ab0a286560d3a9d15790"}],"cinder/volume/volume_utils.py":[{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"823d3c011f0521b41a5f90e49961b8f7a3a12910","unresolved":true,"context_lines":[{"line_number":1637,"context_line":""},{"line_number":1638,"context_line":""},{"line_number":1639,"context_line":"def is_all_zero(chunk: bytes) -\u003e bool:"},{"line_number":1640,"context_line":"    \"\"\"Return true is the chunk of bytes is all zeroes.\"\"\""},{"line_number":1641,"context_line":"    # This is not optimized at all. See what Knuth said about it."},{"line_number":1642,"context_line":"    return sum(chunk) \u003d\u003d 0"}],"source_content_type":"text/x-python","patch_set":7,"id":"f050792e_11d03a75","line":1640,"updated":"2023-02-08 16:20:27.000000000","message":"Return true /if/","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"6c5444233980f5012fa65161c5411d5eb818830f","unresolved":false,"context_lines":[{"line_number":1637,"context_line":""},{"line_number":1638,"context_line":""},{"line_number":1639,"context_line":"def is_all_zero(chunk: bytes) -\u003e bool:"},{"line_number":1640,"context_line":"    \"\"\"Return true is the chunk of bytes is all zeroes.\"\"\""},{"line_number":1641,"context_line":"    # This is not optimized at all. See what Knuth said about it."},{"line_number":1642,"context_line":"    return sum(chunk) \u003d\u003d 0"}],"source_content_type":"text/x-python","patch_set":7,"id":"ea3913c3_7a1a3bab","line":1640,"in_reply_to":"f050792e_11d03a75","updated":"2023-02-13 22:12:25.000000000","message":"Done","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"},{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"823d3c011f0521b41a5f90e49961b8f7a3a12910","unresolved":true,"context_lines":[{"line_number":1639,"context_line":"def is_all_zero(chunk: bytes) -\u003e bool:"},{"line_number":1640,"context_line":"    \"\"\"Return true is the chunk of bytes is all zeroes.\"\"\""},{"line_number":1641,"context_line":"    # This is not optimized at all. See what Knuth said about it."},{"line_number":1642,"context_line":"    return sum(chunk) \u003d\u003d 0"}],"source_content_type":"text/x-python","patch_set":7,"id":"f25f8981_19aca0b7","line":1642,"updated":"2023-02-08 16:20:27.000000000","message":"This I think reads clearer and is more efficient:\n\n    zero_chunk \u003d bytes(len(chunk))\n    return chunk \u003d\u003d zero_chunk","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"6c5444233980f5012fa65161c5411d5eb818830f","unresolved":false,"context_lines":[{"line_number":1639,"context_line":"def is_all_zero(chunk: bytes) -\u003e bool:"},{"line_number":1640,"context_line":"    \"\"\"Return true is the chunk of bytes is all zeroes.\"\"\""},{"line_number":1641,"context_line":"    # This is not optimized at all. See what Knuth said about it."},{"line_number":1642,"context_line":"    return sum(chunk) \u003d\u003d 0"}],"source_content_type":"text/x-python","patch_set":7,"id":"a46b5c2d_07ffd669","line":1642,"in_reply_to":"f25f8981_19aca0b7","updated":"2023-02-13 22:12:25.000000000","message":"Very interesting. The comparison method that you suggest is about 100 times faster. In C, it\u0027s much better to read from one cache area and add up than from two and compare, on modern CPUs anyway.","commit_id":"69d7d8cb138dd5f626d7871990d73b548199665e"}],"releasenotes/notes/backup-sparse-e186ac1ff56ff033.yaml":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"c132f638c52daed32e001385aa8f7b1a0632de22","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The restore operation of the Cinder backup service now restores into"},{"line_number":5,"context_line":"    sparse volumes, if possible. So, operators no longer need more space"},{"line_number":6,"context_line":"    than used previously when they restore from a disaster."}],"source_content_type":"text/x-yaml","patch_set":10,"id":"ac120273_d84d4448","line":6,"range":{"start_line":2,"start_character":0,"end_line":6,"end_character":59},"updated":"2023-03-01 11:44:06.000000000","message":"this needs to be updated to fixes section with the bug link","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e03e94476eaad35dc1e9eadda2c715a0021693a5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The restore operation of the Cinder backup service now restores into"},{"line_number":5,"context_line":"    sparse volumes, if possible. So, operators no longer need more space"},{"line_number":6,"context_line":"    than used previously when they restore from a disaster."}],"source_content_type":"text/x-yaml","patch_set":10,"id":"64da7788_a3f36fe8","line":6,"range":{"start_line":2,"start_character":0,"end_line":6,"end_character":59},"in_reply_to":"ac120273_d84d4448","updated":"2023-03-02 06:37:52.000000000","message":"Done","commit_id":"36c8a396fa576feef000334198e5b6d7feecd25c"}]}
