)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"6741e7a2c718a510f634041bb8badd1c8bc0ca37","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"515840bc_fc1d4d2f","updated":"2026-08-25 20:09:41.000000000","message":"This was pulled out from 993193: s3api: Checksum Persistence on MPUs | https://review.opendev.org/c/openstack/swift/+/993193 to make reviewing this patch  easier","commit_id":"0c12ec37574da8dc07a65ae2964b7029ef4cb4fd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6ce8e10b83c3d15c6f7ea6a3fdde9168a136c374","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"f659dfd8_53dd8d9d","updated":"2026-08-26 14:53:32.000000000","message":"I left some suggestions here https://review.opendev.org/c/openstack/swift/+/1002516 but that is based on a later patch","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"ff58eca5810d9eaa819c2ba455d5d61896041432","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"d1b03f32_5850e96b","updated":"2026-08-27 12:54:43.000000000","message":"LGTM.\n\nanycrc is in no dependency file, so 5 tests in TestCRCCombine are skipped if not installed; installed it manually to verify they work.","commit_id":"1cbc7dc25a1064eb003ac9af2a393cbc3a348ef8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c79eec82429776b1034ba4e7f2ae936add138e2e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"bb317e63_986958e1","updated":"2026-08-27 12:14:41.000000000","message":"related follow-ups\n\n 1002636: s3api: warn of missing crc combine functions on startup | https://review.opendev.org/c/openstack/swift/+/1002636\n \n 1002635: checksum.py: unit test improvements | https://review.opendev.org/c/openstack/swift/+/1002635","commit_id":"1cbc7dc25a1064eb003ac9af2a393cbc3a348ef8"}],"swift/common/utils/checksum.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6ce8e10b83c3d15c6f7ea6a3fdde9168a136c374","unresolved":true,"context_lines":[{"line_number":36,"context_line":"    crc64nvme_combine_anycrc \u003d crc64nvme_anycrc_model.combine"},{"line_number":37,"context_line":"    crc32c_anycrc \u003d crc32c_anycrc_model.calc"},{"line_number":38,"context_line":"    crc64nvme_anycrc \u003d crc64nvme_anycrc_model.calc"},{"line_number":39,"context_line":"else:"},{"line_number":40,"context_line":"    crc32_combine_anycrc \u003d None"},{"line_number":41,"context_line":"    crc32c_combine_anycrc \u003d None"},{"line_number":42,"context_line":"    crc64nvme_combine_anycrc \u003d None"}],"source_content_type":"text/x-python","patch_set":4,"id":"12302d5c_8d8f3177","line":39,"updated":"2026-08-26 14:53:32.000000000","message":"in the ``else`` case the module does not get any of the ``*_model`` attributes, which implies that they are only used in the scope of the ``if`` case, but they do become module attributes in the ``if`` case, which could lead to confusion. They don\u0027t seem necessary, just dereferences, so perhaps drop them?\n\n```\ndiff --git a/swift/common/utils/checksum.py b/swift/common/utils/checksum.py\nindex a5a6804cf..2216a5260 100644\n--- a/swift/common/utils/checksum.py\n+++ b/swift/common/utils/checksum.py\n@@ -28,14 +28,11 @@ import zlib\n \n # See if anycrc is available...\n if anycrc:\n-    crc32_anycrc_model \u003d anycrc.Model(\u0027CRC32\u0027)\n-    crc32c_anycrc_model \u003d anycrc.Model(\u0027CRC32C\u0027)\n-    crc64nvme_anycrc_model \u003d anycrc.Model(\u0027CRC64-NVME\u0027)\n-    crc32_combine_anycrc \u003d crc32_anycrc_model.combine\n-    crc32c_combine_anycrc \u003d crc32c_anycrc_model.combine\n-    crc64nvme_combine_anycrc \u003d crc64nvme_anycrc_model.combine\n-    crc32c_anycrc \u003d crc32c_anycrc_model.calc\n-    crc64nvme_anycrc \u003d crc64nvme_anycrc_model.calc\n+    crc32_combine_anycrc \u003d anycrc.Model(\u0027CRC32\u0027).combine\n+    crc32c_combine_anycrc \u003d anycrc.Model(\u0027CRC32C\u0027).combine\n+    crc64nvme_combine_anycrc \u003d anycrc.Model(\u0027CRC64-NVME\u0027).combine\n+    crc32c_anycrc \u003d anycrc.Model(\u0027CRC32C\u0027).calc\n+    crc64nvme_anycrc \u003d anycrc.Model(\u0027CRC64-NVME\u0027).calc\n else:\n     crc32_combine_anycrc \u003d None\n     crc32c_combine_anycrc \u003d None\n\n```\n\nBTW my LLM tells me the additional cost of building each Model twice is negligible","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"32e3eed2517febd8435ff77cf0d781ffea278f10","unresolved":true,"context_lines":[{"line_number":36,"context_line":"    crc64nvme_combine_anycrc \u003d crc64nvme_anycrc_model.combine"},{"line_number":37,"context_line":"    crc32c_anycrc \u003d crc32c_anycrc_model.calc"},{"line_number":38,"context_line":"    crc64nvme_anycrc \u003d crc64nvme_anycrc_model.calc"},{"line_number":39,"context_line":"else:"},{"line_number":40,"context_line":"    crc32_combine_anycrc \u003d None"},{"line_number":41,"context_line":"    crc32c_combine_anycrc \u003d None"},{"line_number":42,"context_line":"    crc64nvme_combine_anycrc \u003d None"}],"source_content_type":"text/x-python","patch_set":4,"id":"e1c8ea8e_6a2804b8","line":39,"in_reply_to":"12302d5c_8d8f3177","updated":"2026-08-26 18:16:17.000000000","message":"I think this is more straightforward and we can add it","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"44cdb764e55796cb229785533ea8444d5c511f27","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    crc64nvme_combine_anycrc \u003d crc64nvme_anycrc_model.combine"},{"line_number":37,"context_line":"    crc32c_anycrc \u003d crc32c_anycrc_model.calc"},{"line_number":38,"context_line":"    crc64nvme_anycrc \u003d crc64nvme_anycrc_model.calc"},{"line_number":39,"context_line":"else:"},{"line_number":40,"context_line":"    crc32_combine_anycrc \u003d None"},{"line_number":41,"context_line":"    crc32c_combine_anycrc \u003d None"},{"line_number":42,"context_line":"    crc64nvme_combine_anycrc \u003d None"}],"source_content_type":"text/x-python","patch_set":4,"id":"ecca717b_d3b8a734","line":39,"in_reply_to":"e1c8ea8e_6a2804b8","updated":"2026-08-26 19:10:59.000000000","message":"Done","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6ce8e10b83c3d15c6f7ea6a3fdde9168a136c374","unresolved":true,"context_lines":[{"line_number":169,"context_line":"    \"\"\""},{"line_number":170,"context_line":"    Helper that works like a hashlib hasher, but with a CRC."},{"line_number":171,"context_line":"    \"\"\""},{"line_number":172,"context_line":"    def __init__(self, name, crc_func, crc_combine_func, data\u003dNone,"},{"line_number":173,"context_line":"                 initial_value\u003d0, width\u003d32):"},{"line_number":174,"context_line":"        \"\"\""},{"line_number":175,"context_line":"        Initialize the CRCHasher."}],"source_content_type":"text/x-python","patch_set":4,"id":"b9d4c26d_d61c2caa","line":172,"range":{"start_line":172,"start_character":39,"end_line":172,"end_character":55},"updated":"2026-08-26 14:53:32.000000000","message":"this is added as a new positional argument but always called using a keyword.\n\nIt\u0027s probably ok to steal the fourth position from ``data`` but safer to add new args as keyword args.","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"32e3eed2517febd8435ff77cf0d781ffea278f10","unresolved":true,"context_lines":[{"line_number":169,"context_line":"    \"\"\""},{"line_number":170,"context_line":"    Helper that works like a hashlib hasher, but with a CRC."},{"line_number":171,"context_line":"    \"\"\""},{"line_number":172,"context_line":"    def __init__(self, name, crc_func, crc_combine_func, data\u003dNone,"},{"line_number":173,"context_line":"                 initial_value\u003d0, width\u003d32):"},{"line_number":174,"context_line":"        \"\"\""},{"line_number":175,"context_line":"        Initialize the CRCHasher."}],"source_content_type":"text/x-python","patch_set":4,"id":"e36271d5_a0211bec","line":172,"range":{"start_line":172,"start_character":39,"end_line":172,"end_character":55},"in_reply_to":"b9d4c26d_d61c2caa","updated":"2026-08-26 18:16:17.000000000","message":"Yea `crc_combine_func` should be on a keyword arg","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"44cdb764e55796cb229785533ea8444d5c511f27","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    \"\"\""},{"line_number":170,"context_line":"    Helper that works like a hashlib hasher, but with a CRC."},{"line_number":171,"context_line":"    \"\"\""},{"line_number":172,"context_line":"    def __init__(self, name, crc_func, crc_combine_func, data\u003dNone,"},{"line_number":173,"context_line":"                 initial_value\u003d0, width\u003d32):"},{"line_number":174,"context_line":"        \"\"\""},{"line_number":175,"context_line":"        Initialize the CRCHasher."}],"source_content_type":"text/x-python","patch_set":4,"id":"0d1aa83d_74381868","line":172,"range":{"start_line":172,"start_character":39,"end_line":172,"end_character":55},"in_reply_to":"e36271d5_a0211bec","updated":"2026-08-26 19:10:59.000000000","message":"Done","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6ce8e10b83c3d15c6f7ea6a3fdde9168a136c374","unresolved":true,"context_lines":[{"line_number":179,"context_line":"        :param data: Data to update the hasher."},{"line_number":180,"context_line":"        :param initial_value: Initial CRC value."},{"line_number":181,"context_line":"        :param width: Width (in bits) of CRC values."},{"line_number":182,"context_line":"        :param crc_combine_func: Function to combine two CRC values."},{"line_number":183,"context_line":"        \"\"\""},{"line_number":184,"context_line":"        self.name \u003d name"},{"line_number":185,"context_line":"        self.crc_func \u003d crc_func"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ea6e72c_bb3e1cbc","line":182,"updated":"2026-08-26 14:53:32.000000000","message":"nit: we usually list params in the order of the signature, but perhaps the arg should move to the end of the signature anyway as a kwarg?","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"32e3eed2517febd8435ff77cf0d781ffea278f10","unresolved":true,"context_lines":[{"line_number":179,"context_line":"        :param data: Data to update the hasher."},{"line_number":180,"context_line":"        :param initial_value: Initial CRC value."},{"line_number":181,"context_line":"        :param width: Width (in bits) of CRC values."},{"line_number":182,"context_line":"        :param crc_combine_func: Function to combine two CRC values."},{"line_number":183,"context_line":"        \"\"\""},{"line_number":184,"context_line":"        self.name \u003d name"},{"line_number":185,"context_line":"        self.crc_func \u003d crc_func"}],"source_content_type":"text/x-python","patch_set":4,"id":"b8c10e25_72c545fe","line":182,"in_reply_to":"9ea6e72c_bb3e1cbc","updated":"2026-08-26 18:16:17.000000000","message":"Will fix and move `crc_combine_func` to the end to match the docstring","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"44cdb764e55796cb229785533ea8444d5c511f27","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        :param data: Data to update the hasher."},{"line_number":180,"context_line":"        :param initial_value: Initial CRC value."},{"line_number":181,"context_line":"        :param width: Width (in bits) of CRC values."},{"line_number":182,"context_line":"        :param crc_combine_func: Function to combine two CRC values."},{"line_number":183,"context_line":"        \"\"\""},{"line_number":184,"context_line":"        self.name \u003d name"},{"line_number":185,"context_line":"        self.crc_func \u003d crc_func"}],"source_content_type":"text/x-python","patch_set":4,"id":"e6c77e11_7e48424e","line":182,"in_reply_to":"b8c10e25_72c545fe","updated":"2026-08-26 19:10:59.000000000","message":"Done","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6ce8e10b83c3d15c6f7ea6a3fdde9168a136c374","unresolved":true,"context_lines":[{"line_number":187,"context_line":"        if width not in (32, 64):"},{"line_number":188,"context_line":"            raise ValueError(\"CRCHasher only supports 32- or 64-bit CRCs\")"},{"line_number":189,"context_line":"        self.width \u003d width"},{"line_number":190,"context_line":"        self.crc_combine_func \u003d crc_combine_func"},{"line_number":191,"context_line":"        if data is not None:"},{"line_number":192,"context_line":"            self.update(data)"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"020cb2df_423de666","line":190,"updated":"2026-08-26 14:53:32.000000000","message":"I\u0027m not convinced that this is the best way to expose this function. The class is never used as both a hasher and a combine. When the combine function is used, the class does not maintain any state; the class is just acting as a reference holder to the function. Then in multi_upload we implement a hasher class that maintains the result of using the combine function.\n\nWe than also have places where we have:\n```\nif checksum_hasher.crc_combine_func is None\n```\n\nwhich isn\u0027t particularly elegant.\n\nI think it would be better to have the \u0027combine\u0027 method actually mutate self.crc so that the class that actually maintains the state of calling combine.\n\nAlso, add a ``can_combine`` property that raises NotImplementedError so that the implementation is hidden from the caller.","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"32e3eed2517febd8435ff77cf0d781ffea278f10","unresolved":true,"context_lines":[{"line_number":187,"context_line":"        if width not in (32, 64):"},{"line_number":188,"context_line":"            raise ValueError(\"CRCHasher only supports 32- or 64-bit CRCs\")"},{"line_number":189,"context_line":"        self.width \u003d width"},{"line_number":190,"context_line":"        self.crc_combine_func \u003d crc_combine_func"},{"line_number":191,"context_line":"        if data is not None:"},{"line_number":192,"context_line":"            self.update(data)"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"26114e33_e3df4f4f","line":190,"in_reply_to":"020cb2df_423de666","updated":"2026-08-26 18:16:17.000000000","message":"\u003e the class does not maintain any state\n\nI think this is enough of a reason to use `combine` method with a `con_combine` property, will add!","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"10cad3163deb7385daf2ca43b5631494867dfaff","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        if width not in (32, 64):"},{"line_number":188,"context_line":"            raise ValueError(\"CRCHasher only supports 32- or 64-bit CRCs\")"},{"line_number":189,"context_line":"        self.width \u003d width"},{"line_number":190,"context_line":"        self.crc_combine_func \u003d crc_combine_func"},{"line_number":191,"context_line":"        if data is not None:"},{"line_number":192,"context_line":"            self.update(data)"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"4c71f31d_ee4eebcd","line":190,"in_reply_to":"26114e33_e3df4f4f","updated":"2026-08-27 05:57:05.000000000","message":"Done","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6ce8e10b83c3d15c6f7ea6a3fdde9168a136c374","unresolved":true,"context_lines":[{"line_number":237,"context_line":"                         width\u003dself.width,"},{"line_number":238,"context_line":"                         crc_combine_func\u003dself.crc_combine_func)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    def combine(self, crc1, crc2, crc2_len):"},{"line_number":241,"context_line":"        \"\"\""},{"line_number":242,"context_line":"        Combine two CRC values using anycrc\u0027s combine implementation."},{"line_number":243,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"d50602ed_544dbbf4","line":240,"updated":"2026-08-26 14:53:32.000000000","message":"later in the patch chain, when combine is called, the value must first be cast to an int from a digest bytes. That conversion could/should be encapsulated in this class since it is the reverse of the ``digest`` method.","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"10cad3163deb7385daf2ca43b5631494867dfaff","unresolved":false,"context_lines":[{"line_number":237,"context_line":"                         width\u003dself.width,"},{"line_number":238,"context_line":"                         crc_combine_func\u003dself.crc_combine_func)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    def combine(self, crc1, crc2, crc2_len):"},{"line_number":241,"context_line":"        \"\"\""},{"line_number":242,"context_line":"        Combine two CRC values using anycrc\u0027s combine implementation."},{"line_number":243,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"cfd65b17_dd84fdb5","line":240,"in_reply_to":"4d52a76f_52f59974","updated":"2026-08-27 05:57:05.000000000","message":"Done","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"32e3eed2517febd8435ff77cf0d781ffea278f10","unresolved":true,"context_lines":[{"line_number":237,"context_line":"                         width\u003dself.width,"},{"line_number":238,"context_line":"                         crc_combine_func\u003dself.crc_combine_func)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    def combine(self, crc1, crc2, crc2_len):"},{"line_number":241,"context_line":"        \"\"\""},{"line_number":242,"context_line":"        Combine two CRC values using anycrc\u0027s combine implementation."},{"line_number":243,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"4d52a76f_52f59974","line":240,"in_reply_to":"d50602ed_544dbbf4","updated":"2026-08-26 18:16:17.000000000","message":"Yes I think we can encapsulate it too","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6ce8e10b83c3d15c6f7ea6a3fdde9168a136c374","unresolved":true,"context_lines":[{"line_number":247,"context_line":"        if self.crc_combine_func is None:"},{"line_number":248,"context_line":"            raise NotImplementedError("},{"line_number":249,"context_line":"                \u0027no combine implementation, install anycrc\u0027)"},{"line_number":250,"context_line":"        return self.crc_combine_func(crc1, crc2, crc2_len)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"def crc32(data\u003dNone, initial_value\u003d0):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba82c3cc_7613e880","line":250,"updated":"2026-08-26 14:53:32.000000000","message":"this could just update ``self.crc``. Otherwise, self.crc is unused when we want a combining hasher, which makes this a weird interface, and the ``_FullObjectChecksumHashe`` has to maintain crc state.","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"32e3eed2517febd8435ff77cf0d781ffea278f10","unresolved":true,"context_lines":[{"line_number":247,"context_line":"        if self.crc_combine_func is None:"},{"line_number":248,"context_line":"            raise NotImplementedError("},{"line_number":249,"context_line":"                \u0027no combine implementation, install anycrc\u0027)"},{"line_number":250,"context_line":"        return self.crc_combine_func(crc1, crc2, crc2_len)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"def crc32(data\u003dNone, initial_value\u003d0):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ead9d21e_be8d0ee4","line":250,"in_reply_to":"ba82c3cc_7613e880","updated":"2026-08-26 18:16:17.000000000","message":"\u003e Otherwise, self.crc is unused \n\nYes this does lead to a strange interface I agree","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"44cdb764e55796cb229785533ea8444d5c511f27","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        if self.crc_combine_func is None:"},{"line_number":248,"context_line":"            raise NotImplementedError("},{"line_number":249,"context_line":"                \u0027no combine implementation, install anycrc\u0027)"},{"line_number":250,"context_line":"        return self.crc_combine_func(crc1, crc2, crc2_len)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"def crc32(data\u003dNone, initial_value\u003d0):"}],"source_content_type":"text/x-python","patch_set":4,"id":"e10bc7de_fb55f6e5","line":250,"in_reply_to":"ead9d21e_be8d0ee4","updated":"2026-08-26 19:10:59.000000000","message":"Done","commit_id":"4ea9f5841c407c0d9f32e82e51fd60def83c3860"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c79eec82429776b1034ba4e7f2ae936add138e2e","unresolved":true,"context_lines":[{"line_number":320,"context_line":"            \u0027No implementation found for CRC64NVME; \u0027"},{"line_number":321,"context_line":"            \u0027install ISA-L or anycrc for support.\u0027)"},{"line_number":322,"context_line":"    else:"},{"line_number":323,"context_line":"        logger.info(\u0027Using %s implementation for CRC64NVME.\u0027 % impl.__name__)"}],"source_content_type":"text/x-python","patch_set":7,"id":"d2a2d921_f24fc33e","line":323,"updated":"2026-08-27 12:14:41.000000000","message":"we probably want to log a warning if the combine functions are not available...but maybe not until we merge MPU checksum support when they are required? See 1002636: s3api: warn of missing crc combine functions on startup | https://review.opendev.org/c/openstack/swift/+/1002636","commit_id":"1cbc7dc25a1064eb003ac9af2a393cbc3a348ef8"}],"test/unit/common/utils/test_checksum.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c79eec82429776b1034ba4e7f2ae936add138e2e","unresolved":true,"context_lines":[{"line_number":245,"context_line":"        self.assertEqual(final_crc.digest(), combined_crc.digest())"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    @unittest.skipIf("},{"line_number":248,"context_line":"        checksum.crc32_combine_anycrc is None, \u0027No anycrc CRC32 combine\u0027)"},{"line_number":249,"context_line":"    def test_crc32(self):"},{"line_number":250,"context_line":"        self.check_combine(checksum.crc32)"},{"line_number":251,"context_line":"        self.check_combine_multiple(checksum.crc32)"}],"source_content_type":"text/x-python","patch_set":7,"id":"6293bd0c_faa52271","line":248,"updated":"2026-08-27 12:14:41.000000000","message":"nit: we could have a decorator for this skip condition similar to requires_crc32c","commit_id":"1cbc7dc25a1064eb003ac9af2a393cbc3a348ef8"}]}
