)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f6ca54ec9e544213ad0885eda25141ab0d7ddad","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"s3api: Support GET/HEAD request with PartNumber"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ib396309c706fbc6bc419377fe23fcf5603a89f45"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"a684017e_c73ca845","line":9,"updated":"2023-10-04 03:59:36.000000000","message":"At some point, we should include a\n```\nCloses-Bug: #1735284\n```\nto link back to https://bugs.launchpad.net/swift/+bug/1735284","commit_id":"b36e5ee7d76e95a12a5406627990a968ec2627a1"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"19d871c6bfc55f1a2ece2f3014a282a777b931a7","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"s3api: Support GET/HEAD request with PartNumber"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ib396309c706fbc6bc419377fe23fcf5603a89f45"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"c5bc0ffc_d3058343","line":9,"in_reply_to":"a684017e_c73ca845","updated":"2023-10-09 20:58:35.000000000","message":"Done","commit_id":"b36e5ee7d76e95a12a5406627990a968ec2627a1"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3ded4d4d0e56e61007831f1bc13585ae907cbb54","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"4e45c74b_88f5918b","updated":"2023-10-10 16:51:44.000000000","message":"I don\u0027t think I understood what was going on with the s3api controller routing previously; I think we can clean this up.\n\nYou should write more s3api cross-compat tests; as many as you can come up with names for - test partNumber with Range, test partNumber with uploadId, test partNumber with PUT - we want to *discover* how real AWS works and then make our code do the same.","commit_id":"38f87a179aa5253c8cf5779d1d80291bf5867f9e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c5535086bd90ca92a96a148f43ec4e133cb33a3d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":47,"id":"a6e53b7a_c8901def","updated":"2023-10-28 02:53:33.000000000","message":"I was only able to address maybe half of Tim\u0027s comments on the s3api-cross compat tests; but I got them passing against AWS.  They\u0027re still failing against this branch:\n\n\tvagrant@saio:~$ pytest swift/test/s3api/test_mpu.py\n\t\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d test session starts \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\tplatform linux -- Python 3.8.10, pytest-7.4.2, pluggy-1.3.0 -- /usr/bin/python\n\tcachedir: .pytest_cache\n\trootdir: /home/vagrant/swift\n\tconfigfile: tox.ini\n\tplugins: cov-4.1.0\n\tcollected 6 items                                                                                                                                                                     \n\n\tswift/test/s3api/test_mpu.py::TestMultiPartUpload::test_basic_upload PASSED                                                                                                     [ 16%]\n\tswift/test/s3api/test_mpu.py::TestMultiPartUpload::test_complete_multipart_upload_malformed_request PASSED                                                                      [ 33%]\n\tswift/test/s3api/test_mpu.py::TestMultiPartUpload::test_create_list_abort_multipart_uploads PASSED                                                                              [ 50%]\n\tswift/test/s3api/test_mpu.py::TestMultiPartUpload::test_get_by_part_number FAILED                                                                                               [ 66%]\n\tswift/test/s3api/test_mpu.py::TestMultiPartUpload::test_upload_part_copy PASSED                                                                                                 [ 83%]\n\tswift/test/s3api/test_mpu.py::TestVersionedMultiPartUpload::test_get_by_part_number_with_versioning FAILED                                                                      [100%]\n\n\t\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d FAILURES \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\t_____________________________________________________________________ TestMultiPartUpload.test_get_by_part_number _____________________________________________________________________\n\n\tself \u003d \u003ctest.s3api.test_mpu.TestMultiPartUpload testMethod\u003dtest_get_by_part_number\u003e\n\n\t    def test_get_by_part_number(self):\n\t\t# let\u0027s use up some memory!\n\t\tnum_parts \u003d 3\n\t\tpart_size \u003d 5 * (2 ** 20)  # 5 MB\n\t\tkey_name \u003d self.create_name(\u0027part-num-test\u0027)\n\t\tmpu_etag \u003d self._upload_mpu(key_name, num_parts, part_size)\n\t    \n\t\t# partNumber argument is 1 indexed\n\t\twith self.assertRaises(ClientError) as caught:\n\t\t    self.client.get_object(Bucket\u003dself.bucket_name,\n\t\t\t\t\t   Key\u003dkey_name, PartNumber\u003d0)\n\t\terr_resp \u003d caught.exception.response\n\t\tself.assertEqual(400, err_resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])\n\t\u003e       self.assertEqual(\u0027InvalidArgument\u0027, err_resp[\u0027Error\u0027][\u0027Code\u0027])\n\tE       AssertionError: \u0027InvalidArgument\u0027 !\u003d \u0027InvalidRequest\u0027\n\tE       - InvalidArgument\n\tE       + InvalidRequest\n\n\tswift/test/s3api/test_mpu.py:197: AssertionError\n\t________________________________________________________ TestVersionedMultiPartUpload.test_get_by_part_number_with_versioning _________________________________________________________\n\n\tself \u003d \u003ctest.s3api.test_mpu.TestVersionedMultiPartUpload testMethod\u003dtest_get_by_part_number_with_versioning\u003e\n\n\t    def test_get_by_part_number_with_versioning(self):\n\t\t# let\u0027s use up some memory!\n\t\tparts_counts \u003d [2, 3, 4]\n\t\tpart_size \u003d 5 * (2 ** 20)  # 5 MB\n\t\tkey_name \u003d self.create_name(\u0027part-num-versions\u0027)\n\t\tversion_vars \u003d []\n\t\tfor num_parts in parts_counts:\n\t\t    resp \u003d self._upload_mpu_resp(\n\t\t\tkey_name, num_parts, part_size)\n\t\u003e           version_vars.append((num_parts, resp[\u0027ETag\u0027], resp[\u0027VersionId\u0027]))\n\tE           KeyError: \u0027VersionId\u0027\n\n\tswift/test/s3api/test_mpu.py:336: KeyError\n\t\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d warnings summary \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\ttest/s3api/test_mpu.py: 79 warnings\n\t  /usr/local/lib/python3.8/dist-packages/urllib3/poolmanager.py:315: DeprecationWarning: The \u0027strict\u0027 parameter is no longer needed on Python 3+. This will raise an error in urllib3 v2.1.0.\n\t    warnings.warn(\n\n\t-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n\t\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d short test summary info \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\tFAILED swift/test/s3api/test_mpu.py::TestMultiPartUpload::test_get_by_part_number - AssertionError: \u0027InvalidArgument\u0027 !\u003d \u0027InvalidRequest\u0027\n\tFAILED swift/test/s3api/test_mpu.py::TestVersionedMultiPartUpload::test_get_by_part_number_with_versioning - KeyError: \u0027VersionId\u0027\n\t\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d 2 failed, 4 passed, 79 warnings in 12.80s \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nI think I\u0027ve lamented previously at the lack of unittests for this change - I\u0027d expect some updates in `test/unit/common/middleware/s3api/test_multi_*.py`","commit_id":"1dbca32793311310459647dc5ff76a42ad6a8471"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"497e0c897cacfbacbabe0fda0674267888bb09f7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":74,"id":"4aa6d8fb_d80dd528","updated":"2023-12-07 23:09:31.000000000","message":"oh, i had some unposted comments!","commit_id":"3c7233c87248c48fe3db54423ce807049183540d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccb9bced599c1a56a63b472bc3d9d866655ce408","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":74,"id":"d471f982_311298f2","updated":"2023-12-08 04:50:18.000000000","message":"the cross-compat tests still need more fixing:\n\n903130: wip: more tests for s3api-part-num | https://review.opendev.org/c/openstack/swift/+/903130\n\nI\u0027m going work on fixing s3acl next; but we need to have some unittests that do GET on MPU and I don\u0027t think we currently have ANY.","commit_id":"3c7233c87248c48fe3db54423ce807049183540d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5bc1e267cf52908efdb85ae8395e1cf5d08156ec","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":76,"id":"9647bd5f_25ff98e9","updated":"2023-12-10 22:01:21.000000000","message":"I found some more tests in my working tree i want to add to s3api-part-num eventually:   903266: wip: cross-compat test for non-mpu | https://review.opendev.org/c/openstack/swift/+/903266","commit_id":"7269d7461403367a6389789ecb5b2bf3b2a66e82"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8390dead667790770ce5ba258f4c2977b69c7558","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":85,"id":"9ca07484_2da1672e","updated":"2023-12-15 18:15:00.000000000","message":"this seems remarkably simple 😊\n\nI haven\u0027t yet done a thorough review, so no vote, but I have played with in my VSAIo and verified that GET/HEAD responses with valid and invalid part numbers are consistent with what I see from AWS S3.","commit_id":"936e1e37b8c98246ca5fa262821032a6b6452629"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1890bdbdb002e8bd85f3f14c48c30bce51316b71","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":86,"id":"6ba19fcc_087b8d44","updated":"2023-12-17 22:35:51.000000000","message":"this is looking pretty good, a few nits and some uncovered compat tests for HEADs\n\n... mostly addressed in:\n\n903847: more s3api part-num tests | https://review.opendev.org/c/openstack/swift/+/903847\n\n^ although this got a little messy trying to understand and failing to fix a 503 when trying to head-object w/ part-number \u0026 version-id\n\n\tvagrant@saio:~$ aws s3api get-object --bucket s3test --key test.big --part-number 1 --version-id 1702844469.32651 delete.me\n\t{\n\t    \"AcceptRanges\": \"bytes\",\n\t    \"LastModified\": \"Sun, 17 Dec 2023 20:23:34 GMT\",\n\t    \"ContentLength\": 5242880,\n\t    \"ETag\": \"\\\"a7d414b9133d6483d9a1c4e04e856e3b-2\\\"\",\n\t    \"VersionId\": \"1702844469.32651\",\n\t    \"ContentRange\": \"bytes 0-5242879/10485760\",\n\t    \"ContentType\": \"application/octet-stream\",\n\t    \"Metadata\": {},\n\t    \"PartsCount\": 2\n\t}\n\tvagrant@saio:~$ aws s3api head-object --bucket s3test --key test.big --part-number 1 --version-id 1702844469.32651\n\n\tAn error occurred (503) when calling the HeadObject operation (reached max retries: 4): Service Unavailable\n\n^ this is a real functional failure that we need to fix.\n\nI couldn\u0027t duplicate in unittests even though i took a whack at wrapping slo(object_versioning(symlink(s3api.FakeApp))) struggled to understand how mw is supposed to call get_container_info on a request environ with a path like /v1/test:tester/mpu/bucket and then gave up about the time I was registering null-namespace request paths.  But it shows up in the follow-on s3api cross-compat tests, but with an annoyling lack of proxy error logs:\n\n\tDec 17 22:34:43 saio proxy-server: 127.0.0.1 127.0.0.1 17/Dec/2023/22/34/43 HEAD /v1/AUTH_test/%2500versions%2500s3api-test-test-mpu-47c859b104a64e51a024fbb49ba31e6f/%2500s3api-test-part-num-versions-ad0cccf803de42d893baa592af15ea4c%25008297147528.60497%3Fpart-number%3D1%26version-id%3D1702852471.39502 HTTP/1.0 200 - Boto3/1.29.5%20md/Botocore%231.32.5%20ua/2.0%20os/linux%235.15.0-91-generic%20md/arch%23x86_64%20lang/python%233.10.12%20md/pyimpl%23CPython%20cfg/retry-mode%23legacy%20Botocore/1.32.5 - - - - tx9ca37e602aca4da180b15-00657f7783 - 0.0097 S3 - 1702852483.649849176 1702852483.659546614 0\n\tDec 17 22:34:43 saio proxy-server: 127.0.0.1 127.0.0.1 17/Dec/2023/22/34/43 HEAD /s3api-test-test-mpu-47c859b104a64e51a024fbb49ba31e6f/s3api-test-part-num-versions-ad0cccf803de42d893baa592af15ea4c%3FpartNumber%3D1%26versionId%3D1702852471.39502 HTTP/1.0 503 - Boto3/1.29.5%20md/Botocore%231.32.5%20ua/2.0%20os/linux%235.15.0-91-generic%20md/arch%23x86_64%20lang/python%233.10.12%20md/pyimpl%23CPython%20cfg/retry-mode%23legacy%20Botocore/1.32.5 - - - - tx9ca37e602aca4da180b15-00657f7783 - 0.0271 - - 1702852483.635280132 1702852483.662428617 -","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"a20c164e713fadd8fd483571d25183b49679e90a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":93,"id":"855265cc_45aa01ab","updated":"2024-01-05 17:53:44.000000000","message":"recheck.","commit_id":"eddcdfc88f4d63f4246573624d9a98b76b9ae289"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"404d11bc9ea91d12cb817e43d4e20909bd631a2a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":94,"id":"61b28e32_61a7af97","updated":"2024-01-26 17:47:20.000000000","message":"The behaviour of partNumber AND Range with a single-part object was questioned in an upstream meeting w.r.t. https://review.opendev.org/c/openstack/swift/+/906391 so I put together a cross-compat test https://review.opendev.org/c/openstack/swift/+/906906.\n\nAWS will return a 400 but this patch doesn\u0027t because it relies on SLO to return an error and SLO only checks the parameter and headers if the object IS an SLO.","commit_id":"212d5d438ac99288b32e68a03e288924f59cb262"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2a0819a77dea2bcc8cc833839d14b2a2c5a70075","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":97,"id":"57d58d20_5765324f","updated":"2024-02-28 14:49:18.000000000","message":"I went ahead and squashed in https://review.opendev.org/c/openstack/swift/+/906906/7?usp\u003drelated-change - I think it makes sense to review the combined changes as one.","commit_id":"ba341ea37403e33008c2ab21d2be826e8b00d204"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"27342520d304753e8377b76686f9ebde43dee130","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":98,"id":"48a5a75c_a6bd03e5","updated":"2024-03-01 17:41:20.000000000","message":"we think this should be ready!","commit_id":"d4cfc13094c0e2fef283ff840a2639ea0fd7b90a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"fdff97f144abaf5489c64f5c4db94a85386eedd4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":99,"id":"5a451e20_76622aa1","updated":"2024-03-08 12:33:07.000000000","message":"I checked that the new compat tests in test/s3api/test_mpu.py pass against AWS S3","commit_id":"7557ab7ef6420e8182ebc1560fefa4a1c6f81e74"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c973fdbb319a88223472c880caf6eb292cfd7444","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":99,"id":"40be42a6_e48cc286","updated":"2024-03-12 06:17:10.000000000","message":"This looks good. And testing in my vsaio works as expected. Only holding off on the +A because of it\u0027s parent patch. Once that\u0027s good (and I\u0027ve +Aed that one) I\u0027ll come and land this ;)","commit_id":"7557ab7ef6420e8182ebc1560fefa4a1c6f81e74"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"48a0e0f21653c5fe2ddff5099b0788e9b9114942","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":99,"id":"29c80e85_429c0c14","in_reply_to":"5a451e20_76622aa1","updated":"2024-03-08 19:07:11.000000000","message":"Thank you for helping out","commit_id":"7557ab7ef6420e8182ebc1560fefa4a1c6f81e74"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"764523554da5b46d2b86da3aeb85e9ce4f88a345","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":100,"id":"b3e055ea_11d80c79","updated":"2024-03-12 22:53:48.000000000","message":"I just +A\u0027ed the parent, so lets land this at the same time!\n\nGreat one guys. Retested this with my vsaio.","commit_id":"46e7da97c6e620ba2998872901ed44055714e699"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"06770dfc68e92f448c0aa95c575f0f79f71f9088","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":100,"id":"cad6d1ab_029552d4","updated":"2024-03-13 02:56:57.000000000","message":"recheck","commit_id":"46e7da97c6e620ba2998872901ed44055714e699"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3b4d5cef613b57be32855007cf8cc8d9f8bf5ba7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":100,"id":"ea19249e_a64447b8","updated":"2024-03-13 05:52:16.000000000","message":"recheck","commit_id":"46e7da97c6e620ba2998872901ed44055714e699"}],"swift/common/middleware/s3api/controllers/multi_upload.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3ded4d4d0e56e61007831f1bc13585ae907cbb54","unresolved":true,"context_lines":[{"line_number":174,"context_line":"        \"\"\""},{"line_number":175,"context_line":"        Handles Upload Part and Upload Part Copy."},{"line_number":176,"context_line":"        \"\"\""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        if \u0027uploadId\u0027 not in req.params:"},{"line_number":179,"context_line":"            raise InvalidArgument(\u0027ResourceType\u0027, \u0027partNumber\u0027,"},{"line_number":180,"context_line":"                                  \u0027Unexpected query string parameter\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"dfdcc22c_60421e26","side":"PARENT","line":177,"updated":"2023-10-10 16:51:44.000000000","message":"unrelated","commit_id":"47b6d426bced6f8dc25126fb4b65e0e338bc0135"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"a90588c0c9bd42d49d89e872faf6fb912c2553e6","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        \"\"\""},{"line_number":175,"context_line":"        Handles Upload Part and Upload Part Copy."},{"line_number":176,"context_line":"        \"\"\""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        if \u0027uploadId\u0027 not in req.params:"},{"line_number":179,"context_line":"            raise InvalidArgument(\u0027ResourceType\u0027, \u0027partNumber\u0027,"},{"line_number":180,"context_line":"                                  \u0027Unexpected query string parameter\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"25ce7a8f_f5cdfcbc","side":"PARENT","line":177,"in_reply_to":"dfdcc22c_60421e26","updated":"2023-10-11 15:48:06.000000000","message":"Done","commit_id":"47b6d426bced6f8dc25126fb4b65e0e338bc0135"}],"swift/common/middleware/s3api/controllers/obj.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f6ca54ec9e544213ad0885eda25141ab0d7ddad","unresolved":true,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        if version_id is not None:"},{"line_number":96,"context_line":"            query \u003d {\u0027version-id\u0027: version_id}"},{"line_number":97,"context_line":"        elif part_number is not None:"},{"line_number":98,"context_line":"            query \u003d {\u0027part_number\u0027: part_number}"},{"line_number":99,"context_line":"        else:"},{"line_number":100,"context_line":"            query \u003d {}"}],"source_content_type":"text/x-python","patch_set":16,"id":"cf9dae31_dfe17d6f","line":97,"range":{"start_line":97,"start_character":8,"end_line":97,"end_character":24},"updated":"2023-10-04 03:59:36.000000000","message":"Surely, we could make a request like `?versionId\u003dfoo\u0026partNumber\u003d2`, yeah? What would you expect out of that?","commit_id":"d64c0213da2a3b4a8f1dd64579602fe0d5444cd6"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4f472a04f372432ae6d87a9fce3c247fa61d694d","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        if version_id is not None:"},{"line_number":96,"context_line":"            query \u003d {\u0027version-id\u0027: version_id}"},{"line_number":97,"context_line":"        elif part_number is not None:"},{"line_number":98,"context_line":"            query \u003d {\u0027part_number\u0027: part_number}"},{"line_number":99,"context_line":"        else:"},{"line_number":100,"context_line":"            query \u003d {}"}],"source_content_type":"text/x-python","patch_set":16,"id":"ed11b4d9_bf987a4b","line":97,"range":{"start_line":97,"start_character":8,"end_line":97,"end_character":24},"in_reply_to":"6a598f7a_b81dc1a3","updated":"2023-10-17 19:42:58.000000000","message":"Done","commit_id":"d64c0213da2a3b4a8f1dd64579602fe0d5444cd6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3ded4d4d0e56e61007831f1bc13585ae907cbb54","unresolved":true,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        if version_id is not None:"},{"line_number":96,"context_line":"            query \u003d {\u0027version-id\u0027: version_id}"},{"line_number":97,"context_line":"        elif part_number is not None:"},{"line_number":98,"context_line":"            query \u003d {\u0027part_number\u0027: part_number}"},{"line_number":99,"context_line":"        else:"},{"line_number":100,"context_line":"            query \u003d {}"}],"source_content_type":"text/x-python","patch_set":16,"id":"6a598f7a_b81dc1a3","line":97,"range":{"start_line":97,"start_character":8,"end_line":97,"end_character":24},"in_reply_to":"cf9dae31_dfe17d6f","updated":"2023-10-10 16:51:44.000000000","message":"we should include a cross compat test for part-number with version-id!","commit_id":"d64c0213da2a3b4a8f1dd64579602fe0d5444cd6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0f6ca54ec9e544213ad0885eda25141ab0d7ddad","unresolved":true,"context_lines":[{"line_number":95,"context_line":"        if version_id is not None:"},{"line_number":96,"context_line":"            query \u003d {\u0027version-id\u0027: version_id}"},{"line_number":97,"context_line":"        elif part_number is not None:"},{"line_number":98,"context_line":"            query \u003d {\u0027part_number\u0027: part_number}"},{"line_number":99,"context_line":"        else:"},{"line_number":100,"context_line":"            query \u003d {}"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"89eaeb25_7a0ea21d","line":98,"range":{"start_line":98,"start_character":22,"end_line":98,"end_character":33},"updated":"2023-10-04 03:59:36.000000000","message":"Did the API we added to SLO use `part_number`, or `part-number`?","commit_id":"d64c0213da2a3b4a8f1dd64579602fe0d5444cd6"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"19d871c6bfc55f1a2ece2f3014a282a777b931a7","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        if version_id is not None:"},{"line_number":96,"context_line":"            query \u003d {\u0027version-id\u0027: version_id}"},{"line_number":97,"context_line":"        elif part_number is not None:"},{"line_number":98,"context_line":"            query \u003d {\u0027part_number\u0027: part_number}"},{"line_number":99,"context_line":"        else:"},{"line_number":100,"context_line":"            query \u003d {}"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"6b85ab0f_822c5c8d","line":98,"range":{"start_line":98,"start_character":22,"end_line":98,"end_character":33},"in_reply_to":"89eaeb25_7a0ea21d","updated":"2023-10-09 20:58:35.000000000","message":"Done","commit_id":"d64c0213da2a3b4a8f1dd64579602fe0d5444cd6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":true,"context_lines":[{"line_number":99,"context_line":"        elif version_id is not None and part_number is not None:"},{"line_number":100,"context_line":"            query \u003d {\u0027version-id\u0027: version_id, \u0027part-number\u0027: part_number}"},{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            query \u003d {}"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        if version_id not in (\u0027null\u0027, None):"},{"line_number":105,"context_line":"            container_info \u003d req.get_container_info(self.app)"}],"source_content_type":"text/x-python","patch_set":46,"id":"7b523b6e_5bdb2432","line":102,"updated":"2023-10-27 18:19:13.000000000","message":"Maybe\n```\nquery \u003d {}\nif version_id is not None:\n    query[\u0027version-id\u0027] \u003d version_id\nif part-number is not None:\n    query[\u0027part-number\u0027] \u003d part_number\n```\n?","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c5535086bd90ca92a96a148f43ec4e133cb33a3d","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        elif version_id is not None and part_number is not None:"},{"line_number":100,"context_line":"            query \u003d {\u0027version-id\u0027: version_id, \u0027part-number\u0027: part_number}"},{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            query \u003d {}"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        if version_id not in (\u0027null\u0027, None):"},{"line_number":105,"context_line":"            container_info \u003d req.get_container_info(self.app)"}],"source_content_type":"text/x-python","patch_set":46,"id":"71eeec9c_a53f51b5","line":102,"in_reply_to":"7b523b6e_5bdb2432","updated":"2023-10-28 02:53:33.000000000","message":"Done","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"497e0c897cacfbacbabe0fda0674267888bb09f7","unresolved":true,"context_lines":[{"line_number":73,"context_line":"        try:"},{"line_number":74,"context_line":"            part_number \u003d int(req.params[\u0027partNumber\u0027])"},{"line_number":75,"context_line":"            if part_number \u003d\u003d 1:"},{"line_number":76,"context_line":"                return part_number"},{"line_number":77,"context_line":"            else:"},{"line_number":78,"context_line":"                raise ValueError()"},{"line_number":79,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":68,"id":"552bbdba_136f79f3","line":76,"updated":"2023-12-07 23:09:31.000000000","message":"it seems like this method can only return if the part_number \u003d\u003d 1\n\nmaybe it should just be _validate_part_number\n\nit looks like we only do this in the resp; and only if not resp.is_slo","commit_id":"ba67294c4f36f12422f4eb7fd301344b6522cf1b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"b5e8fa87803b7ed13bed87421606586b30c331d0","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        try:"},{"line_number":74,"context_line":"            part_number \u003d int(req.params[\u0027partNumber\u0027])"},{"line_number":75,"context_line":"            if part_number \u003d\u003d 1:"},{"line_number":76,"context_line":"                return part_number"},{"line_number":77,"context_line":"            else:"},{"line_number":78,"context_line":"                raise ValueError()"},{"line_number":79,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":68,"id":"3dc7674c_568da853","line":76,"in_reply_to":"552bbdba_136f79f3","updated":"2023-12-14 20:14:39.000000000","message":"Done","commit_id":"ba67294c4f36f12422f4eb7fd301344b6522cf1b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"497e0c897cacfbacbabe0fda0674267888bb09f7","unresolved":true,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        resp \u003d req.get_response(self.app, query\u003dquery)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        if \u0027partNumber\u0027 in req.params and not resp.is_slo:"},{"line_number":130,"context_line":"            resp \u003d self._gen_non_slo_part_num_resp(req, resp)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        if req.method \u003d\u003d \u0027HEAD\u0027:"}],"source_content_type":"text/x-python","patch_set":68,"id":"259ef1b1_e1086063","line":129,"updated":"2023-12-07 23:09:31.000000000","message":"oic, not resp.is_slo\n\nthis might be one of the rare cases I\u0027d prefer the more significant not condition to be put explicitly on the LHS\n\n    if (not resp.is_slo) and part_number is not None:\n    \nI might even go with:\n\n    if resp.is_slo is False and part_number:\n\n.... to match how I\u0027d think about the condition of \"client requested non-slo w/ part_number param\"","commit_id":"ba67294c4f36f12422f4eb7fd301344b6522cf1b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"b5e8fa87803b7ed13bed87421606586b30c331d0","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        resp \u003d req.get_response(self.app, query\u003dquery)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        if \u0027partNumber\u0027 in req.params and not resp.is_slo:"},{"line_number":130,"context_line":"            resp \u003d self._gen_non_slo_part_num_resp(req, resp)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        if req.method \u003d\u003d \u0027HEAD\u0027:"}],"source_content_type":"text/x-python","patch_set":68,"id":"0c2aea14_6a7f631c","line":129,"in_reply_to":"259ef1b1_e1086063","updated":"2023-12-14 20:14:39.000000000","message":"Done","commit_id":"ba67294c4f36f12422f4eb7fd301344b6522cf1b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8390dead667790770ce5ba258f4c2977b69c7558","unresolved":true,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        return resp"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _validate_part_number(self, req):"},{"line_number":73,"context_line":"        try:"},{"line_number":74,"context_line":"            part_number \u003d int(req.params[\u0027partNumber\u0027])"},{"line_number":75,"context_line":"            if part_number \u003d\u003d 1:"}],"source_content_type":"text/x-python","patch_set":84,"id":"e09c81de_ed55fa40","line":72,"updated":"2023-12-15 18:15:00.000000000","message":"nit: I did a double take when I first read this method because it requires part num to be exactly 1. Eventually I realised it\u0027s only used for a non-slo request. Perhaps roll it all into _gen_non_slo_part_num_resp?","commit_id":"2158cef630cf096804bdecf7ffb56cfb98c29500"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a6a6b9ce4d8c47e431e146f5afd0af9c20029b8b","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        return resp"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _validate_part_number(self, req):"},{"line_number":73,"context_line":"        try:"},{"line_number":74,"context_line":"            part_number \u003d int(req.params[\u0027partNumber\u0027])"},{"line_number":75,"context_line":"            if part_number \u003d\u003d 1:"}],"source_content_type":"text/x-python","patch_set":84,"id":"dc39c85a_5d09b206","line":72,"in_reply_to":"e09c81de_ed55fa40","updated":"2023-12-20 15:02:15.000000000","message":"Done","commit_id":"2158cef630cf096804bdecf7ffb56cfb98c29500"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8390dead667790770ce5ba258f4c2977b69c7558","unresolved":true,"context_lines":[{"line_number":76,"context_line":"                return part_number"},{"line_number":77,"context_line":"            else:"},{"line_number":78,"context_line":"                raise ValueError()"},{"line_number":79,"context_line":"        except ValueError:"},{"line_number":80,"context_line":"            raise InvalidPartNumber()"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _gen_non_slo_part_num_resp(self, req, resp):"}],"source_content_type":"text/x-python","patch_set":84,"id":"f1d29a65_dc8ae3e4","line":79,"updated":"2023-12-15 18:15:00.000000000","message":"some errors might be InvalidArgument, like -1 or foo","commit_id":"2158cef630cf096804bdecf7ffb56cfb98c29500"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a6a6b9ce4d8c47e431e146f5afd0af9c20029b8b","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                return part_number"},{"line_number":77,"context_line":"            else:"},{"line_number":78,"context_line":"                raise ValueError()"},{"line_number":79,"context_line":"        except ValueError:"},{"line_number":80,"context_line":"            raise InvalidPartNumber()"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _gen_non_slo_part_num_resp(self, req, resp):"}],"source_content_type":"text/x-python","patch_set":84,"id":"de03bf38_4c3990e0","line":79,"in_reply_to":"f1d29a65_dc8ae3e4","updated":"2023-12-20 15:02:15.000000000","message":"Done","commit_id":"2158cef630cf096804bdecf7ffb56cfb98c29500"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1890bdbdb002e8bd85f3f14c48c30bce51316b71","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        resp \u003d req.get_response(self.app, query\u003dquery)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        if resp.is_slo is False and part_number:"},{"line_number":130,"context_line":"            resp \u003d self._gen_non_slo_part_num_resp(req, resp)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        if req.method \u003d\u003d \u0027HEAD\u0027:"}],"source_content_type":"text/x-python","patch_set":86,"id":"73960e12_addd4dd9","line":129,"updated":"2023-12-17 22:35:51.000000000","message":"I find I keep waffling about this line.  Obviously it could have been written as:\n\n    if not resp.is_slo and part_number:\n    \n... but I\u0027m sure I\u0027d suggest at least explicit parans should be used to clarify the binding.\n\n\n    if (not resp.is_slo) and part_number:\n    \n... which starts to look a bit more messy.  I think what\u0027s here:\n\n    if resp.is_slo is False and part_number:\n    \n... is cloest to how I\u0027d describe the condition in english, but I could also imaging saying it:\n\n    if part_number and not resp.is_slo:\n    \n... but that seems like it\u0027s putting the less significant part of condition first (this block is about non-slo-part-num responses).  But maybe in the controller \"what the client requested\" is more important that \"what swift actually had\"; I can\u0027t decide what\u0027s best.\n\nRegardless, however you want to write it; it\u0027s immaterial:\n\nhttps://docs.openstack.org/swift/latest/contributor/review_guidelines.html#maintainable-code-is-obvious\n\nthese are the correct conditions to enter this branch.","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a6a6b9ce4d8c47e431e146f5afd0af9c20029b8b","unresolved":true,"context_lines":[{"line_number":38,"context_line":"    query param for non-MPU if it\u0027s exactly 1."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    When the query param *is* exactly 1, as a side-effect this function updates"},{"line_number":41,"context_line":"    the response status code an headers."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    :raises: InvalidPartNumber"},{"line_number":44,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":91,"id":"c82e2974_4281c356","line":41,"range":{"start_line":41,"start_character":29,"end_line":41,"end_character":31},"updated":"2023-12-20 15:02:15.000000000","message":"typo s/an/and/","commit_id":"2e9d68a0fd67db02696806b56fce1825041640a3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4505a044fff596775a29c87dc1ac8f023aa7a8c9","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    query param for non-MPU if it\u0027s exactly 1."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    When the query param *is* exactly 1, as a side-effect this function updates"},{"line_number":41,"context_line":"    the response status code an headers."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    :raises: InvalidPartNumber"},{"line_number":44,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":91,"id":"152629af_a8273844","line":41,"range":{"start_line":41,"start_character":29,"end_line":41,"end_character":31},"in_reply_to":"c82e2974_4281c356","updated":"2024-01-03 22:50:18.000000000","message":"Done","commit_id":"2e9d68a0fd67db02696806b56fce1825041640a3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a6a6b9ce4d8c47e431e146f5afd0af9c20029b8b","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                    if int(part_number) \u003e 10000:"},{"line_number":139,"context_line":"                        raise InvalidPartArgument(part_number)"},{"line_number":140,"context_line":"                except (ValueError, TypeError):"},{"line_number":141,"context_line":"                    raise InvalidPartArgument(part_number)"},{"line_number":142,"context_line":"            else:"},{"line_number":143,"context_line":"                _update_non_slo_part_num_response(part_number, resp)"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":91,"id":"9df0b343_fccdcdb0","line":141,"updated":"2023-12-20 15:02:15.000000000","message":"let\u0027s not enforce this here in case the SLO does actually have \u003e10000 parts\n\nsee https://review.opendev.org/c/openstack/swift/+/904127","commit_id":"2e9d68a0fd67db02696806b56fce1825041640a3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4505a044fff596775a29c87dc1ac8f023aa7a8c9","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                    if int(part_number) \u003e 10000:"},{"line_number":139,"context_line":"                        raise InvalidPartArgument(part_number)"},{"line_number":140,"context_line":"                except (ValueError, TypeError):"},{"line_number":141,"context_line":"                    raise InvalidPartArgument(part_number)"},{"line_number":142,"context_line":"            else:"},{"line_number":143,"context_line":"                _update_non_slo_part_num_response(part_number, resp)"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":91,"id":"4a6ccaaf_21dfec8f","line":141,"in_reply_to":"9df0b343_fccdcdb0","updated":"2024-01-03 22:50:18.000000000","message":"Done","commit_id":"2e9d68a0fd67db02696806b56fce1825041640a3"}],"swift/common/middleware/s3api/s3request.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3ded4d4d0e56e61007831f1bc13585ae907cbb54","unresolved":true,"context_lines":[{"line_number":1042,"context_line":"        if \u0027logging\u0027 in self.params:"},{"line_number":1043,"context_line":"            return LoggingStatusController"},{"line_number":1044,"context_line":"        if \u0027partNumber\u0027 in self.params:"},{"line_number":1045,"context_line":"            return PartController"},{"line_number":1046,"context_line":"        if \u0027uploadId\u0027 in self.params:"},{"line_number":1047,"context_line":"            return UploadController"},{"line_number":1048,"context_line":"        if \u0027uploads\u0027 in self.params:"}],"source_content_type":"text/x-python","patch_set":21,"id":"10b0f496_fa67cc49","side":"PARENT","line":1045,"updated":"2023-10-10 16:51:44.000000000","message":"maybe this is the place to branch behavior for partNumber in params - if PUT return partController (assumes upload id?) else return ObjectController","commit_id":"47b6d426bced6f8dc25126fb4b65e0e338bc0135"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"9cfe19827c3475cf4269b71ce8bba626eaa0d70a","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"        if \u0027logging\u0027 in self.params:"},{"line_number":1043,"context_line":"            return LoggingStatusController"},{"line_number":1044,"context_line":"        if \u0027partNumber\u0027 in self.params:"},{"line_number":1045,"context_line":"            return PartController"},{"line_number":1046,"context_line":"        if \u0027uploadId\u0027 in self.params:"},{"line_number":1047,"context_line":"            return UploadController"},{"line_number":1048,"context_line":"        if \u0027uploads\u0027 in self.params:"}],"source_content_type":"text/x-python","patch_set":21,"id":"bf6ebab7_b6b4b3ac","side":"PARENT","line":1045,"in_reply_to":"10b0f496_fa67cc49","updated":"2023-10-16 22:36:11.000000000","message":"Done","commit_id":"47b6d426bced6f8dc25126fb4b65e0e338bc0135"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3ded4d4d0e56e61007831f1bc13585ae907cbb54","unresolved":true,"context_lines":[{"line_number":1047,"context_line":"            return UploadController"},{"line_number":1048,"context_line":"        if \u0027partNumber\u0027 in self.params:"},{"line_number":1049,"context_line":"            if \u0027uploadId\u0027 not in self.params and self.method \u003d\u003d \u0027PUT\u0027:"},{"line_number":1050,"context_line":"                raise InvalidArgument(\u0027uploadId\u0027, \u0027\u0027)"},{"line_number":1051,"context_line":"            return ObjectController"},{"line_number":1052,"context_line":"        if \u0027uploads\u0027 in self.params:"},{"line_number":1053,"context_line":"            return UploadsController"}],"source_content_type":"text/x-python","patch_set":21,"id":"7621cf93_7be0c4b0","line":1050,"updated":"2023-10-10 16:51:44.000000000","message":"is a put with uploadId \u0026 partNumber a invalid argument tho?  It seems like on L1046 we\u0027d return the PartController?","commit_id":"d55400fee575d1039b35d9c85b00a4fe77f6262d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"0be1a139f542c74416e7206eb3a52b1eef36427b","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"            return UploadController"},{"line_number":1048,"context_line":"        if \u0027partNumber\u0027 in self.params:"},{"line_number":1049,"context_line":"            if \u0027uploadId\u0027 not in self.params and self.method \u003d\u003d \u0027PUT\u0027:"},{"line_number":1050,"context_line":"                raise InvalidArgument(\u0027uploadId\u0027, \u0027\u0027)"},{"line_number":1051,"context_line":"            return ObjectController"},{"line_number":1052,"context_line":"        if \u0027uploads\u0027 in self.params:"},{"line_number":1053,"context_line":"            return UploadsController"}],"source_content_type":"text/x-python","patch_set":21,"id":"dfbb39f5_0f7ec4e6","line":1050,"in_reply_to":"7621cf93_7be0c4b0","updated":"2023-10-16 22:36:49.000000000","message":"Done","commit_id":"d55400fee575d1039b35d9c85b00a4fe77f6262d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":true,"context_lines":[{"line_number":1048,"context_line":"            if self.method \u003d\u003d \u0027PUT\u0027:"},{"line_number":1049,"context_line":"                return PartController"},{"line_number":1050,"context_line":"            else:"},{"line_number":1051,"context_line":"                return ObjectController"},{"line_number":1052,"context_line":"        if \u0027uploadId\u0027 in self.params:"},{"line_number":1053,"context_line":"            return UploadController"},{"line_number":1054,"context_line":"        if \u0027uploads\u0027 in self.params:"}],"source_content_type":"text/x-python","patch_set":46,"id":"052f21a1_85cd6333","line":1051,"updated":"2023-10-27 18:19:13.000000000","message":"So `DELETE` with `?partNumber\u003dX` will delete the whole object -- how does AWS behave? Do they also ignore the query string, or do they return some kind of error?","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c5535086bd90ca92a96a148f43ec4e133cb33a3d","unresolved":true,"context_lines":[{"line_number":1048,"context_line":"            if self.method \u003d\u003d \u0027PUT\u0027:"},{"line_number":1049,"context_line":"                return PartController"},{"line_number":1050,"context_line":"            else:"},{"line_number":1051,"context_line":"                return ObjectController"},{"line_number":1052,"context_line":"        if \u0027uploadId\u0027 in self.params:"},{"line_number":1053,"context_line":"            return UploadController"},{"line_number":1054,"context_line":"        if \u0027uploads\u0027 in self.params:"}],"source_content_type":"text/x-python","patch_set":46,"id":"1f0788c0_3f176c87","line":1051,"in_reply_to":"052f21a1_85cd6333","updated":"2023-10-28 02:53:33.000000000","message":"Tim, that\u0027s a good question.  It may not be trivial to answer with a s3api cross compat test since PartNumber isn\u0027t a valid argument to delete_object:\n\nhttps://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/delete_object.html\n\nMaybe we can pair up and get you some AWS creds to try to look into on Monday so we can offer Ash some guidiance on how to proceed?","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8390dead667790770ce5ba258f4c2977b69c7558","unresolved":true,"context_lines":[{"line_number":1048,"context_line":"            if self.method \u003d\u003d \u0027PUT\u0027:"},{"line_number":1049,"context_line":"                return PartController"},{"line_number":1050,"context_line":"            else:"},{"line_number":1051,"context_line":"                return ObjectController"},{"line_number":1052,"context_line":"        if \u0027uploadId\u0027 in self.params:"},{"line_number":1053,"context_line":"            return UploadController"},{"line_number":1054,"context_line":"        if \u0027uploads\u0027 in self.params:"}],"source_content_type":"text/x-python","patch_set":46,"id":"ad3df497_1e8c904f","line":1051,"in_reply_to":"1f0788c0_3f176c87","updated":"2023-12-15 18:15:00.000000000","message":"error and object is still intact:\n\n```\n(acoles) ~/0dev/openstack/swift{review/ashwin_a_nair/extend-slo-attrs,+} % curl \"https://acoles-test.s3.amazonaws.com/mpu?partNumber\u003d2\" -H \"X-Amz-Date: 20231215T162620Z\" -H \"X-Amz-Security-Token: \u003csnip\u003e -X DELETE -i\nHTTP/1.1 400 Bad Request\nx-amz-request-id: M7KPN6FKFKT2SWH9\nx-amz-id-2: gYecSr5plRpPwEF8g0FEETf7eNoR2dgzooYwNcD72TycmaF69igysuoN4Yxj+e2IjXrXns/8jFE\u003d\nContent-Type: application/xml\nTransfer-Encoding: chunked\nDate: Fri, 15 Dec 2023 16:41:51 GMT\nServer: AmazonS3\nConnection: close\n\n\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e\n\u003cError\u003e\u003cCode\u003eInvalidArgument\u003c/Code\u003e\u003cMessage\u003eThis operation does not accept partNumber without uploadId\u003c/Message\u003e\u003cArgumentName\u003epartNumber\u003c/ArgumentName\u003e\u003cArgumentValue\u003epartNumber\u003c/ArgumentValue\u003e\u003cRequestId\u003eM7KPN6FKFKT2SWH9\u003c/RequestId\u003e\u003cHostId\u003egYecSr5plRpPwEF8g0FEETf7eNoR2dgzooYwNcD72TycmaF69igysuoN4Yxj+e2IjXrXns/8jFE\u003d\u003c/HostId\u003e\u003c/Error\u003e%\n\n\n(acoles) ~/0dev/openstack/swift{review/ashwin_a_nair/extend-slo-attrs,+} % curl \"https://acoles-test.s3.amazonaws.com/mpu?partNumber\u003d2\" -H \"X-Amz-Date: 20231215T162620Z\" -H \"X-Amz-Security-Token: \u003csnip\u003e -I\nHTTP/1.1 206 Partial Content\nx-amz-id-2: /h7BBXTc3UQF5LkApKYhPaPfjzdkyr5SwFV36ZLOJYiCJxKShcvWlKY3POQj2mPwS24u3aKdat4\u003d\nx-amz-request-id: 3VG4HS4M55XMGZVW\nDate: Fri, 15 Dec 2023 16:32:02 GMT\nLast-Modified: Fri, 15 Dec 2023 14:08:43 GMT\nETag: \"f279586a6ca0314340f53a7cbeb32a91-2\"\nx-amz-mp-parts-count: 2\nx-amz-server-side-encryption: AES256\nAccept-Ranges: bytes\nContent-Range: bytes 10240000-20479999/20480000\nContent-Type: binary/octet-stream\nServer: AmazonS3\nContent-Length: 10240000\n```","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc7db2c3c058690599d7aa31b7f5bf10240604f0","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"            if self.method \u003d\u003d \u0027PUT\u0027:"},{"line_number":1049,"context_line":"                return PartController"},{"line_number":1050,"context_line":"            else:"},{"line_number":1051,"context_line":"                return ObjectController"},{"line_number":1052,"context_line":"        if \u0027uploadId\u0027 in self.params:"},{"line_number":1053,"context_line":"            return UploadController"},{"line_number":1054,"context_line":"        if \u0027uploads\u0027 in self.params:"}],"source_content_type":"text/x-python","patch_set":46,"id":"a8b6ce13_f1e1e251","line":1051,"in_reply_to":"ad3df497_1e8c904f","updated":"2024-02-20 21:36:30.000000000","message":"Done","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8390dead667790770ce5ba258f4c2977b69c7558","unresolved":true,"context_lines":[{"line_number":1427,"context_line":"                           \u002710000, inclusive\u0027)"},{"line_number":1428,"context_line":"                raise InvalidArgument(\u0027partNumber\u0027,"},{"line_number":1429,"context_line":"                                      self.params[\u0027partNumber\u0027],"},{"line_number":1430,"context_line":"                                      err_str)"},{"line_number":1431,"context_line":"            else:"},{"line_number":1432,"context_line":"                raise InvalidRequest(msg\u003derr_str)"},{"line_number":1433,"context_line":"        if status \u003d\u003d HTTP_UNAUTHORIZED:"}],"source_content_type":"text/x-python","patch_set":84,"id":"63aa0e72_753cc8da","line":1430,"updated":"2023-12-15 18:15:00.000000000","message":"ok so for actual mpus the validation is delegated to SLO and just translated here","commit_id":"2158cef630cf096804bdecf7ffb56cfb98c29500"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4505a044fff596775a29c87dc1ac8f023aa7a8c9","unresolved":false,"context_lines":[{"line_number":1427,"context_line":"                           \u002710000, inclusive\u0027)"},{"line_number":1428,"context_line":"                raise InvalidArgument(\u0027partNumber\u0027,"},{"line_number":1429,"context_line":"                                      self.params[\u0027partNumber\u0027],"},{"line_number":1430,"context_line":"                                      err_str)"},{"line_number":1431,"context_line":"            else:"},{"line_number":1432,"context_line":"                raise InvalidRequest(msg\u003derr_str)"},{"line_number":1433,"context_line":"        if status \u003d\u003d HTTP_UNAUTHORIZED:"}],"source_content_type":"text/x-python","patch_set":84,"id":"435b041f_2337a147","line":1430,"in_reply_to":"63aa0e72_753cc8da","updated":"2024-01-03 22:50:18.000000000","message":"Acknowledged","commit_id":"2158cef630cf096804bdecf7ffb56cfb98c29500"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1890bdbdb002e8bd85f3f14c48c30bce51316b71","unresolved":true,"context_lines":[{"line_number":1315,"context_line":"                \u0027GET\u0027: {"},{"line_number":1316,"context_line":"                    HTTP_NOT_FOUND: not_found_handler,"},{"line_number":1317,"context_line":"                    HTTP_PRECONDITION_FAILED: PreconditionFailed,"},{"line_number":1318,"context_line":"                    HTTP_REQUESTED_RANGE_NOT_SATISFIABLE: InvalidRange,"},{"line_number":1319,"context_line":"                },"},{"line_number":1320,"context_line":"                \u0027PUT\u0027: {"},{"line_number":1321,"context_line":"                    HTTP_NOT_FOUND: (NoSuchBucket, container),"}],"source_content_type":"text/x-python","patch_set":86,"id":"abf7da44_023bd2b7","side":"PARENT","line":1318,"updated":"2023-12-17 22:35:51.000000000","message":"having looked at this code more closely when debugging 416 response translation with Ash I now think pulling *any* of these translations out of this limited err_codes-map is a kind of win.\n\nIt\u0027s annoying to have two different ways to translate swift errors into s3api errors - the elif train has none of the limitations of this method (the \"callable\" interface can\u0027t inspect the response, and \"env\" isn\u0027t a good as having the request object)\n\nI think Tim took a stab at refactoring a lot of this once; we probaby should have leaned into it more.","commit_id":"7663f225ee84999b1a7250705fb663aaab845331"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4a0b87c53e731d98036632e5d4e4234627ccbf0f","unresolved":false,"context_lines":[{"line_number":1315,"context_line":"                \u0027GET\u0027: {"},{"line_number":1316,"context_line":"                    HTTP_NOT_FOUND: not_found_handler,"},{"line_number":1317,"context_line":"                    HTTP_PRECONDITION_FAILED: PreconditionFailed,"},{"line_number":1318,"context_line":"                    HTTP_REQUESTED_RANGE_NOT_SATISFIABLE: InvalidRange,"},{"line_number":1319,"context_line":"                },"},{"line_number":1320,"context_line":"                \u0027PUT\u0027: {"},{"line_number":1321,"context_line":"                    HTTP_NOT_FOUND: (NoSuchBucket, container),"}],"source_content_type":"text/x-python","patch_set":86,"id":"09dd7230_21dd2381","side":"PARENT","line":1318,"in_reply_to":"0e2d8371_37e12832","updated":"2024-02-22 01:09:15.000000000","message":"Done","commit_id":"7663f225ee84999b1a7250705fb663aaab845331"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b345b886e3152837bdc01805959ce014e34f45c","unresolved":true,"context_lines":[{"line_number":1315,"context_line":"                \u0027GET\u0027: {"},{"line_number":1316,"context_line":"                    HTTP_NOT_FOUND: not_found_handler,"},{"line_number":1317,"context_line":"                    HTTP_PRECONDITION_FAILED: PreconditionFailed,"},{"line_number":1318,"context_line":"                    HTTP_REQUESTED_RANGE_NOT_SATISFIABLE: InvalidRange,"},{"line_number":1319,"context_line":"                },"},{"line_number":1320,"context_line":"                \u0027PUT\u0027: {"},{"line_number":1321,"context_line":"                    HTTP_NOT_FOUND: (NoSuchBucket, container),"}],"source_content_type":"text/x-python","patch_set":86,"id":"0e2d8371_37e12832","side":"PARENT","line":1318,"in_reply_to":"abf7da44_023bd2b7","updated":"2024-02-22 01:08:46.000000000","message":"Ya i think i addressed it here, ref: https://review.opendev.org/c/openstack/swift/+/894580/comment/eddd4748_d1e4ed2b/","commit_id":"7663f225ee84999b1a7250705fb663aaab845331"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1890bdbdb002e8bd85f3f14c48c30bce51316b71","unresolved":true,"context_lines":[{"line_number":1417,"context_line":"                raise InvalidArgument(\u0027X-Delete-At\u0027,"},{"line_number":1418,"context_line":"                                      self.headers[\u0027X-Delete-At\u0027],"},{"line_number":1419,"context_line":"                                      err_str)"},{"line_number":1420,"context_line":"            if \u0027X-Delete-After\u0027 in err_str:"},{"line_number":1421,"context_line":"                raise InvalidArgument(\u0027X-Delete-After\u0027,"},{"line_number":1422,"context_line":"                                      self.headers[\u0027X-Delete-After\u0027],"},{"line_number":1423,"context_line":"                                      err_str)"}],"source_content_type":"text/x-python","patch_set":86,"id":"7a62367e_52444909","line":1420,"updated":"2023-12-17 22:35:51.000000000","message":"oic, we didn\u0027t DROP decode; we just *re-used* the already decoded err_str - nice cleanup actually; kudos.","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0925780ffd3db4d3e27dea6fd757d2f5f3802265","unresolved":false,"context_lines":[{"line_number":1417,"context_line":"                raise InvalidArgument(\u0027X-Delete-At\u0027,"},{"line_number":1418,"context_line":"                                      self.headers[\u0027X-Delete-At\u0027],"},{"line_number":1419,"context_line":"                                      err_str)"},{"line_number":1420,"context_line":"            if \u0027X-Delete-After\u0027 in err_str:"},{"line_number":1421,"context_line":"                raise InvalidArgument(\u0027X-Delete-After\u0027,"},{"line_number":1422,"context_line":"                                      self.headers[\u0027X-Delete-After\u0027],"},{"line_number":1423,"context_line":"                                      err_str)"}],"source_content_type":"text/x-python","patch_set":86,"id":"728c1fc5_e4df2ace","line":1420,"in_reply_to":"7a62367e_52444909","updated":"2024-01-11 14:27:17.000000000","message":"Acknowledged","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1890bdbdb002e8bd85f3f14c48c30bce51316b71","unresolved":true,"context_lines":[{"line_number":1422,"context_line":"                                      self.headers[\u0027X-Delete-After\u0027],"},{"line_number":1423,"context_line":"                                      err_str)"},{"line_number":1424,"context_line":"            elif (\u0027Part number must be an integer\u0027"},{"line_number":1425,"context_line":"                  in err_str):"},{"line_number":1426,"context_line":"                err_str \u003d (\u0027Part number must be an integer between 1 and \u0027"},{"line_number":1427,"context_line":"                           \u002710000, inclusive\u0027)"},{"line_number":1428,"context_line":"                raise InvalidArgument(\u0027partNumber\u0027,"}],"source_content_type":"text/x-python","patch_set":86,"id":"eddd4748_d1e4ed2b","line":1425,"updated":"2023-12-17 22:35:51.000000000","message":"from my read there\u0027s not any prior art in this block where we look at the swift error message *body* to determine what response we should send to the client - and this change does it TWICE.\n\nI imagine there may exist some other explicit more maintainable way to determine what error mssage swift is sending using headers or such, but lacking swift \"error codes\" I\u0027m not sure there\u0027s anything *obviously* better than just relying on swift not changing it\u0027s error response body messages on accident.","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b345b886e3152837bdc01805959ce014e34f45c","unresolved":true,"context_lines":[{"line_number":1422,"context_line":"                                      self.headers[\u0027X-Delete-After\u0027],"},{"line_number":1423,"context_line":"                                      err_str)"},{"line_number":1424,"context_line":"            elif (\u0027Part number must be an integer\u0027"},{"line_number":1425,"context_line":"                  in err_str):"},{"line_number":1426,"context_line":"                err_str \u003d (\u0027Part number must be an integer between 1 and \u0027"},{"line_number":1427,"context_line":"                           \u002710000, inclusive\u0027)"},{"line_number":1428,"context_line":"                raise InvalidArgument(\u0027partNumber\u0027,"}],"source_content_type":"text/x-python","patch_set":86,"id":"e24c1e38_b89f89a4","line":1425,"in_reply_to":"b4efcc56_bc263d56","updated":"2024-02-22 01:08:46.000000000","message":"This could be addressed in a follow-on patch, perhaps ref: https://review.opendev.org/c/openstack/swift/+/751555","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4a0b87c53e731d98036632e5d4e4234627ccbf0f","unresolved":false,"context_lines":[{"line_number":1422,"context_line":"                                      self.headers[\u0027X-Delete-After\u0027],"},{"line_number":1423,"context_line":"                                      err_str)"},{"line_number":1424,"context_line":"            elif (\u0027Part number must be an integer\u0027"},{"line_number":1425,"context_line":"                  in err_str):"},{"line_number":1426,"context_line":"                err_str \u003d (\u0027Part number must be an integer between 1 and \u0027"},{"line_number":1427,"context_line":"                           \u002710000, inclusive\u0027)"},{"line_number":1428,"context_line":"                raise InvalidArgument(\u0027partNumber\u0027,"}],"source_content_type":"text/x-python","patch_set":86,"id":"f481ee70_a4ed8485","line":1425,"in_reply_to":"e24c1e38_b89f89a4","updated":"2024-02-22 01:09:15.000000000","message":"Acknowledged","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a6a6b9ce4d8c47e431e146f5afd0af9c20029b8b","unresolved":true,"context_lines":[{"line_number":1422,"context_line":"                                      self.headers[\u0027X-Delete-After\u0027],"},{"line_number":1423,"context_line":"                                      err_str)"},{"line_number":1424,"context_line":"            elif (\u0027Part number must be an integer\u0027"},{"line_number":1425,"context_line":"                  in err_str):"},{"line_number":1426,"context_line":"                err_str \u003d (\u0027Part number must be an integer between 1 and \u0027"},{"line_number":1427,"context_line":"                           \u002710000, inclusive\u0027)"},{"line_number":1428,"context_line":"                raise InvalidArgument(\u0027partNumber\u0027,"}],"source_content_type":"text/x-python","patch_set":86,"id":"b4efcc56_bc263d56","line":1425,"in_reply_to":"eddd4748_d1e4ed2b","updated":"2023-12-20 15:02:15.000000000","message":"this error could be caught earlier though - we don\u0027t have to rely on SLO to detect a non-integer partnumber","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1890bdbdb002e8bd85f3f14c48c30bce51316b71","unresolved":true,"context_lines":[{"line_number":1437,"context_line":"            raise AccessDenied(reason\u003d\u0027forbidden\u0027)"},{"line_number":1438,"context_line":"        if status \u003d\u003d HTTP_REQUESTED_RANGE_NOT_SATISFIABLE:"},{"line_number":1439,"context_line":"            err_str \u003d err_msg.decode(\u0027utf8\u0027)"},{"line_number":1440,"context_line":"            if \u0027The requested part number is not satisfiable\u0027 in err_str:"},{"line_number":1441,"context_line":"                raise InvalidPartNumber()"},{"line_number":1442,"context_line":"            raise InvalidRange()"},{"line_number":1443,"context_line":"        if status \u003d\u003d HTTP_SERVICE_UNAVAILABLE:"}],"source_content_type":"text/x-python","patch_set":86,"id":"8237c995_af28144c","line":1440,"updated":"2023-12-17 22:35:51.000000000","message":"most importantly I\u0027ve confirmed if either of these messages change in slo.py\n\n\tgit diff swift/common/middleware/slo.py\n\tdiff --git a/swift/common/middleware/slo.py b/swift/common/middleware/slo.py\n\tindex 14fbdc48c..d740b58cf 100644\n\t--- a/swift/common/middleware/slo.py\n\t+++ b/swift/common/middleware/slo.py\n\t@@ -1035,7 +1035,7 @@ class SloGetContext(WSGIContext):\n\t\t\t     resp_iter \u003d []\n\t\t\t     headers[\u0027Content-Length\u0027] \u003d \u00270\u0027\n\t\t\t else:\n\t-                    body \u003d b\u0027The requested part number is not satisfiable\u0027\n\t+                    body \u003d b\u0027The requested part number not satisfiable\u0027\n\t\t\t     resp_iter \u003d [body]\n\t\t\t     headers[\u0027Content-Length\u0027] \u003d len(body)\n\t\t\t headers[\u0027Content-Range\u0027] \u003d \u0027bytes */%d\u0027 % resp_attrs.slo_size\n\t@@ -1123,7 +1123,7 @@ class SloGetContext(WSGIContext):\n\t\t     if part_number \u003c\u003d 0:\n\t\t\t raise ValueError\n\t\t except ValueError:\n\t-            raise HTTPBadRequest(\u0027Part number must be an integer greater \u0027\n\t+            raise HTTPBadRequest(\u0027Part number must be integer greater \u0027\n\t\t\t\t\t  \u0027than 0\u0027)\n\t \n\t\t if req.range:\n\n\nwe get clear indications in s3api unittests that additional updates will be required in the request translation; burdonsome perhaps - but explicitly verifiable and easily maintained:\n\n\tFAILED swift/test/unit/common/middleware/s3api/test_multi_get.py::TestMpuGET::test_mpu_GET_invalid_part_num - AssertionError: \u0027InvalidRequest\u0027 !\u003d \u0027InvalidArgument\u0027\n\tFAILED swift/test/unit/common/middleware/s3api/test_multi_get.py::TestMpuGET::test_mpu_GET_out_of_range_part_num - AssertionError: \u0027InvalidRange\u0027 !\u003d \u0027InvalidPartNumber\u0027\n\tFAILED swift/test/unit/common/middleware/s3api/test_multi_get.py::TestMpuGET::test_mpu_GET_zero_part_num - AssertionError: \u0027InvalidRequest\u0027 !\u003d \u0027InvalidArgument\u0027","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4505a044fff596775a29c87dc1ac8f023aa7a8c9","unresolved":false,"context_lines":[{"line_number":1437,"context_line":"            raise AccessDenied(reason\u003d\u0027forbidden\u0027)"},{"line_number":1438,"context_line":"        if status \u003d\u003d HTTP_REQUESTED_RANGE_NOT_SATISFIABLE:"},{"line_number":1439,"context_line":"            err_str \u003d err_msg.decode(\u0027utf8\u0027)"},{"line_number":1440,"context_line":"            if \u0027The requested part number is not satisfiable\u0027 in err_str:"},{"line_number":1441,"context_line":"                raise InvalidPartNumber()"},{"line_number":1442,"context_line":"            raise InvalidRange()"},{"line_number":1443,"context_line":"        if status \u003d\u003d HTTP_SERVICE_UNAVAILABLE:"}],"source_content_type":"text/x-python","patch_set":86,"id":"88e63838_a6cbe462","line":1440,"in_reply_to":"8237c995_af28144c","updated":"2024-01-03 22:50:18.000000000","message":"Acknowledged","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d4983929818e6a71bee5c7bda9d39aea1a3634bf","unresolved":true,"context_lines":[{"line_number":1424,"context_line":"            elif (\u0027Part number must be an integer\u0027"},{"line_number":1425,"context_line":"                  in err_str):"},{"line_number":1426,"context_line":"                err_str \u003d (\u0027Part number must be an integer between 1 and \u0027"},{"line_number":1427,"context_line":"                           \u002710000, inclusive\u0027)"},{"line_number":1428,"context_line":"                raise InvalidArgument(\u0027partNumber\u0027,"},{"line_number":1429,"context_line":"                                      self.params[\u0027partNumber\u0027],"},{"line_number":1430,"context_line":"                                      err_str)"}],"source_content_type":"text/x-python","patch_set":87,"id":"9f0249e3_064eb38c","line":1427,"range":{"start_line":1427,"start_character":27,"end_line":1427,"end_character":33},"updated":"2023-12-19 19:06:08.000000000","message":"AFAICT the upper limit is not enforced (and IMHO nor should it be - same as for SLO, the max is configurable so we don\u0027t know how many parts an MPU may have been created with in the past).\n\nOh, but the message must be identical to AWS. OK!","commit_id":"c09525899875d2b8c866ba63564c50aa4fe2872e"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4505a044fff596775a29c87dc1ac8f023aa7a8c9","unresolved":false,"context_lines":[{"line_number":1424,"context_line":"            elif (\u0027Part number must be an integer\u0027"},{"line_number":1425,"context_line":"                  in err_str):"},{"line_number":1426,"context_line":"                err_str \u003d (\u0027Part number must be an integer between 1 and \u0027"},{"line_number":1427,"context_line":"                           \u002710000, inclusive\u0027)"},{"line_number":1428,"context_line":"                raise InvalidArgument(\u0027partNumber\u0027,"},{"line_number":1429,"context_line":"                                      self.params[\u0027partNumber\u0027],"},{"line_number":1430,"context_line":"                                      err_str)"}],"source_content_type":"text/x-python","patch_set":87,"id":"2a3e5231_fbb5b26f","line":1427,"range":{"start_line":1427,"start_character":27,"end_line":1427,"end_character":33},"in_reply_to":"9f0249e3_064eb38c","updated":"2024-01-03 22:50:18.000000000","message":"Acknowledged","commit_id":"c09525899875d2b8c866ba63564c50aa4fe2872e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"14345cc66547a166af7b39733b0bea32a69bc1ef","unresolved":true,"context_lines":[{"line_number":1438,"context_line":"                    part_num \u003d int(self.params[\u0027partNumber\u0027])"},{"line_number":1439,"context_line":"                except ValueError:"},{"line_number":1440,"context_line":"                    raise InvalidPartArgument(self.params[\u0027partNumber\u0027])"},{"line_number":1441,"context_line":"                if part_num \u003e 10000:"},{"line_number":1442,"context_line":"                    raise InvalidPartArgument(self.params[\u0027partNumber\u0027])"},{"line_number":1443,"context_line":"                if \u0027The requested part number is not satisfiable\u0027 in err_str:"},{"line_number":1444,"context_line":"                    raise InvalidPartNumber()"}],"source_content_type":"text/x-python","patch_set":91,"id":"d6200ce8_63d628a6","line":1441,"range":{"start_line":1441,"start_character":30,"end_line":1441,"end_character":35},"updated":"2023-12-20 16:18:41.000000000","message":"I made a start on this being the configured value https://review.opendev.org/c/openstack/swift/+/904137","commit_id":"2e9d68a0fd67db02696806b56fce1825041640a3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4505a044fff596775a29c87dc1ac8f023aa7a8c9","unresolved":false,"context_lines":[{"line_number":1438,"context_line":"                    part_num \u003d int(self.params[\u0027partNumber\u0027])"},{"line_number":1439,"context_line":"                except ValueError:"},{"line_number":1440,"context_line":"                    raise InvalidPartArgument(self.params[\u0027partNumber\u0027])"},{"line_number":1441,"context_line":"                if part_num \u003e 10000:"},{"line_number":1442,"context_line":"                    raise InvalidPartArgument(self.params[\u0027partNumber\u0027])"},{"line_number":1443,"context_line":"                if \u0027The requested part number is not satisfiable\u0027 in err_str:"},{"line_number":1444,"context_line":"                    raise InvalidPartNumber()"}],"source_content_type":"text/x-python","patch_set":91,"id":"8e9982f6_18bbfaf4","line":1441,"range":{"start_line":1441,"start_character":30,"end_line":1441,"end_character":35},"in_reply_to":"d6200ce8_63d628a6","updated":"2024-01-03 22:50:18.000000000","message":"Done","commit_id":"2e9d68a0fd67db02696806b56fce1825041640a3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a6a6b9ce4d8c47e431e146f5afd0af9c20029b8b","unresolved":true,"context_lines":[{"line_number":1441,"context_line":"                if part_num \u003e 10000:"},{"line_number":1442,"context_line":"                    raise InvalidPartArgument(self.params[\u0027partNumber\u0027])"},{"line_number":1443,"context_line":"                if \u0027The requested part number is not satisfiable\u0027 in err_str:"},{"line_number":1444,"context_line":"                    raise InvalidPartNumber()"},{"line_number":1445,"context_line":"            raise InvalidRange()"},{"line_number":1446,"context_line":"        if status \u003d\u003d HTTP_SERVICE_UNAVAILABLE:"},{"line_number":1447,"context_line":"            raise ServiceUnavailable()"}],"source_content_type":"text/x-python","patch_set":91,"id":"23d48d94_5f6a6001","line":1444,"updated":"2023-12-20 15:02:15.000000000","message":"there\u0027s similar code in obj.py , and in the PartController - unified in https://review.opendev.org/c/openstack/swift/+/904127","commit_id":"2e9d68a0fd67db02696806b56fce1825041640a3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4505a044fff596775a29c87dc1ac8f023aa7a8c9","unresolved":false,"context_lines":[{"line_number":1441,"context_line":"                if part_num \u003e 10000:"},{"line_number":1442,"context_line":"                    raise InvalidPartArgument(self.params[\u0027partNumber\u0027])"},{"line_number":1443,"context_line":"                if \u0027The requested part number is not satisfiable\u0027 in err_str:"},{"line_number":1444,"context_line":"                    raise InvalidPartNumber()"},{"line_number":1445,"context_line":"            raise InvalidRange()"},{"line_number":1446,"context_line":"        if status \u003d\u003d HTTP_SERVICE_UNAVAILABLE:"},{"line_number":1447,"context_line":"            raise ServiceUnavailable()"}],"source_content_type":"text/x-python","patch_set":91,"id":"4451c39d_ad1e3537","line":1444,"in_reply_to":"23d48d94_5f6a6001","updated":"2024-01-03 22:50:18.000000000","message":"Done","commit_id":"2e9d68a0fd67db02696806b56fce1825041640a3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65c05dfc01e2dcfd82f658a74ba32a4835b23c4b","unresolved":true,"context_lines":[{"line_number":1465,"context_line":"                                      err_str)"},{"line_number":1466,"context_line":"            elif \u0027Part number must be an integer\u0027 in err_str:"},{"line_number":1467,"context_line":"                self.validate_part_number("},{"line_number":1468,"context_line":"                    max_parts\u003dself.conf.max_upload_part_num)"},{"line_number":1469,"context_line":"            raise InvalidRequest(msg\u003derr_str)"},{"line_number":1470,"context_line":"        if status \u003d\u003d HTTP_UNAUTHORIZED:"},{"line_number":1471,"context_line":"            raise SignatureDoesNotMatch("}],"source_content_type":"text/x-python","patch_set":96,"id":"36ab0540_b4f7f528","line":1468,"updated":"2024-02-28 14:27:33.000000000","message":"this shouldn\u0027t be necessary once we have https://review.opendev.org/c/openstack/swift/+/906906\n\nI\u0027m wondering if we should squash that in","commit_id":"3aa990a90aeb309be5d058ab996f20342ce96121"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"15c30fd48ff3f6ee122d7adb2bb5254f860ddf55","unresolved":false,"context_lines":[{"line_number":1465,"context_line":"                                      err_str)"},{"line_number":1466,"context_line":"            elif \u0027Part number must be an integer\u0027 in err_str:"},{"line_number":1467,"context_line":"                self.validate_part_number("},{"line_number":1468,"context_line":"                    max_parts\u003dself.conf.max_upload_part_num)"},{"line_number":1469,"context_line":"            raise InvalidRequest(msg\u003derr_str)"},{"line_number":1470,"context_line":"        if status \u003d\u003d HTTP_UNAUTHORIZED:"},{"line_number":1471,"context_line":"            raise SignatureDoesNotMatch("}],"source_content_type":"text/x-python","patch_set":96,"id":"13f68444_431f7d8b","line":1468,"in_reply_to":"2f891fc1_49454138","updated":"2024-03-01 17:41:17.000000000","message":"Done","commit_id":"3aa990a90aeb309be5d058ab996f20342ce96121"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"27342520d304753e8377b76686f9ebde43dee130","unresolved":false,"context_lines":[{"line_number":1465,"context_line":"                                      err_str)"},{"line_number":1466,"context_line":"            elif \u0027Part number must be an integer\u0027 in err_str:"},{"line_number":1467,"context_line":"                self.validate_part_number("},{"line_number":1468,"context_line":"                    max_parts\u003dself.conf.max_upload_part_num)"},{"line_number":1469,"context_line":"            raise InvalidRequest(msg\u003derr_str)"},{"line_number":1470,"context_line":"        if status \u003d\u003d HTTP_UNAUTHORIZED:"},{"line_number":1471,"context_line":"            raise SignatureDoesNotMatch("}],"source_content_type":"text/x-python","patch_set":96,"id":"e527fc53_0b4d845e","line":1468,"in_reply_to":"2f891fc1_49454138","updated":"2024-03-01 17:41:20.000000000","message":"Done","commit_id":"3aa990a90aeb309be5d058ab996f20342ce96121"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2a0819a77dea2bcc8cc833839d14b2a2c5a70075","unresolved":true,"context_lines":[{"line_number":1465,"context_line":"                                      err_str)"},{"line_number":1466,"context_line":"            elif \u0027Part number must be an integer\u0027 in err_str:"},{"line_number":1467,"context_line":"                self.validate_part_number("},{"line_number":1468,"context_line":"                    max_parts\u003dself.conf.max_upload_part_num)"},{"line_number":1469,"context_line":"            raise InvalidRequest(msg\u003derr_str)"},{"line_number":1470,"context_line":"        if status \u003d\u003d HTTP_UNAUTHORIZED:"},{"line_number":1471,"context_line":"            raise SignatureDoesNotMatch("}],"source_content_type":"text/x-python","patch_set":96,"id":"2f891fc1_49454138","line":1468,"in_reply_to":"36ab0540_b4f7f528","updated":"2024-02-28 14:49:18.000000000","message":"I squashed it","commit_id":"3aa990a90aeb309be5d058ab996f20342ce96121"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c973fdbb319a88223472c880caf6eb292cfd7444","unresolved":true,"context_lines":[{"line_number":571,"context_line":"        given."},{"line_number":572,"context_line":""},{"line_number":573,"context_line":"        :param parts_count: if given, this is the number of parts in an"},{"line_number":574,"context_line":"            existing object."},{"line_number":575,"context_line":"        :raises InvalidPartArgument: if the partNumber param is invalid i.e."},{"line_number":576,"context_line":"            less than 1 or greater than the maximum allowed parts."},{"line_number":577,"context_line":"        :raises InvalidPartNumber: if the partNumber param is valid but greater"}],"source_content_type":"text/x-python","patch_set":99,"id":"32feac3a_89c03cc1","line":574,"updated":"2024-03-12 06:17:10.000000000","message":"NIT: check_max doesn\u0027t seem to be given in this doc string.","commit_id":"7557ab7ef6420e8182ebc1560fefa4a1c6f81e74"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c973fdbb319a88223472c880caf6eb292cfd7444","unresolved":true,"context_lines":[{"line_number":1481,"context_line":"            raise AccessDenied(reason\u003d\u0027forbidden\u0027)"},{"line_number":1482,"context_line":"        if status \u003d\u003d HTTP_REQUESTED_RANGE_NOT_SATISFIABLE:"},{"line_number":1483,"context_line":"            self.validate_part_number("},{"line_number":1484,"context_line":"                parts_count\u003dresp.headers.get(\u0027x-amz-mp-parts-count\u0027))"},{"line_number":1485,"context_line":"            raise InvalidRange()"},{"line_number":1486,"context_line":"        if status \u003d\u003d HTTP_SERVICE_UNAVAILABLE:"},{"line_number":1487,"context_line":"            raise ServiceUnavailable()"}],"source_content_type":"text/x-python","patch_set":99,"id":"d8ce71f7_5f3d4044","line":1484,"updated":"2024-03-12 06:17:10.000000000","message":"I assume we just call it like this so the other potential errors can be raised. but otherwise this looks weird. Or maybe it\u0027s just me.","commit_id":"7557ab7ef6420e8182ebc1560fefa4a1c6f81e74"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e0aca7c415b6cf02a32752a42bf859d22cbf83f6","unresolved":true,"context_lines":[{"line_number":1481,"context_line":"            raise AccessDenied(reason\u003d\u0027forbidden\u0027)"},{"line_number":1482,"context_line":"        if status \u003d\u003d HTTP_REQUESTED_RANGE_NOT_SATISFIABLE:"},{"line_number":1483,"context_line":"            self.validate_part_number("},{"line_number":1484,"context_line":"                parts_count\u003dresp.headers.get(\u0027x-amz-mp-parts-count\u0027))"},{"line_number":1485,"context_line":"            raise InvalidRange()"},{"line_number":1486,"context_line":"        if status \u003d\u003d HTTP_SERVICE_UNAVAILABLE:"},{"line_number":1487,"context_line":"            raise ServiceUnavailable()"}],"source_content_type":"text/x-python","patch_set":99,"id":"987d3b9b_d8853730","line":1484,"in_reply_to":"d8ce71f7_5f3d4044","updated":"2024-03-12 10:34:22.000000000","message":"what looks weird?\n\nwe\u0027re passing in the actual parts count so that the error message can be accurate about what the allowed part numbers are","commit_id":"7557ab7ef6420e8182ebc1560fefa4a1c6f81e74"}],"swift/common/middleware/s3api/s3response.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1890bdbdb002e8bd85f3f14c48c30bce51316b71","unresolved":true,"context_lines":[{"line_number":484,"context_line":"    _status \u003d \u0027416 Requested Range Not Satisfiable\u0027"},{"line_number":485,"context_line":"    _msg \u003d \u0027The requested partnumber is not satisfiable\u0027"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"class InvalidRequest(ErrorResponse):"},{"line_number":489,"context_line":"    _status \u003d \u0027400 Bad Request\u0027"},{"line_number":490,"context_line":"    _msg \u003d \u0027Invalid Request.\u0027"}],"source_content_type":"text/x-python","patch_set":86,"id":"dca7450f_bca9cc25","line":487,"updated":"2023-12-17 22:35:51.000000000","message":"test.unit.common.mw.s3api.test_s3response is sort of anemic, both of these changes are well covered in the unittests of the module\u0027s that rely on them.","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4505a044fff596775a29c87dc1ac8f023aa7a8c9","unresolved":false,"context_lines":[{"line_number":484,"context_line":"    _status \u003d \u0027416 Requested Range Not Satisfiable\u0027"},{"line_number":485,"context_line":"    _msg \u003d \u0027The requested partnumber is not satisfiable\u0027"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"class InvalidRequest(ErrorResponse):"},{"line_number":489,"context_line":"    _status \u003d \u0027400 Bad Request\u0027"},{"line_number":490,"context_line":"    _msg \u003d \u0027Invalid Request.\u0027"}],"source_content_type":"text/x-python","patch_set":86,"id":"d9164a60_dcd590fa","line":487,"in_reply_to":"dca7450f_bca9cc25","updated":"2024-01-03 22:50:18.000000000","message":"Acknowledged","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a6a6b9ce4d8c47e431e146f5afd0af9c20029b8b","unresolved":true,"context_lines":[{"line_number":451,"context_line":"    _msg \u003d \u0027The operation is not valid for the current state of the object.\u0027"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"class InvalidPartArgument(InvalidArgument):"},{"line_number":455,"context_line":"    _code \u003d \u0027InvalidArgument\u0027"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def __init__(self, value):"}],"source_content_type":"text/x-python","patch_set":91,"id":"d1f4a9f7_82392547","line":454,"updated":"2023-12-20 15:02:15.000000000","message":"this could be re-used in the PartController - see https://review.opendev.org/c/openstack/swift/+/904127","commit_id":"2e9d68a0fd67db02696806b56fce1825041640a3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4505a044fff596775a29c87dc1ac8f023aa7a8c9","unresolved":false,"context_lines":[{"line_number":451,"context_line":"    _msg \u003d \u0027The operation is not valid for the current state of the object.\u0027"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"class InvalidPartArgument(InvalidArgument):"},{"line_number":455,"context_line":"    _code \u003d \u0027InvalidArgument\u0027"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def __init__(self, value):"}],"source_content_type":"text/x-python","patch_set":91,"id":"78181d36_b75e472f","line":454,"in_reply_to":"d1f4a9f7_82392547","updated":"2024-01-03 22:50:18.000000000","message":"Done","commit_id":"2e9d68a0fd67db02696806b56fce1825041640a3"}],"test/s3api/__init__.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0925780ffd3db4d3e27dea6fd757d2f5f3802265","unresolved":true,"context_lines":[{"line_number":151,"context_line":"    # Default to v4 signatures (as aws-cli does), but subclasses can override"},{"line_number":152,"context_line":"    signature_version \u003d \u0027s3v4\u0027"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def get_s3_client(self, user):"},{"line_number":155,"context_line":"        return get_s3_client(user, self.signature_version)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def _remove_all_object_versions_from_bucket(self, client, bucket_name):"}],"source_content_type":"text/x-python","patch_set":93,"id":"9894eb8b_8bb011e3","line":154,"updated":"2024-01-11 14:27:17.000000000","message":"it\u0027s not clear to me why these helpers needed to become instance methods","commit_id":"eddcdfc88f4d63f4246573624d9a98b76b9ae289"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b345b886e3152837bdc01805959ce014e34f45c","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    # Default to v4 signatures (as aws-cli does), but subclasses can override"},{"line_number":152,"context_line":"    signature_version \u003d \u0027s3v4\u0027"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def get_s3_client(self, user):"},{"line_number":155,"context_line":"        return get_s3_client(user, self.signature_version)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def _remove_all_object_versions_from_bucket(self, client, bucket_name):"}],"source_content_type":"text/x-python","patch_set":93,"id":"d150b72a_8508b61a","line":154,"in_reply_to":"9894eb8b_8bb011e3","updated":"2024-02-22 01:08:46.000000000","message":"Done","commit_id":"eddcdfc88f4d63f4246573624d9a98b76b9ae289"}],"test/s3api/test_mpu.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3ded4d4d0e56e61007831f1bc13585ae907cbb54","unresolved":true,"context_lines":[{"line_number":142,"context_line":"            self.assertEqual(mpu_etag, resp[\u0027ETag\u0027], mpu_etag)"},{"line_number":143,"context_line":"            self.assertEqual(num_parts, resp[\u0027PartsCount\u0027])"},{"line_number":144,"context_line":"            self.assertEqual(\u0027bytes\u0027, resp[\u0027AcceptRanges\u0027])"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def test_create_list_abort_multipart_uploads(self):"},{"line_number":147,"context_line":"        key_name \u003d self.create_name(\u0027key\u0027)"},{"line_number":148,"context_line":"        create_mpu_resp \u003d self.client.create_multipart_upload("}],"source_content_type":"text/x-python","patch_set":21,"id":"f2f3a1de_8bb2d568","line":145,"updated":"2023-10-10 16:51:44.000000000","message":"I think ther\u0027es some other client methods that support PartNumber kwarg - it\u0027d be nice to grab a few more tests","commit_id":"d55400fee575d1039b35d9c85b00a4fe77f6262d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4ee65a004d83e935b24e661a46d5d9d351229305","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            self.assertEqual(mpu_etag, resp[\u0027ETag\u0027], mpu_etag)"},{"line_number":143,"context_line":"            self.assertEqual(num_parts, resp[\u0027PartsCount\u0027])"},{"line_number":144,"context_line":"            self.assertEqual(\u0027bytes\u0027, resp[\u0027AcceptRanges\u0027])"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def test_create_list_abort_multipart_uploads(self):"},{"line_number":147,"context_line":"        key_name \u003d self.create_name(\u0027key\u0027)"},{"line_number":148,"context_line":"        create_mpu_resp \u003d self.client.create_multipart_upload("}],"source_content_type":"text/x-python","patch_set":21,"id":"4f216548_3a84d95f","line":145,"in_reply_to":"f2f3a1de_8bb2d568","updated":"2023-10-17 22:18:05.000000000","message":"Done","commit_id":"d55400fee575d1039b35d9c85b00a4fe77f6262d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":true,"context_lines":[{"line_number":18,"context_line":"from botocore.exceptions import ClientError"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def retry(f, timeout\u003d10):"},{"line_number":22,"context_line":"    timelimit \u003d time.time() + timeout"},{"line_number":23,"context_line":"    while True:"},{"line_number":24,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":46,"id":"2a943b5f_fcf65ea8","line":21,"updated":"2023-10-27 18:19:13.000000000","message":"Looks like this was cribbed from `test_versioning.py` -- should we pull it up to `__init__.py`?","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c5535086bd90ca92a96a148f43ec4e133cb33a3d","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from botocore.exceptions import ClientError"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def retry(f, timeout\u003d10):"},{"line_number":22,"context_line":"    timelimit \u003d time.time() + timeout"},{"line_number":23,"context_line":"    while True:"},{"line_number":24,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":46,"id":"6b803e51_d6b36ac9","line":21,"in_reply_to":"2a943b5f_fcf65ea8","updated":"2023-10-28 02:53:33.000000000","message":"I\u0027m not sure we should encourage it\u0027s use?  there\u0027s not even any backoff.\n\nIt was added in the original versions patch:\n\nhttps://review.opendev.org/c/openstack/swift/+/673682/1/test/s3api/test_versioning.py\n\nI\u0027m not sure the justification; it seems to be related to enable-ing versionsing.\n\nNo good reason to *duplidate* it tho; if we can\u0027t remove it we should have a common \"VersionEnabledTestMixin\" or something.","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":true,"context_lines":[{"line_number":26,"context_line":"        except (ClientError, AssertionError):"},{"line_number":27,"context_line":"            if time.time() \u003e timelimit:"},{"line_number":28,"context_line":"                raise"},{"line_number":29,"context_line":"            continue"},{"line_number":30,"context_line":"        else:"},{"line_number":31,"context_line":"            break"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"d4b196cc_1736eedc","line":29,"updated":"2023-10-27 18:19:13.000000000","message":"Maybe off-topic: Should we have some kind of sleep/backoff here?","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c5535086bd90ca92a96a148f43ec4e133cb33a3d","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        except (ClientError, AssertionError):"},{"line_number":27,"context_line":"            if time.time() \u003e timelimit:"},{"line_number":28,"context_line":"                raise"},{"line_number":29,"context_line":"            continue"},{"line_number":30,"context_line":"        else:"},{"line_number":31,"context_line":"            break"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"94500de7_98442856","line":29,"in_reply_to":"d4b196cc_1736eedc","updated":"2023-10-28 02:53:33.000000000","message":"heh, maybe in test_versoining - I\u0027m going to pull it out of here for now.","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":true,"context_lines":[{"line_number":47,"context_line":"                VersioningConfiguration\u003d{\u0027Status\u0027: \u0027Enabled\u0027})"},{"line_number":48,"context_line":"            self.assertEqual(200, resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        retry(enable_versioning)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def tearDown(self):"},{"line_number":53,"context_line":"        resp \u003d self.client.put_bucket_versioning("}],"source_content_type":"text/x-python","patch_set":46,"id":"01fc4af2_edc74e0d","line":50,"updated":"2023-10-27 18:19:13.000000000","message":"So we always enable versioning, not just for the versioning test? Which makes it all the stranger that the gate\u0027s failing, complaining about\n```\n\u003e       version_resp \u003d complete_mpu_resp[\u0027VersionId\u0027]\nE       KeyError: \u0027VersionId\u0027\n```\n...do we not send back version IDs when completing MPUs? I feel like we really _should_.","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c5535086bd90ca92a96a148f43ec4e133cb33a3d","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                VersioningConfiguration\u003d{\u0027Status\u0027: \u0027Enabled\u0027})"},{"line_number":48,"context_line":"            self.assertEqual(200, resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        retry(enable_versioning)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def tearDown(self):"},{"line_number":53,"context_line":"        resp \u003d self.client.put_bucket_versioning("}],"source_content_type":"text/x-python","patch_set":46,"id":"f04e871d_3896b684","line":50,"in_reply_to":"01fc4af2_edc74e0d","updated":"2023-10-28 02:53:33.000000000","message":"we should probably only enable versions when the tests expect them\n\nwe should definately return the same response/error that s3 returns","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":true,"context_lines":[{"line_number":53,"context_line":"        resp \u003d self.client.put_bucket_versioning("},{"line_number":54,"context_line":"            Bucket\u003dself.bucket_name,"},{"line_number":55,"context_line":"            VersioningConfiguration\u003d{\u0027Status\u0027: \u0027Suspended\u0027})"},{"line_number":56,"context_line":"        self.assertEqual(200, resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":57,"context_line":"        self.clear_bucket(self.client, self.bucket_name)"},{"line_number":58,"context_line":"        super(TestMultiPartUploads, self).tearDown()"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"3e9e8f98_fdeed674","line":56,"updated":"2023-10-27 18:19:13.000000000","message":"Why the `retry` in `setUp` but not `tearDown`?","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c5535086bd90ca92a96a148f43ec4e133cb33a3d","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        resp \u003d self.client.put_bucket_versioning("},{"line_number":54,"context_line":"            Bucket\u003dself.bucket_name,"},{"line_number":55,"context_line":"            VersioningConfiguration\u003d{\u0027Status\u0027: \u0027Suspended\u0027})"},{"line_number":56,"context_line":"        self.assertEqual(200, resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":57,"context_line":"        self.clear_bucket(self.client, self.bucket_name)"},{"line_number":58,"context_line":"        super(TestMultiPartUploads, self).tearDown()"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"4bf6a1d8_4410962f","line":56,"in_reply_to":"3e9e8f98_fdeed674","updated":"2023-10-28 02:53:33.000000000","message":"idk, probably cause that\u0027s what versioning did:\n\nhttps://github.com/NVIDIA/swift/blob/master/test/s3api/test_versioning.py#L57\n\nash, you can either learn to ask these questions yourself when you\u0027re copying code (get curious man!) or wait for reviewers to ask you, but we have to struggle to know why the code we write needs to be written the way we write it - or else we\u0027ll die under the complexity of maintaining a legacy of cargo culted maddess with no hope of ever beating out the stupid we\u0027ll inevitably let in despite our best efforts.","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":true,"context_lines":[{"line_number":98,"context_line":"        part_bodies \u003d ["},{"line_number":99,"context_line":"            (\u0027%d\u0027 % i) * part_size"},{"line_number":100,"context_line":"            for i in range(num_parts)"},{"line_number":101,"context_line":"        ]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        create_mpu_resp \u003d self.client.create_multipart_upload("},{"line_number":104,"context_line":"            Bucket\u003dself.bucket_name, Key\u003dkey_name)"}],"source_content_type":"text/x-python","patch_set":46,"id":"8777c684_321528a9","line":101,"updated":"2023-10-27 18:19:13.000000000","message":"nit: We could save some memory by making each body as we need it in the loop.","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc7db2c3c058690599d7aa31b7f5bf10240604f0","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        part_bodies \u003d ["},{"line_number":99,"context_line":"            (\u0027%d\u0027 % i) * part_size"},{"line_number":100,"context_line":"            for i in range(num_parts)"},{"line_number":101,"context_line":"        ]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        create_mpu_resp \u003d self.client.create_multipart_upload("},{"line_number":104,"context_line":"            Bucket\u003dself.bucket_name, Key\u003dkey_name)"}],"source_content_type":"text/x-python","patch_set":46,"id":"ef2a55e7_10d119c1","line":101,"in_reply_to":"7aa87827_7f7f9f37","updated":"2024-02-20 21:36:30.000000000","message":"Done","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c5535086bd90ca92a96a148f43ec4e133cb33a3d","unresolved":true,"context_lines":[{"line_number":98,"context_line":"        part_bodies \u003d ["},{"line_number":99,"context_line":"            (\u0027%d\u0027 % i) * part_size"},{"line_number":100,"context_line":"            for i in range(num_parts)"},{"line_number":101,"context_line":"        ]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        create_mpu_resp \u003d self.client.create_multipart_upload("},{"line_number":104,"context_line":"            Bucket\u003dself.bucket_name, Key\u003dkey_name)"}],"source_content_type":"text/x-python","patch_set":46,"id":"7aa87827_7f7f9f37","line":101,"in_reply_to":"8777c684_321528a9","updated":"2023-10-28 02:53:33.000000000","message":"Currently it\u0027s only ever ~10-20M?  I don\u0027t think it hurts the memory - I like to imagine it wants to be useful.","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":true,"context_lines":[{"line_number":128,"context_line":"        self.assertEqual(200, complete_mpu_resp["},{"line_number":129,"context_line":"            \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        version_resp \u003d complete_mpu_resp[\u0027VersionId\u0027]"},{"line_number":132,"context_line":"        if version_resp:"},{"line_number":133,"context_line":"            return complete_mpu_resp[\u0027ETag\u0027], complete_mpu_resp[\u0027VersionId\u0027]"},{"line_number":134,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":46,"id":"5a972f8a_c73e91c5","line":131,"updated":"2023-10-27 18:19:13.000000000","message":"I think you want `.get(\u0027VersionId\u0027)` here... or get rid of `version_resp` and say `if \u0027VersionId\u0027 in complete_mpu_resp:` below\n\nBut I think I like\n```\nreturn complete_mpu_resp[\u0027ETag\u0027], complete_mpu_resp.get(\u0027VersionId\u0027)\n```\nmost.","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c5535086bd90ca92a96a148f43ec4e133cb33a3d","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        self.assertEqual(200, complete_mpu_resp["},{"line_number":129,"context_line":"            \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        version_resp \u003d complete_mpu_resp[\u0027VersionId\u0027]"},{"line_number":132,"context_line":"        if version_resp:"},{"line_number":133,"context_line":"            return complete_mpu_resp[\u0027ETag\u0027], complete_mpu_resp[\u0027VersionId\u0027]"},{"line_number":134,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":46,"id":"41454fba_370b9e8c","line":131,"in_reply_to":"5a972f8a_c73e91c5","updated":"2023-10-28 02:53:33.000000000","message":"Ack","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":true,"context_lines":[{"line_number":142,"context_line":"        ]"},{"line_number":143,"context_line":"        total_size \u003d num_parts * part_size"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        for i in range(num_parts):"},{"line_number":146,"context_line":"            # partNumber argument is 1 indexed"},{"line_number":147,"context_line":"            resp \u003d self.client.get_object(Bucket\u003dself.bucket_name,"},{"line_number":148,"context_line":"                                          Key\u003dkey_name,"}],"source_content_type":"text/x-python","patch_set":46,"id":"6cccacf5_7300bba8","line":145,"updated":"2023-10-27 18:19:13.000000000","message":"What do we get when we request `partNumber\u003d\u003cnum_parts + 1\u003e`?","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c5535086bd90ca92a96a148f43ec4e133cb33a3d","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        ]"},{"line_number":143,"context_line":"        total_size \u003d num_parts * part_size"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        for i in range(num_parts):"},{"line_number":146,"context_line":"            # partNumber argument is 1 indexed"},{"line_number":147,"context_line":"            resp \u003d self.client.get_object(Bucket\u003dself.bucket_name,"},{"line_number":148,"context_line":"                                          Key\u003dkey_name,"}],"source_content_type":"text/x-python","patch_set":46,"id":"1dcf99eb_7cfcfba7","line":145,"in_reply_to":"6cccacf5_7300bba8","updated":"2023-10-28 02:53:33.000000000","message":"good question!  I found a test for PartNumber\u003d0 but not PartNumber\u003d4!?","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            self.assertEqual(expected_range, resp[\u0027ContentRange\u0027])"},{"line_number":159,"context_line":"            # ETag and PartsCount are from the MPU"},{"line_number":160,"context_line":"            self.assertEqual(mpu_etag, resp[\u0027ETag\u0027], mpu_etag)"},{"line_number":161,"context_line":"            self.assertEqual(num_parts, resp[\u0027PartsCount\u0027])"},{"line_number":162,"context_line":"            self.assertEqual(\u0027bytes\u0027, resp[\u0027AcceptRanges\u0027])"},{"line_number":163,"context_line":"            if version is not None:"},{"line_number":164,"context_line":"                self.assertEqual(version, resp[\u0027VersionId\u0027])"}],"source_content_type":"text/x-python","patch_set":46,"id":"f0aeddc5_a61911ba","line":161,"updated":"2023-10-27 18:19:13.000000000","message":"Right; from my notes in the bug/feature request, looks like the parts count is the only extra info we get back -- AWS doesn\u0027t reflect the requested `partNumber` back, just the `Content-Range`.","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":true,"context_lines":[{"line_number":161,"context_line":"            self.assertEqual(num_parts, resp[\u0027PartsCount\u0027])"},{"line_number":162,"context_line":"            self.assertEqual(\u0027bytes\u0027, resp[\u0027AcceptRanges\u0027])"},{"line_number":163,"context_line":"            if version is not None:"},{"line_number":164,"context_line":"                self.assertEqual(version, resp[\u0027VersionId\u0027])"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def _verify_copy_parts(self, key_src, key_dest, part_size, num_parts,"},{"line_number":167,"context_line":"                           upload_id):"}],"source_content_type":"text/x-python","patch_set":46,"id":"ae5cdf34_6a9bb06f","line":164,"updated":"2023-10-27 18:19:13.000000000","message":"Can/should we have a\n```\nelse:\n    self.assertNotIn(\u0027VersionId\u0027, resp)\n```\n?","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c5535086bd90ca92a96a148f43ec4e133cb33a3d","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            self.assertEqual(num_parts, resp[\u0027PartsCount\u0027])"},{"line_number":162,"context_line":"            self.assertEqual(\u0027bytes\u0027, resp[\u0027AcceptRanges\u0027])"},{"line_number":163,"context_line":"            if version is not None:"},{"line_number":164,"context_line":"                self.assertEqual(version, resp[\u0027VersionId\u0027])"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def _verify_copy_parts(self, key_src, key_dest, part_size, num_parts,"},{"line_number":167,"context_line":"                           upload_id):"}],"source_content_type":"text/x-python","patch_set":46,"id":"5fccaed4_d2b4b8ad","line":164,"in_reply_to":"ae5cdf34_6a9bb06f","updated":"2023-10-28 02:53:33.000000000","message":"good question!  I\u0027ll add the assert, run test tests and let you know!","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":true,"context_lines":[{"line_number":177,"context_line":"                                 CopySource\u003d{"},{"line_number":178,"context_line":"                                     \u0027Bucket\u0027: self.bucket_name,"},{"line_number":179,"context_line":"                                     \u0027Key\u0027: key_src,"},{"line_number":180,"context_line":"                                 }, CopySourceRange\u003dcopy_range,"},{"line_number":181,"context_line":"                                 UploadId\u003dupload_id)"},{"line_number":182,"context_line":"            self.assertEqual(200, copy_resp["},{"line_number":183,"context_line":"                \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"}],"source_content_type":"text/x-python","patch_set":46,"id":"a9650454_e9349f54","line":180,"updated":"2023-10-27 18:19:13.000000000","message":"Does it work to copy with the `partNumber` in a query param off the `x-amz-copy-source` header, so we don\u0027t even have to know the ranges for the part?","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c5535086bd90ca92a96a148f43ec4e133cb33a3d","unresolved":true,"context_lines":[{"line_number":177,"context_line":"                                 CopySource\u003d{"},{"line_number":178,"context_line":"                                     \u0027Bucket\u0027: self.bucket_name,"},{"line_number":179,"context_line":"                                     \u0027Key\u0027: key_src,"},{"line_number":180,"context_line":"                                 }, CopySourceRange\u003dcopy_range,"},{"line_number":181,"context_line":"                                 UploadId\u003dupload_id)"},{"line_number":182,"context_line":"            self.assertEqual(200, copy_resp["},{"line_number":183,"context_line":"                \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"}],"source_content_type":"text/x-python","patch_set":46,"id":"ab31fecc_69bf5980","line":180,"in_reply_to":"a9650454_e9349f54","updated":"2023-10-28 02:53:33.000000000","message":"it doesn\u0027t SEEM like using part-number as part of copy-source is supported:\n\nhttps://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/upload_part_copy.html\n\nI think this is the recommend way to do it and the most important inerface for us to achieve parity with s3.  If there is an undocumented way to do it better I\u0027m sure there\u0027s some other client that\u0027s found it tho - so it might be useful to purseu further - probably as a follow-up.","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9391347eb89e33d483b4f686a5c849c99adde229","unresolved":true,"context_lines":[{"line_number":177,"context_line":"                                 CopySource\u003d{"},{"line_number":178,"context_line":"                                     \u0027Bucket\u0027: self.bucket_name,"},{"line_number":179,"context_line":"                                     \u0027Key\u0027: key_src,"},{"line_number":180,"context_line":"                                 }, CopySourceRange\u003dcopy_range,"},{"line_number":181,"context_line":"                                 UploadId\u003dupload_id)"},{"line_number":182,"context_line":"            self.assertEqual(200, copy_resp["},{"line_number":183,"context_line":"                \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"}],"source_content_type":"text/x-python","patch_set":46,"id":"ea7e2a09_62929a4d","line":180,"in_reply_to":"ab31fecc_69bf5980","updated":"2023-10-30 18:18:04.000000000","message":"Yeah, I was mainly asking because you definitely *can* use query strings in `x-amz-copy-source` -- that\u0027s how you restore old versions! So it had me curious...","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4a0b87c53e731d98036632e5d4e4234627ccbf0f","unresolved":false,"context_lines":[{"line_number":177,"context_line":"                                 CopySource\u003d{"},{"line_number":178,"context_line":"                                     \u0027Bucket\u0027: self.bucket_name,"},{"line_number":179,"context_line":"                                     \u0027Key\u0027: key_src,"},{"line_number":180,"context_line":"                                 }, CopySourceRange\u003dcopy_range,"},{"line_number":181,"context_line":"                                 UploadId\u003dupload_id)"},{"line_number":182,"context_line":"            self.assertEqual(200, copy_resp["},{"line_number":183,"context_line":"                \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"}],"source_content_type":"text/x-python","patch_set":46,"id":"247cf459_df26de6c","line":180,"in_reply_to":"ea7e2a09_62929a4d","updated":"2024-02-22 01:09:15.000000000","message":"Acknowledged","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":true,"context_lines":[{"line_number":234,"context_line":"            mpu_etag, version \u003d self._upload_mpu("},{"line_number":235,"context_line":"                key_name, num_parts, part_size)"},{"line_number":236,"context_line":"            mpu_etags.append(mpu_etag)"},{"line_number":237,"context_line":"            self._verify_part_num_response("},{"line_number":238,"context_line":"                key_name, num_parts, part_size,"},{"line_number":239,"context_line":"                mpu_etag, version)"},{"line_number":240,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"7f00c09e_f47b8fc6","line":237,"updated":"2023-10-27 18:19:13.000000000","message":"I think I\u0027d prefer this test do something like\n```\nfor num_parts in parts_counts:\n    self._upload_mpu(...)\nfor num_parts in parts_counts:\n    self._verify_part_num_response(...)\n```\ni.e., do all the uploads, then verify that we can still do `partNumber` queries even when it\u0027s not the currently-active version.","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c5535086bd90ca92a96a148f43ec4e133cb33a3d","unresolved":false,"context_lines":[{"line_number":234,"context_line":"            mpu_etag, version \u003d self._upload_mpu("},{"line_number":235,"context_line":"                key_name, num_parts, part_size)"},{"line_number":236,"context_line":"            mpu_etags.append(mpu_etag)"},{"line_number":237,"context_line":"            self._verify_part_num_response("},{"line_number":238,"context_line":"                key_name, num_parts, part_size,"},{"line_number":239,"context_line":"                mpu_etag, version)"},{"line_number":240,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"56a87907_5af25c8f","line":237,"in_reply_to":"7f00c09e_f47b8fc6","updated":"2023-10-28 02:53:33.000000000","message":"seems reasonable, I don\u0027t think verify_part currently makes a verion\u0027d request","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        key_src \u003d self.create_name(\u0027part-copy-src\u0027)"},{"line_number":245,"context_line":"        key_dest \u003d self.create_name(\u0027part-copy-dest\u0027)"},{"line_number":246,"context_line":"        mpu_etag_src, _ \u003d self._upload_mpu(key_src, num_parts, part_size)"},{"line_number":247,"context_line":"        self._verify_part_num_response(key_src, num_parts, part_size,"},{"line_number":248,"context_line":"                                       mpu_etag_src)"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        create_mpu_dest \u003d self.client.create_multipart_upload("}],"source_content_type":"text/x-python","patch_set":46,"id":"e1227ba0_a177c240","line":247,"updated":"2023-10-27 18:19:13.000000000","message":"OK, this duplicates some assertions from `test_get_by_part_number`, but it never hurts to be thorough.","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90e9499fd27ff1a74457305237f7bc76efcdded8","unresolved":true,"context_lines":[{"line_number":257,"context_line":"                                               num_parts, upload_id)"},{"line_number":258,"context_line":"        self._verify_part_num_response(key_dest, num_parts, part_size,"},{"line_number":259,"context_line":"                                       mpu_etag_dst)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def test_create_list_abort_multipart_uploads(self):"},{"line_number":262,"context_line":"        key_name \u003d self.create_name(\u0027key\u0027)"},{"line_number":263,"context_line":"        create_mpu_resp \u003d self.client.create_multipart_upload("}],"source_content_type":"text/x-python","patch_set":46,"id":"c7b8dac1_260c0284","line":260,"updated":"2023-10-27 18:19:13.000000000","message":"Would be nice to have a test where we use the `partNumber` API against a normal (non-MPU) object.","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"88d19a4705343bc51b167e807acbce17ac281278","unresolved":false,"context_lines":[{"line_number":257,"context_line":"                                               num_parts, upload_id)"},{"line_number":258,"context_line":"        self._verify_part_num_response(key_dest, num_parts, part_size,"},{"line_number":259,"context_line":"                                       mpu_etag_dst)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def test_create_list_abort_multipart_uploads(self):"},{"line_number":262,"context_line":"        key_name \u003d self.create_name(\u0027key\u0027)"},{"line_number":263,"context_line":"        create_mpu_resp \u003d self.client.create_multipart_upload("}],"source_content_type":"text/x-python","patch_set":46,"id":"de090c72_0faa9eed","line":260,"in_reply_to":"ae0eef1c_f940ba37","updated":"2023-11-01 20:42:10.000000000","message":"From what i could tell from the aws docs:\n\nThe part-number request is specific to the multipart upload (MPU) process in AWS. When we’re uploading a part in a multipart upload, you must specify a part number in addition to the upload ID. This part number uniquely identifies a part and its position in the object you’re uploading1.\n\nFor non-MPU objects, i.e., objects that are uploaded in a single operation, the concept of part numbers doesn’t apply because these objects aren’t divided into parts for the upload process. Therefore, we can\u0027t use part-number requests for non-MPU objects in AWS.","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c5535086bd90ca92a96a148f43ec4e133cb33a3d","unresolved":true,"context_lines":[{"line_number":257,"context_line":"                                               num_parts, upload_id)"},{"line_number":258,"context_line":"        self._verify_part_num_response(key_dest, num_parts, part_size,"},{"line_number":259,"context_line":"                                       mpu_etag_dst)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def test_create_list_abort_multipart_uploads(self):"},{"line_number":262,"context_line":"        key_name \u003d self.create_name(\u0027key\u0027)"},{"line_number":263,"context_line":"        create_mpu_resp \u003d self.client.create_multipart_upload("}],"source_content_type":"text/x-python","patch_set":46,"id":"ae0eef1c_f940ba37","line":260,"in_reply_to":"c7b8dac1_260c0284","updated":"2023-10-28 02:53:33.000000000","message":"100%!!! great idea!","commit_id":"f0176a8ad83b138190d8e7a70317c0f9f4b53a1a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"497e0c897cacfbacbabe0fda0674267888bb09f7","unresolved":true,"context_lines":[{"line_number":216,"context_line":"                                   Key\u003dkey_name, PartNumber\u003dnum_parts + 1)"},{"line_number":217,"context_line":"        err_resp \u003d caught.exception.response"},{"line_number":218,"context_line":"        self.assertEqual(416, err_resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":219,"context_line":"        self.assertEqual(\u0027InvalidRange\u0027, err_resp[\u0027Error\u0027][\u0027Code\u0027])"},{"line_number":220,"context_line":"        err_msg \u003d \u0027The requested partnumber is not satisfiable\u0027"},{"line_number":221,"context_line":"        self.assertEqual(err_msg, err_resp[\u0027Error\u0027][\u0027Message\u0027])"},{"line_number":222,"context_line":"        self.assertEqual(\u00274\u0027, err_resp[\u0027Error\u0027][\u0027PartNumberRequested\u0027])"}],"source_content_type":"text/x-python","patch_set":68,"id":"ae5f9529_c1b99986","line":219,"updated":"2023-12-07 23:09:31.000000000","message":"it\u0027s really annoying and counter productive that these tests keep getting changed so they fail against AWS\n\n    \u003e       self.assertEqual(\u0027InvalidRange\u0027, err_resp[\u0027Error\u0027][\u0027Code\u0027])\n    E       AssertionError: \u0027InvalidRange\u0027 !\u003d \u0027InvalidPartNumber\u0027\n    E       - InvalidRange\n    E       + InvalidPartNumber\n    \nthese tests are our best shot at getting AWS compatibility correct but in the gate they\u0027ll only run against swift/s3api; so we need first and formost keep them working against AWS and only then tweak them (or the s3api emulation) to work against s3api.\n\nWe have to keep them working against AWS on our own.  If these cross-compat tests don\u0027t pass against AWS they\u0027re useless.\n\nIf we\u0027re using minio or some other AWS-emulation as our baseline instead of real AWS I\u0027m not surprised they keep drifting.  Cross-compat tests are hard to get right; but we need to get them right.","commit_id":"ba67294c4f36f12422f4eb7fd301344b6522cf1b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"beb08b82e50782e558df5b92d86b8241a0f3c5f8","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                                   Key\u003dkey_name, PartNumber\u003dnum_parts + 1)"},{"line_number":217,"context_line":"        err_resp \u003d caught.exception.response"},{"line_number":218,"context_line":"        self.assertEqual(416, err_resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":219,"context_line":"        self.assertEqual(\u0027InvalidRange\u0027, err_resp[\u0027Error\u0027][\u0027Code\u0027])"},{"line_number":220,"context_line":"        err_msg \u003d \u0027The requested partnumber is not satisfiable\u0027"},{"line_number":221,"context_line":"        self.assertEqual(err_msg, err_resp[\u0027Error\u0027][\u0027Message\u0027])"},{"line_number":222,"context_line":"        self.assertEqual(\u00274\u0027, err_resp[\u0027Error\u0027][\u0027PartNumberRequested\u0027])"}],"source_content_type":"text/x-python","patch_set":68,"id":"44746a2d_fbf1145e","line":219,"in_reply_to":"ae5f9529_c1b99986","updated":"2023-12-08 20:00:58.000000000","message":"Done","commit_id":"ba67294c4f36f12422f4eb7fd301344b6522cf1b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1890bdbdb002e8bd85f3f14c48c30bce51316b71","unresolved":true,"context_lines":[{"line_number":74,"context_line":"        self.assertEqual(200, head_object_resp["},{"line_number":75,"context_line":"            \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        return head_object_resp"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _upload_mpu(self, key_name, num_parts, part_size):"},{"line_number":80,"context_line":"        return self._upload_mpu_resp(key_name, num_parts, part_size)[\u0027ETag\u0027]"}],"source_content_type":"text/x-python","patch_set":86,"id":"ce629cc1_8aad0edf","line":77,"updated":"2023-12-17 22:35:51.000000000","message":"it\u0027s a little confusing that _upload_mpu_resp returns a HEAD response, but I guess the comment and associated bug explain it.  Method is only ever used to steal the ETag \u0026 version-id off the response; both of which are in the HEAD response.\n\nI guess I could imagine an signature like:\n\n    etag, version_id \u003d _upload_mpu()\n    \nthat sometimes return version_id is as None","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc7db2c3c058690599d7aa31b7f5bf10240604f0","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        self.assertEqual(200, head_object_resp["},{"line_number":75,"context_line":"            \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        return head_object_resp"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _upload_mpu(self, key_name, num_parts, part_size):"},{"line_number":80,"context_line":"        return self._upload_mpu_resp(key_name, num_parts, part_size)[\u0027ETag\u0027]"}],"source_content_type":"text/x-python","patch_set":86,"id":"1f51c6f2_e918c6de","line":77,"in_reply_to":"ce629cc1_8aad0edf","updated":"2024-02-20 21:36:30.000000000","message":"Done","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1890bdbdb002e8bd85f3f14c48c30bce51316b71","unresolved":true,"context_lines":[{"line_number":77,"context_line":"        return head_object_resp"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _upload_mpu(self, key_name, num_parts, part_size):"},{"line_number":80,"context_line":"        return self._upload_mpu_resp(key_name, num_parts, part_size)[\u0027ETag\u0027]"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _verify_part_num_response(self, key_name, num_parts, part_size,"},{"line_number":83,"context_line":"                                  mpu_etag, version\u003dNone):"}],"source_content_type":"text/x-python","patch_set":86,"id":"1b5a66d8_f96f9beb","line":80,"updated":"2023-12-17 22:35:51.000000000","message":"here we could still have\n\n    def upload_mpu():\n        etag, _ \u003d _upload_mpu()\n        return etag","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc7db2c3c058690599d7aa31b7f5bf10240604f0","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        return head_object_resp"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _upload_mpu(self, key_name, num_parts, part_size):"},{"line_number":80,"context_line":"        return self._upload_mpu_resp(key_name, num_parts, part_size)[\u0027ETag\u0027]"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _verify_part_num_response(self, key_name, num_parts, part_size,"},{"line_number":83,"context_line":"                                  mpu_etag, version\u003dNone):"}],"source_content_type":"text/x-python","patch_set":86,"id":"7d67fd67_af3e7264","line":80,"in_reply_to":"1b5a66d8_f96f9beb","updated":"2024-02-20 21:36:30.000000000","message":"Done","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1890bdbdb002e8bd85f3f14c48c30bce51316b71","unresolved":true,"context_lines":[{"line_number":84,"context_line":"        part_bodies \u003d ["},{"line_number":85,"context_line":"            (\u0027%d\u0027 % i) * part_size"},{"line_number":86,"context_line":"            for i in range(num_parts)"},{"line_number":87,"context_line":"        ]"},{"line_number":88,"context_line":"        total_size \u003d num_parts * part_size"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        for i in range(num_parts):"}],"source_content_type":"text/x-python","patch_set":86,"id":"856335b0_d14c0d67","line":87,"updated":"2023-12-17 22:35:51.000000000","message":"it\u0027s a little un-usual to re-create the bodies like this coupled with _upload_mpu\n\n... but they\u0027re like 5MB each, so it makes sense not to keep the enormous strings around\n\nprobalby the best strategy is just DRY it out with a _make_part_bodies helper, possibly using stashed self.part_size \u0026 self.part_number attributes.","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"27342520d304753e8377b76686f9ebde43dee130","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        part_bodies \u003d ["},{"line_number":85,"context_line":"            (\u0027%d\u0027 % i) * part_size"},{"line_number":86,"context_line":"            for i in range(num_parts)"},{"line_number":87,"context_line":"        ]"},{"line_number":88,"context_line":"        total_size \u003d num_parts * part_size"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        for i in range(num_parts):"}],"source_content_type":"text/x-python","patch_set":86,"id":"0643859e_c819b9bc","line":87,"in_reply_to":"856335b0_d14c0d67","updated":"2024-03-01 17:41:20.000000000","message":"Done","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"15c30fd48ff3f6ee122d7adb2bb5254f860ddf55","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        part_bodies \u003d ["},{"line_number":85,"context_line":"            (\u0027%d\u0027 % i) * part_size"},{"line_number":86,"context_line":"            for i in range(num_parts)"},{"line_number":87,"context_line":"        ]"},{"line_number":88,"context_line":"        total_size \u003d num_parts * part_size"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        for i in range(num_parts):"}],"source_content_type":"text/x-python","patch_set":86,"id":"7384b64f_82495189","line":87,"in_reply_to":"856335b0_d14c0d67","updated":"2024-03-01 17:41:17.000000000","message":"Done","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1890bdbdb002e8bd85f3f14c48c30bce51316b71","unresolved":true,"context_lines":[{"line_number":223,"context_line":"        err_msg \u003d \u0027The requested partnumber is not satisfiable\u0027"},{"line_number":224,"context_line":"        self.assertEqual(err_msg, err_resp[\u0027Error\u0027][\u0027Message\u0027])"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def test_part_number_non_slo(self):"},{"line_number":227,"context_line":"        key_name \u003d self.create_name(\u0027part-num-non-mpu\u0027)"},{"line_number":228,"context_line":"        self.client.put_object(Bucket\u003dself.bucket_name,"},{"line_number":229,"context_line":"                               Key\u003dkey_name,"}],"source_content_type":"text/x-python","patch_set":86,"id":"f1c803f0_1666983b","line":226,"updated":"2023-12-17 22:35:51.000000000","message":"I\u0027m sure it could be argued this test doesn\u0027t belong in this module; but i\u0027m glad it\u0027s here\n\nI was working on the non-slo-part handling and forgot to run unittests for the object controller - this caught a bug for me.","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4505a044fff596775a29c87dc1ac8f023aa7a8c9","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        err_msg \u003d \u0027The requested partnumber is not satisfiable\u0027"},{"line_number":224,"context_line":"        self.assertEqual(err_msg, err_resp[\u0027Error\u0027][\u0027Message\u0027])"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def test_part_number_non_slo(self):"},{"line_number":227,"context_line":"        key_name \u003d self.create_name(\u0027part-num-non-mpu\u0027)"},{"line_number":228,"context_line":"        self.client.put_object(Bucket\u003dself.bucket_name,"},{"line_number":229,"context_line":"                               Key\u003dkey_name,"}],"source_content_type":"text/x-python","patch_set":86,"id":"bc3316e2_3de91d0f","line":226,"in_reply_to":"4b8f9ba5_63e411ac","updated":"2024-01-03 22:50:18.000000000","message":"Acknowledged","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a6a6b9ce4d8c47e431e146f5afd0af9c20029b8b","unresolved":true,"context_lines":[{"line_number":223,"context_line":"        err_msg \u003d \u0027The requested partnumber is not satisfiable\u0027"},{"line_number":224,"context_line":"        self.assertEqual(err_msg, err_resp[\u0027Error\u0027][\u0027Message\u0027])"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def test_part_number_non_slo(self):"},{"line_number":227,"context_line":"        key_name \u003d self.create_name(\u0027part-num-non-mpu\u0027)"},{"line_number":228,"context_line":"        self.client.put_object(Bucket\u003dself.bucket_name,"},{"line_number":229,"context_line":"                               Key\u003dkey_name,"}],"source_content_type":"text/x-python","patch_set":86,"id":"4b8f9ba5_63e411ac","line":226,"in_reply_to":"f1c803f0_1666983b","updated":"2023-12-20 15:02:15.000000000","message":"I\u0027m glad this test is here, in fact I started writing it before I realised it was already here :D","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1890bdbdb002e8bd85f3f14c48c30bce51316b71","unresolved":true,"context_lines":[{"line_number":387,"context_line":"        resp \u003d self.client.get_bucket_versioning(Bucket\u003dself.bucket_name)"},{"line_number":388,"context_line":"        versioning \u003d False"},{"line_number":389,"context_line":"        if \u0027Status\u0027 in resp and resp[\u0027Status\u0027] \u003d\u003d \u0027Enabled\u0027:"},{"line_number":390,"context_line":"            versioning \u003d True"},{"line_number":391,"context_line":"        self.assertEqual(200, resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":392,"context_line":"        for num_parts in parts_counts:"},{"line_number":393,"context_line":"            resp \u003d self._upload_mpu_resp("}],"source_content_type":"text/x-python","patch_set":86,"id":"873da7df_7907b3e2","line":390,"updated":"2023-12-17 22:35:51.000000000","message":"isn\u0027t this setup in the setUp?  how could this test possibly pass in the else condition","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc7db2c3c058690599d7aa31b7f5bf10240604f0","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        resp \u003d self.client.get_bucket_versioning(Bucket\u003dself.bucket_name)"},{"line_number":388,"context_line":"        versioning \u003d False"},{"line_number":389,"context_line":"        if \u0027Status\u0027 in resp and resp[\u0027Status\u0027] \u003d\u003d \u0027Enabled\u0027:"},{"line_number":390,"context_line":"            versioning \u003d True"},{"line_number":391,"context_line":"        self.assertEqual(200, resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":392,"context_line":"        for num_parts in parts_counts:"},{"line_number":393,"context_line":"            resp \u003d self._upload_mpu_resp("}],"source_content_type":"text/x-python","patch_set":86,"id":"e42276dc_06f674ae","line":390,"in_reply_to":"873da7df_7907b3e2","updated":"2024-02-20 21:36:30.000000000","message":"Done","commit_id":"61d73adc3539703fe29164cd92e5b14bd537ad27"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a6a6b9ce4d8c47e431e146f5afd0af9c20029b8b","unresolved":true,"context_lines":[{"line_number":218,"context_line":"            self.assertEqual(str(val), err_resp[\u0027Error\u0027][\u0027ArgumentValue\u0027])"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def _check_part_num_zero_exc(self, exc, is_head\u003dFalse):"},{"line_number":221,"context_line":"        self._check_part_num_invalid_exc(exc, 0, is_head\u003dis_head)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def _check_part_num_out_of_range_exc(self, exc, is_head\u003dFalse):"},{"line_number":224,"context_line":"        err_resp \u003d exc.response"}],"source_content_type":"text/x-python","patch_set":91,"id":"6f548f04_1884ec4a","line":221,"updated":"2023-12-20 15:02:15.000000000","message":"I\u0027m not convinced this extra shim is worth it and I\u0027d rather see a more explicit hint at the expected error inline in the test e.g.\n\n```\nself._check_part_num_invalid_exc(exc, 0, is_head\u003dTrue)\n```\n\ninline in the test tells me we\u0027re expecting a 400 rather than having to come here to discover that there\u0027s actually not a special case for 0.","commit_id":"2e9d68a0fd67db02696806b56fce1825041640a3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0925780ffd3db4d3e27dea6fd757d2f5f3802265","unresolved":false,"context_lines":[{"line_number":218,"context_line":"            self.assertEqual(str(val), err_resp[\u0027Error\u0027][\u0027ArgumentValue\u0027])"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def _check_part_num_zero_exc(self, exc, is_head\u003dFalse):"},{"line_number":221,"context_line":"        self._check_part_num_invalid_exc(exc, 0, is_head\u003dis_head)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def _check_part_num_out_of_range_exc(self, exc, is_head\u003dFalse):"},{"line_number":224,"context_line":"        err_resp \u003d exc.response"}],"source_content_type":"text/x-python","patch_set":91,"id":"4c8c6fb6_f1bf1919","line":221,"in_reply_to":"6f548f04_1884ec4a","updated":"2024-01-11 14:27:17.000000000","message":"Done","commit_id":"2e9d68a0fd67db02696806b56fce1825041640a3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a6a6b9ce4d8c47e431e146f5afd0af9c20029b8b","unresolved":true,"context_lines":[{"line_number":357,"context_line":"        with self.assertRaises(ClientError) as caught:"},{"line_number":358,"context_line":"            self.client.head_object(Bucket\u003dself.bucket_name,"},{"line_number":359,"context_line":"                                    Key\u003dkey_name,"},{"line_number":360,"context_line":"                                    PartNumber\u003d10001)"},{"line_number":361,"context_line":"        self._check_part_num_invalid_exc(caught.exception, invalid_part_num,"},{"line_number":362,"context_line":"                                         is_head\u003dTrue)"},{"line_number":363,"context_line":""}],"source_content_type":"text/x-python","patch_set":91,"id":"7090c00d_dbea4556","line":360,"range":{"start_line":360,"start_character":47,"end_line":360,"end_character":52},"updated":"2023-12-20 15:02:15.000000000","message":"it\u0027s odd that invalid_part_num is introduced just for the final cases, but not used here - I\u0027d either use the var pattern throughout the test, or not at all.","commit_id":"2e9d68a0fd67db02696806b56fce1825041640a3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0925780ffd3db4d3e27dea6fd757d2f5f3802265","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        with self.assertRaises(ClientError) as caught:"},{"line_number":358,"context_line":"            self.client.head_object(Bucket\u003dself.bucket_name,"},{"line_number":359,"context_line":"                                    Key\u003dkey_name,"},{"line_number":360,"context_line":"                                    PartNumber\u003d10001)"},{"line_number":361,"context_line":"        self._check_part_num_invalid_exc(caught.exception, invalid_part_num,"},{"line_number":362,"context_line":"                                         is_head\u003dTrue)"},{"line_number":363,"context_line":""}],"source_content_type":"text/x-python","patch_set":91,"id":"f6d226f6_ec079252","line":360,"range":{"start_line":360,"start_character":47,"end_line":360,"end_character":52},"in_reply_to":"7090c00d_dbea4556","updated":"2024-01-11 14:27:17.000000000","message":"Done","commit_id":"2e9d68a0fd67db02696806b56fce1825041640a3"}],"test/unit/common/middleware/s3api/test_obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"497e0c897cacfbacbabe0fda0674267888bb09f7","unresolved":true,"context_lines":[{"line_number":97,"context_line":"        self._assert_policy_index(req.headers, headers, bucket_policy_index)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        unexpected_headers \u003d []"},{"line_number":100,"context_line":"        if \u0027partNumber\u0027 not in query:"},{"line_number":101,"context_line":"            for key, val in self.response_headers.items():"},{"line_number":102,"context_line":"                if key in (\u0027Content-Length\u0027, \u0027Content-Type\u0027,"},{"line_number":103,"context_line":"                           \u0027content-encoding\u0027,"}],"source_content_type":"text/x-python","patch_set":68,"id":"c9874998_2c35bda4","line":100,"updated":"2023-12-07 23:09:31.000000000","message":"this is pretty jank; why are we using a common assert helper if none of the asserts are common between the requests?","commit_id":"ba67294c4f36f12422f4eb7fd301344b6522cf1b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4505a044fff596775a29c87dc1ac8f023aa7a8c9","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        self._assert_policy_index(req.headers, headers, bucket_policy_index)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        unexpected_headers \u003d []"},{"line_number":100,"context_line":"        if \u0027partNumber\u0027 not in query:"},{"line_number":101,"context_line":"            for key, val in self.response_headers.items():"},{"line_number":102,"context_line":"                if key in (\u0027Content-Length\u0027, \u0027Content-Type\u0027,"},{"line_number":103,"context_line":"                           \u0027content-encoding\u0027,"}],"source_content_type":"text/x-python","patch_set":68,"id":"4fddfe26_a9eb1f34","line":100,"in_reply_to":"adc8bd1a_33252788","updated":"2024-01-03 22:50:18.000000000","message":"Done","commit_id":"ba67294c4f36f12422f4eb7fd301344b6522cf1b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a6a6b9ce4d8c47e431e146f5afd0af9c20029b8b","unresolved":true,"context_lines":[{"line_number":97,"context_line":"        self._assert_policy_index(req.headers, headers, bucket_policy_index)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        unexpected_headers \u003d []"},{"line_number":100,"context_line":"        if \u0027partNumber\u0027 not in query:"},{"line_number":101,"context_line":"            for key, val in self.response_headers.items():"},{"line_number":102,"context_line":"                if key in (\u0027Content-Length\u0027, \u0027Content-Type\u0027,"},{"line_number":103,"context_line":"                           \u0027content-encoding\u0027,"}],"source_content_type":"text/x-python","patch_set":68,"id":"adc8bd1a_33252788","line":100,"in_reply_to":"c9874998_2c35bda4","updated":"2023-12-20 15:02:15.000000000","message":"fixed here https://review.opendev.org/c/openstack/swift/+/904131","commit_id":"ba67294c4f36f12422f4eb7fd301344b6522cf1b"}],"test/unit/common/middleware/s3api/test_s3request.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3ded4d4d0e56e61007831f1bc13585ae907cbb54","unresolved":true,"context_lines":[{"line_number":1207,"context_line":"            return SigV4Request(req.environ, None, config)"},{"line_number":1208,"context_line":""},{"line_number":1209,"context_line":"        s3req \u003d make_s3req(Config(), \u0027/bkt\u0027, {\u0027partNumber\u0027: \u00273\u0027})"},{"line_number":1210,"context_line":"        self.assertEqual(controllers.ObjectController,"},{"line_number":1211,"context_line":"                         s3req.controller)"},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":"        s3req \u003d make_s3req(Config(), \u0027/bkt\u0027, {\u0027uploadId\u0027: \u00274\u0027})"}],"source_content_type":"text/x-python","patch_set":21,"id":"6bf7c306_10d1d409","line":1210,"updated":"2023-10-10 16:51:44.000000000","message":"this is nice!  there\u0027s should definately be a test with partNumber and uploadId params - I think for PUT with partNumber we can expect an uploadId and should go to the partController.","commit_id":"d55400fee575d1039b35d9c85b00a4fe77f6262d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4ee65a004d83e935b24e661a46d5d9d351229305","unresolved":false,"context_lines":[{"line_number":1207,"context_line":"            return SigV4Request(req.environ, None, config)"},{"line_number":1208,"context_line":""},{"line_number":1209,"context_line":"        s3req \u003d make_s3req(Config(), \u0027/bkt\u0027, {\u0027partNumber\u0027: \u00273\u0027})"},{"line_number":1210,"context_line":"        self.assertEqual(controllers.ObjectController,"},{"line_number":1211,"context_line":"                         s3req.controller)"},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":"        s3req \u003d make_s3req(Config(), \u0027/bkt\u0027, {\u0027uploadId\u0027: \u00274\u0027})"}],"source_content_type":"text/x-python","patch_set":21,"id":"3b298987_59609223","line":1210,"in_reply_to":"6bf7c306_10d1d409","updated":"2023-10-17 22:18:05.000000000","message":"Done","commit_id":"d55400fee575d1039b35d9c85b00a4fe77f6262d"}]}
