)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ef3a933e_e4c74472","updated":"2023-12-20 21:35:25.000000000","message":"I think there a lot of nice simplifications in here!  I think I\u0027ve convinced myself it\u0027s actaullly asserting behavioral consistentency with the existing s3api-part-num validation (pure refactor)\n\nI think the next patch in the series advocates we more consistently apply the configured max_upload_parts to reads and gets; which would be a further improvement to this refactoring.","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ee007a27_0267a427","updated":"2023-12-21 17:22:15.000000000","message":"this is all good","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"}],"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":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":true,"context_lines":[{"line_number":204,"context_line":"            err_msg \u003d \u0027Part number must be an integer between 1 and %d,\u0027 \\"},{"line_number":205,"context_line":"                      \u0027 inclusive\u0027 % self.conf.max_upload_part_num"},{"line_number":206,"context_line":"            raise InvalidArgument(\u0027partNumber\u0027, get_param(req, \u0027partNumber\u0027),"},{"line_number":207,"context_line":"                                  err_msg)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        upload_id \u003d get_param(req, \u0027uploadId\u0027)"},{"line_number":210,"context_line":"        _get_upload_info(req, self.app, upload_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fceea6e9_83c311de","side":"PARENT","line":207,"updated":"2023-12-20 21:35:25.000000000","message":"so this is the existing InvalidArgument/400 for uplod of partNumber\u003d10001","commit_id":"eb05494b7c0964798dd9e9918f5367784a8a5a16"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            err_msg \u003d \u0027Part number must be an integer between 1 and %d,\u0027 \\"},{"line_number":205,"context_line":"                      \u0027 inclusive\u0027 % self.conf.max_upload_part_num"},{"line_number":206,"context_line":"            raise InvalidArgument(\u0027partNumber\u0027, get_param(req, \u0027partNumber\u0027),"},{"line_number":207,"context_line":"                                  err_msg)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        upload_id \u003d get_param(req, \u0027uploadId\u0027)"},{"line_number":210,"context_line":"        _get_upload_info(req, self.app, upload_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"93f862aa_d6093033","side":"PARENT","line":207,"in_reply_to":"fceea6e9_83c311de","updated":"2023-12-21 17:22:15.000000000","message":"Acknowledged","commit_id":"eb05494b7c0964798dd9e9918f5367784a8a5a16"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":true,"context_lines":[{"line_number":197,"context_line":"                                  \u0027Unexpected query string parameter\u0027)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        part_number \u003d req.validate_part_number("},{"line_number":200,"context_line":"            max_parts\u003dself.conf.max_upload_part_num)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        upload_id \u003d get_param(req, \u0027uploadId\u0027)"},{"line_number":203,"context_line":"        _get_upload_info(req, self.app, upload_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"68f6ee9c_b0311fed","line":200,"updated":"2023-12-20 21:35:25.000000000","message":"curious to use self.conf here and not on 416/read errors\n\nthat might indicate we think someone would have been more likly to LOWER this value than raise it; but I assume if there\u0027s any swift cluster with this value different than 10K it\u0027s probably 20-50K instead.","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                                  \u0027Unexpected query string parameter\u0027)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        part_number \u003d req.validate_part_number("},{"line_number":200,"context_line":"            max_parts\u003dself.conf.max_upload_part_num)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        upload_id \u003d get_param(req, \u0027uploadId\u0027)"},{"line_number":203,"context_line":"        _get_upload_info(req, self.app, upload_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a49edee_1a36f5b9","line":200,"in_reply_to":"68f6ee9c_b0311fed","updated":"2023-12-21 17:22:15.000000000","message":"i think Al was just trying to make this commit a pure refactor; this gets fixed in the follow-up and i want them all squashed into the s3api-part-num patch","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"}],"swift/common/middleware/s3api/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":true,"context_lines":[{"line_number":111,"context_line":"            # SLO ignores part_number for non-slo objects, but s3api only"},{"line_number":112,"context_line":"            # allows the query param for non-MPU if it\u0027s exactly 1."},{"line_number":113,"context_line":"            part_number \u003d req.validate_part_number(max_parts\u003d10000,"},{"line_number":114,"context_line":"                                                   num_parts\u003d1)"},{"line_number":115,"context_line":"            if part_number:"},{"line_number":116,"context_line":"                # When the query param *is* exactly 1 the response status code"},{"line_number":117,"context_line":"                # and headers are updated."}],"source_content_type":"text/x-python","patch_set":2,"id":"d1855f37_a3db7ff7","line":114,"updated":"2023-12-20 21:35:25.000000000","message":"that\u0027s actually kind of nice how it comes out there.","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            # SLO ignores part_number for non-slo objects, but s3api only"},{"line_number":112,"context_line":"            # allows the query param for non-MPU if it\u0027s exactly 1."},{"line_number":113,"context_line":"            part_number \u003d req.validate_part_number(max_parts\u003d10000,"},{"line_number":114,"context_line":"                                                   num_parts\u003d1)"},{"line_number":115,"context_line":"            if part_number:"},{"line_number":116,"context_line":"                # When the query param *is* exactly 1 the response status code"},{"line_number":117,"context_line":"                # and headers are updated."}],"source_content_type":"text/x-python","patch_set":2,"id":"9a6bb1e9_d581b4b4","line":114,"in_reply_to":"d1855f37_a3db7ff7","updated":"2023-12-21 17:22:15.000000000","message":"this is also the diff that removes the (untested) behavior of allowing you to download a partNumber \u003e max_parts *if* you had an existing MPU stored with more than max_parts\n\n(e.g. you run with max_upload_parts \u003d\u003d 10000 but then mess up your configs and get the default 1000 - at least your existing MPUs can still download all the parts they have)","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":true,"context_lines":[{"line_number":112,"context_line":"            # allows the query param for non-MPU if it\u0027s exactly 1."},{"line_number":113,"context_line":"            part_number \u003d req.validate_part_number(max_parts\u003d10000,"},{"line_number":114,"context_line":"                                                   num_parts\u003d1)"},{"line_number":115,"context_line":"            if part_number:"},{"line_number":116,"context_line":"                # When the query param *is* exactly 1 the response status code"},{"line_number":117,"context_line":"                # and headers are updated."},{"line_number":118,"context_line":"                resp.status \u003d HTTP_PARTIAL_CONTENT"}],"source_content_type":"text/x-python","patch_set":2,"id":"884f55a1_7418f1ba","line":115,"updated":"2023-12-20 21:35:25.000000000","message":"maybe more obvious as `if part_number \u003d\u003d 1`\n\nI think the only possible values are (None, 1); anything else would have raised an exception.","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            # allows the query param for non-MPU if it\u0027s exactly 1."},{"line_number":113,"context_line":"            part_number \u003d req.validate_part_number(max_parts\u003d10000,"},{"line_number":114,"context_line":"                                                   num_parts\u003d1)"},{"line_number":115,"context_line":"            if part_number:"},{"line_number":116,"context_line":"                # When the query param *is* exactly 1 the response status code"},{"line_number":117,"context_line":"                # and headers are updated."},{"line_number":118,"context_line":"                resp.status \u003d HTTP_PARTIAL_CONTENT"}],"source_content_type":"text/x-python","patch_set":2,"id":"4a4847b8_383a6f38","line":115,"in_reply_to":"884f55a1_7418f1ba","updated":"2023-12-21 17:22:15.000000000","message":"Done","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":true,"context_lines":[{"line_number":118,"context_line":"                resp.status \u003d HTTP_PARTIAL_CONTENT"},{"line_number":119,"context_line":"                resp.headers[\u0027Content-Range\u0027] \u003d \\"},{"line_number":120,"context_line":"                    \u0027bytes 0-%d/%s\u0027 % (int(resp.headers[\u0027Content-Length\u0027]) - 1,"},{"line_number":121,"context_line":"                                       resp.headers[\u0027Content-Length\u0027])"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        if req.method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":124,"context_line":"            resp.app_iter \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"3332f90f_a154d255","line":121,"updated":"2023-12-20 21:35:25.000000000","message":"also kind of nice to have the response manipulatoin in line with the the request handler.","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                resp.status \u003d HTTP_PARTIAL_CONTENT"},{"line_number":119,"context_line":"                resp.headers[\u0027Content-Range\u0027] \u003d \\"},{"line_number":120,"context_line":"                    \u0027bytes 0-%d/%s\u0027 % (int(resp.headers[\u0027Content-Length\u0027]) - 1,"},{"line_number":121,"context_line":"                                       resp.headers[\u0027Content-Length\u0027])"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        if req.method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":124,"context_line":"            resp.app_iter \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"b4bf9910_06963910","line":121,"in_reply_to":"3332f90f_a154d255","updated":"2023-12-21 17:22:15.000000000","message":"Acknowledged","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"}],"swift/common/middleware/s3api/s3request.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":true,"context_lines":[{"line_number":563,"context_line":"        \"\"\""},{"line_number":564,"context_line":"        Get the partNumber param, if it exists, and check it is valid."},{"line_number":565,"context_line":""},{"line_number":566,"context_line":"        :param max_parts: the maximum value allowed fo partNumber."},{"line_number":567,"context_line":"        :param num_parts: if given, this is the number of parts in the MPU."},{"line_number":568,"context_line":"        :raises InvalidPartArgument: if the partNumber param is invalid i.e."},{"line_number":569,"context_line":"            less than 1 or greater than 10000."}],"source_content_type":"text/x-python","patch_set":2,"id":"1b1a6fc6_f64d44d3","line":566,"updated":"2023-12-20 21:35:25.000000000","message":"s/fo part/for part/\n\nis my reading of previous comments I understood you to be advocating this should never be set - the only time you can reject a partNumber as \"too large\" is if it\u0027s larger than the parts in the MPU?\n\nwhere the edge case is something like\n\nnum_parts \u003c max_parts \u003c partNumber \u003d\u003e InvalidPartArgument\n\nvs. the more expected case\n\nnum_parts \u003c partNumber \u003c max_parts \u003d\u003e InvalidPartNumber\n\n... the most interesting case is\n\nmax_parts \u003c partNumber \u003c num_parts\n\n... we currently expect s3api to return InvalidPartArgument for partNumber \u003e max_parts; where as slo-part-num might just give you your part you have an SLO with \u003e 10K parts in it somehow.","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[{"line_number":563,"context_line":"        \"\"\""},{"line_number":564,"context_line":"        Get the partNumber param, if it exists, and check it is valid."},{"line_number":565,"context_line":""},{"line_number":566,"context_line":"        :param max_parts: the maximum value allowed fo partNumber."},{"line_number":567,"context_line":"        :param num_parts: if given, this is the number of parts in the MPU."},{"line_number":568,"context_line":"        :raises InvalidPartArgument: if the partNumber param is invalid i.e."},{"line_number":569,"context_line":"            less than 1 or greater than 10000."}],"source_content_type":"text/x-python","patch_set":2,"id":"4948f6f8_0a449b10","line":566,"in_reply_to":"1b1a6fc6_f64d44d3","updated":"2023-12-21 17:22:15.000000000","message":"Done","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":true,"context_lines":[{"line_number":583,"context_line":""},{"line_number":584,"context_line":"            if num_parts is not None:"},{"line_number":585,"context_line":"                try:"},{"line_number":586,"context_line":"                    num_parts \u003d int(num_parts)"},{"line_number":587,"context_line":"                except ValueError:"},{"line_number":588,"context_line":"                    pass"},{"line_number":589,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"36cf7f8f_5d4f5dc1","line":586,"updated":"2023-12-20 21:35:25.000000000","message":"this probably makes sense given the source of this value will often be from a resp header.","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[{"line_number":583,"context_line":""},{"line_number":584,"context_line":"            if num_parts is not None:"},{"line_number":585,"context_line":"                try:"},{"line_number":586,"context_line":"                    num_parts \u003d int(num_parts)"},{"line_number":587,"context_line":"                except ValueError:"},{"line_number":588,"context_line":"                    pass"},{"line_number":589,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"6e83c68b_4d22fc4b","line":586,"in_reply_to":"36cf7f8f_5d4f5dc1","updated":"2023-12-21 17:22:15.000000000","message":"Acknowledged","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":true,"context_lines":[{"line_number":585,"context_line":"                try:"},{"line_number":586,"context_line":"                    num_parts \u003d int(num_parts)"},{"line_number":587,"context_line":"                except ValueError:"},{"line_number":588,"context_line":"                    pass"},{"line_number":589,"context_line":"                else:"},{"line_number":590,"context_line":"                    if part_number \u003e num_parts:"},{"line_number":591,"context_line":"                        raise InvalidPartNumber()  # 416"}],"source_content_type":"text/x-python","patch_set":2,"id":"a065f0ab_9241ed0c","line":588,"updated":"2023-12-20 21:35:25.000000000","message":"interesting choice","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[{"line_number":585,"context_line":"                try:"},{"line_number":586,"context_line":"                    num_parts \u003d int(num_parts)"},{"line_number":587,"context_line":"                except ValueError:"},{"line_number":588,"context_line":"                    pass"},{"line_number":589,"context_line":"                else:"},{"line_number":590,"context_line":"                    if part_number \u003e num_parts:"},{"line_number":591,"context_line":"                        raise InvalidPartNumber()  # 416"}],"source_content_type":"text/x-python","patch_set":2,"id":"fc5d0275_7ec402aa","line":588,"in_reply_to":"a065f0ab_9241ed0c","updated":"2023-12-21 17:22:15.000000000","message":"i guess it\u0027s the same as num_parts\u003dNone","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":true,"context_lines":[{"line_number":1456,"context_line":"                                      err_str)"},{"line_number":1457,"context_line":"            elif (\u0027Part number must be an integer\u0027"},{"line_number":1458,"context_line":"                  in err_str):"},{"line_number":1459,"context_line":"                raise InvalidPartArgument(10000, self.params[\u0027partNumber\u0027])"},{"line_number":1460,"context_line":"            else:"},{"line_number":1461,"context_line":"                raise InvalidRequest(msg\u003derr_str)"},{"line_number":1462,"context_line":"        if status \u003d\u003d HTTP_UNAUTHORIZED:"}],"source_content_type":"text/x-python","patch_set":2,"id":"822f53aa_a03157bb","line":1459,"updated":"2023-12-20 21:35:25.000000000","message":"looking around the corner it seemed like self.conf.max_upload_part_num is already a thing and defaults to 10000; maybe we just go ahead and use that?\n\nAssuming that either you\u0027re running with the default or you will only ever RAISE the value.","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[{"line_number":1456,"context_line":"                                      err_str)"},{"line_number":1457,"context_line":"            elif (\u0027Part number must be an integer\u0027"},{"line_number":1458,"context_line":"                  in err_str):"},{"line_number":1459,"context_line":"                raise InvalidPartArgument(10000, self.params[\u0027partNumber\u0027])"},{"line_number":1460,"context_line":"            else:"},{"line_number":1461,"context_line":"                raise InvalidRequest(msg\u003derr_str)"},{"line_number":1462,"context_line":"        if status \u003d\u003d HTTP_UNAUTHORIZED:"}],"source_content_type":"text/x-python","patch_set":2,"id":"fecefdeb_23eb32bc","line":1459,"in_reply_to":"822f53aa_a03157bb","updated":"2023-12-21 17:22:15.000000000","message":"nope, defaults to 1K to match default SLO configuration sadly.  SwiftStack made the call to increase both to 10K by default and that works great!\n\nbut using the configured value is a necessary improvement even if upstream increases the default","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":true,"context_lines":[{"line_number":1467,"context_line":"        if status \u003d\u003d HTTP_REQUESTED_RANGE_NOT_SATISFIABLE:"},{"line_number":1468,"context_line":"            self.validate_part_number("},{"line_number":1469,"context_line":"                max_parts\u003d10000,"},{"line_number":1470,"context_line":"                num_parts\u003dresp.headers.get(\u0027x-amz-mp-parts-count\u0027))"},{"line_number":1471,"context_line":"            raise InvalidRange()"},{"line_number":1472,"context_line":"        if status \u003d\u003d HTTP_SERVICE_UNAVAILABLE:"},{"line_number":1473,"context_line":"            raise ServiceUnavailable()"}],"source_content_type":"text/x-python","patch_set":2,"id":"d132099c_8634b212","line":1470,"updated":"2023-12-20 21:35:25.000000000","message":"ok, this is a NOOP if \u0027partNumber\u0027 not in self.params\n\nbut on an SLO 416 gets translated to InvalidPartNumber (416) based on the qs value being larger than the number of parts reported by SLO (as opposed to inspecting the SLO error message).\n\nAgain there\u0027s a special case handling for\n\npartNumber \u003e max_parts - presumably SLO returned 416 because partNumber \u003e num_parts; but if it happens partNumber \u003e max_parts we want to 400.","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[{"line_number":1467,"context_line":"        if status \u003d\u003d HTTP_REQUESTED_RANGE_NOT_SATISFIABLE:"},{"line_number":1468,"context_line":"            self.validate_part_number("},{"line_number":1469,"context_line":"                max_parts\u003d10000,"},{"line_number":1470,"context_line":"                num_parts\u003dresp.headers.get(\u0027x-amz-mp-parts-count\u0027))"},{"line_number":1471,"context_line":"            raise InvalidRange()"},{"line_number":1472,"context_line":"        if status \u003d\u003d HTTP_SERVICE_UNAVAILABLE:"},{"line_number":1473,"context_line":"            raise ServiceUnavailable()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7e38a5e9_176066a7","line":1470,"in_reply_to":"d132099c_8634b212","updated":"2023-12-21 17:22:15.000000000","message":"Acknowledged","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"}],"test/s3api/test_mpu.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":true,"context_lines":[{"line_number":254,"context_line":"        with self.assertRaises(ClientError) as caught:"},{"line_number":255,"context_line":"            self.client.get_object(Bucket\u003dself.bucket_name,"},{"line_number":256,"context_line":"                                   Key\u003dkey_name, PartNumber\u003d10000)"},{"line_number":257,"context_line":"        self._check_part_num_out_of_range_exc(caught.exception)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"        # because of ParamValidationError we can\u0027t test \u0027foo\u0027"},{"line_number":260,"context_line":"        val \u003d -1"}],"source_content_type":"text/x-python","patch_set":2,"id":"1796e230_9e074e7c","line":257,"updated":"2023-12-20 21:35:25.000000000","message":"oic, any value num_parts \u003c partNumber \u003c\u003d max_parts is 416","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        with self.assertRaises(ClientError) as caught:"},{"line_number":255,"context_line":"            self.client.get_object(Bucket\u003dself.bucket_name,"},{"line_number":256,"context_line":"                                   Key\u003dkey_name, PartNumber\u003d10000)"},{"line_number":257,"context_line":"        self._check_part_num_out_of_range_exc(caught.exception)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"        # because of ParamValidationError we can\u0027t test \u0027foo\u0027"},{"line_number":260,"context_line":"        val \u003d -1"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ec08d47_1a67ad7d","line":257,"in_reply_to":"1796e230_9e074e7c","updated":"2023-12-21 17:22:15.000000000","message":"Acknowledged","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"}],"test/unit/common/middleware/s3api/test_multi_get.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":true,"context_lines":[{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    def test_mpu_GET_out_of_range_part_num(self):"},{"line_number":199,"context_line":"        self._do_test_mpu_GET_out_of_range_part_num(4)"},{"line_number":200,"context_line":"        self._do_test_mpu_GET_out_of_range_part_num(10000)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def test_mpu_GET_huge_part_num(self):"},{"line_number":203,"context_line":"        req \u003d swob.Request.blank(\u0027/bucket/mpu\u0027, params\u003d{"}],"source_content_type":"text/x-python","patch_set":2,"id":"c1195030_b84d1429","line":200,"updated":"2023-12-20 21:35:25.000000000","message":"again seems to cover the num_parts \u003c partNumber \u003c\u003d max_parts case","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    def test_mpu_GET_out_of_range_part_num(self):"},{"line_number":199,"context_line":"        self._do_test_mpu_GET_out_of_range_part_num(4)"},{"line_number":200,"context_line":"        self._do_test_mpu_GET_out_of_range_part_num(10000)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def test_mpu_GET_huge_part_num(self):"},{"line_number":203,"context_line":"        req \u003d swob.Request.blank(\u0027/bucket/mpu\u0027, params\u003d{"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fd265db_f413dbb2","line":200,"in_reply_to":"c1195030_b84d1429","updated":"2023-12-21 17:22:15.000000000","message":"Acknowledged","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"}],"test/unit/common/middleware/s3api/test_multi_upload.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":true,"context_lines":[{"line_number":711,"context_line":"        self.assertEqual(self._get_error_code(body), \u0027InvalidArgument\u0027)"},{"line_number":712,"context_line":"        self.assertEqual(self._get_error_message(body),"},{"line_number":713,"context_line":"                         \u0027Part number must be an integer between 1 and 10000, \u0027"},{"line_number":714,"context_line":"                         \u0027inclusive\u0027)"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        with patch.object(self.s3api.conf, \u0027max_upload_part_num\u0027, 1000):"},{"line_number":717,"context_line":"            # part number must be \u003c 1001"}],"source_content_type":"text/x-python","patch_set":2,"id":"506afb89_adec503f","line":714,"updated":"2023-12-20 21:35:25.000000000","message":"bumber these assertions didn\u0027t exist already","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[{"line_number":711,"context_line":"        self.assertEqual(self._get_error_code(body), \u0027InvalidArgument\u0027)"},{"line_number":712,"context_line":"        self.assertEqual(self._get_error_message(body),"},{"line_number":713,"context_line":"                         \u0027Part number must be an integer between 1 and 10000, \u0027"},{"line_number":714,"context_line":"                         \u0027inclusive\u0027)"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        with patch.object(self.s3api.conf, \u0027max_upload_part_num\u0027, 1000):"},{"line_number":717,"context_line":"            # part number must be \u003c 1001"}],"source_content_type":"text/x-python","patch_set":2,"id":"8e653d36_64ae805c","line":714,"in_reply_to":"506afb89_adec503f","updated":"2023-12-21 17:22:15.000000000","message":"Acknowledged","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"978bc2a18942a110dcb1f082cdd0bdb83573910e","unresolved":true,"context_lines":[{"line_number":725,"context_line":"            self.assertEqual(self._get_error_code(body), \u0027InvalidArgument\u0027)"},{"line_number":726,"context_line":"            self.assertEqual(self._get_error_message(body),"},{"line_number":727,"context_line":"                             \u0027Part number must be an integer between 1 and \u0027"},{"line_number":728,"context_line":"                             \u00271000, inclusive\u0027)"},{"line_number":729,"context_line":""},{"line_number":730,"context_line":"        # without target bucket"},{"line_number":731,"context_line":"        req \u003d Request.blank(\u0027/nobucket/object?partNumber\u003d1\u0026uploadId\u003dX\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"2df55358_762fcf4c","line":728,"updated":"2023-12-20 21:35:25.000000000","message":"that\u0027s nice; presumably also works on master.\n\nconfirmed all of these tests pass as in against master with the all new code under swift/ reverted - this is just how it already worked; this change still works exactly this way.  KUDOS!","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae74f93f73f1606d1e214fff0ac57688906e470c","unresolved":false,"context_lines":[{"line_number":725,"context_line":"            self.assertEqual(self._get_error_code(body), \u0027InvalidArgument\u0027)"},{"line_number":726,"context_line":"            self.assertEqual(self._get_error_message(body),"},{"line_number":727,"context_line":"                             \u0027Part number must be an integer between 1 and \u0027"},{"line_number":728,"context_line":"                             \u00271000, inclusive\u0027)"},{"line_number":729,"context_line":""},{"line_number":730,"context_line":"        # without target bucket"},{"line_number":731,"context_line":"        req \u003d Request.blank(\u0027/nobucket/object?partNumber\u003d1\u0026uploadId\u003dX\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3c182b54_c8d28fb6","line":728,"in_reply_to":"2df55358_762fcf4c","updated":"2023-12-21 17:22:15.000000000","message":"Acknowledged","commit_id":"5232ee2e04e86fc6afef403cb6d813f62cc9aae1"}]}
