)]}'
{"test/unit/obj/test_reconstructor.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fea09a67b3589a4be996a39aa42f4b4b21c4a5f4","unresolved":false,"context_lines":[{"line_number":705,"context_line":"            new_device[\u0027device\u0027] \u003d device"},{"line_number":706,"context_line":"            new_device[\u0027id\u0027] \u003d next(id_counter)"},{"line_number":707,"context_line":"            self.policy.object_ring.devs.append(new_device)"},{"line_number":708,"context_line":"        self.reconstructor.stats_interval \u003d 0"},{"line_number":709,"context_line":"        self.process_job \u003d lambda j: sleep(0)"},{"line_number":710,"context_line":"        with mock_ssync_sender(), \\"},{"line_number":711,"context_line":"            mocked_http_conn(*[200] * http_count,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fce034c_ee0fbfde","side":"PARENT","line":708,"range":{"start_line":708,"start_character":44,"end_line":708,"end_character":45},"updated":"2019-04-16 16:25:48.000000000","message":"WHY!? Why did we think a busy loop was a good idea?\n\nTesting locally with this at zero, the test just *hangs*, at least on py37.","commit_id":"5090a15f527f17fe7b1acaa5166a957eaeeb0497"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fea09a67b3589a4be996a39aa42f4b4b21c4a5f4","unresolved":false,"context_lines":[{"line_number":728,"context_line":"        matched \u003d stats_lines \u0026 acceptable"},{"line_number":729,"context_line":"        self.assertEqual(matched, acceptable,"},{"line_number":730,"context_line":"                         \u0027missing some expected acceptable:\\n%s\u0027 % ("},{"line_number":731,"context_line":"                             \u0027\\n\u0027.join(sorted(acceptable - matched))))"},{"line_number":732,"context_line":"        self.assertEqual(self.reconstructor.reconstruction_part_count, 8)"},{"line_number":733,"context_line":"        self.assertEqual(self.reconstructor.part_count, 8)"},{"line_number":734,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3fce034c_8ec5db5d","line":731,"updated":"2019-04-16 16:25:48.000000000","message":"I don\u0027t like how we\u0027re testing the stat-reporting thread :-(","commit_id":"3584b4ac341a11a89af5959c9bfbc94af5af851a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e61156667009b2eaba0a80944fa12f893a981f00","unresolved":false,"context_lines":[{"line_number":4578,"context_line":"            \u0027Content-Length\u0027: \u00270\u0027,"},{"line_number":4579,"context_line":"            \u0027ETag\u0027: \u0027etag\u0027,"},{"line_number":4580,"context_line":"            \u0027X-Timestamp\u0027: self.obj_timestamp.normal"},{"line_number":4581,"context_line":"        }"},{"line_number":4582,"context_line":""},{"line_number":4583,"context_line":"    def test_reconstruct_fa_no_errors(self):"},{"line_number":4584,"context_line":"        job \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfbec78f_d1047d1a","line":4581,"updated":"2019-05-15 02:50:49.000000000","message":"One side comment about this... When we unpickle, metadata comes out as all bytes, both keys and values. So, obj_path being b\u0027\u0027 is correct and tests the right thing. But the rest of the obj_metadata dict is wrong. It must all be in bytes if it imitates what the diskfile gives the reconstructor.","commit_id":"11fc2a0e5291abf176555c3dbb9b17b27a9f1370"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"c40ba656a6dcae6f564358833fbba4a2aef0df5d","unresolved":false,"context_lines":[{"line_number":4578,"context_line":"            \u0027Content-Length\u0027: \u00270\u0027,"},{"line_number":4579,"context_line":"            \u0027ETag\u0027: \u0027etag\u0027,"},{"line_number":4580,"context_line":"            \u0027X-Timestamp\u0027: self.obj_timestamp.normal"},{"line_number":4581,"context_line":"        }"},{"line_number":4582,"context_line":""},{"line_number":4583,"context_line":"    def test_reconstruct_fa_no_errors(self):"},{"line_number":4584,"context_line":"        job \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_484bbf86","line":4581,"in_reply_to":"dfbec78f_5ed64c2a","updated":"2019-05-16 18:36:40.000000000","message":"_full_path() has a decoder clause just for this. The reconstruct_fa() calls _full_path(,,datafile_metadata[\u0027name\u0027],).","commit_id":"11fc2a0e5291abf176555c3dbb9b17b27a9f1370"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8d3e90f9ca5498f8ef603bf289e5a1ad29f69c9e","unresolved":false,"context_lines":[{"line_number":4578,"context_line":"            \u0027Content-Length\u0027: \u00270\u0027,"},{"line_number":4579,"context_line":"            \u0027ETag\u0027: \u0027etag\u0027,"},{"line_number":4580,"context_line":"            \u0027X-Timestamp\u0027: self.obj_timestamp.normal"},{"line_number":4581,"context_line":"        }"},{"line_number":4582,"context_line":""},{"line_number":4583,"context_line":"    def test_reconstruct_fa_no_errors(self):"},{"line_number":4584,"context_line":"        job \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfbec78f_5ed64c2a","line":4581,"in_reply_to":"dfbec78f_d1047d1a","updated":"2019-05-16 17:00:23.000000000","message":"When it comes out of the pickle, sure. But just before we return from read_metadata, we send the dict through _decode_metadata which gets us back to native strings (possibly with surrogate escapes, on py3) -- see https://github.com/openstack/swift/commit/36c4297. Now I need to remember why (I thought) name-as-bytes was needed...","commit_id":"11fc2a0e5291abf176555c3dbb9b17b27a9f1370"}]}
