)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"70c1f918523b827e08be5333a71044318e115d37","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f368a35c_2fd179c4","updated":"2024-02-06 09:23:37.000000000","message":"@Tim: BTW, I\u0027m not making it a priority to fix any of the Swift discrepancies in the current implementation, rather invest in a new implementation.","commit_id":"319034d79fa0876ec55d6b0209ca26806836bb2e"}],"test/s3api/test_mpu.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1599e25e81f502a4d6d7aed8f212569e4730221f","unresolved":true,"context_lines":[{"line_number":319,"context_line":"        self.assertEqual(200, head_resp["},{"line_number":320,"context_line":"            \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":321,"context_line":"        obj_time \u003d head_resp[\u0027LastModified\u0027]"},{"line_number":322,"context_line":"        # object time is the time MPU was created, not when it was completed"},{"line_number":323,"context_line":"        # XXX swift s3api fails here..."},{"line_number":324,"context_line":"        self.assertEqual(create_time.timestamp(), obj_time.timestamp())"},{"line_number":325,"context_line":"        self.assertLess(create_time.timestamp(), complete_time.timestamp())"}],"source_content_type":"text/x-python","patch_set":1,"id":"d92b8b93_441cb76c","line":322,"range":{"start_line":322,"start_character":42,"end_line":322,"end_character":49},"updated":"2024-02-05 20:18:26.000000000","message":"\"initiated\"?\n\nBut that\u0027s a *fascinating* difference...","commit_id":"319034d79fa0876ec55d6b0209ca26806836bb2e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"70c1f918523b827e08be5333a71044318e115d37","unresolved":true,"context_lines":[{"line_number":319,"context_line":"        self.assertEqual(200, head_resp["},{"line_number":320,"context_line":"            \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":321,"context_line":"        obj_time \u003d head_resp[\u0027LastModified\u0027]"},{"line_number":322,"context_line":"        # object time is the time MPU was created, not when it was completed"},{"line_number":323,"context_line":"        # XXX swift s3api fails here..."},{"line_number":324,"context_line":"        self.assertEqual(create_time.timestamp(), obj_time.timestamp())"},{"line_number":325,"context_line":"        self.assertLess(create_time.timestamp(), complete_time.timestamp())"}],"source_content_type":"text/x-python","patch_set":1,"id":"7bd0b95b_aeb57999","line":322,"range":{"start_line":322,"start_character":42,"end_line":322,"end_character":49},"in_reply_to":"d92b8b93_441cb76c","updated":"2024-02-06 09:23:37.000000000","message":"the S3 lingo uses \"create\" https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html but I think I may have been split-brained on create vs initiate :)","commit_id":"319034d79fa0876ec55d6b0209ca26806836bb2e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1599e25e81f502a4d6d7aed8f212569e4730221f","unresolved":true,"context_lines":[{"line_number":731,"context_line":"        parts \u003d self.upload_parts(key_name, upload_id, 2)"},{"line_number":732,"context_line":"        self.complete_mpu(key_name, upload_id, parts)"},{"line_number":733,"context_line":"        # abort gets 204"},{"line_number":734,"context_line":"        # XXX swift s3api fails here...404"},{"line_number":735,"context_line":"        self.abort_mpu(key_name, upload_id)"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"    def test_create_upload_complete_delete_abort(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"c02ec722_35b00401","line":734,"updated":"2024-02-05 20:18:26.000000000","message":"🤔 Maybe we need to look for a timestamp on 404s when we HEAD the upload marker...","commit_id":"319034d79fa0876ec55d6b0209ca26806836bb2e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"70c1f918523b827e08be5333a71044318e115d37","unresolved":true,"context_lines":[{"line_number":731,"context_line":"        parts \u003d self.upload_parts(key_name, upload_id, 2)"},{"line_number":732,"context_line":"        self.complete_mpu(key_name, upload_id, parts)"},{"line_number":733,"context_line":"        # abort gets 204"},{"line_number":734,"context_line":"        # XXX swift s3api fails here...404"},{"line_number":735,"context_line":"        self.abort_mpu(key_name, upload_id)"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"    def test_create_upload_complete_delete_abort(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"60fb2154_87265f7a","line":734,"in_reply_to":"c02ec722_35b00401","updated":"2024-02-06 09:23:37.000000000","message":"we could, but eventually the tombstone will disappear - I haven\u0027t been organised enough to run a long term test against S3 to see if it ever, eventually, returns 404 after a 204.","commit_id":"319034d79fa0876ec55d6b0209ca26806836bb2e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1599e25e81f502a4d6d7aed8f212569e4730221f","unresolved":true,"context_lines":[{"line_number":797,"context_line":"        upload_id \u003d self.create_mpu(key_name)"},{"line_number":798,"context_line":"        parts \u003d self.upload_parts(key_name, upload_id, 3)"},{"line_number":799,"context_line":"        self.complete_mpu(key_name, upload_id, parts[:2])"},{"line_number":800,"context_line":"        # XXX swift s3api fails here, AssertionError: ClientError not raised"},{"line_number":801,"context_line":"        with self.assertRaises(ClientError) as cm:"},{"line_number":802,"context_line":"            self.list_parts(key_name, upload_id)"},{"line_number":803,"context_line":"        self.assertEqual(404, status_from_error(cm.exception))"}],"source_content_type":"text/x-python","patch_set":1,"id":"aceacb0c_ffa0b7fc","line":800,"updated":"2024-02-05 20:18:26.000000000","message":"Whoa! That\u0027s actually a little surprising to me...","commit_id":"319034d79fa0876ec55d6b0209ca26806836bb2e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"70c1f918523b827e08be5333a71044318e115d37","unresolved":true,"context_lines":[{"line_number":797,"context_line":"        upload_id \u003d self.create_mpu(key_name)"},{"line_number":798,"context_line":"        parts \u003d self.upload_parts(key_name, upload_id, 3)"},{"line_number":799,"context_line":"        self.complete_mpu(key_name, upload_id, parts[:2])"},{"line_number":800,"context_line":"        # XXX swift s3api fails here, AssertionError: ClientError not raised"},{"line_number":801,"context_line":"        with self.assertRaises(ClientError) as cm:"},{"line_number":802,"context_line":"            self.list_parts(key_name, upload_id)"},{"line_number":803,"context_line":"        self.assertEqual(404, status_from_error(cm.exception))"}],"source_content_type":"text/x-python","patch_set":1,"id":"9b8f5e16_275db498","line":800,"in_reply_to":"aceacb0c_ffa0b7fc","updated":"2024-02-06 09:23:37.000000000","message":"listing parts is gated by _get_upload_info but _get_upload_info falls back to finding the manifest, so I guess swift always lists parts (not just when only a subset was used)?","commit_id":"319034d79fa0876ec55d6b0209ca26806836bb2e"}]}
