)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"fd54a164f3bc8a194be752f9fb506907d764990b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"deca504b_dca6c371","updated":"2026-09-04 00:14:51.000000000","message":"We NEED this patch! but python 3.7 doesn\u0027t have ``functools.cache``. also cooperative yielding can be skipped with anycrc.","commit_id":"928014eb6bcc49b95df619f406e35f4851fdac18"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"17bba1d0f70250aa2cb1c2093cfe5431832fc332","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"453082aa_74610754","updated":"2026-09-03 22:59:01.000000000","message":"python3.7 returns this error\n\n```\n/usr/local/lib/python3.7/importlib/__init__.py:127: in import_module\n    return _bootstrap._gcd_import(name[level:], package, level)\n\u003cfrozen importlib._bootstrap\u003e:1006: in _gcd_import\n    ???\n\u003cfrozen importlib._bootstrap\u003e:983: in _find_and_load\n    ???\n\u003cfrozen importlib._bootstrap\u003e:953: in _find_and_load_unlocked\n    ???\n\u003cfrozen importlib._bootstrap\u003e:219: in _call_with_frames_removed\n    ???\n\u003cfrozen importlib._bootstrap\u003e:1006: in _gcd_import\n    ???\n\u003cfrozen importlib._bootstrap\u003e:983: in _find_and_load\n    ???\n\u003cfrozen importlib._bootstrap\u003e:953: in _find_and_load_unlocked\n    ???\n\u003cfrozen importlib._bootstrap\u003e:219: in _call_with_frames_removed\n    ???\n\u003cfrozen importlib._bootstrap\u003e:1006: in _gcd_import\n    ???\n\u003cfrozen importlib._bootstrap\u003e:983: in _find_and_load\n    ???\n\u003cfrozen importlib._bootstrap\u003e:967: in _find_and_load_unlocked\n    ???\n\u003cfrozen importlib._bootstrap\u003e:677: in _load_unlocked\n    ???\n\u003cfrozen importlib._bootstrap_external\u003e:728: in exec_module\n    ???\n\u003cfrozen importlib._bootstrap\u003e:219: in _call_with_frames_removed\n    ???\ntest/unit/__init__.py:51: in \u003cmodule\u003e\n    from swift.common.utils import Timestamp, md5, close_if_possible, checksum\nswift/common/utils/checksum.py:193: in \u003cmodule\u003e\n    @functools.cache\nE   AttributeError: module \u0027functools\u0027 has no attribute \u0027cache\u0027\n\n```","commit_id":"928014eb6bcc49b95df619f406e35f4851fdac18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"12798d1465c37a96b7c2e8654bc9a39319f00818","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b311816b_6d861072","in_reply_to":"deca504b_dca6c371","updated":"2026-09-04 18:59:06.000000000","message":"Introduced in py39, apparently! Fortunately, it\u0027s equivalent to `functools.lru_cache(maxsize\u003dNone)`.","commit_id":"928014eb6bcc49b95df619f406e35f4851fdac18"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"1c8360173c4db0c8e1e53dcb341d520458ace6e2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"33294a1f_92b14aa8","updated":"2026-09-16 19:07:59.000000000","message":"I am pushing up a new update to fix those.","commit_id":"25e0fd1fd8af0b9626f226b80be11acbf5dc4969"}],"swift/common/middleware/s3api/controllers/multi_upload.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"608d8d05920dcc982cc07809f8d67fc2185a4631","unresolved":true,"context_lines":[{"line_number":791,"context_line":"                continue"},{"line_number":792,"context_line":""},{"line_number":793,"context_line":"            if isinstance(hasher, _FullObjectChecksumHasher) and \\"},{"line_number":794,"context_line":"                    0 \u003d\u003d (index + 1) % 250:"},{"line_number":795,"context_line":"                # If we needed a pure-Python combine function, it can get"},{"line_number":796,"context_line":"                # CPU-bound; give other requests a chance to jump in"},{"line_number":797,"context_line":"                sleep(0)"}],"source_content_type":"text/x-python","patch_set":1,"id":"b36fa760_d8dd26d4","line":794,"updated":"2026-09-03 21:03:07.000000000","message":"This might not be often enough -- should be every 20ms or so given part size like 4GB on my crap ARM box... but with a pathological 4GB - 1 part size, it\u0027s more like every 340ms.\n\nMaybe `% 50` would be OK? That\u0027d be more like every 70ms at least...","commit_id":"a345e4a02dc9d5b8d06a7fef9742766377ada33b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b434c65f685ad2af9f9c5e926ac39a3ca70af43a","unresolved":false,"context_lines":[{"line_number":791,"context_line":"                continue"},{"line_number":792,"context_line":""},{"line_number":793,"context_line":"            if isinstance(hasher, _FullObjectChecksumHasher) and \\"},{"line_number":794,"context_line":"                    0 \u003d\u003d (index + 1) % 250:"},{"line_number":795,"context_line":"                # If we needed a pure-Python combine function, it can get"},{"line_number":796,"context_line":"                # CPU-bound; give other requests a chance to jump in"},{"line_number":797,"context_line":"                sleep(0)"}],"source_content_type":"text/x-python","patch_set":1,"id":"f1719b2c_c51a1046","line":794,"in_reply_to":"b36fa760_d8dd26d4","updated":"2026-09-14 23:32:54.000000000","message":"Done","commit_id":"a345e4a02dc9d5b8d06a7fef9742766377ada33b"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"fd54a164f3bc8a194be752f9fb506907d764990b","unresolved":true,"context_lines":[{"line_number":790,"context_line":"                missing_part_checksum \u003d True"},{"line_number":791,"context_line":"                continue"},{"line_number":792,"context_line":""},{"line_number":793,"context_line":"            if isinstance(hasher, _FullObjectChecksumHasher) and \\"},{"line_number":794,"context_line":"                    0 \u003d\u003d (index + 1) % 50:"},{"line_number":795,"context_line":"                # If we needed a pure-Python combine function, it can get"},{"line_number":796,"context_line":"                # CPU-bound; give other requests a chance to jump in"}],"source_content_type":"text/x-python","patch_set":2,"id":"834b00e5_46bf6a10","line":793,"updated":"2026-09-04 00:14:51.000000000","message":"anycrc combine is fast and doesn\u0027t require cooperative yielding, however it will also yield at here unnecessarily\n\nCould we move the cooperative-yield counter into ``_FullObjectChecksumHasher.update()`` and enable it only when the selected combine function is one of the pure-Python fallbacks? That would avoid yielding for fast anycrc combines and would count actual combine operations rather than manifest positions, which can be skipped for failed HEADs or missing checksum metadata.\n\n```\nclass _FullObjectChecksumHasher:\n    def __init__(self, checksum_attrs, yield_frequency\u003d50):\n        self.checksum_hasher \u003d _get_checksum_hasher(\n            checksum_attrs, require_combine\u003dTrue)\n        self.combine_count \u003d 0\n        self.yield_frequency \u003d yield_frequency\n        self.needs_yield \u003d self.checksum_hasher.crc_combine_func in (\n            checksum.crc32_combine_python,\n            checksum.crc32c_combine_python,\n            checksum.crc64nvme_combine_python,\n        )\n\n    def update(self, b64digest, length, *args, **kwargs):\n        digest \u003d validate_checksum_value(\n            self.checksum_hasher, b64digest)\n        crc \u003d self.checksum_hasher.crc_from_digest(digest)\n        self.checksum_hasher.combine(crc, length)\n\n        if self.needs_yield:\n            self.combine_count +\u003d 1\n            if self.combine_count % self.yield_frequency \u003d\u003d 0:\n                sleep(0)\n```","commit_id":"928014eb6bcc49b95df619f406e35f4851fdac18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"12798d1465c37a96b7c2e8654bc9a39319f00818","unresolved":false,"context_lines":[{"line_number":790,"context_line":"                missing_part_checksum \u003d True"},{"line_number":791,"context_line":"                continue"},{"line_number":792,"context_line":""},{"line_number":793,"context_line":"            if isinstance(hasher, _FullObjectChecksumHasher) and \\"},{"line_number":794,"context_line":"                    0 \u003d\u003d (index + 1) % 50:"},{"line_number":795,"context_line":"                # If we needed a pure-Python combine function, it can get"},{"line_number":796,"context_line":"                # CPU-bound; give other requests a chance to jump in"}],"source_content_type":"text/x-python","patch_set":2,"id":"79b6094b_977b287a","line":793,"in_reply_to":"834b00e5_46bf6a10","updated":"2026-09-04 18:59:06.000000000","message":"Done","commit_id":"928014eb6bcc49b95df619f406e35f4851fdac18"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"baceadf290cb87a57f7725098d5830fee9311c77","unresolved":true,"context_lines":[{"line_number":561,"context_line":"        crc \u003d self.checksum_hasher.crc_from_digest(digest)"},{"line_number":562,"context_line":"        self.checksum_hasher.combine(crc, length)"},{"line_number":563,"context_line":"        self.combine_calls +\u003d 1"},{"line_number":564,"context_line":"        if self.combine_calls % 50 \u003d\u003d 0 and \\"},{"line_number":565,"context_line":"                isinstance(self.checksum_hasher.combine, PythonCombine):"},{"line_number":566,"context_line":"            # If we needed a pure-Python combine function, it can get"},{"line_number":567,"context_line":"            # CPU-bound; give other requests a chance to jump in"}],"source_content_type":"text/x-python","patch_set":4,"id":"fc35ee17_f1203116","line":564,"updated":"2026-09-13 18:50:23.000000000","message":"that\u0027ll be great if we have tests that verify this one yield on the 50th Python combine and no yield for anycrc","commit_id":"fd43bf1c4512736aaf4a1923d4c39e4b1c69660a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b9b1c92495a8b7000b28b4b60441f97acd14656e","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        crc \u003d self.checksum_hasher.crc_from_digest(digest)"},{"line_number":562,"context_line":"        self.checksum_hasher.combine(crc, length)"},{"line_number":563,"context_line":"        self.combine_calls +\u003d 1"},{"line_number":564,"context_line":"        if self.combine_calls % 50 \u003d\u003d 0 and \\"},{"line_number":565,"context_line":"                isinstance(self.checksum_hasher.combine, PythonCombine):"},{"line_number":566,"context_line":"            # If we needed a pure-Python combine function, it can get"},{"line_number":567,"context_line":"            # CPU-bound; give other requests a chance to jump in"}],"source_content_type":"text/x-python","patch_set":4,"id":"2a5b7683_8a5c9e35","line":564,"in_reply_to":"fc35ee17_f1203116","updated":"2026-09-14 20:03:12.000000000","message":"Done","commit_id":"fd43bf1c4512736aaf4a1923d4c39e4b1c69660a"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"baceadf290cb87a57f7725098d5830fee9311c77","unresolved":true,"context_lines":[{"line_number":562,"context_line":"        self.checksum_hasher.combine(crc, length)"},{"line_number":563,"context_line":"        self.combine_calls +\u003d 1"},{"line_number":564,"context_line":"        if self.combine_calls % 50 \u003d\u003d 0 and \\"},{"line_number":565,"context_line":"                isinstance(self.checksum_hasher.combine, PythonCombine):"},{"line_number":566,"context_line":"            # If we needed a pure-Python combine function, it can get"},{"line_number":567,"context_line":"            # CPU-bound; give other requests a chance to jump in"},{"line_number":568,"context_line":"            sleep(0)"}],"source_content_type":"text/x-python","patch_set":4,"id":"61afee10_01d6db6d","line":565,"updated":"2026-09-13 18:50:23.000000000","message":"should it be ``crc_combine_func`` instead?\n```\nisinstance(self.checksum_hasher.crc_combine_func, PythonCombine):\n```","commit_id":"fd43bf1c4512736aaf4a1923d4c39e4b1c69660a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b9b1c92495a8b7000b28b4b60441f97acd14656e","unresolved":false,"context_lines":[{"line_number":562,"context_line":"        self.checksum_hasher.combine(crc, length)"},{"line_number":563,"context_line":"        self.combine_calls +\u003d 1"},{"line_number":564,"context_line":"        if self.combine_calls % 50 \u003d\u003d 0 and \\"},{"line_number":565,"context_line":"                isinstance(self.checksum_hasher.combine, PythonCombine):"},{"line_number":566,"context_line":"            # If we needed a pure-Python combine function, it can get"},{"line_number":567,"context_line":"            # CPU-bound; give other requests a chance to jump in"},{"line_number":568,"context_line":"            sleep(0)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5b427967_2b6630c6","line":565,"in_reply_to":"61afee10_01d6db6d","updated":"2026-09-14 20:03:12.000000000","message":"D\u0027oh! Fixed.","commit_id":"fd43bf1c4512736aaf4a1923d4c39e4b1c69660a"}],"swift/common/utils/checksum.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"608d8d05920dcc982cc07809f8d67fc2185a4631","unresolved":true,"context_lines":[{"line_number":190,"context_line":"    return [_gf2_matrix_times(matrix, row) for row in matrix]"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"@functools.cache"},{"line_number":194,"context_line":"def _matrix_2_n(polynomial, width, n):"},{"line_number":195,"context_line":"    if n \u003d\u003d 0:"},{"line_number":196,"context_line":"        mat \u003d [0] * width"}],"source_content_type":"text/x-python","patch_set":1,"id":"cf0839ad_2087d02e","line":193,"updated":"2026-09-03 21:03:07.000000000","message":"FWIW, we expect no more than 36 entries per polynomial -- 5GB has a 33-bit `length`, plus the starting `n \u003d 3` in `_crc_shift`. And each entry is a list of `width` integers.\n```\n       3 algos\ntimes 36 entries\ntimes 64 integers per entry\ntimes  8 bytes per int\ntimes, say, an overhead factor of 3\n```\nI think we can ballpark it all as \u003c200KB?","commit_id":"a345e4a02dc9d5b8d06a7fef9742766377ada33b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1a9e09771262c8c4ddb2e02f1618bd258552d11b","unresolved":true,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"def _combine_func(polynomial, width):"},{"line_number":227,"context_line":"    def combine(crc1, crc2, length2):"},{"line_number":228,"context_line":"        \"\"\""},{"line_number":229,"context_line":"        Calculate the combined CRC of concatenated data."},{"line_number":230,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"f1a0a678_b4ade5b6","line":227,"updated":"2026-09-04 21:13:44.000000000","message":"Oh, right -- all the `_python` functions actually have `__name__ \u003d\u003d \"combine\"` -- the check in `multi_upload.py` won\u0027t work right.","commit_id":"f8610665c6221fad655de1a511b274a7caf8fb3e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b434c65f685ad2af9f9c5e926ac39a3ca70af43a","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"def _combine_func(polynomial, width):"},{"line_number":227,"context_line":"    def combine(crc1, crc2, length2):"},{"line_number":228,"context_line":"        \"\"\""},{"line_number":229,"context_line":"        Calculate the combined CRC of concatenated data."},{"line_number":230,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ea979844_9be7d61e","line":227,"in_reply_to":"f1a0a678_b4ade5b6","updated":"2026-09-14 23:32:54.000000000","message":"Done","commit_id":"f8610665c6221fad655de1a511b274a7caf8fb3e"}],"test/s3api/test_input_errors.py":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"1c8360173c4db0c8e1e53dcb341d520458ace6e2","unresolved":true,"context_lines":[{"line_number":30,"context_line":"from swift.common import bufferedhttp"},{"line_number":31,"context_line":"from swift.common.utils.checksum import anycrc, crc32"},{"line_number":32,"context_line":"from swift.common.utils.ipaddrs import parse_socket_string"},{"line_number":33,"context_line":"from test import requires_crc32_combine"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"from test.s3api import BaseS3TestCaseWithBucket, get_opt, get_s3_client"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1329c2ba_801a1829","line":33,"updated":"2026-09-16 19:07:59.000000000","message":"not needed anymore","commit_id":"25e0fd1fd8af0b9626f226b80be11acbf5dc4969"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"914b9ac34de6859886eddc63de699980d37de59b","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from swift.common import bufferedhttp"},{"line_number":31,"context_line":"from swift.common.utils.checksum import anycrc, crc32"},{"line_number":32,"context_line":"from swift.common.utils.ipaddrs import parse_socket_string"},{"line_number":33,"context_line":"from test import requires_crc32_combine"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"from test.s3api import BaseS3TestCaseWithBucket, get_opt, get_s3_client"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5724ac97_6b24218f","line":33,"in_reply_to":"1329c2ba_801a1829","updated":"2026-09-16 19:24:50.000000000","message":"Done","commit_id":"25e0fd1fd8af0b9626f226b80be11acbf5dc4969"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"1c8360173c4db0c8e1e53dcb341d520458ace6e2","unresolved":true,"context_lines":[{"line_number":1665,"context_line":"        ).encode(\u0027utf-8\u0027)"},{"line_number":1666,"context_line":"        return upload_id, complete_request_body"},{"line_number":1667,"context_line":""},{"line_number":1668,"context_line":"    @requires_crc32_combine"},{"line_number":1669,"context_line":"    def test_good_md5_good_sha_good_crc_header_no_content_length_mpu(self):"},{"line_number":1670,"context_line":"        # try uploading a checksum aware mpu part with missing content-length"},{"line_number":1671,"context_line":"        key \u003d \u0027mpu-name\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"310b06c2_8d3e47c0","line":1668,"updated":"2026-09-16 19:07:59.000000000","message":"need to remove this","commit_id":"25e0fd1fd8af0b9626f226b80be11acbf5dc4969"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"914b9ac34de6859886eddc63de699980d37de59b","unresolved":false,"context_lines":[{"line_number":1665,"context_line":"        ).encode(\u0027utf-8\u0027)"},{"line_number":1666,"context_line":"        return upload_id, complete_request_body"},{"line_number":1667,"context_line":""},{"line_number":1668,"context_line":"    @requires_crc32_combine"},{"line_number":1669,"context_line":"    def test_good_md5_good_sha_good_crc_header_no_content_length_mpu(self):"},{"line_number":1670,"context_line":"        # try uploading a checksum aware mpu part with missing content-length"},{"line_number":1671,"context_line":"        key \u003d \u0027mpu-name\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"48a6d14b_737f3061","line":1668,"in_reply_to":"310b06c2_8d3e47c0","updated":"2026-09-16 19:24:50.000000000","message":"Done","commit_id":"25e0fd1fd8af0b9626f226b80be11acbf5dc4969"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"1c8360173c4db0c8e1e53dcb341d520458ace6e2","unresolved":true,"context_lines":[{"line_number":2769,"context_line":"        resp \u003d self._complete_mpu_with_checksum_trailer(\u0027COMPOSITE\u0027)"},{"line_number":2770,"context_line":"        self.assertNotServerError(resp)"},{"line_number":2771,"context_line":""},{"line_number":2772,"context_line":"    @requires_crc32_combine"},{"line_number":2773,"context_line":"    def test_strm_unsgnd_pyld_trl_complete_mpu_trailer_full_object(self):"},{"line_number":2774,"context_line":"        resp \u003d self._complete_mpu_with_checksum_trailer(\u0027FULL_OBJECT\u0027)"},{"line_number":2775,"context_line":"        self.assertNotServerError(resp)"}],"source_content_type":"text/x-python","patch_set":7,"id":"868442d0_372bdffe","line":2772,"updated":"2026-09-16 19:07:59.000000000","message":"this one too","commit_id":"25e0fd1fd8af0b9626f226b80be11acbf5dc4969"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"914b9ac34de6859886eddc63de699980d37de59b","unresolved":false,"context_lines":[{"line_number":2769,"context_line":"        resp \u003d self._complete_mpu_with_checksum_trailer(\u0027COMPOSITE\u0027)"},{"line_number":2770,"context_line":"        self.assertNotServerError(resp)"},{"line_number":2771,"context_line":""},{"line_number":2772,"context_line":"    @requires_crc32_combine"},{"line_number":2773,"context_line":"    def test_strm_unsgnd_pyld_trl_complete_mpu_trailer_full_object(self):"},{"line_number":2774,"context_line":"        resp \u003d self._complete_mpu_with_checksum_trailer(\u0027FULL_OBJECT\u0027)"},{"line_number":2775,"context_line":"        self.assertNotServerError(resp)"}],"source_content_type":"text/x-python","patch_set":7,"id":"da388fb7_c2cdd494","line":2772,"in_reply_to":"868442d0_372bdffe","updated":"2026-09-16 19:24:50.000000000","message":"Done","commit_id":"25e0fd1fd8af0b9626f226b80be11acbf5dc4969"}],"test/s3api/test_object_checksums.py":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"baceadf290cb87a57f7725098d5830fee9311c77","unresolved":true,"context_lines":[{"line_number":1347,"context_line":"        cls.client \u003d cls.get_s3_client(1)"},{"line_number":1348,"context_line":"        cls.use_tls \u003d cls.client._endpoint.host.startswith(\u0027https:\u0027)"},{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":"    @requires_crc32_combine"},{"line_number":1351,"context_line":"    def test_zero_length_final_part(self):"},{"line_number":1352,"context_line":"        obj_name \u003d self.create_name(\u0027full-object-mpu-empty-final-part\u0027)"},{"line_number":1353,"context_line":"        first_part \u003d MPU_PART_BODIES[0]"}],"source_content_type":"text/x-python","patch_set":4,"id":"c7e5a20a_595b0032","side":"PARENT","line":1350,"updated":"2026-09-13 18:50:23.000000000","message":"nice, those combine tests no longer skip when anycrc is absent","commit_id":"4aedf6761dea26ea5f7c69ec1b75718f2f420e9e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b9b1c92495a8b7000b28b4b60441f97acd14656e","unresolved":false,"context_lines":[{"line_number":1347,"context_line":"        cls.client \u003d cls.get_s3_client(1)"},{"line_number":1348,"context_line":"        cls.use_tls \u003d cls.client._endpoint.host.startswith(\u0027https:\u0027)"},{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":"    @requires_crc32_combine"},{"line_number":1351,"context_line":"    def test_zero_length_final_part(self):"},{"line_number":1352,"context_line":"        obj_name \u003d self.create_name(\u0027full-object-mpu-empty-final-part\u0027)"},{"line_number":1353,"context_line":"        first_part \u003d MPU_PART_BODIES[0]"}],"source_content_type":"text/x-python","patch_set":4,"id":"b7165d39_018dbc72","side":"PARENT","line":1350,"in_reply_to":"c7e5a20a_595b0032","updated":"2026-09-14 20:03:12.000000000","message":"Yeah, I had like three related reasons for wanting the python fallback:\n\n- make our behavior more consistent -- `FULL_OBJECT` is *always* available\n- that in turn allows the checksum and s3api code to be simpler -- we can get get rid of `can_combine` and `require_combine` entirely\n- all of which means we can simplify our test matrix -- fewer conditional skips, don\u0027t need to test the 501 path at all","commit_id":"4aedf6761dea26ea5f7c69ec1b75718f2f420e9e"}],"test/unit/common/utils/test_checksum.py":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"fd54a164f3bc8a194be752f9fb506907d764990b","unresolved":true,"context_lines":[{"line_number":329,"context_line":"        self.assertEqual(4, hasher.digest_size)"},{"line_number":330,"context_line":"        self.assertEqual(zlib.crc32, hasher.crc_func)"},{"line_number":331,"context_line":"        self.assertEqual(32, hasher.width)"},{"line_number":332,"context_line":"        self.assertIsNotNone(hasher.crc_combine_func)"},{"line_number":333,"context_line":"        self.assertEqual(0, hasher.crc)"},{"line_number":334,"context_line":"        self.assertEqual(b\u0027\\x00\\x00\\x00\\x00\u0027, hasher.digest())"},{"line_number":335,"context_line":"        self.assertEqual(\u002700000000\u0027, hasher.hexdigest())"}],"source_content_type":"text/x-python","patch_set":2,"id":"ed2b1562_88e272f8","line":332,"updated":"2026-09-04 00:14:51.000000000","message":"this change verifies ``hasher.crc_combine_func`` won\u0027t be NONE. in additional, that\u0027ll be great to test ``anycrc`` still will be preferred choice.\n\n```\ndef test_crc32_combine_selection(self):\n    with mock.patch.object(\n            checksum, \u0027crc32_combine_anycrc\u0027, mock.sentinel.anycrc):\n        self.assertIs(\n            mock.sentinel.anycrc,\n            checksum._select_crc32_combine_impl())\n\n    with mock.patch.object(checksum, \u0027crc32_combine_anycrc\u0027, None):\n        self.assertIs(\n            checksum.crc32_combine_python,\n            checksum._select_crc32_combine_impl())\n```","commit_id":"928014eb6bcc49b95df619f406e35f4851fdac18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"12798d1465c37a96b7c2e8654bc9a39319f00818","unresolved":false,"context_lines":[{"line_number":329,"context_line":"        self.assertEqual(4, hasher.digest_size)"},{"line_number":330,"context_line":"        self.assertEqual(zlib.crc32, hasher.crc_func)"},{"line_number":331,"context_line":"        self.assertEqual(32, hasher.width)"},{"line_number":332,"context_line":"        self.assertIsNotNone(hasher.crc_combine_func)"},{"line_number":333,"context_line":"        self.assertEqual(0, hasher.crc)"},{"line_number":334,"context_line":"        self.assertEqual(b\u0027\\x00\\x00\\x00\\x00\u0027, hasher.digest())"},{"line_number":335,"context_line":"        self.assertEqual(\u002700000000\u0027, hasher.hexdigest())"}],"source_content_type":"text/x-python","patch_set":2,"id":"22ed2bc1_1cc2b047","line":332,"in_reply_to":"ed2b1562_88e272f8","updated":"2026-09-04 18:59:06.000000000","message":"Done","commit_id":"928014eb6bcc49b95df619f406e35f4851fdac18"}]}
