)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"bdf58bcf2ce4c526b5f061da6c33fa34247776c0","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"ProviderTree.get_provider_uuids: Top-down ordering"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It will become important in update_from_provider_tree to be able to walk"},{"line_number":10,"context_line":"the providers in a ProviderTree in a sane and predictable order."},{"line_number":11,"context_line":"Otherwise, when flushing multiple adds/deletes, we will have no reliable"},{"line_number":12,"context_line":"way to avoid creating orphans (which will fail)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f96bb07_4224a7c6","line":9,"range":{"start_line":9,"start_character":28,"end_line":9,"end_character":53},"updated":"2018-01-23 04:01:55.000000000","message":"The function you added in driver\u0027s side is update_provider_tree[1].\nOr, are you talking about another function?\n\n[1] https://review.openstack.org/#/c/521187/29","commit_id":"67d221e97ac5b46b91452bc9028f15c8f6fde376"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"891df11564dfdd7bd2e6a95f5ba5d5c8db932901","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"ProviderTree.get_provider_uuids: Top-down ordering"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It will become important in update_from_provider_tree to be able to walk"},{"line_number":10,"context_line":"the providers in a ProviderTree in a sane and predictable order."},{"line_number":11,"context_line":"Otherwise, when flushing multiple adds/deletes, we will have no reliable"},{"line_number":12,"context_line":"way to avoid creating orphans (which will fail)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f96bb07_3dd2cf5d","line":9,"range":{"start_line":9,"start_character":28,"end_line":9,"end_character":53},"in_reply_to":"7f96bb07_24d088c9","updated":"2018-01-23 13:56:42.000000000","message":"Yes; it\u0027s this patch [1], specifically the algorithms here [2] and here [3].  If you look at the previous rev of that code, you\u0027ll see I was doing it in random order - and that\u0027s when I ran afoul of the issue that prompted this patch.\n\n[1] https://review.openstack.org/#/c/533821/\n[2] https://review.openstack.org/#/c/533821/7/nova/scheduler/client/report.py@1399\n[3] https://review.openstack.org/#/c/533821/7/nova/scheduler/client/report.py@1410","commit_id":"67d221e97ac5b46b91452bc9028f15c8f6fde376"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"a05507cc028d095d9e7a308a12592d3b14d9e7c3","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"ProviderTree.get_provider_uuids: Top-down ordering"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It will become important in update_from_provider_tree to be able to walk"},{"line_number":10,"context_line":"the providers in a ProviderTree in a sane and predictable order."},{"line_number":11,"context_line":"Otherwise, when flushing multiple adds/deletes, we will have no reliable"},{"line_number":12,"context_line":"way to avoid creating orphans (which will fail)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f96bb07_24d088c9","line":9,"range":{"start_line":9,"start_character":28,"end_line":9,"end_character":53},"in_reply_to":"7f96bb07_4224a7c6","updated":"2018-01-23 04:27:53.000000000","message":"Later: This seems another function. Sorry for the noise...","commit_id":"67d221e97ac5b46b91452bc9028f15c8f6fde376"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"0b646f0fad73497b4e03142d71a0b48d816fbdaf","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Here we change ProviderTree.get_provider_uuids from returning a set() to"},{"line_number":15,"context_line":"returning a list which is guaranteed to be in top-down order.  We do not"},{"line_number":16,"context_line":"guarantee the order in which siblings appear, or where nephews appear"},{"line_number":17,"context_line":"relative to their uncles; just that a child will always appear after its"},{"line_number":18,"context_line":"parent (and, by extension, after all its ancestors)."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5f93b717_f0ba8adc","line":16,"range":{"start_line":16,"start_character":55,"end_line":16,"end_character":62},"updated":"2018-01-25 15:00:59.000000000","message":"nieces.","commit_id":"f004ef55d359d10b287e2c3fcbc36364f0d59071"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"0b646f0fad73497b4e03142d71a0b48d816fbdaf","unresolved":false,"context_lines":[{"line_number":14,"context_line":"Here we change ProviderTree.get_provider_uuids from returning a set() to"},{"line_number":15,"context_line":"returning a list which is guaranteed to be in top-down order.  We do not"},{"line_number":16,"context_line":"guarantee the order in which siblings appear, or where nephews appear"},{"line_number":17,"context_line":"relative to their uncles; just that a child will always appear after its"},{"line_number":18,"context_line":"parent (and, by extension, after all its ancestors)."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I2fb691e019177c502ec651390faf3740a2d49045"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5f93b717_70ed1aee","line":17,"range":{"start_line":17,"start_character":18,"end_line":17,"end_character":24},"updated":"2018-01-25 15:00:59.000000000","message":"aunts.","commit_id":"f004ef55d359d10b287e2c3fcbc36364f0d59071"}],"nova/compute/provider_tree.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e7cc14aadec20d7ba75efc61e8d86c18672d2384","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            inventory, traits, aggregates)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def get_provider_uuids(self):"},{"line_number":89,"context_line":"        \"\"\"Returns a list, in top-down traversal order, of UUIDs of this"},{"line_number":90,"context_line":"        provider and all its descendants.\"\"\""},{"line_number":91,"context_line":"        ret \u003d [self.uuid]"},{"line_number":92,"context_line":"        for child in self.children.values():"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_c842e30f","line":89,"range":{"start_line":89,"start_character":21,"end_line":89,"end_character":25},"updated":"2018-01-24 13:24:11.000000000","message":"It is a shame that python does not have an ordered set in the standard lib. There is collections.OrderedDict but that would be overkill here.","commit_id":"67d221e97ac5b46b91452bc9028f15c8f6fde376"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7ce93bfea750566a5a1ffd0d91abed4ea9141142","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            inventory, traits, aggregates)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def get_provider_uuids(self):"},{"line_number":89,"context_line":"        \"\"\"Returns a list, in top-down traversal order, of UUIDs of this"},{"line_number":90,"context_line":"        provider and all its descendants.\"\"\""},{"line_number":91,"context_line":"        ret \u003d [self.uuid]"},{"line_number":92,"context_line":"        for child in self.children.values():"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f93b717_32a49608","line":89,"range":{"start_line":89,"start_character":21,"end_line":89,"end_character":25},"in_reply_to":"7f96bb07_c842e30f","updated":"2018-01-25 00:01:20.000000000","message":"I don\u0027t disagree.  However...\n\nWe *should* never have duplicate UUIDs in the list.  If we do, it means we have cycles or other anomalies, which *should* be impossible to create, at least once things like [1] are tightened up.  And whereas a set would still be useful for O(1) operations, these trees ought to be pretty durn small for the most part.  So meh.\n\n[1] https://review.openstack.org/#/c/531260/12/nova/compute/provider_tree.py","commit_id":"67d221e97ac5b46b91452bc9028f15c8f6fde376"},{"author":{"_account_id":19853,"name":"Nguyen Hung Phuong","email":"phuongnh@vn.fujitsu.com","username":"phuongnh"},"change_message_id":"ef1612e110b6cfe4dc8da6debe95bd8f15f51b05","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def get_provider_uuids(self):"},{"line_number":89,"context_line":"        \"\"\"Returns a list, in top-down traversal order, of UUIDs of this"},{"line_number":90,"context_line":"        provider and all its descendants.\"\"\""},{"line_number":91,"context_line":"        ret \u003d [self.uuid]"},{"line_number":92,"context_line":"        for child in self.children.values():"},{"line_number":93,"context_line":"            ret.extend(child.get_provider_uuids())"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_ecbe0cd3","line":90,"updated":"2018-01-23 01:51:28.000000000","message":"please move (\"\"\") to a new line.","commit_id":"67d221e97ac5b46b91452bc9028f15c8f6fde376"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7ce93bfea750566a5a1ffd0d91abed4ea9141142","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def get_provider_uuids(self):"},{"line_number":89,"context_line":"        \"\"\"Returns a list, in top-down traversal order, of UUIDs of this"},{"line_number":90,"context_line":"        provider and all its descendants.\"\"\""},{"line_number":91,"context_line":"        ret \u003d [self.uuid]"},{"line_number":92,"context_line":"        for child in self.children.values():"},{"line_number":93,"context_line":"            ret.extend(child.get_provider_uuids())"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f93b717_b23426e0","line":90,"in_reply_to":"7f96bb07_ecbe0cd3","updated":"2018-01-25 00:01:20.000000000","message":"Done","commit_id":"67d221e97ac5b46b91452bc9028f15c8f6fde376"}],"nova/tests/unit/compute/test_provider_tree.py":[{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"341e1ea989195f58d2421ee4fef0ca9416223157","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        self.assertEqual([cn1.uuid],"},{"line_number":55,"context_line":"                         pt.get_provider_uuids(name_or_uuid\u003dcn1.uuid))"},{"line_number":56,"context_line":"        self.assertEqual([cn1.uuid, cn2.uuid], pt.get_provider_uuids())"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        numa_cell0_uuid \u003d pt.new_child(\u0027numa_cell0\u0027, cn1.uuid)"},{"line_number":59,"context_line":"        numa_cell1_uuid \u003d pt.new_child(\u0027numa_cell1\u0027, cn1.uuid)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f93b717_eb4b90ad","line":56,"range":{"start_line":56,"start_character":25,"end_line":56,"end_character":70},"updated":"2018-01-25 01:04:11.000000000","message":"nit: we can guarantee the order here, just because we initialized the provider_tree in this order @L39 and @L32, so intrinsically we don\u0027t have to guarantee the order here, right?","commit_id":"89f5eecba2445f52ce6b7346761ead508b9433b8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"054ab798d3eb47288f03af2b58e0ffdcabe3c3eb","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        self.assertEqual([cn1.uuid],"},{"line_number":55,"context_line":"                         pt.get_provider_uuids(name_or_uuid\u003dcn1.uuid))"},{"line_number":56,"context_line":"        self.assertEqual([cn1.uuid, cn2.uuid], pt.get_provider_uuids())"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        numa_cell0_uuid \u003d pt.new_child(\u0027numa_cell0\u0027, cn1.uuid)"},{"line_number":59,"context_line":"        numa_cell1_uuid \u003d pt.new_child(\u0027numa_cell1\u0027, cn1.uuid)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f93b717_cbd7b323","line":56,"range":{"start_line":56,"start_character":25,"end_line":56,"end_character":70},"in_reply_to":"5f93b717_eb4b90ad","updated":"2018-01-25 01:40:37.000000000","message":"No, actually we can\u0027t guarantee the order here.  This could fail intermittently.  I should fix it.","commit_id":"89f5eecba2445f52ce6b7346761ead508b9433b8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"0b646f0fad73497b4e03142d71a0b48d816fbdaf","unresolved":false,"context_lines":[{"line_number":322,"context_line":"        for desc in (uuids.grandchild1_1, uuids.grandchild1_2):"},{"line_number":323,"context_line":"            self.assertTrue(puuids.index(desc) \u003e puuids.index(uuids.child1))"},{"line_number":324,"context_line":"        for desc in (uuids.ggc1_2_1, uuids.ggc1_2_2, uuids.ggc1_2_3):"},{"line_number":325,"context_line":"            self.assertTrue("},{"line_number":326,"context_line":"                puuids.index(desc) \u003e puuids.index(uuids.grandchild1_2))"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    def test_populate_from_iterable_with_root_update(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f93b717_30947237","line":325,"range":{"start_line":325,"start_character":17,"end_line":325,"end_character":27},"updated":"2018-01-25 15:00:59.000000000","message":"note there\u0027s an assertGreater()\n\nhttps://docs.python.org/2/library/unittest.html#unittest.TestCase.assertGreater","commit_id":"f004ef55d359d10b287e2c3fcbc36364f0d59071"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c8670728ebf11f4ff670ab20f77929ee5642f5d0","unresolved":false,"context_lines":[{"line_number":322,"context_line":"        for desc in (uuids.grandchild1_1, uuids.grandchild1_2):"},{"line_number":323,"context_line":"            self.assertTrue(puuids.index(desc) \u003e puuids.index(uuids.child1))"},{"line_number":324,"context_line":"        for desc in (uuids.ggc1_2_1, uuids.ggc1_2_2, uuids.ggc1_2_3):"},{"line_number":325,"context_line":"            self.assertTrue("},{"line_number":326,"context_line":"                puuids.index(desc) \u003e puuids.index(uuids.grandchild1_2))"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    def test_populate_from_iterable_with_root_update(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f93b717_15e54da8","line":325,"range":{"start_line":325,"start_character":17,"end_line":325,"end_character":27},"in_reply_to":"5f93b717_30947237","updated":"2018-01-30 00:11:05.000000000","message":"Done in https://review.openstack.org/#/c/531260/","commit_id":"f004ef55d359d10b287e2c3fcbc36364f0d59071"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"0b646f0fad73497b4e03142d71a0b48d816fbdaf","unresolved":false,"context_lines":[{"line_number":323,"context_line":"            self.assertTrue(puuids.index(desc) \u003e puuids.index(uuids.child1))"},{"line_number":324,"context_line":"        for desc in (uuids.ggc1_2_1, uuids.ggc1_2_2, uuids.ggc1_2_3):"},{"line_number":325,"context_line":"            self.assertTrue("},{"line_number":326,"context_line":"                puuids.index(desc) \u003e puuids.index(uuids.grandchild1_2))"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    def test_populate_from_iterable_with_root_update(self):"},{"line_number":329,"context_line":"        # Ensure we can update hierarchies, including adding children, in a"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f93b717_308f922b","line":326,"updated":"2018-01-25 15:00:59.000000000","message":"ack. good test.","commit_id":"f004ef55d359d10b287e2c3fcbc36364f0d59071"}]}
