)]}'
{"swift/obj/server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a148e3c0307f33022410a288e95f2e58b5540be3","unresolved":false,"context_lines":[{"line_number":891,"context_line":"                                    is_object_transient_sysmeta(val[0])))"},{"line_number":892,"context_line":"                headers_to_copy \u003d ("},{"line_number":893,"context_line":"                    request.headers.get("},{"line_number":894,"context_line":"                        \u0027X-Backend-Replication-Headers\u0027, \u0027\u0027).split() +"},{"line_number":895,"context_line":"                    list(self.allowed_headers))"},{"line_number":896,"context_line":"                for header_key in headers_to_copy:"},{"line_number":897,"context_line":"                    if header_key in request.headers:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_1c8b72c0","side":"PARENT","line":894,"range":{"start_line":894,"start_character":25,"end_line":894,"end_character":54},"updated":"2018-09-13 07:12:31.000000000","message":"Bug or feature? This used to override even footers.","commit_id":"33c76507531073e431148a4f65da0a40e5ba88eb"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8f467c9ddae267f44191bab3b070b42218b71f24","unresolved":false,"context_lines":[{"line_number":891,"context_line":"                                    is_object_transient_sysmeta(val[0])))"},{"line_number":892,"context_line":"                headers_to_copy \u003d ("},{"line_number":893,"context_line":"                    request.headers.get("},{"line_number":894,"context_line":"                        \u0027X-Backend-Replication-Headers\u0027, \u0027\u0027).split() +"},{"line_number":895,"context_line":"                    list(self.allowed_headers))"},{"line_number":896,"context_line":"                for header_key in headers_to_copy:"},{"line_number":897,"context_line":"                    if header_key in request.headers:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_74b5d6cf","side":"PARENT","line":894,"range":{"start_line":894,"start_character":25,"end_line":894,"end_character":54},"in_reply_to":"3f79a3b5_1c8b72c0","updated":"2018-09-13 13:58:56.000000000","message":"hard to say, replication doesn\u0027t use footers... YET :\\","commit_id":"33c76507531073e431148a4f65da0a40e5ba88eb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a148e3c0307f33022410a288e95f2e58b5540be3","unresolved":false,"context_lines":[{"line_number":990,"context_line":"            get_name_and_placement(request, 5, 5, True)"},{"line_number":991,"context_line":"        disk_file, fsize, orig_metadata \u003d self._pre_create_checks("},{"line_number":992,"context_line":"            request, device, partition, account, container, obj, policy)"},{"line_number":993,"context_line":"        writer \u003d disk_file.writer(size\u003dfsize)"},{"line_number":994,"context_line":"        try:"},{"line_number":995,"context_line":"            obj_input \u003d request.environ[\u0027wsgi.input\u0027]"},{"line_number":996,"context_line":"            obj_input, multi_stage_mime_state \u003d \\"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_3cd8aeee","line":993,"range":{"start_line":993,"start_character":8,"end_line":993,"end_character":45},"updated":"2018-09-13 07:12:31.000000000","message":"It seems weird that we return disk_file for the sole purpose of this line. What do you think about something like http://paste.openstack.org/show/730010/ ?","commit_id":"9865b22c871ff5e79e4b0ec71f471267feb4692b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8f467c9ddae267f44191bab3b070b42218b71f24","unresolved":false,"context_lines":[{"line_number":990,"context_line":"            get_name_and_placement(request, 5, 5, True)"},{"line_number":991,"context_line":"        disk_file, fsize, orig_metadata \u003d self._pre_create_checks("},{"line_number":992,"context_line":"            request, device, partition, account, container, obj, policy)"},{"line_number":993,"context_line":"        writer \u003d disk_file.writer(size\u003dfsize)"},{"line_number":994,"context_line":"        try:"},{"line_number":995,"context_line":"            obj_input \u003d request.environ[\u0027wsgi.input\u0027]"},{"line_number":996,"context_line":"            obj_input, multi_stage_mime_state \u003d \\"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_54353a44","line":993,"range":{"start_line":993,"start_character":8,"end_line":993,"end_character":45},"in_reply_to":"3f79a3b5_3cd8aeee","updated":"2018-09-13 13:58:56.000000000","message":"I don\u0027t mind returning disk_file and giving the caller the option of create or writer/open/close\n\nI didn\u0027t like adding a new property to the writer interface for \"upload_size_correct\" - but since it\u0027s already tracking/returning upload_size... *maybe*?","commit_id":"9865b22c871ff5e79e4b0ec71f471267feb4692b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a148e3c0307f33022410a288e95f2e58b5540be3","unresolved":false,"context_lines":[{"line_number":999,"context_line":"                request, device, obj_input, writer, fsize)"},{"line_number":1000,"context_line":"            metadata \u003d self._get_request_metadata(request)"},{"line_number":1001,"context_line":"            if multi_stage_mime_state:"},{"line_number":1002,"context_line":"                footers_metadata \u003d self._read_mime_footers_metadata("},{"line_number":1003,"context_line":"                    **multi_stage_mime_state)"},{"line_number":1004,"context_line":"            else:"},{"line_number":1005,"context_line":"                footers_metadata \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_97af5b7c","line":1002,"range":{"start_line":1002,"start_character":40,"end_line":1002,"end_character":67},"updated":"2018-09-13 07:12:31.000000000","message":"This is causing us to call md5() again, causing the unit test failure.\n\nI guess? I mean, we called it before, too... but somehow we previously called md5 for each of the six fragments, then called md5 for each of the six footer bodies. Now we do frag, footer, frag, footer, ...\n\nFWIW, I can repro on master if I move the\n\n etag \u003d md5()\n\nto just before\n\n timeout_reader \u003d self._make_timeout_reader(obj_input)\n\nPart of me wonders if it\u0027d be better to have DiskFileWriter be responsible for the md5\u0027ing, just so we can target the busted-md5 mock better.","commit_id":"9865b22c871ff5e79e4b0ec71f471267feb4692b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"94615c430a09142f90368421346fdd163b159de2","unresolved":false,"context_lines":[{"line_number":999,"context_line":"                request, device, obj_input, writer, fsize)"},{"line_number":1000,"context_line":"            metadata \u003d self._get_request_metadata(request)"},{"line_number":1001,"context_line":"            if multi_stage_mime_state:"},{"line_number":1002,"context_line":"                footers_metadata \u003d self._read_mime_footers_metadata("},{"line_number":1003,"context_line":"                    **multi_stage_mime_state)"},{"line_number":1004,"context_line":"            else:"},{"line_number":1005,"context_line":"                footers_metadata \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_d7de2c69","line":1002,"range":{"start_line":1002,"start_character":40,"end_line":1002,"end_character":67},"in_reply_to":"3f79a3b5_944c329e","updated":"2018-09-13 14:21:53.000000000","message":"LOL at this fix too:\n\n\tdiff --git a/swift/obj/server.py b/swift/obj/server.py\n\tindex 8c4bfdbfe..f7a8ed306 100644\n\t--- a/swift/obj/server.py\n\t+++ b/swift/obj/server.py\n\t@@ -530,6 +530,7 @@ class ObjectController(BaseStorageServer):\n\t\t except StopIteration:\n\t\t     raise HTTPBadRequest(body\u003d\"couldn\u0027t find footer MIME doc\")\n\t \n\t+        sleep(0)\n\t\t timeout_reader \u003d self._make_timeout_reader(footer_iter)\n\t\t try:\n\t\t     footer_body \u003d \u0027\u0027.join(iter(timeout_reader, \u0027\u0027))","commit_id":"9865b22c871ff5e79e4b0ec71f471267feb4692b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c987584d086ad81dacf1d92f9b7ba8329be8e9e9","unresolved":false,"context_lines":[{"line_number":999,"context_line":"                request, device, obj_input, writer, fsize)"},{"line_number":1000,"context_line":"            metadata \u003d self._get_request_metadata(request)"},{"line_number":1001,"context_line":"            if multi_stage_mime_state:"},{"line_number":1002,"context_line":"                footers_metadata \u003d self._read_mime_footers_metadata("},{"line_number":1003,"context_line":"                    **multi_stage_mime_state)"},{"line_number":1004,"context_line":"            else:"},{"line_number":1005,"context_line":"                footers_metadata \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_944c329e","line":1002,"range":{"start_line":1002,"start_character":40,"end_line":1002,"end_character":67},"in_reply_to":"3f79a3b5_97af5b7c","updated":"2018-09-13 14:09:30.000000000","message":"so the frag, footer, frag, footer ... was a great clue\n\nThis works:\n\n\tdiff --git a/test/unit/proxy/test_server.py b/test/unit/proxy/test_server.py\n\tindex f53f87c85..1f6822103 100644\n\t--- a/test/unit/proxy/test_server.py\n\t+++ b/test/unit/proxy/test_server.py\n\t@@ -5850,7 +5850,7 @@ class BaseTestECObjectController(BaseTestObjectController):\n\t\t # hashers in an object server.\n\t\t count \u003d (\n\t\t     self.ec_policy.object_ring.replica_count - self.ec_policy.ec_ndata)\n\t-        countdown \u003d [count]\n\t+        countdown \u003d [2 * count]\n\t \n\t\t def busted_md5_constructor(initial_str\u003d\"\"):\n\t\t     hasher \u003d md5(initial_str)","commit_id":"9865b22c871ff5e79e4b0ec71f471267feb4692b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a148e3c0307f33022410a288e95f2e58b5540be3","unresolved":false,"context_lines":[{"line_number":1003,"context_line":"                    **multi_stage_mime_state)"},{"line_number":1004,"context_line":"            else:"},{"line_number":1005,"context_line":"                footers_metadata \u003d {}"},{"line_number":1006,"context_line":"            self._apply_extra_metadata(metadata, footers_metadata,"},{"line_number":1007,"context_line":"                                       staged_etag, upload_size)"},{"line_number":1008,"context_line":"            if metadata[\u0027ETag\u0027] !\u003d staged_etag:"},{"line_number":1009,"context_line":"                raise HTTPUnprocessableEntity(request\u003drequest)"},{"line_number":1010,"context_line":"            writer.put(metadata)"},{"line_number":1011,"context_line":"            if multi_stage_mime_state:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_fc4556b5","line":1008,"range":{"start_line":1006,"start_character":12,"end_line":1008,"end_character":47},"updated":"2018-09-13 07:12:31.000000000","message":"This feels a little spooky... I might feel better about _apply_extra_metadata returning a meta_from_etag...\n\nOTOH, we *know* metadata\u0027s getting updated -- we *need* that side-effect to get footers into our writer.put() call below...\n\nAm I being OCD in wanting something like\n\n metadata_to_store \u003d self._combine_metadata_sources(\n     metadata, footers_metadata, staged_etag, upload_size)\n\nwhere the helper builds up a brand new dict? *shrug*","commit_id":"9865b22c871ff5e79e4b0ec71f471267feb4692b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8f467c9ddae267f44191bab3b070b42218b71f24","unresolved":false,"context_lines":[{"line_number":1003,"context_line":"                    **multi_stage_mime_state)"},{"line_number":1004,"context_line":"            else:"},{"line_number":1005,"context_line":"                footers_metadata \u003d {}"},{"line_number":1006,"context_line":"            self._apply_extra_metadata(metadata, footers_metadata,"},{"line_number":1007,"context_line":"                                       staged_etag, upload_size)"},{"line_number":1008,"context_line":"            if metadata[\u0027ETag\u0027] !\u003d staged_etag:"},{"line_number":1009,"context_line":"                raise HTTPUnprocessableEntity(request\u003drequest)"},{"line_number":1010,"context_line":"            writer.put(metadata)"},{"line_number":1011,"context_line":"            if multi_stage_mime_state:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_540e9a8c","line":1008,"range":{"start_line":1006,"start_character":12,"end_line":1008,"end_character":47},"in_reply_to":"3f79a3b5_fc4556b5","updated":"2018-09-13 13:58:56.000000000","message":"I had it written that way, and realized the side-effect was going to be hard to get rid of so decided to just accept it as part of life.","commit_id":"9865b22c871ff5e79e4b0ec71f471267feb4692b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8f467c9ddae267f44191bab3b070b42218b71f24","unresolved":false,"context_lines":[{"line_number":1006,"context_line":"            self._apply_extra_metadata(metadata, footers_metadata,"},{"line_number":1007,"context_line":"                                       staged_etag, upload_size)"},{"line_number":1008,"context_line":"            if metadata[\u0027ETag\u0027] !\u003d staged_etag:"},{"line_number":1009,"context_line":"                raise HTTPUnprocessableEntity(request\u003drequest)"},{"line_number":1010,"context_line":"            writer.put(metadata)"},{"line_number":1011,"context_line":"            if multi_stage_mime_state:"},{"line_number":1012,"context_line":"                self._send_multi_stage_continue_headers("}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_e32b79e7","line":1009,"updated":"2018-09-13 13:58:56.000000000","message":"This little bit should go ahead and move into _apply_extra_metadata","commit_id":"9865b22c871ff5e79e4b0ec71f471267feb4692b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a148e3c0307f33022410a288e95f2e58b5540be3","unresolved":false,"context_lines":[{"line_number":1021,"context_line":"        except ChunkReadTimeout:"},{"line_number":1022,"context_line":"            return HTTPRequestTimeout(request\u003drequest)"},{"line_number":1023,"context_line":"        finally:"},{"line_number":1024,"context_line":"            writer.close()"},{"line_number":1025,"context_line":"        self._post_commit_updates(request, device,"},{"line_number":1026,"context_line":"                                  account, container, obj, policy,"},{"line_number":1027,"context_line":"                                  orig_metadata, footers_metadata, metadata)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_fc731615","line":1024,"updated":"2018-09-13 07:12:31.000000000","message":"The writer doesn\u0027t get opened until _stage_obj_data, yeah? So if we bomb out in _do_multi_stage_mime_continue_headers (because we didn\u0027t find a boundary, or we hit a ChunkReadError) we\u0027ll close an unopened writer... but that should be fine.","commit_id":"9865b22c871ff5e79e4b0ec71f471267feb4692b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8f467c9ddae267f44191bab3b070b42218b71f24","unresolved":false,"context_lines":[{"line_number":1021,"context_line":"        except ChunkReadTimeout:"},{"line_number":1022,"context_line":"            return HTTPRequestTimeout(request\u003drequest)"},{"line_number":1023,"context_line":"        finally:"},{"line_number":1024,"context_line":"            writer.close()"},{"line_number":1025,"context_line":"        self._post_commit_updates(request, device,"},{"line_number":1026,"context_line":"                                  account, container, obj, policy,"},{"line_number":1027,"context_line":"                                  orig_metadata, footers_metadata, metadata)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_142022f8","line":1024,"in_reply_to":"3f79a3b5_fc731615","updated":"2018-09-13 13:58:56.000000000","message":"+1","commit_id":"9865b22c871ff5e79e4b0ec71f471267feb4692b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bd5534fb297fd968c1b7157cd6a55c58d4df7740","unresolved":false,"context_lines":[{"line_number":889,"context_line":"        headers_to_copy \u003d ("},{"line_number":890,"context_line":"            request.headers.get("},{"line_number":891,"context_line":"                \u0027X-Backend-Replication-Headers\u0027, \u0027\u0027).split() +"},{"line_number":892,"context_line":"            list(self.allowed_headers))"},{"line_number":893,"context_line":"        for header_key in headers_to_copy:"},{"line_number":894,"context_line":"            if header_key in request.headers:"},{"line_number":895,"context_line":"                header_caps \u003d header_key.title()"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_4904b57e","line":892,"range":{"start_line":892,"start_character":22,"end_line":892,"end_character":37},"updated":"2018-09-14 06:58:08.000000000","message":"Hmm... I suddenly had a bad thought...\n\nWhat happens if you include etag in allowed_headers?\n\nI guess... we\u0027re OK? Just because metadata is a regular dict (instead of a HeaderKeyDict) and you can\u0027t get .title() to give you \"ETag\". But that seems more like dumb luck than a conscious design decision...","commit_id":"cbfa585d3b48d2d8e2aedb9cedc62226dade8798"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bd5534fb297fd968c1b7157cd6a55c58d4df7740","unresolved":false,"context_lines":[{"line_number":1706,"context_line":""},{"line_number":1707,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":1708,"context_line":"        self.assertEqual(resp.status_int, 201)"},{"line_number":1709,"context_line":"        self.assertEqual(resp.etag, obj_etag)"},{"line_number":1710,"context_line":""},{"line_number":1711,"context_line":"        objfile \u003d os.path.join("},{"line_number":1712,"context_line":"            self.testdir, \u0027sda1\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_c9a0c594","line":1709,"updated":"2018-09-14 06:58:08.000000000","message":"Not necessarily opposed... but this didn\u0027t actually have an impact on test results, did it?\n\nI\u0027m guessing it was just because you\u0027d get\n\n None !\u003d \u0027...\u0027\n\nin your test results when the problem was better described as something like\n\n 500 !\u003d 201\n\nyeah?","commit_id":"cbfa585d3b48d2d8e2aedb9cedc62226dade8798"}]}
