)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d23876211b20f8441802cbb56fb0cebfbcb3d18f","unresolved":false,"context_lines":[{"line_number":10,"context_line":"to the migrations table in the cell database and"},{"line_number":11,"context_line":"corresponding field in the Migrations versioned"},{"line_number":12,"context_line":"object. This will be used to track cross-cell"},{"line_number":13,"context_line":"resize operations. Also, a Migration.get_by_uuid()"},{"line_number":14,"context_line":"method is added to the versioned object because"},{"line_number":15,"context_line":"while doing a cross-cell resize, we will need to"},{"line_number":16,"context_line":"be able to lookup a migration record via its uuid"},{"line_number":17,"context_line":"which will be unique across cell databases, unlike"},{"line_number":18,"context_line":"its id value which is specific to each cell database."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Part of blueprint cross-cell-resize"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f79a3b5_689a84c4","line":18,"range":{"start_line":13,"start_character":18,"end_line":18,"end_character":53},"updated":"2018-11-07 14:16:32.000000000","message":"or... we could consider putting the migrations table in the top-level API database. Either way, ++ on referencing everything by UUID instead of internal integer ID.","commit_id":"06a9b42397f8d79d041f20d945453fe00f65749c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7bcd8c3ce5edf50233e79b4faa6241fbe94ba8a1","unresolved":false,"context_lines":[{"line_number":10,"context_line":"to the migrations table in the cell database and"},{"line_number":11,"context_line":"corresponding field in the Migrations versioned"},{"line_number":12,"context_line":"object. This will be used to track cross-cell"},{"line_number":13,"context_line":"resize operations. Also, a Migration.get_by_uuid()"},{"line_number":14,"context_line":"method is added to the versioned object because"},{"line_number":15,"context_line":"while doing a cross-cell resize, we will need to"},{"line_number":16,"context_line":"be able to lookup a migration record via its uuid"},{"line_number":17,"context_line":"which will be unique across cell databases, unlike"},{"line_number":18,"context_line":"its id value which is specific to each cell database."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Part of blueprint cross-cell-resize"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f79a3b5_289a4c11","line":18,"range":{"start_line":13,"start_character":18,"end_line":18,"end_character":53},"in_reply_to":"3f79a3b5_689a84c4","updated":"2018-11-07 14:43:27.000000000","message":"\u003e or... we could consider putting the migrations table in the top-level API database.\n\nMigrations are per-instance so they belong in the cell DB with the instance IMO. Plus moving migrations to the API at this point would be a huge change.","commit_id":"06a9b42397f8d79d041f20d945453fe00f65749c"}],"nova/db/sqlalchemy/models.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d23876211b20f8441802cbb56fb0cebfbcb3d18f","unresolved":false,"context_lines":[{"line_number":791,"context_line":"    disk_total \u003d Column(BigInteger, nullable\u003dTrue)"},{"line_number":792,"context_line":"    disk_processed \u003d Column(BigInteger, nullable\u003dTrue)"},{"line_number":793,"context_line":"    disk_remaining \u003d Column(BigInteger, nullable\u003dTrue)"},{"line_number":794,"context_line":"    cross_cell_move \u003d Column(Boolean, default\u003dFalse)"},{"line_number":795,"context_line":""},{"line_number":796,"context_line":"    instance \u003d orm.relationship(\"Instance\", foreign_keys\u003dinstance_uuid,"},{"line_number":797,"context_line":"                            primaryjoin\u003d\u0027and_(Migration.instance_uuid \u003d\u003d \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_48e3083b","line":794,"updated":"2018-11-07 14:16:32.000000000","message":"Instead of a boolean cross_cell_move column, how about adding two new fields called source_cell_uuid and dest_cell_uuid? That would align a whole lot better with the existing source_compute/source_node and dest_compute/dest_node fields we currently have in here.","commit_id":"06a9b42397f8d79d041f20d945453fe00f65749c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7bcd8c3ce5edf50233e79b4faa6241fbe94ba8a1","unresolved":false,"context_lines":[{"line_number":791,"context_line":"    disk_total \u003d Column(BigInteger, nullable\u003dTrue)"},{"line_number":792,"context_line":"    disk_processed \u003d Column(BigInteger, nullable\u003dTrue)"},{"line_number":793,"context_line":"    disk_remaining \u003d Column(BigInteger, nullable\u003dTrue)"},{"line_number":794,"context_line":"    cross_cell_move \u003d Column(Boolean, default\u003dFalse)"},{"line_number":795,"context_line":""},{"line_number":796,"context_line":"    instance \u003d orm.relationship(\"Instance\", foreign_keys\u003dinstance_uuid,"},{"line_number":797,"context_line":"                            primaryjoin\u003d\u0027and_(Migration.instance_uuid \u003d\u003d \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_88f3606e","line":794,"in_reply_to":"3f79a3b5_48e3083b","updated":"2018-11-07 14:43:27.000000000","message":"We could, I was just able to get by with the source_compute to look up the source cell mapping via the host mapping for the source compute:\n\nhttps://review.openstack.org/#/c/603930/15/nova/conductor/tasks/cross_cell_migrate.py@871\n\nIt\u0027s not a huge deal to me either way. Using the cross_cell_move flag is nice in the compute/RT code where I need to determine what\u0027s going on, but that could also just be a property on the Migration object which returns True if those other fields are set.","commit_id":"06a9b42397f8d79d041f20d945453fe00f65749c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9cc52be22d85ef861eadec41b1bd325752bbbe16","unresolved":false,"context_lines":[{"line_number":791,"context_line":"    disk_total \u003d Column(BigInteger, nullable\u003dTrue)"},{"line_number":792,"context_line":"    disk_processed \u003d Column(BigInteger, nullable\u003dTrue)"},{"line_number":793,"context_line":"    disk_remaining \u003d Column(BigInteger, nullable\u003dTrue)"},{"line_number":794,"context_line":"    cross_cell_move \u003d Column(Boolean, default\u003dFalse)"},{"line_number":795,"context_line":""},{"line_number":796,"context_line":"    instance \u003d orm.relationship(\"Instance\", foreign_keys\u003dinstance_uuid,"},{"line_number":797,"context_line":"                            primaryjoin\u003d\u0027and_(Migration.instance_uuid \u003d\u003d \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_1f64e8b3","line":794,"in_reply_to":"3f79a3b5_4dc07d4c","updated":"2018-11-30 17:10:35.000000000","message":"\u003e FWIW, I think it\u0027d potentially be worth just checking this each time instead of storing it, if that would be possible and not too wasteful. I\u0027m not sure where all this is checked (and how often), but we have the source and dest hosts, which means we should be able to (a) determine if they\u0027re in the same cell from the top, and (b) check to see if either is \"in my cell or not\" from the bottom.\n\nIt\u0027s used in a few places, both in the API and compute layers. You\u0027d probably have to pull down https://review.openstack.org/#/c/603930/ and grep for it.","commit_id":"06a9b42397f8d79d041f20d945453fe00f65749c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8d5b03c21c9d8414367c58ba2f324cb13d541bfd","unresolved":false,"context_lines":[{"line_number":791,"context_line":"    disk_total \u003d Column(BigInteger, nullable\u003dTrue)"},{"line_number":792,"context_line":"    disk_processed \u003d Column(BigInteger, nullable\u003dTrue)"},{"line_number":793,"context_line":"    disk_remaining \u003d Column(BigInteger, nullable\u003dTrue)"},{"line_number":794,"context_line":"    cross_cell_move \u003d Column(Boolean, default\u003dFalse)"},{"line_number":795,"context_line":""},{"line_number":796,"context_line":"    instance \u003d orm.relationship(\"Instance\", foreign_keys\u003dinstance_uuid,"},{"line_number":797,"context_line":"                            primaryjoin\u003d\u0027and_(Migration.instance_uuid \u003d\u003d \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_4dc07d4c","line":794,"in_reply_to":"3f79a3b5_88f3606e","updated":"2018-11-30 16:33:37.000000000","message":"So I was about to say something like \"storing a boolean seems wasteful when we could store something useful and imply the boolean\". I still feel that way. However, I really don\u0027t want the cells to know anything about their ... cell, and since the migration is stored in the cell DB, this would be such a violation. So, while I don\u0027t love storing a boolean as I think it\u0027s too specific and likely to be \"not enough\" some time later, I\u0027d prefer it over violating the layers.\n\nFWIW, I think it\u0027d potentially be worth just checking this each time instead of storing it, if that would be possible and not too wasteful. I\u0027m not sure where all this is checked (and how often), but we have the source and dest hosts, which means we should be able to (a) determine if they\u0027re in the same cell from the top, and (b) check to see if either is \"in my cell or not\" from the bottom.","commit_id":"06a9b42397f8d79d041f20d945453fe00f65749c"}],"nova/objects/migration.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f4db64109422cefcb43290919ded4e94d8559aee","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            self.migration_type \u003d determine_migration_type(self)"},{"line_number":113,"context_line":"        elif attrname \u003d\u003d \u0027hidden\u0027:"},{"line_number":114,"context_line":"            self.hidden \u003d False"},{"line_number":115,"context_line":"        else:"},{"line_number":116,"context_line":"            super(Migration, self).obj_load_attr(attrname)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _ensure_uuid(self):"}],"source_content_type":"text/x-python","patch_set":35,"id":"bfb3d3c7_834d3b3f","line":115,"updated":"2019-05-30 15:22:17.000000000","message":"do we need to add cross_cell_move here to default it to False like hidden?","commit_id":"befc7ef80c6d9b110341622c1fb57367b9a444d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e7512263cfd601ad0946bcd8d20b9e93a991d9ba","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            self.migration_type \u003d determine_migration_type(self)"},{"line_number":113,"context_line":"        elif attrname \u003d\u003d \u0027hidden\u0027:"},{"line_number":114,"context_line":"            self.hidden \u003d False"},{"line_number":115,"context_line":"        else:"},{"line_number":116,"context_line":"            super(Migration, self).obj_load_attr(attrname)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _ensure_uuid(self):"}],"source_content_type":"text/x-python","patch_set":35,"id":"9fb8cfa7_6c08f827","line":115,"in_reply_to":"9fb8cfa7_9fd23934","updated":"2019-06-03 19:20:04.000000000","message":"Done: https://review.opendev.org/662833","commit_id":"befc7ef80c6d9b110341622c1fb57367b9a444d4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"eb8c2b44ee5659a2ba1e6bd79dcb62b8114d9a82","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            self.migration_type \u003d determine_migration_type(self)"},{"line_number":113,"context_line":"        elif attrname \u003d\u003d \u0027hidden\u0027:"},{"line_number":114,"context_line":"            self.hidden \u003d False"},{"line_number":115,"context_line":"        else:"},{"line_number":116,"context_line":"            super(Migration, self).obj_load_attr(attrname)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _ensure_uuid(self):"}],"source_content_type":"text/x-python","patch_set":35,"id":"9fb8cfa7_9fd23934","line":115,"in_reply_to":"bfb3d3c7_48e509db","updated":"2019-06-03 09:07:37.000000000","message":"Follow up works for me.","commit_id":"befc7ef80c6d9b110341622c1fb57367b9a444d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"292568a7d17ddb7bf629af433bcc1a0b9fee8503","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            self.migration_type \u003d determine_migration_type(self)"},{"line_number":113,"context_line":"        elif attrname \u003d\u003d \u0027hidden\u0027:"},{"line_number":114,"context_line":"            self.hidden \u003d False"},{"line_number":115,"context_line":"        else:"},{"line_number":116,"context_line":"            super(Migration, self).obj_load_attr(attrname)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _ensure_uuid(self):"}],"source_content_type":"text/x-python","patch_set":35,"id":"bfb3d3c7_48e509db","line":115,"in_reply_to":"bfb3d3c7_834d3b3f","updated":"2019-05-31 14:32:12.000000000","message":"Hmm, yeah I suppose I could and just call obj_set_defaults. I\u0027d prefer to tack that on with a follow up though so I don\u0027t have to rebase the series for it.","commit_id":"befc7ef80c6d9b110341622c1fb57367b9a444d4"}],"nova/tests/unit/objects/test_migration.py":[{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b16600b73cbdb9ff055d0c5273f8b115efd36419","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        data \u003d lambda x: x[\u0027nova_object.data\u0027]"},{"line_number":301,"context_line":"        primitive \u003d data(mig.obj_to_primitive(target_version\u003d\u00271.5\u0027))"},{"line_number":302,"context_line":"        self.assertIn(\u0027uuid\u0027, primitive)"},{"line_number":303,"context_line":"        self.assertNotIn(\u0027cross_cell_resize\u0027, primitive)"},{"line_number":304,"context_line":"        primitive \u003d data(mig.obj_to_primitive(target_version\u003d\u00271.4\u0027))"},{"line_number":305,"context_line":"        self.assertIn(\u0027memory_total\u0027, primitive)"},{"line_number":306,"context_line":"        self.assertNotIn(\u0027uuid\u0027, primitive)"}],"source_content_type":"text/x-python","patch_set":37,"id":"7faddb67_2405a710","line":303,"range":{"start_line":303,"start_character":26,"end_line":303,"end_character":43},"updated":"2019-08-01 08:49:24.000000000","message":"I think this column is \u0027cross_cell_move\u0027 not \u0027cross_cell_resize\u0027, beacuse \u0027cross_cell_resize\u0027 not a column in the migrations table.","commit_id":"1cf3da87027d87251920c2df665b850abb31178e"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"cd708f39c37f59eb201671fb19d25f6ce1e68470","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        data \u003d lambda x: x[\u0027nova_object.data\u0027]"},{"line_number":301,"context_line":"        primitive \u003d data(mig.obj_to_primitive(target_version\u003d\u00271.5\u0027))"},{"line_number":302,"context_line":"        self.assertIn(\u0027uuid\u0027, primitive)"},{"line_number":303,"context_line":"        self.assertNotIn(\u0027cross_cell_resize\u0027, primitive)"},{"line_number":304,"context_line":"        primitive \u003d data(mig.obj_to_primitive(target_version\u003d\u00271.4\u0027))"},{"line_number":305,"context_line":"        self.assertIn(\u0027memory_total\u0027, primitive)"},{"line_number":306,"context_line":"        self.assertNotIn(\u0027uuid\u0027, primitive)"}],"source_content_type":"text/x-python","patch_set":37,"id":"7faddb67_d77d671c","line":303,"range":{"start_line":303,"start_character":26,"end_line":303,"end_character":43},"in_reply_to":"7faddb67_2405a710","updated":"2019-08-01 08:58:38.000000000","message":"I was pushed a fix patch, see: https://review.opendev.org/#/c/673961/","commit_id":"1cf3da87027d87251920c2df665b850abb31178e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a3a229844131497b8f3672237c64e0776c157a09","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        data \u003d lambda x: x[\u0027nova_object.data\u0027]"},{"line_number":301,"context_line":"        primitive \u003d data(mig.obj_to_primitive(target_version\u003d\u00271.5\u0027))"},{"line_number":302,"context_line":"        self.assertIn(\u0027uuid\u0027, primitive)"},{"line_number":303,"context_line":"        self.assertNotIn(\u0027cross_cell_resize\u0027, primitive)"},{"line_number":304,"context_line":"        primitive \u003d data(mig.obj_to_primitive(target_version\u003d\u00271.4\u0027))"},{"line_number":305,"context_line":"        self.assertIn(\u0027memory_total\u0027, primitive)"},{"line_number":306,"context_line":"        self.assertNotIn(\u0027uuid\u0027, primitive)"}],"source_content_type":"text/x-python","patch_set":37,"id":"7faddb67_c40a7a24","line":303,"range":{"start_line":303,"start_character":26,"end_line":303,"end_character":43},"in_reply_to":"7faddb67_d77d671c","updated":"2019-08-02 13:35:59.000000000","message":"Thanks for catching and fixing this.","commit_id":"1cf3da87027d87251920c2df665b850abb31178e"}]}
