)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"19fb9384cb7111aff753e9cb2d534fa48d5fadcc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"090ad894_2ab3fe79","updated":"2025-02-06 15:46:39.000000000","message":"I\u0027m not sure what to make the ceph test failures...\n\n```\nFAIL: s3tests_boto3.functional.test_s3.test_object_read_unreadable\n----------------------------------------------------------------------\nTraceback (most recent call last):\n  File \"/home/zuul/venv/lib/python3.9/site-packages/nose/case.py\", line 197, in runTest\n    self.test(*self.arg)\n  File \"/home/zuul/s3compat/ceph-tests/s3tests_boto3/functional/test_s3.py\", line 13673, in test_object_read_unreadable\n    eq(status, 400)\nAssertionError: 404 !\u003d 400\n```","commit_id":"57782c24266abd2c85c177475000e51c15fe82b0"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"979ee75239a9ba020f037f984dea233faf8e4605","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"90afb256_7024e21a","updated":"2025-02-06 22:25:01.000000000","message":"i don\u0027t know if there\u0027s actually a bug here or this is just a cleanup refactor\n\nI guess the internal_client get_metadata is a \"but\" - but I haven\u0027t gone looking yet for where we might have relied on get_metadata in the consistency engine.","commit_id":"e577c38f99b482653e1732094300af5f7a92bde1"}],"swift/common/internal_client.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695eaaecb8cb72206186b0377f2e55ea883ab4c7","unresolved":true,"context_lines":[{"line_number":288,"context_line":"        metadata_prefix \u003d metadata_prefix.lower()"},{"line_number":289,"context_line":"        metadata \u003d {}"},{"line_number":290,"context_line":"        for k, v in resp.headers.items():"},{"line_number":291,"context_line":"            lkey \u003d k.encode(\u0027latin1\u0027).decode(\u0027utf8\u0027).lower().encode(\u0027utf8\u0027).decode(\u0027latin1\u0027)"},{"line_number":292,"context_line":"            if lkey.startswith(metadata_prefix):"},{"line_number":293,"context_line":"                metadata[lkey[len(metadata_prefix):]] \u003d v"},{"line_number":294,"context_line":"        return metadata"}],"source_content_type":"text/x-python","patch_set":1,"id":"ec9adb83_2b66f936","line":291,"updated":"2025-02-06 01:32:12.000000000","message":"Pop quiz, no cheating! 😜\n\nWhat\u0027s the length of\n```\n[(c, x) for x in range(256) if len((c:\u003dchr(x)).upper()) !\u003d 1 or len(c.lower()) !\u003d 1]\n```\n? Of\n```\n[(c, x) for x in range(256) if (c:\u003dchr(x)).upper().lower() !\u003d c.lower()]\n```\n? And let\u0027s not even get into the locale-specific nature of it. (Hi, [dotless I](https://en.wikipedia.org/wiki/Dotted_and_dotless_I_in_computing)!)\n\nGet the utf8 shenanigans out of there and you\u0027ve got yourself a deal!\n\n---\n\nFWIW, working only on the ascii bits is at least (fairly) internally-consistent; cf.\n- https://github.com/openstack/swift/blob/master/swift/common/header_key_dict.py#L32\n- https://github.com/openstack/swift/blob/master/swift/common/http_protocol.py#L192-L193\n- https://github.com/openstack/swift/blob/master/swift/common/swob.py#L264","commit_id":"57782c24266abd2c85c177475000e51c15fe82b0"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"979ee75239a9ba020f037f984dea233faf8e4605","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        metadata_prefix \u003d metadata_prefix.lower()"},{"line_number":289,"context_line":"        metadata \u003d {}"},{"line_number":290,"context_line":"        for k, v in resp.headers.items():"},{"line_number":291,"context_line":"            lkey \u003d k.encode(\u0027latin1\u0027).decode(\u0027utf8\u0027).lower().encode(\u0027utf8\u0027).decode(\u0027latin1\u0027)"},{"line_number":292,"context_line":"            if lkey.startswith(metadata_prefix):"},{"line_number":293,"context_line":"                metadata[lkey[len(metadata_prefix):]] \u003d v"},{"line_number":294,"context_line":"        return metadata"}],"source_content_type":"text/x-python","patch_set":1,"id":"4204f57b_872981e7","line":291,"in_reply_to":"15770a0a_bcb8e7ce","updated":"2025-02-06 22:25:01.000000000","message":"Done","commit_id":"57782c24266abd2c85c177475000e51c15fe82b0"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"19fb9384cb7111aff753e9cb2d534fa48d5fadcc","unresolved":true,"context_lines":[{"line_number":288,"context_line":"        metadata_prefix \u003d metadata_prefix.lower()"},{"line_number":289,"context_line":"        metadata \u003d {}"},{"line_number":290,"context_line":"        for k, v in resp.headers.items():"},{"line_number":291,"context_line":"            lkey \u003d k.encode(\u0027latin1\u0027).decode(\u0027utf8\u0027).lower().encode(\u0027utf8\u0027).decode(\u0027latin1\u0027)"},{"line_number":292,"context_line":"            if lkey.startswith(metadata_prefix):"},{"line_number":293,"context_line":"                metadata[lkey[len(metadata_prefix):]] \u003d v"},{"line_number":294,"context_line":"        return metadata"}],"source_content_type":"text/x-python","patch_set":1,"id":"15770a0a_bcb8e7ce","line":291,"in_reply_to":"ec9adb83_2b66f936","updated":"2025-02-06 15:46:39.000000000","message":"I mean I *wanted* them BOTH to be 0 length lists\n\nrofl\n\n```\n\u003e\u003e\u003e \u0027ß\u0027.upper()\n\u0027SS\u0027\n\u003e\u003e\u003e \u0027ß\u0027.upper().lower()\n\u0027ss\u0027\n```\n\n```\n\u003e\u003e\u003e x \u003d \u0027µ\u0027\n\u003e\u003e\u003e x.encode()\nb\u0027\\xc2\\xb5\u0027\n\u003e\u003e\u003e x.lower().encode()\nb\u0027\\xc2\\xb5\u0027\n\u003e\u003e\u003e x.upper().lower().encode()\nb\u0027\\xce\\xbc\u0027\n```","commit_id":"57782c24266abd2c85c177475000e51c15fe82b0"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"979ee75239a9ba020f037f984dea233faf8e4605","unresolved":true,"context_lines":[{"line_number":286,"context_line":"        headers \u003d headers or {}"},{"line_number":287,"context_line":"        resp \u003d self.make_request(\u0027HEAD\u0027, path, headers, acceptable_statuses,"},{"line_number":288,"context_line":"                                 params\u003dparams)"},{"line_number":289,"context_line":"        metadata_prefix \u003d metadata_prefix.lower()"},{"line_number":290,"context_line":"        metadata \u003d {}"},{"line_number":291,"context_line":"        for k, v in resp.headers.items():"},{"line_number":292,"context_line":"            lkey \u003d http_lower(k)"}],"source_content_type":"text/x-python","patch_set":3,"id":"6d9899e8_96e71209","line":289,"updated":"2025-02-06 22:25:01.000000000","message":"it\u0027s probably not obvious if the caller is expected to pass in a string or a wsgi-string; luckily it\u0027s all the same if you stick to ascii e.g. `x-account-meta-`\n\nthe same ambiguity will come up if we try to fix set_metadata","commit_id":"e577c38f99b482653e1732094300af5f7a92bde1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"c63f3a73b73e7395073d6ed5c6d6b2cccc7a48e4","unresolved":true,"context_lines":[{"line_number":289,"context_line":"        metadata_prefix \u003d metadata_prefix.lower()"},{"line_number":290,"context_line":"        metadata \u003d {}"},{"line_number":291,"context_line":"        for k, v in resp.headers.items():"},{"line_number":292,"context_line":"            lkey \u003d http_lower(k)"},{"line_number":293,"context_line":"            if lkey.startswith(metadata_prefix):"},{"line_number":294,"context_line":"                metadata[lkey[len(metadata_prefix):]] \u003d v"},{"line_number":295,"context_line":"        return metadata"}],"source_content_type":"text/x-python","patch_set":3,"id":"100eef63_44852a59","line":292,"updated":"2025-03-03 20:02:42.000000000","message":"let\u0027s not forget to revert the changes in ``test_rebuild_quarantines_lonely_frag`` at https://review.opendev.org/c/openstack/swift/+/938631/11/test/probe/test_reconstructor_rebuild.py#441, which was used to get around the internal client bug.","commit_id":"e577c38f99b482653e1732094300af5f7a92bde1"}]}
