)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"57a175d41bd977e27976f948f365b2f6a59e7ab2","unresolved":false,"context_lines":[{"line_number":17,"context_line":"The callback may return a list of problematic segments; each item in the"},{"line_number":18,"context_line":"list should be a tuple of"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    (quoted object name, description of problem)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"This will be useful both for s3api minimum segment size validation and"},{"line_number":23,"context_line":"creating tar large objects."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"dfd5e7cf_a8bea662","line":20,"updated":"2019-01-09 16:51:29.000000000","message":"A list of dicts {\u0027name\u0027: \u0027xyz\u0027, \u0027error\u0027: \u0027blah\u0027} would be more extensible... if we think more context may ever be needed, name and error are probably sufficient.","commit_id":"284bbdd391b24823f1f1154577b2b68575e7f7e9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"be0465476954ddd2c344289057938e3672d397ef","unresolved":false,"context_lines":[{"line_number":17,"context_line":"The callback may return a list of problematic segments; each item in the"},{"line_number":18,"context_line":"list should be a tuple of"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    (quoted object name, description of problem)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"This will be useful both for s3api minimum segment size validation and"},{"line_number":23,"context_line":"creating tar large objects."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"dfd5e7cf_e166092a","line":20,"in_reply_to":"dfd5e7cf_a8bea662","updated":"2019-01-09 18:47:11.000000000","message":"I could have done that... the main reason I did it this way is that it matches the format of errors returned to the user.","commit_id":"284bbdd391b24823f1f1154577b2b68575e7f7e9"}],"swift/common/middleware/slo.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"57a175d41bd977e27976f948f365b2f6a59e7ab2","unresolved":false,"context_lines":[{"line_number":1167,"context_line":"                _etag !\u003d head_seg_resp.etag"},{"line_number":1168,"context_line":"            )"},{"line_number":1169,"context_line":"            if etag_mismatch:"},{"line_number":1170,"context_line":"                problem_segments.append([quote(obj_name), \u0027Etag Mismatch\u0027])"},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"            if head_seg_resp.last_modified:"},{"line_number":1173,"context_line":"                last_modified \u003d head_seg_resp.last_modified"}],"source_content_type":"text/x-python","patch_set":4,"id":"dfd5e7cf_28b2b695","line":1170,"updated":"2019-01-09 16:51:29.000000000","message":"so I guess we already support/expect obj_name\u0027s to have multiple problems...","commit_id":"284bbdd391b24823f1f1154577b2b68575e7f7e9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"57a175d41bd977e27976f948f365b2f6a59e7ab2","unresolved":false,"context_lines":[{"line_number":1230,"context_line":"            # Middleware left of SLO can add a callback to the WSGI"},{"line_number":1231,"context_line":"            # environment to perform additional validation and/or"},{"line_number":1232,"context_line":"            # manipulation on the manifest that will be written."},{"line_number":1233,"context_line":"            hook \u003d req.environ.get(\u0027swift.callback.slo_manifest_hook\u0027)"},{"line_number":1234,"context_line":"            if hook:"},{"line_number":1235,"context_line":"                more_problems \u003d hook(data_for_storage)"},{"line_number":1236,"context_line":"                if more_problems:"}],"source_content_type":"text/x-python","patch_set":4,"id":"dfd5e7cf_eb1ca86b","line":1233,"updated":"2019-01-09 16:51:29.000000000","message":"This callback name is rightfully generic because the hook will support modification as well as verification.","commit_id":"284bbdd391b24823f1f1154577b2b68575e7f7e9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"57a175d41bd977e27976f948f365b2f6a59e7ab2","unresolved":false,"context_lines":[{"line_number":1232,"context_line":"            # manipulation on the manifest that will be written."},{"line_number":1233,"context_line":"            hook \u003d req.environ.get(\u0027swift.callback.slo_manifest_hook\u0027)"},{"line_number":1234,"context_line":"            if hook:"},{"line_number":1235,"context_line":"                more_problems \u003d hook(data_for_storage)"},{"line_number":1236,"context_line":"                if more_problems:"},{"line_number":1237,"context_line":"                    problem_segments.extend(more_problems)"},{"line_number":1238,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"dfd5e7cf_087c92b3","line":1235,"updated":"2019-01-09 16:51:29.000000000","message":"So it\u0027s important to note that we\u0027re passing in a mutable data structure here.  ;)","commit_id":"284bbdd391b24823f1f1154577b2b68575e7f7e9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"be0465476954ddd2c344289057938e3672d397ef","unresolved":false,"context_lines":[{"line_number":1232,"context_line":"            # manipulation on the manifest that will be written."},{"line_number":1233,"context_line":"            hook \u003d req.environ.get(\u0027swift.callback.slo_manifest_hook\u0027)"},{"line_number":1234,"context_line":"            if hook:"},{"line_number":1235,"context_line":"                more_problems \u003d hook(data_for_storage)"},{"line_number":1236,"context_line":"                if more_problems:"},{"line_number":1237,"context_line":"                    problem_segments.extend(more_problems)"},{"line_number":1238,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"dfd5e7cf_e1f36972","line":1235,"in_reply_to":"dfd5e7cf_087c92b3","updated":"2019-01-09 18:47:11.000000000","message":"Will add a comment.\n\nSince it *is* mutable, we should probably reverify the manifest schema afterwards :-/","commit_id":"284bbdd391b24823f1f1154577b2b68575e7f7e9"}],"test/unit/common/middleware/test_slo.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"c07122bcddbbbe02c3294f5a43f257c2d02d3529","unresolved":false,"context_lines":[{"line_number":967,"context_line":"    def test_handle_multipart_put_with_manipulator_callback(self):"},{"line_number":968,"context_line":"        def data_inserter(manifest):"},{"line_number":969,"context_line":"            for i in range(len(manifest), -1, -1):"},{"line_number":970,"context_line":"                manifest.insert(i, {\u0027data\u0027: \u0027WA\u003d\u003d\u0027})"},{"line_number":971,"context_line":""},{"line_number":972,"context_line":"        good_data \u003d json.dumps(["},{"line_number":973,"context_line":"            {\u0027path\u0027: \u0027/checktest/a_1\u0027},"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_7cb51bcf","line":970,"updated":"2018-10-16 19:12:27.000000000","message":"Ouch, I\u0027m not onboard with a \"validator\" that modifies the data that it\u0027s supposed to validate -- in an official test suite, no less!","commit_id":"13ec721ea3185826da8c9c217fb3d9a915a164f6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"41d6d60bda391aa16791898c4976132a977c54cd","unresolved":false,"context_lines":[{"line_number":967,"context_line":"    def test_handle_multipart_put_with_manipulator_callback(self):"},{"line_number":968,"context_line":"        def data_inserter(manifest):"},{"line_number":969,"context_line":"            for i in range(len(manifest), -1, -1):"},{"line_number":970,"context_line":"                manifest.insert(i, {\u0027data\u0027: \u0027WA\u003d\u003d\u0027})"},{"line_number":971,"context_line":""},{"line_number":972,"context_line":"        good_data \u003d json.dumps(["},{"line_number":973,"context_line":"            {\u0027path\u0027: \u0027/checktest/a_1\u0027},"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_5cb4df80","line":970,"in_reply_to":"3f79a3b5_7cb51bcf","updated":"2018-10-16 19:33:54.000000000","message":"Well... I kinda *want* the ability to manipulate, if we want to be able to have something like https://review.openstack.org/#/c/499260/ (even if it ends up being out-of-tree). It seems very clunky to me that size_bytes is required just so we can get the padding right.\n\nI\u0027d definitely be on board with changing the name, though. Do you have anything in mind?","commit_id":"13ec721ea3185826da8c9c217fb3d9a915a164f6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"41d6d60bda391aa16791898c4976132a977c54cd","unresolved":false,"context_lines":[{"line_number":998,"context_line":"            {\u0027data\u0027: \u0027WA\u003d\u003d\u0027},"},{"line_number":999,"context_line":"        ])"},{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":"    def test_handle_multipart_put_with_validator_callback(self):"},{"line_number":1002,"context_line":"        def complainer(manifest):"},{"line_number":1003,"context_line":"            return [(item[\u0027name\u0027], \"Don\u0027t wanna\") for item in manifest]"},{"line_number":1004,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_1c20a7f7","line":1001,"updated":"2018-10-16 19:33:54.000000000","message":"This style, where it\u0027s pure validation, is useful for https://review.openstack.org/#/c/610747/","commit_id":"13ec721ea3185826da8c9c217fb3d9a915a164f6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"57a175d41bd977e27976f948f365b2f6a59e7ab2","unresolved":false,"context_lines":[{"line_number":978,"context_line":"                     \u0027swift.callback.slo_manifest_hook\u0027: data_inserter},"},{"line_number":979,"context_line":"            body\u003dgood_data)"},{"line_number":980,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":981,"context_line":"        self.assertEqual(self.app.call_count, 3)"},{"line_number":982,"context_line":""},{"line_number":983,"context_line":"        # Check that we still populated the manifest properly from our HEADs"},{"line_number":984,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":4,"id":"dfd5e7cf_abff80ff","line":981,"updated":"2019-01-09 16:51:29.000000000","message":"Oh, ok, so we do want to support modification of the manifest.  That\u0027s a little coupling, but I think that\u0027s ok - since we have to support old formats on-disk anyway.","commit_id":"284bbdd391b24823f1f1154577b2b68575e7f7e9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"be0465476954ddd2c344289057938e3672d397ef","unresolved":false,"context_lines":[{"line_number":978,"context_line":"                     \u0027swift.callback.slo_manifest_hook\u0027: data_inserter},"},{"line_number":979,"context_line":"            body\u003dgood_data)"},{"line_number":980,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":981,"context_line":"        self.assertEqual(self.app.call_count, 3)"},{"line_number":982,"context_line":""},{"line_number":983,"context_line":"        # Check that we still populated the manifest properly from our HEADs"},{"line_number":984,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":4,"id":"dfd5e7cf_01930dfc","line":981,"in_reply_to":"dfd5e7cf_abff80ff","updated":"2019-01-09 18:47:11.000000000","message":"Yeah, thinking of https://review.openstack.org/#/c/499260/ in particular -- it felt stupid that we\u0027d require the user to provide size_bytes.","commit_id":"284bbdd391b24823f1f1154577b2b68575e7f7e9"}]}
