)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"aac340dc6e29abc1424d64848878150529b4e546","unresolved":true,"context_lines":[{"line_number":16,"context_line":" * For the subsequent request with a part-number-marker param, we"},{"line_number":17,"context_line":"   wouldn\u0027t include any sort of marker in the request to the container"},{"line_number":18,"context_line":"   server, causing us to get *the same set of parts*, all of which would"},{"line_number":19,"context_line":"   be filtered out in the proxy."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"This is because we don\u0027t zero-pad part numbers in the +segments"},{"line_number":22,"context_line":"container, so we need to look at all uploaded parts to determine the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"f9e5c99c_e07f8c46","line":19,"updated":"2020-12-18 14:52:32.000000000","message":"this threw me : I was expecting to therefore see a marker param added to the request as part of the fix, whereas it just ceases to be a bad thing if the parts list is expanded to include all parts","commit_id":"3a8065f7b1e927b2d1f8aa20d8c23f1a7f282733"}],"swift/common/middleware/s3api/controllers/multi_upload.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"aac340dc6e29abc1424d64848878150529b4e546","unresolved":true,"context_lines":[{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        query \u003d {"},{"line_number":493,"context_line":"            \u0027format\u0027: \u0027json\u0027,"},{"line_number":494,"context_line":"            \u0027limit\u0027: DEFAULT_MAX_PARTS_LISTING + 1,"},{"line_number":495,"context_line":"            \u0027prefix\u0027: \u0027%s/%s/\u0027 % (req.object_name, upload_id),"},{"line_number":496,"context_line":"            \u0027delimiter\u0027: \u0027/\u0027"},{"line_number":497,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":2,"id":"0bd3d81a_6a2f3017","line":494,"updated":"2020-12-18 14:52:32.000000000","message":"what happens if self.conf.max_parts_listing \u003e DEFAULT_MAX_PARTS_LISTING? AFAICT the GET may still never return some of the wanted parts, so doesn\u0027t this need to be \n\n    \u0027limit\u0027 + self.conf.max_parts_listing + 1\n\nAlso, why the \u0027+ 1\u0027?","commit_id":"3a8065f7b1e927b2d1f8aa20d8c23f1a7f282733"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b071eaa230ed6d11c286bece427a5375b311d2c","unresolved":true,"context_lines":[{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        query \u003d {"},{"line_number":493,"context_line":"            \u0027format\u0027: \u0027json\u0027,"},{"line_number":494,"context_line":"            \u0027limit\u0027: DEFAULT_MAX_PARTS_LISTING + 1,"},{"line_number":495,"context_line":"            \u0027prefix\u0027: \u0027%s/%s/\u0027 % (req.object_name, upload_id),"},{"line_number":496,"context_line":"            \u0027delimiter\u0027: \u0027/\u0027"},{"line_number":497,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":2,"id":"64cccfcf_544c03a1","line":494,"in_reply_to":"0bd3d81a_6a2f3017","updated":"2021-01-09 01:14:30.000000000","message":"Good catch -- think it\u0027s fair to just use self.conf.max_parts_listing? Or maybe even constraints.CONTAINER_LISTING_LIMIT? Neither is quite perfect (operator could have reduced either, leading to missed parts), but I don\u0027t think I\u0027m comfortable loading up an arbitrarily-large listing in a proxy...\n\n\u003e Also, why the \u0027+ 1\u0027?\n\nIt *was* so we can set the `truncated` flag down around L513-517 (and add it to the response at L548-9). Now that we\u0027re grabbing all allowable parts *anyway*... I\u0027m not sure it actually helps.","commit_id":"3a8065f7b1e927b2d1f8aa20d8c23f1a7f282733"}],"test/unit/common/middleware/s3api/test_multi_upload.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"aac340dc6e29abc1424d64848878150529b4e546","unresolved":true,"context_lines":[{"line_number":1678,"context_line":"        self.assertEqual(status.split()[0], \u0027200\u0027)"},{"line_number":1679,"context_line":"        self.assertEqual(elem.find(\u0027NextPartNumberMarker\u0027).text, \u00275\u0027)"},{"line_number":1680,"context_line":"        self.assertEqual([1, 2, 3, 4, 5], ["},{"line_number":1681,"context_line":"            int(p.find(\u0027PartNumber\u0027).text) for p in elem.findall(\u0027Part\u0027)])"},{"line_number":1682,"context_line":""},{"line_number":1683,"context_line":"    def test_object_list_parts_max_parts_with_marker(self):"},{"line_number":1684,"context_line":"        req \u003d Request.blank(\u0027/bucket/object?uploadId\u003dX\u0026max-parts\u003d5\u0026\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"15f704fd_90de25b9","line":1681,"updated":"2020-12-18 14:52:32.000000000","message":"these tests are a little weak in that if the \u0027limit\u0027 param in the request to swift is anything other than 6 then all objects are returned, so the test doesn\u0027t verify that limit\u003d DEFAULT_MAX_PARTS_LISTING + 1\n\nI suggest adding:\n\n    self.assertEqual([\u0027HEAD\u0027, \u0027HEAD\u0027, \u0027HEAD\u0027, \u0027GET\u0027],\n                     [call[0] for call in self.app.swift.calls])\n    self.assertIn(\u0027limit\u003d1001\u0027, self.app.swift.calls[3][1])","commit_id":"3a8065f7b1e927b2d1f8aa20d8c23f1a7f282733"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"aac340dc6e29abc1424d64848878150529b4e546","unresolved":true,"context_lines":[{"line_number":1694,"context_line":"        self.assertEqual(elem.find(\u0027PartNumberMarker\u0027).text, \u00273\u0027)"},{"line_number":1695,"context_line":"        self.assertEqual(elem.find(\u0027NextPartNumberMarker\u0027).text, \u00278\u0027)"},{"line_number":1696,"context_line":"        self.assertEqual([4, 5, 6, 7, 8], ["},{"line_number":1697,"context_line":"            int(p.find(\u0027PartNumber\u0027).text) for p in elem.findall(\u0027Part\u0027)])"},{"line_number":1698,"context_line":""},{"line_number":1699,"context_line":"    def test_object_list_parts_str_max_parts(self):"},{"line_number":1700,"context_line":"        req \u003d Request.blank(\u0027/bucket/object?uploadId\u003dX\u0026max-parts\u003dinvalid\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"854506a8_7f772e3e","line":1697,"updated":"2020-12-18 14:52:32.000000000","message":"same comment as above","commit_id":"3a8065f7b1e927b2d1f8aa20d8c23f1a7f282733"}]}
