)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8b2beddcb892669dcf2d3953d98f654b589a23ea","unresolved":false,"context_lines":[{"line_number":9,"context_line":"We started storing NUMA information as objects in the database in Kilo"},{"line_number":10,"context_line":"(commit bb3202f8594). Prior to this, we had stored this NUMA information"},{"line_number":11,"context_line":"as a plain old dict. To facilitate the transition, we provided some"},{"line_number":12,"context_line":"handlers based on these \u0027_from_dict\u0027 functions. There were used to"},{"line_number":13,"context_line":"ensure we could load old-style entries, converting them to objects which"},{"line_number":14,"context_line":"we could later save back to the database."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"7faddb67_b8a748bc","line":12,"range":{"start_line":12,"start_character":48,"end_line":12,"end_character":53},"updated":"2019-08-20 21:23:04.000000000","message":"They/These","commit_id":"0e0f8ccfb4c0b7022b3b1f32911165886b56f1ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e4802cdf27b9d928e2eb4570363533ab0a66d670","unresolved":false,"context_lines":[{"line_number":9,"context_line":"We started storing NUMA information as objects in the database in Kilo"},{"line_number":10,"context_line":"(commit bb3202f8594). Prior to this, we had stored this NUMA information"},{"line_number":11,"context_line":"as a plain old dict. To facilitate the transition, we provided some"},{"line_number":12,"context_line":"handlers based on these \u0027_from_dict\u0027 functions. There were used to"},{"line_number":13,"context_line":"ensure we could load old-style entries, converting them to objects which"},{"line_number":14,"context_line":"we could later save back to the database."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"7faddb67_9ed23cd1","line":12,"range":{"start_line":12,"start_character":48,"end_line":12,"end_character":53},"in_reply_to":"7faddb67_b8a748bc","updated":"2019-08-23 10:47:36.000000000","message":"Missed this. Will catch next time I need to respin","commit_id":"0e0f8ccfb4c0b7022b3b1f32911165886b56f1ae"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ae804d6307ccf35f7277a36d40e5804b4993747c","unresolved":false,"context_lines":[{"line_number":13,"context_line":"ensure we could load old-style entries, converting them to objects which"},{"line_number":14,"context_line":"we could later save back to the database."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"It\u0027s been over four years (three since Kilo went EOL) and eight (nearly"},{"line_number":17,"context_line":"nine) releases, meaning its time that to drop this code. At this point,"},{"line_number":18,"context_line":"the only thing that could hurt us is attempting to do something with a"},{"line_number":19,"context_line":"NUMA-based instance that hasn\u0027t been touched since they were first"},{"line_number":20,"context_line":"booted on a Kilo or earlier host.  Such instances are unlikely to still"},{"line_number":21,"context_line":"exist, especially when our poor upgrade support back in the day is"},{"line_number":22,"context_line":"considered, and if they do, its unlikely that someone would want to do"},{"line_number":23,"context_line":"it now but not four years ago. Drop the functions and rework some"},{"line_number":24,"context_line":"related code that was handling these old object types. The few"},{"line_number":25,"context_line":"\u0027obj_from_db_obj\u0027 functions we have are also documented. These are still"},{"line_number":26,"context_line":"needed due to the fact that \u0027ComputeNode.numa_topology\u0027 is a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"7faddb67_35849ad3","line":23,"range":{"start_line":16,"start_character":0,"end_line":23,"end_character":30},"updated":"2019-08-22 13:42:09.000000000","message":"Maybe, but we don\u0027t know, and it\u0027s a big world out there with people that have lots of pets they don\u0027t like to touch, so this kind of logic isn\u0027t really something we should consider OK when we have mechanisms in place to detect and move the data forward, like the online_data_migrations CLI. If all you\u0027d need to do is query the cell db for a certain format, and if found run it through the object and save it back, then that seems pretty easy and avoids breaking someone on upgrade.","commit_id":"0e0f8ccfb4c0b7022b3b1f32911165886b56f1ae"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b64f347e53db842cdeb8b880d71c3e9a735a5dcc","unresolved":false,"context_lines":[{"line_number":17,"context_line":"nine) releases, meaning its time that to drop this code. At this point,"},{"line_number":18,"context_line":"the only thing that could hurt us is attempting to do something with a"},{"line_number":19,"context_line":"NUMA-based instance that hasn\u0027t been touched since they were first"},{"line_number":20,"context_line":"booted on a Kilo or earlier host.  Such instances are unlikely to still"},{"line_number":21,"context_line":"exist, especially when our poor upgrade support back in the day is"},{"line_number":22,"context_line":"considered, and if they do, its unlikely that someone would want to do"},{"line_number":23,"context_line":"it now but not four years ago. Drop the functions and rework some"},{"line_number":24,"context_line":"related code that was handling these old object types. The few"},{"line_number":25,"context_line":"\u0027obj_from_db_obj\u0027 functions we have are also documented. These are still"},{"line_number":26,"context_line":"needed due to the fact that \u0027ComputeNode.numa_topology\u0027 is a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"7faddb67_f54e02c1","line":23,"range":{"start_line":20,"start_character":35,"end_line":23,"end_character":30},"updated":"2019-08-22 13:42:43.000000000","message":"Um, what? I think our upgrades were likely better back then :)\n\nIMHO, it\u0027s not okay to make this change until you\u0027ve put an online migration into place for a while. Technically a blocker migration would be called for here, but it would be kind of expensive since it needs to do an in-text-field search.","commit_id":"0e0f8ccfb4c0b7022b3b1f32911165886b56f1ae"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"42e94591c0b77265d24516c73c610da0ebc6c4c9","unresolved":false,"context_lines":[{"line_number":13,"context_line":"ensure we could load old-style entries, converting them to objects which"},{"line_number":14,"context_line":"we could later save back to the database."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"It\u0027s been over four years (three since Kilo went EOL) and eight (nearly"},{"line_number":17,"context_line":"nine) releases, meaning its time that to drop this code. At this point,"},{"line_number":18,"context_line":"the only thing that could hurt us is attempting to do something with a"},{"line_number":19,"context_line":"NUMA-based instance that hasn\u0027t been touched since they were first"},{"line_number":20,"context_line":"booted on a Kilo or earlier host.  Such instances are unlikely to still"},{"line_number":21,"context_line":"exist, especially when our poor upgrade support back in the day is"},{"line_number":22,"context_line":"considered, and if they do, its unlikely that someone would want to do"},{"line_number":23,"context_line":"it now but not four years ago. Drop the functions and rework some"},{"line_number":24,"context_line":"related code that was handling these old object types. The few"},{"line_number":25,"context_line":"\u0027obj_from_db_obj\u0027 functions we have are also documented. These are still"},{"line_number":26,"context_line":"needed due to the fact that \u0027ComputeNode.numa_topology\u0027 is a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"7faddb67_f56fe2f7","line":23,"range":{"start_line":16,"start_character":0,"end_line":23,"end_character":30},"in_reply_to":"7faddb67_35849ad3","updated":"2019-08-22 13:49:00.000000000","message":"\u003e so this kind of logic isn\u0027t really something we should consider OK when we have mechanisms in place to detect and move the data forward, like the online_data_migrations CLI.\n\nRight. It\u0027s also not okay because people may be doing an FFU to blow past a bunch of runtime code, everything looked good (i.e. no complaints) and yet for some reason all of one kind of their instances are crashing on load without so much as an exception handler to explain why.","commit_id":"0e0f8ccfb4c0b7022b3b1f32911165886b56f1ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e4802cdf27b9d928e2eb4570363533ab0a66d670","unresolved":false,"context_lines":[{"line_number":13,"context_line":"ensure we could load old-style entries, converting them to objects which"},{"line_number":14,"context_line":"we could later save back to the database."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"It\u0027s been over four years (three since Kilo went EOL) and eight (nearly"},{"line_number":17,"context_line":"nine) releases, meaning its time that to drop this code. At this point,"},{"line_number":18,"context_line":"the only thing that could hurt us is attempting to do something with a"},{"line_number":19,"context_line":"NUMA-based instance that hasn\u0027t been touched since they were first"},{"line_number":20,"context_line":"booted on a Kilo or earlier host.  Such instances are unlikely to still"},{"line_number":21,"context_line":"exist, especially when our poor upgrade support back in the day is"},{"line_number":22,"context_line":"considered, and if they do, its unlikely that someone would want to do"},{"line_number":23,"context_line":"it now but not four years ago. Drop the functions and rework some"},{"line_number":24,"context_line":"related code that was handling these old object types. The few"},{"line_number":25,"context_line":"\u0027obj_from_db_obj\u0027 functions we have are also documented. These are still"},{"line_number":26,"context_line":"needed due to the fact that \u0027ComputeNode.numa_topology\u0027 is a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"7faddb67_9e5d5c7b","line":23,"range":{"start_line":16,"start_character":0,"end_line":23,"end_character":30},"in_reply_to":"7faddb67_f56fe2f7","updated":"2019-08-23 10:47:36.000000000","message":"Done","commit_id":"0e0f8ccfb4c0b7022b3b1f32911165886b56f1ae"}],"nova/cmd/manage.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5f175df519b193599c8c48b6411b30ebaa555b11","unresolved":false,"context_lines":[{"line_number":694,"context_line":"                exceptions \u003d True"},{"line_number":695,"context_line":"                found \u003d done \u003d 0"},{"line_number":696,"context_line":""},{"line_number":697,"context_line":"            name \u003d migration_meth.__name__"},{"line_number":698,"context_line":"            if found:"},{"line_number":699,"context_line":"                print(_(\u0027%(total)i rows matched query %(meth)s, %(done)i \u0027"},{"line_number":700,"context_line":"                        \u0027migrated\u0027) % {\u0027total\u0027: found,"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_f1fb2445","line":697,"updated":"2019-08-27 21:25:00.000000000","message":"Because of this you need to use a unique name for the online_migrations method names, as seen in the grenade log:\n\nhttps://27e0ec13f61534c7c398-0b8936c820696cdb6c8467dc1e642b32.ssl.cf5.rackcdn.com/537414/19/check/grenade-py3/cf91683/logs/grenade.sh.txt.gz\n\nIt only shows up once:\n\n2019-08-27 17:34:24.514 | +-------------------------------------+--------------+-----------+\n2019-08-27 17:34:24.514 | |              Migration              | Total Needed | Completed |\n2019-08-27 17:34:24.514 | +-------------------------------------+--------------+-----------+\n2019-08-27 17:34:24.514 | |     fill_virtual_interface_list     |      2       |     0     |\n2019-08-27 17:34:24.514 | |         migrate_empty_ratio         |      0       |     0     |\n2019-08-27 17:34:24.514 | |     migrate_legacy_numa_topology    |      0       |     0     |\n2019-08-27 17:34:24.514 | |   migrate_quota_classes_to_api_db   |      0       |     0     |\n2019-08-27 17:34:24.514 | |    migrate_quota_limits_to_api_db   |      0       |     0     |\n2019-08-27 17:34:24.514 | |      migration_migrate_to_uuid      |      0       |     0     |\n2019-08-27 17:34:24.514 | | populate_missing_availability_zones |      0       |     0     |\n2019-08-27 17:34:24.514 | |      populate_queued_for_delete     |      0       |     0     |\n2019-08-27 17:34:24.514 | |           populate_user_id          |      0       |     0     |\n2019-08-27 17:34:24.514 | |            populate_uuids           |      0       |     0     |\n2019-08-27 17:34:24.514 | | service_uuids_online_data_migration |      0       |     0     |\n2019-08-27 17:34:24.514 | +-------------------------------------+--------------+-----------+","commit_id":"6953b2562d44282692088881ab755ea4e4306020"}],"nova/objects/compute_node.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6e4beaaf650dd8e8620019e85dd18d8ab437bf9f","unresolved":false,"context_lines":[{"line_number":549,"context_line":"                mempages\u003d[],"},{"line_number":550,"context_line":"                pinned_cpus\u003dset(),"},{"line_number":551,"context_line":"                siblings\u003d[])"},{"line_number":552,"context_line":"            cells.append(cell_obj)"},{"line_number":553,"context_line":""},{"line_number":554,"context_line":"        topology \u003d objects.NUMATopology(cells\u003dcells)"},{"line_number":555,"context_line":"        compute_node.numa_topology \u003d topology._to_json()"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_50997ace","line":552,"updated":"2020-04-03 15:17:42.000000000","message":"Typically when we do these for things that can also migrate on lazy-load we use the lazy-load routines themselves here instead of replicating it. Why is this not doing that? Like, we\u0027ll have something like:\n\n things \u003d list_things_to_convert()\n for thing in things:\n     obj \u003d load_thing()\n     obj.save()\n\nThat also helps to make sure we\u0027re not migrating things slightly differently here vs. on lazy load at runtime. Sometimes we *only* migrate things in a migration, but the numa objects can migrate themselves on load. Why not use that pattern here?","commit_id":"f1d061509e6508db81f7b632b23b3be02d9fb5db"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"75ff6a795840c4bb542455ca599603d12f6882c8","unresolved":false,"context_lines":[{"line_number":549,"context_line":"                mempages\u003d[],"},{"line_number":550,"context_line":"                pinned_cpus\u003dset(),"},{"line_number":551,"context_line":"                siblings\u003d[])"},{"line_number":552,"context_line":"            cells.append(cell_obj)"},{"line_number":553,"context_line":""},{"line_number":554,"context_line":"        topology \u003d objects.NUMATopology(cells\u003dcells)"},{"line_number":555,"context_line":"        compute_node.numa_topology \u003d topology._to_json()"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_db5dab49","line":552,"in_reply_to":"df33271e_50997ace","updated":"2020-04-03 16:51:31.000000000","message":"Oh, good idea. Don\u0027t know why I didn\u0027t do that initially.","commit_id":"f1d061509e6508db81f7b632b23b3be02d9fb5db"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6e4beaaf650dd8e8620019e85dd18d8ab437bf9f","unresolved":false,"context_lines":[{"line_number":552,"context_line":"            cells.append(cell_obj)"},{"line_number":553,"context_line":""},{"line_number":554,"context_line":"        topology \u003d objects.NUMATopology(cells\u003dcells)"},{"line_number":555,"context_line":"        compute_node.numa_topology \u003d topology._to_json()"},{"line_number":556,"context_line":"        compute_node.save(context.session)"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":"    found \u003d done \u003d len(compute_nodes)"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_f571a00e","line":555,"range":{"start_line":555,"start_character":46,"end_line":555,"end_character":54},"updated":"2020-04-03 15:17:42.000000000","message":"I really wish this didn\u0027t exist. We\u0027ve had objects in the past that had non-serialized-object to_json type methods. This one is doing the right thing, but I\u0027d really rather this just do the obj_to_primitive() right here to make it clear that we\u0027re getting the properly-serialized version.","commit_id":"f1d061509e6508db81f7b632b23b3be02d9fb5db"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"75ff6a795840c4bb542455ca599603d12f6882c8","unresolved":false,"context_lines":[{"line_number":552,"context_line":"            cells.append(cell_obj)"},{"line_number":553,"context_line":""},{"line_number":554,"context_line":"        topology \u003d objects.NUMATopology(cells\u003dcells)"},{"line_number":555,"context_line":"        compute_node.numa_topology \u003d topology._to_json()"},{"line_number":556,"context_line":"        compute_node.save(context.session)"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":"    found \u003d done \u003d len(compute_nodes)"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_5b187b83","line":555,"range":{"start_line":555,"start_character":46,"end_line":555,"end_character":54},"in_reply_to":"df33271e_f571a00e","updated":"2020-04-03 16:51:31.000000000","message":"Done","commit_id":"f1d061509e6508db81f7b632b23b3be02d9fb5db"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"599ac86bdf873f129b777d7c28d8acd86e7fa550","unresolved":false,"context_lines":[{"line_number":530,"context_line":"    \"\"\"Migrate pre-Liberty NUMA topology values.\"\"\""},{"line_number":531,"context_line":"    compute_nodes \u003d (context.session.query(models.ComputeNode)"},{"line_number":532,"context_line":"        .filter(models.ComputeNode.numa_topology !\u003d null())"},{"line_number":533,"context_line":"        .filter(~models.ComputeNode.numa_topology.contains("},{"line_number":534,"context_line":"            \u0027nova_object.name\u0027))"},{"line_number":535,"context_line":"        .filter(models.ComputeNode.deleted \u003d\u003d 0)"},{"line_number":536,"context_line":"        .limit(count).all())"}],"source_content_type":"text/x-python","patch_set":26,"id":"1f493fa4_6e43566d","line":533,"range":{"start_line":533,"start_character":50,"end_line":533,"end_character":58},"updated":"2020-04-28 15:19:41.000000000","message":"This kind of substring search in SQL is going to be super slow, no? I guess since we\u0027re not expecting thousands of compute nodes, it\u0027s probably not a big deal?","commit_id":"00589bf7743e904664e025ebc035b64d09080e7a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f932f17e49f5e59d25cae6ad77b6c38caa2dc530","unresolved":false,"context_lines":[{"line_number":530,"context_line":"    \"\"\"Migrate pre-Liberty NUMA topology values.\"\"\""},{"line_number":531,"context_line":"    compute_nodes \u003d (context.session.query(models.ComputeNode)"},{"line_number":532,"context_line":"        .filter(models.ComputeNode.numa_topology !\u003d null())"},{"line_number":533,"context_line":"        .filter(~models.ComputeNode.numa_topology.contains("},{"line_number":534,"context_line":"            \u0027nova_object.name\u0027))"},{"line_number":535,"context_line":"        .filter(models.ComputeNode.deleted \u003d\u003d 0)"},{"line_number":536,"context_line":"        .limit(count).all())"}],"source_content_type":"text/x-python","patch_set":26,"id":"1f493fa4_072c35aa","line":533,"range":{"start_line":533,"start_character":50,"end_line":533,"end_character":58},"in_reply_to":"1f493fa4_67ec198f","updated":"2020-04-28 15:56:49.000000000","message":"Yeah - so both .contains() and .startswith() produce LIKE statements AFAICT [1] [2], the difference being the wildcard. And while the latter should be faster [3], I *think* that assumes an index on the column, which we don\u0027t have in this case, right?\n\nI feel like we\u0027re speculating out of ignorance here, I\u0027d like an ORM/SQL expert to set us straight.\n\n[1] https://docs.sqlalchemy.org/en/13/core/sqlelement.html#sqlalchemy.sql.operators.ColumnOperators.contains\n[2] https://docs.sqlalchemy.org/en/13/core/sqlelement.html#sqlalchemy.sql.operators.ColumnOperators.startswith\n[3] https://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning","commit_id":"00589bf7743e904664e025ebc035b64d09080e7a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"648f0b7a0cef83b5e737d0615be32ccf747a3943","unresolved":false,"context_lines":[{"line_number":530,"context_line":"    \"\"\"Migrate pre-Liberty NUMA topology values.\"\"\""},{"line_number":531,"context_line":"    compute_nodes \u003d (context.session.query(models.ComputeNode)"},{"line_number":532,"context_line":"        .filter(models.ComputeNode.numa_topology !\u003d null())"},{"line_number":533,"context_line":"        .filter(~models.ComputeNode.numa_topology.contains("},{"line_number":534,"context_line":"            \u0027nova_object.name\u0027))"},{"line_number":535,"context_line":"        .filter(models.ComputeNode.deleted \u003d\u003d 0)"},{"line_number":536,"context_line":"        .limit(count).all())"}],"source_content_type":"text/x-python","patch_set":26,"id":"1f493fa4_67ec198f","line":533,"range":{"start_line":533,"start_character":50,"end_line":533,"end_character":58},"in_reply_to":"1f493fa4_6e43566d","updated":"2020-04-28 15:52:57.000000000","message":"Fair point. Switched to \u0027startswith\u0027, which seems to perform much better for indexed rows at least [1]\n\n[1] https://stackoverflow.com/q/2481528/","commit_id":"00589bf7743e904664e025ebc035b64d09080e7a"}],"nova/objects/instance.py":[{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"599ac86bdf873f129b777d7c28d8acd86e7fa550","unresolved":false,"context_lines":[{"line_number":1264,"context_line":"    \"\"\"Migrate pre-Liberty NUMA topology values.\"\"\""},{"line_number":1265,"context_line":"    instances \u003d (context.session.query(models.InstanceExtra)"},{"line_number":1266,"context_line":"        .filter(models.InstanceExtra.numa_topology !\u003d null())"},{"line_number":1267,"context_line":"        .filter(~models.InstanceExtra.numa_topology.contains("},{"line_number":1268,"context_line":"            \u0027nova_object.name\u0027))"},{"line_number":1269,"context_line":"        .filter_by(deleted\u003d0)"},{"line_number":1270,"context_line":"        .limit(count).all())"}],"source_content_type":"text/x-python","patch_set":26,"id":"1f493fa4_8e5d0249","line":1267,"range":{"start_line":1267,"start_character":52,"end_line":1267,"end_character":60},"updated":"2020-04-28 15:19:41.000000000","message":"Ditto, re: slowness, except in this case we\u0027re potentially looking at thousands (millions?) of instances...","commit_id":"00589bf7743e904664e025ebc035b64d09080e7a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"648f0b7a0cef83b5e737d0615be32ccf747a3943","unresolved":false,"context_lines":[{"line_number":1264,"context_line":"    \"\"\"Migrate pre-Liberty NUMA topology values.\"\"\""},{"line_number":1265,"context_line":"    instances \u003d (context.session.query(models.InstanceExtra)"},{"line_number":1266,"context_line":"        .filter(models.InstanceExtra.numa_topology !\u003d null())"},{"line_number":1267,"context_line":"        .filter(~models.InstanceExtra.numa_topology.contains("},{"line_number":1268,"context_line":"            \u0027nova_object.name\u0027))"},{"line_number":1269,"context_line":"        .filter_by(deleted\u003d0)"},{"line_number":1270,"context_line":"        .limit(count).all())"}],"source_content_type":"text/x-python","patch_set":26,"id":"1f493fa4_c7040d4d","line":1267,"range":{"start_line":1267,"start_character":52,"end_line":1267,"end_character":60},"in_reply_to":"1f493fa4_8e5d0249","updated":"2020-04-28 15:52:57.000000000","message":"Done","commit_id":"00589bf7743e904664e025ebc035b64d09080e7a"}],"nova/objects/instance_numa.py":[{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"0100ace54b4539bd6bb9fc9f458a1a8292b9ebac","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    @classmethod"},{"line_number":149,"context_line":"    def obj_from_db_obj(cls, instance_uuid, db_obj):"},{"line_number":150,"context_line":"        primitive \u003d jsonutils.loads(db_obj)"},{"line_number":151,"context_line":"        obj_topology \u003d cls.obj_from_primitive(primitive)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        if \u0027nova_object.name\u0027 not in db_obj:"},{"line_number":154,"context_line":"            obj_topology.instance_uuid \u003d instance_uuid"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_7003fdbf","line":151,"updated":"2019-07-22 12:30:53.000000000","message":"What about this?","commit_id":"8b8cd345f3e5bc21560ff3081c8f24e1fc9b8954"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9338f90d0e650c76f817d9413e1708e86ac844e8","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    @classmethod"},{"line_number":149,"context_line":"    def obj_from_db_obj(cls, instance_uuid, db_obj):"},{"line_number":150,"context_line":"        primitive \u003d jsonutils.loads(db_obj)"},{"line_number":151,"context_line":"        obj_topology \u003d cls.obj_from_primitive(primitive)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        if \u0027nova_object.name\u0027 not in db_obj:"},{"line_number":154,"context_line":"            obj_topology.instance_uuid \u003d instance_uuid"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_c5bf7bce","line":151,"in_reply_to":"7faddb67_7003fdbf","updated":"2019-07-23 13:49:00.000000000","message":"Actually, this can go as well. Good spot.","commit_id":"8b8cd345f3e5bc21560ff3081c8f24e1fc9b8954"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8b2beddcb892669dcf2d3953d98f654b589a23ea","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        primitive \u003d jsonutils.loads(db_obj)"},{"line_number":176,"context_line":"        obj_topology \u003d cls.obj_from_primitive(primitive)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        if \u0027nova_object.name\u0027 not in db_obj:"},{"line_number":179,"context_line":"            obj_topology.instance_uuid \u003d instance_uuid"},{"line_number":180,"context_line":"            # No benefit to store a list of changed fields"},{"line_number":181,"context_line":"            obj_topology.obj_reset_changes()"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        return obj_topology"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_384598b4","side":"PARENT","line":181,"range":{"start_line":178,"start_character":0,"end_line":181,"end_character":44},"updated":"2019-08-20 21:23:04.000000000","message":"why can we get rid of this?","commit_id":"e392b0d1b24044f0009465c3c193e2d5d6531552"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f0fb5ecf4b07738f17af770771ed2b5de4225a81","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        primitive \u003d jsonutils.loads(db_obj)"},{"line_number":176,"context_line":"        obj_topology \u003d cls.obj_from_primitive(primitive)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        if \u0027nova_object.name\u0027 not in db_obj:"},{"line_number":179,"context_line":"            obj_topology.instance_uuid \u003d instance_uuid"},{"line_number":180,"context_line":"            # No benefit to store a list of changed fields"},{"line_number":181,"context_line":"            obj_topology.obj_reset_changes()"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        return obj_topology"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_98135e65","side":"PARENT","line":181,"range":{"start_line":178,"start_character":0,"end_line":181,"end_character":44},"in_reply_to":"7faddb67_384598b4","updated":"2019-08-21 14:19:53.000000000","message":"The only reason \u0027nova_object.name\u0027 wouldn\u0027t exist is if this wasn\u0027t a versioned object. As noted in the commit message, we haven\u0027t used non-versioned objects for this since before Mitaka, and, since then, any time we\u0027ve pulled instances from the database we have been converting them to versioned objects (the \u0027_from_dict\u0027 function) and saving them back in the new format. As such, this is a no-op nowadays and has been for some time.","commit_id":"e392b0d1b24044f0009465c3c193e2d5d6531552"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"07d014cbd9634c59f6c109785e817e107f94d748","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        primitive \u003d jsonutils.loads(db_obj)"},{"line_number":176,"context_line":"        obj_topology \u003d cls.obj_from_primitive(primitive)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        if \u0027nova_object.name\u0027 not in db_obj:"},{"line_number":179,"context_line":"            obj_topology.instance_uuid \u003d instance_uuid"},{"line_number":180,"context_line":"            # No benefit to store a list of changed fields"},{"line_number":181,"context_line":"            obj_topology.obj_reset_changes()"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        return obj_topology"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_b3319b0d","side":"PARENT","line":181,"range":{"start_line":178,"start_character":0,"end_line":181,"end_character":44},"in_reply_to":"7faddb67_98135e65","updated":"2019-08-21 14:40:19.000000000","message":"ack, thanks","commit_id":"e392b0d1b24044f0009465c3c193e2d5d6531552"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7db95ba1a0b5839905cdc72d597dea328d306e80","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        primitive \u003d jsonutils.loads(db_obj)"},{"line_number":176,"context_line":"        obj_topology \u003d cls.obj_from_primitive(primitive)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        if \u0027nova_object.name\u0027 not in db_obj:"},{"line_number":179,"context_line":"            obj_topology.instance_uuid \u003d instance_uuid"},{"line_number":180,"context_line":"            # No benefit to store a list of changed fields"},{"line_number":181,"context_line":"            obj_topology.obj_reset_changes()"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        return obj_topology"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_b5d3aa01","side":"PARENT","line":181,"range":{"start_line":178,"start_character":0,"end_line":181,"end_character":44},"in_reply_to":"7faddb67_b3319b0d","updated":"2019-08-22 13:37:07.000000000","message":"Have you done an online migration to move everyone? It is very likely people still have instances that were created before mitaka, and potentially unchanged since then. I\u0027m not sure I see where the post-conversion save would be, except for just the case where the instance gets saved because of some other operation.","commit_id":"e392b0d1b24044f0009465c3c193e2d5d6531552"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e4802cdf27b9d928e2eb4570363533ab0a66d670","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        primitive \u003d jsonutils.loads(db_obj)"},{"line_number":176,"context_line":"        obj_topology \u003d cls.obj_from_primitive(primitive)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        if \u0027nova_object.name\u0027 not in db_obj:"},{"line_number":179,"context_line":"            obj_topology.instance_uuid \u003d instance_uuid"},{"line_number":180,"context_line":"            # No benefit to store a list of changed fields"},{"line_number":181,"context_line":"            obj_topology.obj_reset_changes()"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        return obj_topology"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_dec8b422","side":"PARENT","line":181,"range":{"start_line":178,"start_character":0,"end_line":181,"end_character":44},"in_reply_to":"7faddb67_b5d3aa01","updated":"2019-08-23 10:47:36.000000000","message":"I have now","commit_id":"e392b0d1b24044f0009465c3c193e2d5d6531552"}],"nova/objects/migration_context.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b64f347e53db842cdeb8b880d71c3e9a735a5dcc","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        Deserialize instances of this object that have been stored as JSON"},{"line_number":74,"context_line":"        blobs in the database."},{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        return cls.obj_from_primitive(jsonutils.loads(db_obj))"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @base.remotable_classmethod"},{"line_number":79,"context_line":"    def get_by_instance_uuid(cls, context, instance_uuid):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_d523c605","line":76,"updated":"2019-08-22 13:42:43.000000000","message":"This seems unrelated to the rest of the patch...","commit_id":"0e0f8ccfb4c0b7022b3b1f32911165886b56f1ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e4802cdf27b9d928e2eb4570363533ab0a66d670","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        Deserialize instances of this object that have been stored as JSON"},{"line_number":74,"context_line":"        blobs in the database."},{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        return cls.obj_from_primitive(jsonutils.loads(db_obj))"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @base.remotable_classmethod"},{"line_number":79,"context_line":"    def get_by_instance_uuid(cls, context, instance_uuid):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_fe4b30ae","line":76,"in_reply_to":"7faddb67_d523c605","updated":"2019-08-23 10:47:36.000000000","message":"I think I just copy-paste this entire function from \u0027InstanceNUMATopology\u0027 (I wanted the docstring). Gerrit doesn\u0027t highlight any conflicts so I think it\u0027s okay to keep","commit_id":"0e0f8ccfb4c0b7022b3b1f32911165886b56f1ae"}],"nova/objects/numa.py":[{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"0100ace54b4539bd6bb9fc9f458a1a8292b9ebac","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        Deserialize instances of this object that have been stored as JSON"},{"line_number":223,"context_line":"        blobs in the database."},{"line_number":224,"context_line":"        \"\"\""},{"line_number":225,"context_line":"        return cls.obj_from_primitive(jsonutils.loads(db_obj))"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def __len__(self):"},{"line_number":228,"context_line":"        \"\"\"Defined so that boolean testing works the same as for lists.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_106f2993","line":225,"updated":"2019-07-22 12:30:53.000000000","message":"What about this?","commit_id":"8b8cd345f3e5bc21560ff3081c8f24e1fc9b8954"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9338f90d0e650c76f817d9413e1708e86ac844e8","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        Deserialize instances of this object that have been stored as JSON"},{"line_number":223,"context_line":"        blobs in the database."},{"line_number":224,"context_line":"        \"\"\""},{"line_number":225,"context_line":"        return cls.obj_from_primitive(jsonutils.loads(db_obj))"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def __len__(self):"},{"line_number":228,"context_line":"        \"\"\"Defined so that boolean testing works the same as for lists.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_a58d9f2b","line":225,"in_reply_to":"7faddb67_106f2993","updated":"2019-07-23 13:49:00.000000000","message":"Sadly, that\u0027s necessary for users of the ComputeNode object, which doesn\u0027t store the \u0027NUMATopology\u0027 object as an ObjectField.\n\n  https://github.com/openstack/nova/blob/4781ef3321/nova/objects/compute_node.py#L84-L87\n\n Perhaps we should add a property or a proxy field to the \u0027ComputeNode\u0027 object instead? That\u0027s a separate change though","commit_id":"8b8cd345f3e5bc21560ff3081c8f24e1fc9b8954"}],"nova/tests/functional/db/test_instance.py":[{"author":{"_account_id":30209,"name":"Huaqiang","email":"huaqiang.wang@intel.com","username":"Huaqiang.Wang"},"change_message_id":"0b0349600c01b79e7ed7f1d361bae6984e00e1c4","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        db.instance_extra_update_by_uuid(self.context, instances[0].uuid,"},{"line_number":187,"context_line":"                                         {\u0027numa_topology\u0027: legacy_topology})"},{"line_number":188,"context_line":"        db.instance_extra_update_by_uuid(self.context, instances[1].id,"},{"line_number":189,"context_line":"                                         {\u0027numa_topology\u0027: obj_topology})"},{"line_number":190,"context_line":"        db.instance_extra_update_by_uuid(self.context, instances[2].id,"},{"line_number":191,"context_line":"                                         {\u0027numa_topology\u0027: None})"}],"source_content_type":"text/x-python","patch_set":24,"id":"df33271e_3eaee997","line":188,"updated":"2020-04-08 06:27:17.000000000","message":"From the name of \u0027db.instance_extra_update_by_uuid\u0027, you may need to pass in \u0027\ninstances[1].uuid\u0027 to this function as the 2nd parameter.","commit_id":"b4f8d85d8af553219772eeb561a023da8c0387fa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"599f08740a7df5209190774276189b117aba5532","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        db.instance_extra_update_by_uuid(self.context, instances[0].uuid,"},{"line_number":187,"context_line":"                                         {\u0027numa_topology\u0027: legacy_topology})"},{"line_number":188,"context_line":"        db.instance_extra_update_by_uuid(self.context, instances[1].id,"},{"line_number":189,"context_line":"                                         {\u0027numa_topology\u0027: obj_topology})"},{"line_number":190,"context_line":"        db.instance_extra_update_by_uuid(self.context, instances[2].id,"},{"line_number":191,"context_line":"                                         {\u0027numa_topology\u0027: None})"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f4c43b2_a6c50e3f","line":188,"in_reply_to":"3f4c43b2_825f2ce4","updated":"2020-04-14 09:33:11.000000000","message":"Done","commit_id":"b4f8d85d8af553219772eeb561a023da8c0387fa"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"100b47909bafcf760981575915f5844f8e233af4","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        db.instance_extra_update_by_uuid(self.context, instances[0].uuid,"},{"line_number":187,"context_line":"                                         {\u0027numa_topology\u0027: legacy_topology})"},{"line_number":188,"context_line":"        db.instance_extra_update_by_uuid(self.context, instances[1].id,"},{"line_number":189,"context_line":"                                         {\u0027numa_topology\u0027: obj_topology})"},{"line_number":190,"context_line":"        db.instance_extra_update_by_uuid(self.context, instances[2].id,"},{"line_number":191,"context_line":"                                         {\u0027numa_topology\u0027: None})"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f4c43b2_825f2ce4","line":188,"in_reply_to":"df33271e_3eaee997","updated":"2020-04-13 16:01:53.000000000","message":"Yeah, how is this doing the right thing when you\u0027re passing the integer row id in for this parameter? I\u0027m guessing that if you checked the return value of this you\u0027d see it\u0027s not actually updating anything.\n\nI guess it\u0027s not important to the test since the only one you\u0027re looking for is the legacy one above?","commit_id":"b4f8d85d8af553219772eeb561a023da8c0387fa"},{"author":{"_account_id":30209,"name":"Huaqiang","email":"huaqiang.wang@intel.com","username":"Huaqiang.Wang"},"change_message_id":"0b0349600c01b79e7ed7f1d361bae6984e00e1c4","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                                         {\u0027numa_topology\u0027: legacy_topology})"},{"line_number":188,"context_line":"        db.instance_extra_update_by_uuid(self.context, instances[1].id,"},{"line_number":189,"context_line":"                                         {\u0027numa_topology\u0027: obj_topology})"},{"line_number":190,"context_line":"        db.instance_extra_update_by_uuid(self.context, instances[2].id,"},{"line_number":191,"context_line":"                                         {\u0027numa_topology\u0027: None})"},{"line_number":192,"context_line":"        instances[3].destroy()"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"df33271e_9e945546","line":190,"updated":"2020-04-08 06:27:17.000000000","message":"Also this one.","commit_id":"b4f8d85d8af553219772eeb561a023da8c0387fa"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"dfba44a58ee2ea8662364005c1953bde20065988","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        # make sure the actual update was correct"},{"line_number":206,"context_line":"        instance \u003d objects.Instance.get_by_id("},{"line_number":207,"context_line":"            self.context, instances[0].id, expected_attrs\u003d[\u0027numa_topology\u0027],"},{"line_number":208,"context_line":"        )"},{"line_number":209,"context_line":"        self.assertIn(\u0027numa_topology\u0027, instance)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        numa_topology \u003d instance.numa_topology"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f4c43b2_9217fa45","line":208,"updated":"2020-04-20 15:04:51.000000000","message":"What\u0027s with the sudden shift to this widely-spaced paren style? This is three lines, but if it followed the style of the rest of the file, including your own lines from, say L188 (and nova for that matter), it would be two lines.","commit_id":"f46d1b9139335c8cd5122bdaece58dc24aba313c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2858a01b131f9dcfc8c9d5ea981390605b0c7f0a","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        # make sure the actual update was correct"},{"line_number":206,"context_line":"        instance \u003d objects.Instance.get_by_id("},{"line_number":207,"context_line":"            self.context, instances[0].id, expected_attrs\u003d[\u0027numa_topology\u0027],"},{"line_number":208,"context_line":"        )"},{"line_number":209,"context_line":"        self.assertIn(\u0027numa_topology\u0027, instance)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        numa_topology \u003d instance.numa_topology"}],"source_content_type":"text/x-python","patch_set":25,"id":"1f493fa4_5bbc0369","line":208,"in_reply_to":"3f4c43b2_9217fa45","updated":"2020-04-20 16:32:14.000000000","message":"It\u0027s the style black uses (used elsewhere) so I\u0027ve made a habit of using the same style myself ¯\\_(ツ)_/¯","commit_id":"f46d1b9139335c8cd5122bdaece58dc24aba313c"}],"nova/tests/unit/compute/test_compute.py":[{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"0100ace54b4539bd6bb9fc9f458a1a8292b9ebac","unresolved":false,"context_lines":[{"line_number":5790,"context_line":"        instance.refresh()"},{"line_number":5791,"context_line":"        self.assertEqual(vm_states.ACTIVE, instance[\u0027vm_state\u0027])"},{"line_number":5792,"context_line":""},{"line_number":5793,"context_line":"        updated_topology \u003d objects.NUMATopology.obj_from_primitive("},{"line_number":5794,"context_line":"            jsonutils.loads(cn.numa_topology))"},{"line_number":5795,"context_line":""},{"line_number":5796,"context_line":"        # after confirming resize all cpus on currect host must be free"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_f0f60dd9","line":5793,"updated":"2019-07-22 12:30:53.000000000","message":"How is this still passing?","commit_id":"8b8cd345f3e5bc21560ff3081c8f24e1fc9b8954"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9338f90d0e650c76f817d9413e1708e86ac844e8","unresolved":false,"context_lines":[{"line_number":5790,"context_line":"        instance.refresh()"},{"line_number":5791,"context_line":"        self.assertEqual(vm_states.ACTIVE, instance[\u0027vm_state\u0027])"},{"line_number":5792,"context_line":""},{"line_number":5793,"context_line":"        updated_topology \u003d objects.NUMATopology.obj_from_primitive("},{"line_number":5794,"context_line":"            jsonutils.loads(cn.numa_topology))"},{"line_number":5795,"context_line":""},{"line_number":5796,"context_line":"        # after confirming resize all cpus on currect host must be free"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_e5aab76f","line":5793,"in_reply_to":"7faddb67_f0f60dd9","updated":"2019-07-23 13:49:00.000000000","message":"See what I said earlier about the \u0027ComputeNode.numa_topology\u0027 field","commit_id":"8b8cd345f3e5bc21560ff3081c8f24e1fc9b8954"}],"nova/virt/hardware.py":[{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"0100ace54b4539bd6bb9fc9f458a1a8292b9ebac","unresolved":false,"context_lines":[{"line_number":1970,"context_line":"    if instance_numa_topology:"},{"line_number":1971,"context_line":"        if isinstance(instance_numa_topology, six.string_types):"},{"line_number":1972,"context_line":"            instance_numa_topology \u003d ("},{"line_number":1973,"context_line":"                objects.InstanceNUMATopology.obj_from_primitive("},{"line_number":1974,"context_line":"                    jsonutils.loads(instance_numa_topology)))"},{"line_number":1975,"context_line":""},{"line_number":1976,"context_line":"        elif isinstance(instance_numa_topology, dict):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_10464923","line":1973,"updated":"2019-07-22 12:30:53.000000000","message":"Still used here, so you would need to put [1] below this patch.\n\n[1] https://review.opendev.org/#/c/671799/","commit_id":"8b8cd345f3e5bc21560ff3081c8f24e1fc9b8954"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9338f90d0e650c76f817d9413e1708e86ac844e8","unresolved":false,"context_lines":[{"line_number":1970,"context_line":"    if instance_numa_topology:"},{"line_number":1971,"context_line":"        if isinstance(instance_numa_topology, six.string_types):"},{"line_number":1972,"context_line":"            instance_numa_topology \u003d ("},{"line_number":1973,"context_line":"                objects.InstanceNUMATopology.obj_from_primitive("},{"line_number":1974,"context_line":"                    jsonutils.loads(instance_numa_topology)))"},{"line_number":1975,"context_line":""},{"line_number":1976,"context_line":"        elif isinstance(instance_numa_topology, dict):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_45c70b47","line":1973,"in_reply_to":"7faddb67_10464923","updated":"2019-07-23 13:49:00.000000000","message":"No, this is still correct and necessary due to [1]\n\n[1] https://github.com/openstack/nova/blob/4781ef332/nova/objects/compute_node.py#L84-L87","commit_id":"8b8cd345f3e5bc21560ff3081c8f24e1fc9b8954"}]}
