)]}'
{"swift/proxy/controllers/obj.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9f21659d7536f0638bedcb8249434b2549754742","unresolved":false,"context_lines":[{"line_number":698,"context_line":"        raise NotImplementedError()"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"    def _delete_object(self, req, obj_ring, partition, headers,"},{"line_number":701,"context_line":"                       node_count\u003dNone, node_iterator\u003dNone):"},{"line_number":702,"context_line":"        \"\"\"Delete object considering write-affinity."},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"        When deleting object in write affinity deployment, also take configured"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_3c044615","line":701,"range":{"start_line":701,"start_character":23,"end_line":701,"end_character":38},"updated":"2019-03-07 21:02:44.000000000","message":"It never *should* be None, though, right? We always specify either len(nodes) or len(nodes) + local_handoffs, yeah?\n\nWhat would happen if it *was* None? I guess the old behavior, when write_affinity is disabled...","commit_id":"b0f03aeda8bea8ff96fdadfedd23313edd7c339b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9f21659d7536f0638bedcb8249434b2549754742","unresolved":false,"context_lines":[{"line_number":709,"context_line":"        :param req: the DELETE Request"},{"line_number":710,"context_line":"        :param obj_ring: the object ring"},{"line_number":711,"context_line":"        :param partition: ring partition number"},{"line_number":712,"context_line":"        :param headers: system headers to storage nodes"},{"line_number":713,"context_line":"        :return: Response object"},{"line_number":714,"context_line":"        \"\"\""},{"line_number":715,"context_line":"        status_overrides \u003d {404: 204}"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_01400356","line":712,"updated":"2019-03-07 21:02:44.000000000","message":"docstring could use an update.","commit_id":"b0f03aeda8bea8ff96fdadfedd23313edd7c339b"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c547e1dec25df74ffc22e83be274f6a89be9704f","unresolved":false,"context_lines":[{"line_number":869,"context_line":"            if local_handoffs is None:"},{"line_number":870,"context_line":"                local_primaries \u003d [node for node in nodes if is_local(node)]"},{"line_number":871,"context_line":"                local_handoffs \u003d len(nodes) - len(local_primaries)"},{"line_number":872,"context_line":"            node_count +\u003d local_handoffs"},{"line_number":873,"context_line":""},{"line_number":874,"context_line":"        headers \u003d self._backend_requests("},{"line_number":875,"context_line":"            req, node_count, container_partition, container_nodes,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_4f0ef23b","side":"PARENT","line":872,"updated":"2019-03-12 05:05:20.000000000","message":"We do all these sums to get the number of nodes.. then we pretty much do all these sums again in the inter_nodes_local_first interator. I see why we need to, but seems a rather repeditive to me. In either case, this is much better then it was. Nice clean up.","commit_id":"703249d6cbc9ece5c015efe4333d2acf1d403bc0"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20a4e0d333049e1c998161ac694ddd6e6d61cae0","unresolved":false,"context_lines":[{"line_number":710,"context_line":"        :param obj_ring: the object ring"},{"line_number":711,"context_line":"        :param partition: ring partition number"},{"line_number":712,"context_line":"        :param headers: system headers to storage nodes"},{"line_number":713,"context_line":"        :return: Response object"},{"line_number":714,"context_line":"        \"\"\""},{"line_number":715,"context_line":"        status_overrides \u003d {404: 204}"},{"line_number":716,"context_line":"        resp \u003d self.make_requests(req, obj_ring,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_4754ff54","line":713,"updated":"2019-03-19 21:56:18.000000000","message":"Could still use an update.","commit_id":"e1a12dc3dd04bc63d6b5b31d4ffd6a96bf8af918"}],"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9f21659d7536f0638bedcb8249434b2549754742","unresolved":false,"context_lines":[{"line_number":545,"context_line":""},{"line_number":546,"context_line":"        self.assertEqual(resp.status_int, 204)"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"    def test_DELETE_write_affinity_before_replication(self):"},{"line_number":549,"context_line":"        policy_conf \u003d self.app.get_policy_options(self.policy)"},{"line_number":550,"context_line":"        policy_conf.write_affinity_handoff_delete_count \u003d self.replicas() // 2"},{"line_number":551,"context_line":"        policy_conf.write_affinity_is_local_fn \u003d ("}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_f72c9948","line":548,"updated":"2019-03-07 21:02:44.000000000","message":"I\u0027m not sure I get why replication is in the test name at all, so I can\u0027t really tell whether \"before\" or \"after\" is better :-/","commit_id":"b0f03aeda8bea8ff96fdadfedd23313edd7c339b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9f21659d7536f0638bedcb8249434b2549754742","unresolved":false,"context_lines":[{"line_number":1418,"context_line":""},{"line_number":1419,"context_line":"    def test_DELETE_with_write_affinity(self):"},{"line_number":1420,"context_line":"        policy_conf \u003d self.app.get_policy_options(self.policy)"},{"line_number":1421,"context_line":"        policy_conf.write_affinity_handoff_delete_count \u003d self.replicas() / 2"},{"line_number":1422,"context_line":"        policy_conf.write_affinity_is_local_fn \u003d ("},{"line_number":1423,"context_line":"            lambda node: node[\u0027region\u0027] \u003d\u003d 1)"},{"line_number":1424,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_97dc3575","line":1421,"updated":"2019-03-07 21:02:44.000000000","message":"We want integer division, right? Use //","commit_id":"b0f03aeda8bea8ff96fdadfedd23313edd7c339b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a890339305566e4d8de2dd0b5b047d145e3a41a2","unresolved":false,"context_lines":[{"line_number":1418,"context_line":""},{"line_number":1419,"context_line":"    def test_DELETE_with_write_affinity(self):"},{"line_number":1420,"context_line":"        policy_conf \u003d self.app.get_policy_options(self.policy)"},{"line_number":1421,"context_line":"        policy_conf.write_affinity_handoff_delete_count \u003d self.replicas() / 2"},{"line_number":1422,"context_line":"        policy_conf.write_affinity_is_local_fn \u003d ("},{"line_number":1423,"context_line":"            lambda node: node[\u0027region\u0027] \u003d\u003d 1)"},{"line_number":1424,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_d2b5ebef","line":1421,"in_reply_to":"5fc1f717_97dc3575","updated":"2019-03-07 21:45:49.000000000","message":"oh, maybe that\u0027s why it fails under py3!  I was confused...","commit_id":"b0f03aeda8bea8ff96fdadfedd23313edd7c339b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9f21659d7536f0638bedcb8249434b2549754742","unresolved":false,"context_lines":[{"line_number":1436,"context_line":""},{"line_number":1437,"context_line":"        policy_conf.write_affinity_handoff_delete_count \u003d 2"},{"line_number":1438,"context_line":""},{"line_number":1439,"context_line":"        codes \u003d [204, 204, 404, 204, 404]"},{"line_number":1440,"context_line":"        with mocked_http_conn(*codes):"},{"line_number":1441,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1442,"context_line":"        self.assertEqual(resp.status_int, 204)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_370a21d2","line":1439,"updated":"2019-03-07 21:02:44.000000000","message":"Wait... so with write_affinity_handoff_delete_count \u003d 2, we need 5 mocked out responses... up above, where we say\n\n policy_conf.write_affinity_handoff_delete_count \u003d self.replicas() // 2\n\nis the replica count always either 2 or 3? We only needed four response codes then... Should we just say\n\n policy_conf.write_affinity_handoff_delete_count \u003d 1\n\nthere?","commit_id":"b0f03aeda8bea8ff96fdadfedd23313edd7c339b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a890339305566e4d8de2dd0b5b047d145e3a41a2","unresolved":false,"context_lines":[{"line_number":1436,"context_line":""},{"line_number":1437,"context_line":"        policy_conf.write_affinity_handoff_delete_count \u003d 2"},{"line_number":1438,"context_line":""},{"line_number":1439,"context_line":"        codes \u003d [204, 204, 404, 204, 404]"},{"line_number":1440,"context_line":"        with mocked_http_conn(*codes):"},{"line_number":1441,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1442,"context_line":"        self.assertEqual(resp.status_int, 204)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_12a133aa","line":1439,"in_reply_to":"5fc1f717_370a21d2","updated":"2019-03-07 21:45:49.000000000","message":"maybe, I think maybe whatever I copied from was trying to highlight the default?  I did move it here so i could be more explicit/readable w/o having to worry about a bunch of other contexts...","commit_id":"b0f03aeda8bea8ff96fdadfedd23313edd7c339b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9f21659d7536f0638bedcb8249434b2549754742","unresolved":false,"context_lines":[{"line_number":1441,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1442,"context_line":"        self.assertEqual(resp.status_int, 204)"},{"line_number":1443,"context_line":""},{"line_number":1444,"context_line":"        codes \u003d [204, 404, 404, 204, 204]"},{"line_number":1445,"context_line":"        with mocked_http_conn(*codes):"},{"line_number":1446,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1447,"context_line":"        self.assertEqual(resp.status_int, 204)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_37c1c155","line":1444,"updated":"2019-03-07 21:02:44.000000000","message":"How is this different from the case immediately above? I see that the codes are in a different order... but does order actually matter here? Aren\u0027t we going to eventlet.spawn() a bunch of requests so we don\u0027t have any real influence over which node indexes get which response?\n\nShould this maybe have 3x 404 and 2x 204 instead of the other way around?","commit_id":"b0f03aeda8bea8ff96fdadfedd23313edd7c339b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a890339305566e4d8de2dd0b5b047d145e3a41a2","unresolved":false,"context_lines":[{"line_number":1441,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1442,"context_line":"        self.assertEqual(resp.status_int, 204)"},{"line_number":1443,"context_line":""},{"line_number":1444,"context_line":"        codes \u003d [204, 404, 404, 204, 204]"},{"line_number":1445,"context_line":"        with mocked_http_conn(*codes):"},{"line_number":1446,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1447,"context_line":"        self.assertEqual(resp.status_int, 204)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_d283ab03","line":1444,"in_reply_to":"5fc1f717_37c1c155","updated":"2019-03-07 21:45:49.000000000","message":"well, the order the eventlet spawns are returned are significant after the post_quorum timeout - but in this test that probably doesn\u0027t matter...","commit_id":"b0f03aeda8bea8ff96fdadfedd23313edd7c339b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9f21659d7536f0638bedcb8249434b2549754742","unresolved":false,"context_lines":[{"line_number":1444,"context_line":"        codes \u003d [204, 404, 404, 204, 204]"},{"line_number":1445,"context_line":"        with mocked_http_conn(*codes):"},{"line_number":1446,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1447,"context_line":"        self.assertEqual(resp.status_int, 204)"},{"line_number":1448,"context_line":""},{"line_number":1449,"context_line":"    def test_PUT_error_during_transfer_data(self):"},{"line_number":1450,"context_line":"        class FakeReader(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_b747f11d","line":1447,"updated":"2019-03-07 21:02:44.000000000","message":"It seems like this is just further exploring how backend response codes translate to client response codes, is that right? Should we check under what circumstances we\u0027ll start to 404?\n\nI feel like it\u0027d be worth capturing the nodes we hit and making assertion on the count of nodes by region or something...","commit_id":"b0f03aeda8bea8ff96fdadfedd23313edd7c339b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9f21659d7536f0638bedcb8249434b2549754742","unresolved":false,"context_lines":[{"line_number":1850,"context_line":"     StoragePolicy(2, \u00278-replica\u0027, False),"},{"line_number":1851,"context_line":"     StoragePolicy(3, \u002715-replica\u0027, False)],"},{"line_number":1852,"context_line":"    fake_ring_args\u003d["},{"line_number":1853,"context_line":"        {\u0027replicas\u0027: 1}, {\u0027replicas\u0027: 4}, {\u0027replicas\u0027: 8}, {\u0027replicas\u0027: 15}])"},{"line_number":1854,"context_line":"class TestReplicatedObjControllerVariousReplicas(CommonObjectControllerMixin,"},{"line_number":1855,"context_line":"                                                 unittest.TestCase):"},{"line_number":1856,"context_line":"    controller_cls \u003d obj.ReplicatedObjectController"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_17dda513","line":1853,"updated":"2019-03-07 21:02:44.000000000","message":"Why move from 5 to 4? Does this materially affect any other tests? Why can\u0027t we just fix up the response codes to match a 5-replica policy?","commit_id":"b0f03aeda8bea8ff96fdadfedd23313edd7c339b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a890339305566e4d8de2dd0b5b047d145e3a41a2","unresolved":false,"context_lines":[{"line_number":1850,"context_line":"     StoragePolicy(2, \u00278-replica\u0027, False),"},{"line_number":1851,"context_line":"     StoragePolicy(3, \u002715-replica\u0027, False)],"},{"line_number":1852,"context_line":"    fake_ring_args\u003d["},{"line_number":1853,"context_line":"        {\u0027replicas\u0027: 1}, {\u0027replicas\u0027: 4}, {\u0027replicas\u0027: 8}, {\u0027replicas\u0027: 15}])"},{"line_number":1854,"context_line":"class TestReplicatedObjControllerVariousReplicas(CommonObjectControllerMixin,"},{"line_number":1855,"context_line":"                                                 unittest.TestCase):"},{"line_number":1856,"context_line":"    controller_cls \u003d obj.ReplicatedObjectController"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_b27a9f21","line":1853,"in_reply_to":"5fc1f717_17dda513","updated":"2019-03-07 21:45:49.000000000","message":"no i don\u0027t think so, i\u0027m not sure what this case thought it was doing really AFAICT we only ever use policy-0 on all subclasses except in the new test","commit_id":"b0f03aeda8bea8ff96fdadfedd23313edd7c339b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9f21659d7536f0638bedcb8249434b2549754742","unresolved":false,"context_lines":[{"line_number":1861,"context_line":"        policy_conf \u003d self.app.get_policy_options(self.policy)"},{"line_number":1862,"context_line":"        self.app.container_info[\u0027storage_policy\u0027] \u003d policy_index"},{"line_number":1863,"context_line":"        policy_conf.write_affinity_handoff_delete_count \u003d \\"},{"line_number":1864,"context_line":"            self.replicas(self.policy) / 2"},{"line_number":1865,"context_line":"        policy_conf.write_affinity_is_local_fn \u003d ("},{"line_number":1866,"context_line":"            lambda node: node[\u0027region\u0027] \u003d\u003d 1)"},{"line_number":1867,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_579ecd63","line":1864,"updated":"2019-03-07 21:02:44.000000000","message":"Again, // please.","commit_id":"b0f03aeda8bea8ff96fdadfedd23313edd7c339b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a890339305566e4d8de2dd0b5b047d145e3a41a2","unresolved":false,"context_lines":[{"line_number":1861,"context_line":"        policy_conf \u003d self.app.get_policy_options(self.policy)"},{"line_number":1862,"context_line":"        self.app.container_info[\u0027storage_policy\u0027] \u003d policy_index"},{"line_number":1863,"context_line":"        policy_conf.write_affinity_handoff_delete_count \u003d \\"},{"line_number":1864,"context_line":"            self.replicas(self.policy) / 2"},{"line_number":1865,"context_line":"        policy_conf.write_affinity_is_local_fn \u003d ("},{"line_number":1866,"context_line":"            lambda node: node[\u0027region\u0027] \u003d\u003d 1)"},{"line_number":1867,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_72743736","line":1864,"in_reply_to":"5fc1f717_579ecd63","updated":"2019-03-07 21:45:49.000000000","message":"#willfix","commit_id":"b0f03aeda8bea8ff96fdadfedd23313edd7c339b"}]}
