)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9610dcf9625827cec60cb78c330603d65a151cd0","unresolved":true,"context_lines":[{"line_number":24,"context_line":"    and log a warning about it."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    For EC policies, at least one frag iter would have the wrong"},{"line_number":27,"context_line":"    length, causing a decode error from pyeclib."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Now, pop off that header, if present."},{"line_number":30,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"c77c5202_d629aab9","line":27,"updated":"2023-07-10 12:29:52.000000000","message":"might be worth a bug report","commit_id":"20757612c309631fcdd729a03e14ca71d1c55790"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2e54d8c9fc4c5ffb6e53e507d1c63cfe6d6b3205","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"0f372bef_c4a760ec","updated":"2023-07-12 11:20:35.000000000","message":"I wrote some more unit tests to reassure myself about the handling of a 416 while resuming a GET https://review.opendev.org/c/openstack/swift/+/888229\n\nThe first Range request (in this context, with X-Backend-Ignore-Range-If-Metadata-Present matching metadata) will NOT return Content-Range, and as a result the proxy learn_size_from_content_range will update the backend request Range to specify the entire length of the object.\n\nA second (resuming) request will therefore only return 416 if the second object is not of the same length as the first, and therefore will have a different etag, and so the proxy will ignore that source in the resuming getter.\n\nMy previous \u0027impacts\u0027 comment is therefore inaccurate: popping the X-Backend-Ignore-Range-If-Metadata-Present header from resuming backend requests will not trigger a 416 (if the object content is the same) because the backend Range will have been updated by the proxy to the object size.","commit_id":"20757612c309631fcdd729a03e14ca71d1c55790"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9610dcf9625827cec60cb78c330603d65a151cd0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d885f9e6_8aef77ef","updated":"2023-07-10 12:29:52.000000000","message":"IIUC, this has the following impacts:\n\n1. for SLO, \u0027resuming\u0027 requests may cause a 416 at backend and may return a truncated manifest if the range is less than the manifest length. SLO will retry the manifest GET with no range (much like the behaviour prior to the introduction of the X-Backend-Ignore-Range-If-Metadata-Present header [1]).\n\n2. for DLO and Symlink, the resuming requests may similarly trigger a 416 at the backend, but the 416 is accepted as a good response in the proxy, and those middlewares don\u0027t care too much about the response body anyway.\n\nIt\u0027s unfortunate that this fix will undo the cleanup of 416 backend logging that came with [1], albeit only in the case of a resuming GET.\n\nThe best alternative idea I could come up with is to send an Alternative-Range header that the backend uses when ignoring Range. Alternative-Range can initially be empty but updated with just a start byte when resuming (much like the Range header gets updated).\n\n[1] https://review.opendev.org/c/openstack/swift/+/697739","commit_id":"20757612c309631fcdd729a03e14ca71d1c55790"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c75bceea6f47e2bcf031b1e51cbf9a812956d5b8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6b60a9f8_dcef2d49","updated":"2023-07-24 05:04:13.000000000","message":"Not only does it stop a traceback and fairly straight forward. We also have been running it in prod and it\u0027s working well.","commit_id":"20757612c309631fcdd729a03e14ca71d1c55790"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5c1f3c84f32a856e621330d8ae33d2f1613a8995","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"a1f66375_f17bf486","updated":"2023-07-10 16:36:10.000000000","message":"the patch as it is fixes a traceback, so +1, and we can discuss some more perhaps before +2","commit_id":"20757612c309631fcdd729a03e14ca71d1c55790"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"66432bb99ef72f64d536bd2f646d0e35a49e960b","unresolved":false,"context_lines":[{"line_number":1067,"context_line":"                                                  \u003e end of range + 1"},{"line_number":1068,"context_line":"        :raises RangeAlreadyComplete: if begin + num_bytes \u003d\u003d end of range + 1"},{"line_number":1069,"context_line":"        \"\"\""},{"line_number":1070,"context_line":"        self.backend_headers.pop("},{"line_number":1071,"context_line":"            \u0027X-Backend-Ignore-Range-If-Metadata-Present\u0027, None)"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"90e62cfc_c84b9faf","line":1070,"updated":"2023-07-06 14:32:59.000000000","message":"I see that your fix involved popping X-Backend-Ignore-Range-If-Metadata-Present  similar to SLOs which makes since we can have the proxy check the response headers and in case our object server ignored the requested Range, the proxy app could still try to read the range request before issuing a response!","commit_id":"20757612c309631fcdd729a03e14ca71d1c55790"}],"test/unit/proxy/controllers/test_base.py":[{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc3a6f3c0471e3a852a212c435711784401fc23a","unresolved":true,"context_lines":[{"line_number":1152,"context_line":"        self.assertNotIn(\u0027X-Backend-Ignore-Range-If-Metadata-Present\u0027,"},{"line_number":1153,"context_line":"                         handler.backend_headers)"},{"line_number":1154,"context_line":""},{"line_number":1155,"context_line":"    def test_range_fast_forward_after_data_timeout(self):"},{"line_number":1156,"context_line":"        req \u003d Request.blank(\u0027/\u0027)"},{"line_number":1157,"context_line":""},{"line_number":1158,"context_line":"        # We get a 200 and learn that it\u0027s a 1000-byte object, but receive 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"b6ac6d60_77a2952e","line":1155,"updated":"2023-08-17 16:14:24.000000000","message":"Would it be wise to add another test at the the proxy level as well ?","commit_id":"20757612c309631fcdd729a03e14ca71d1c55790"}]}
