)]}'
{"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5678e6a00e535e3fe1345fec49026a55851c6ec5","unresolved":false,"context_lines":[{"line_number":3669,"context_line":"            for orig_chunk in orig_chunks:"},{"line_number":3670,"context_line":"                expected \u003d [\u0027\u0027.join([expected[i], x])"},{"line_number":3671,"context_line":"                            for i, x in enumerate("},{"line_number":3672,"context_line":"                    policy.pyeclib_driver.encode(orig_chunk))]"},{"line_number":3673,"context_line":"            transform \u003d obj.chunk_transformer(policy)"},{"line_number":3674,"context_line":"            transform.send(None)"},{"line_number":3675,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a30ddce_3b1d0674","line":3672,"updated":"2017-03-07 17:20:16.000000000","message":"too dense, I misunderstood the expected behavior of chunk_transformer because the shape of expected wasn\u0027t obvious \n\n            expected \u003d [[]] * policy.ec_n_unique_fragments\n            for orig_chunk in orig_chunks:\n                # each segment produces a set of frags\n                frags \u003d policy.pyeclib_driver.encode(orig_chunk)\n                for i, f in enumerate(frags):\n                    expected[i].append(f)\n            # chunk_transformer buffers and concatenates multiple frags\n            expected \u003d [\u0027\u0027.join(frags) for frags in expected]","commit_id":"c0060f73bb6f571ccaf8275110d98e11ba8379a4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5678e6a00e535e3fe1345fec49026a55851c6ec5","unresolved":false,"context_lines":[{"line_number":4330,"context_line":"        handoff_putter.node_index \u003d None"},{"line_number":4331,"context_line":""},{"line_number":4332,"context_line":"        # and then pop another putter for a copy of same fragment index"},{"line_number":4333,"context_line":"        putters.pop(missing_two + self.policy.ec_n_unique_fragments)"},{"line_number":4334,"context_line":""},{"line_number":4335,"context_line":"        # also pop one copy of a different fragment to make one missing hole"},{"line_number":4336,"context_line":"        putters.pop(missing_one)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a30ddce_1abbfc73","line":4333,"updated":"2017-03-07 17:20:16.000000000","message":"I guess if you pass in missing_two \u003d [14, 28) you just get an IndexError\n\nwfm","commit_id":"c0060f73bb6f571ccaf8275110d98e11ba8379a4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5678e6a00e535e3fe1345fec49026a55851c6ec5","unresolved":false,"context_lines":[{"line_number":4353,"context_line":"        # drop node_index 0, 14 and 1 should work"},{"line_number":4354,"context_line":"        self._test_determine_chunk_destinations_prioritize(0, 1)"},{"line_number":4355,"context_line":"        # drop node_index 1, 15 and 0 should work, too"},{"line_number":4356,"context_line":"        self._test_determine_chunk_destinations_prioritize(1, 0)"},{"line_number":4357,"context_line":""},{"line_number":4358,"context_line":""},{"line_number":4359,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a30ddce_1a113cad","line":4356,"updated":"2017-03-07 17:20:16.000000000","message":"ok, so this is just making the math implicit\n\nsince this is a 10+4 instead of (0, 14) it\u0027s just 0 ... and 0 + n_unique is implied","commit_id":"c0060f73bb6f571ccaf8275110d98e11ba8379a4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0450bc93205c55e9912eecb0eb70826f652ab3db","unresolved":false,"context_lines":[{"line_number":3672,"context_line":"                for i, f in enumerate(frag_set):"},{"line_number":3673,"context_line":"                    expected[i].append(f)"},{"line_number":3674,"context_line":"            # chunk_transformer buffers and concatenates multiple frags"},{"line_number":3675,"context_line":"            expected \u003d [\u0027\u0027.join(frags) for frags in expected]"},{"line_number":3676,"context_line":""},{"line_number":3677,"context_line":"            transform \u003d obj.chunk_transformer(policy)"},{"line_number":3678,"context_line":"            transform.send(None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a30ddce_04245e0b","line":3675,"updated":"2017-03-07 19:57:55.000000000","message":"+1 that\u0027s a lot easier to grok. #mybad\n\nbut -1 it fails test - [[]]*10 gives you 10 refs to the SAME list instance","commit_id":"3e2a6d3198ec0657b6a63e0d2d97d1d7ac3ad9d9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ca0efd3205e8dd6072b64e575d6447d75dc04054","unresolved":false,"context_lines":[{"line_number":3672,"context_line":"                for i, f in enumerate(frag_set):"},{"line_number":3673,"context_line":"                    expected[i].append(f)"},{"line_number":3674,"context_line":"            # chunk_transformer buffers and concatenates multiple frags"},{"line_number":3675,"context_line":"            expected \u003d [\u0027\u0027.join(frags) for frags in expected]"},{"line_number":3676,"context_line":""},{"line_number":3677,"context_line":"            transform \u003d obj.chunk_transformer(policy)"},{"line_number":3678,"context_line":"            transform.send(None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a30ddce_612b47ec","line":3675,"in_reply_to":"9a30ddce_04245e0b","updated":"2017-03-07 21:11:14.000000000","message":"I blame\n\n    x \u003d [\u0027\u0027] * 10\n\nfor putting the bad idea in my head :D\n\nI would have swore I at least *ran* the test tho!?  i\u0027m totally losing it","commit_id":"3e2a6d3198ec0657b6a63e0d2d97d1d7ac3ad9d9"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"bdf90ef031c72e554ea7ce488c7b3bb110566a1f","unresolved":false,"context_lines":[{"line_number":3672,"context_line":"                for i, f in enumerate(frag_set):"},{"line_number":3673,"context_line":"                    expected[i].append(f)"},{"line_number":3674,"context_line":"            # chunk_transformer buffers and concatenates multiple frags"},{"line_number":3675,"context_line":"            expected \u003d [\u0027\u0027.join(frags) for frags in expected]"},{"line_number":3676,"context_line":""},{"line_number":3677,"context_line":"            transform \u003d obj.chunk_transformer(policy)"},{"line_number":3678,"context_line":"            transform.send(None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a30ddce_8d7f21aa","line":3675,"range":{"start_line":3675,"start_character":12,"end_line":3675,"end_character":61},"updated":"2017-03-10 05:26:36.000000000","message":"It might be only me but i\u0027d like to avoid re-assignment for \"expected\" variable, I think the first usage at L3668 is actually not \"expected\" but a temporary variable to make an expected encoded chunk list. so perhaps, something like \"encoded_chunks\" could be better to understand, maybe?\n\n\nAnd I tried to do the code being more intuitive like:\n\n\n # encoded_chunk_map is dict to map from frag_index to encoded chunks that\n # ordered by the order of input segment chunks\n encoded_chunk_map \u003d defaultdict(list)\n for orig_chunk in orig_chunks:\n   # each segment produces a set of frags\n   frag_set \u003d policy.pyeclib_driver.encode(orig_chunk)\n   for frag_index, frag_body in enumerate(frag_set):\n     encoded_chunk_map[frag_index].append(frag_body)\n # sanity, the # of key(frag_index)s is same with n_unique_fragments\n self.assertEqual(len(encoded_chunk_map), policy.ec_n_unique_fragments)\n expected \u003d [\u0027\u0027.join(frags) for frag in encoded_chunk_map.values()]\n\n\nBut it is being larger than the original, so I\u0027m not sure if it may be getting better :/","commit_id":"debb2905657596a8fa5f0b06e37a1739a1e770ac"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a567eccbe50980ca654478da3233982db0713148","unresolved":false,"context_lines":[{"line_number":3672,"context_line":"                for i, f in enumerate(frag_set):"},{"line_number":3673,"context_line":"                    expected[i].append(f)"},{"line_number":3674,"context_line":"            # chunk_transformer buffers and concatenates multiple frags"},{"line_number":3675,"context_line":"            expected \u003d [\u0027\u0027.join(frags) for frags in expected]"},{"line_number":3676,"context_line":""},{"line_number":3677,"context_line":"            transform \u003d obj.chunk_transformer(policy)"},{"line_number":3678,"context_line":"            transform.send(None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a30ddce_7d3e0429","line":3675,"range":{"start_line":3675,"start_character":12,"end_line":3675,"end_character":61},"in_reply_to":"9a30ddce_8d7f21aa","updated":"2017-03-10 15:13:10.000000000","message":"Done - used most of your suggestion, thanks","commit_id":"debb2905657596a8fa5f0b06e37a1739a1e770ac"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"bdf90ef031c72e554ea7ce488c7b3bb110566a1f","unresolved":false,"context_lines":[{"line_number":4306,"context_line":"            self, missing_two, missing_one):"},{"line_number":4307,"context_line":"        # This scenario is only in ec_duplication_factor \u003e\u003d 2 likely,"},{"line_number":4308,"context_line":"        # If we have multiple failures such that frag X is missing"},{"line_number":4309,"context_line":"        # two copies and frag Y is missing 1, we should prioritize"},{"line_number":4310,"context_line":"        # finding a handoff for frag X."},{"line_number":4311,"context_line":""},{"line_number":4312,"context_line":"        class FakePutter(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a30ddce_086cffce","line":4309,"range":{"start_line":4309,"start_character":43,"end_line":4309,"end_character":44},"updated":"2017-03-10 05:26:36.000000000","message":"This is absolutely my fault but maybe \"missing one copy\" is consistent with the previous expression.","commit_id":"debb2905657596a8fa5f0b06e37a1739a1e770ac"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a567eccbe50980ca654478da3233982db0713148","unresolved":false,"context_lines":[{"line_number":4306,"context_line":"            self, missing_two, missing_one):"},{"line_number":4307,"context_line":"        # This scenario is only in ec_duplication_factor \u003e\u003d 2 likely,"},{"line_number":4308,"context_line":"        # If we have multiple failures such that frag X is missing"},{"line_number":4309,"context_line":"        # two copies and frag Y is missing 1, we should prioritize"},{"line_number":4310,"context_line":"        # finding a handoff for frag X."},{"line_number":4311,"context_line":""},{"line_number":4312,"context_line":"        class FakePutter(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a30ddce_1df18801","line":4309,"range":{"start_line":4309,"start_character":43,"end_line":4309,"end_character":44},"in_reply_to":"9a30ddce_086cffce","updated":"2017-03-10 15:13:10.000000000","message":"Done","commit_id":"debb2905657596a8fa5f0b06e37a1739a1e770ac"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"bdf90ef031c72e554ea7ce488c7b3bb110566a1f","unresolved":false,"context_lines":[{"line_number":4348,"context_line":"        self.assertIsNone(handoff_putter.node_index)"},{"line_number":4349,"context_line":"        self.assertEqual(got[handoff_putter], missing_two)"},{"line_number":4350,"context_line":"        # sanity, other nodes except handoff_putter have node_index"},{"line_number":4351,"context_line":"        self.assertTrue(all("},{"line_number":4352,"context_line":"            [putter.node_index for putter in got if"},{"line_number":4353,"context_line":"             putter !\u003d handoff_putter]))"},{"line_number":4354,"context_line":""},{"line_number":4355,"context_line":"    def test_determine_chunk_destinations_prioritize_more_missing(self):"},{"line_number":4356,"context_line":"        # drop node_index 0, 14 and 1 should work"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a30ddce_1ca520a1","line":4353,"range":{"start_line":4351,"start_character":0,"end_line":4353,"end_character":40},"updated":"2017-03-10 05:26:36.000000000","message":"If you don\u0027t mind, could you fix also this assertion?\n\nI found an error case that, if node_index would be 0, this assertion fail unexpectedly. (nothing affects with this change FOR NOW, though)\n\nI\u0027ve pushed a patch to fix that[1] but if you could think that it\u0027s nice to have, for telling as \"improve _test_determine_chunk_destinations_prioritize\"\n\n1: https://review.openstack.org/#/c/443072/2/test/unit/proxy/controllers/test_obj.py@4340","commit_id":"debb2905657596a8fa5f0b06e37a1739a1e770ac"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a567eccbe50980ca654478da3233982db0713148","unresolved":false,"context_lines":[{"line_number":4348,"context_line":"        self.assertIsNone(handoff_putter.node_index)"},{"line_number":4349,"context_line":"        self.assertEqual(got[handoff_putter], missing_two)"},{"line_number":4350,"context_line":"        # sanity, other nodes except handoff_putter have node_index"},{"line_number":4351,"context_line":"        self.assertTrue(all("},{"line_number":4352,"context_line":"            [putter.node_index for putter in got if"},{"line_number":4353,"context_line":"             putter !\u003d handoff_putter]))"},{"line_number":4354,"context_line":""},{"line_number":4355,"context_line":"    def test_determine_chunk_destinations_prioritize_more_missing(self):"},{"line_number":4356,"context_line":"        # drop node_index 0, 14 and 1 should work"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a30ddce_ddea900e","line":4353,"range":{"start_line":4351,"start_character":0,"end_line":4353,"end_character":40},"in_reply_to":"9a30ddce_1ca520a1","updated":"2017-03-10 15:13:10.000000000","message":"Done","commit_id":"debb2905657596a8fa5f0b06e37a1739a1e770ac"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"de9a6053274c790887829240ce00eae3e74af0bb","unresolved":false,"context_lines":[{"line_number":4304,"context_line":""},{"line_number":4305,"context_line":"    def _test_determine_chunk_destinations_prioritize("},{"line_number":4306,"context_line":"            self, missing_two, missing_one):"},{"line_number":4307,"context_line":"        # This scenario is only likely for ec_duplication_factor \u003e\u003d 2. If we"},{"line_number":4308,"context_line":"        # have multiple failures such that the putters collection is missing"},{"line_number":4309,"context_line":"        # two primary nodes for frag index \u0027missing_two\u0027 and missing one"},{"line_number":4310,"context_line":"        # primary node for frag index \u0027missing_one\u0027, then we should prioritize"},{"line_number":4311,"context_line":"        # finding a handoff for frag index \u0027missing_two\u0027."},{"line_number":4312,"context_line":""},{"line_number":4313,"context_line":"        class FakePutter(object):"},{"line_number":4314,"context_line":"            def __init__(self, index):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_df70a474","line":4311,"range":{"start_line":4307,"start_character":5,"end_line":4311,"end_character":57},"updated":"2017-03-13 01:26:49.000000000","message":"Good docs, thanks!","commit_id":"9e1915ad5bff844726fc99136f035494c7826622"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6b747817c29eb21a9ae8c18ba923f28dd3dfa046","unresolved":false,"context_lines":[{"line_number":3673,"context_line":"                for frag_index, frag_data in enumerate(frag_set):"},{"line_number":3674,"context_line":"                    encoded_chunks[frag_index].append(frag_data)"},{"line_number":3675,"context_line":"            # chunk_transformer buffers and concatenates multiple frags"},{"line_number":3676,"context_line":"            expected \u003d [\u0027\u0027.join(frags) for frags in encoded_chunks]"},{"line_number":3677,"context_line":""},{"line_number":3678,"context_line":"            transform \u003d obj.chunk_transformer(policy)"},{"line_number":3679,"context_line":"            transform.send(None)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a1ced50_5c0e8fe5","line":3676,"updated":"2017-03-22 19:25:00.000000000","message":"so for each segment worth of stuff we get a set of fragments - those fragments concat together to become a chunk of the frag_archive","commit_id":"aa9afb538457a22d8fd2ab86ea401f26196189c8"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6b747817c29eb21a9ae8c18ba923f28dd3dfa046","unresolved":false,"context_lines":[{"line_number":3677,"context_line":""},{"line_number":3678,"context_line":"            transform \u003d obj.chunk_transformer(policy)"},{"line_number":3679,"context_line":"            transform.send(None)"},{"line_number":3680,"context_line":"            backend_chunks \u003d transform.send(\u0027\u0027.join(orig_chunks))"},{"line_number":3681,"context_line":"            self.assertIsNotNone(backend_chunks)  # sanity"},{"line_number":3682,"context_line":"            self.assertEqual("},{"line_number":3683,"context_line":"                len(backend_chunks), policy.ec_n_unique_fragments)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a1ced50_bc494333","line":3680,"updated":"2017-03-22 19:25:00.000000000","message":"so we send the transformer multiple segements worth of bytes","commit_id":"aa9afb538457a22d8fd2ab86ea401f26196189c8"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6b747817c29eb21a9ae8c18ba923f28dd3dfa046","unresolved":false,"context_lines":[{"line_number":4353,"context_line":"        self.assertEqual(len(putters), len(got))"},{"line_number":4354,"context_line":"        # sanity, no node index - for handoff putter"},{"line_number":4355,"context_line":"        self.assertIsNone(handoff_putter.node_index)"},{"line_number":4356,"context_line":"        self.assertEqual(got[handoff_putter], missing_two)"},{"line_number":4357,"context_line":"        # sanity, other nodes except handoff_putter have node_index"},{"line_number":4358,"context_line":"        self.assertTrue(all("},{"line_number":4359,"context_line":"            [putter.node_index is not None for putter in got if"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a1ced50_422cea98","line":4356,"updated":"2017-03-22 19:25:00.000000000","message":"nice.","commit_id":"aa9afb538457a22d8fd2ab86ea401f26196189c8"}]}
