)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"5614dc309bf2872dadb37aa6cdebfbf7f2ff3bc5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"539ba4c4_27cf67c9","updated":"2026-01-23 15:14:15.000000000","message":"Holding on +2 but overall looks really good!","commit_id":"f4a9b06776fb3312a9880e05bb41fc037daf8856"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"d0c3bd012e4df38d83b726132e58fcfc208bfb95","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"900a35f4_15a4f99e","updated":"2026-01-23 15:14:29.000000000","message":"ideally this should go at the end of the cycle, or close to it","commit_id":"f4a9b06776fb3312a9880e05bb41fc037daf8856"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"e80e29f4aab66a3f3cdda916b1931fa9e93ab9be","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"963b4bc7_e4614269","updated":"2026-01-27 15:13:02.000000000","message":"always run pep8 before submitting for review! who said that? I did! :D","commit_id":"2482b17c54cea07b6c7f4602c12cfc450c2aded9"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"080aacf13b89851f1c7ccda92ab6eadf70c476f1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"d6cc36f8_bf451739","updated":"2026-01-28 19:39:39.000000000","message":"I should mention my review comes from a GR-OSS group review.","commit_id":"339946c9ac7327a02a1207cd2354d89bb31d8ab8"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"db63913028142b3a47c2cb795f507ed64ab6eaab","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"71507f4e_85a2a32d","updated":"2026-01-29 16:59:32.000000000","message":"wrong rebase","commit_id":"8a13af427eb24d290f94052edd53c03fed59ec51"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"81bdb98f4b9593b0fa14a9e6d573e3da0478620e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"6755f89e_fe332959","updated":"2026-01-30 21:15:55.000000000","message":"LGTM","commit_id":"abf2e577aa1b795330adff6d2f24b042a24ac79b"}],"ironic/db/sqlalchemy/alembic/versions/c1fd28861bb9_migrate_to_utf8mb4.py":[{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"608ac3b3bd329e7d444ac1b4b7ffbb6f6f64507d","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# List of all tables that need to be converted to UTF8MB4"},{"line_number":30,"context_line":"TABLES \u003d ["},{"line_number":31,"context_line":"    \u0027chassis\u0027,"},{"line_number":32,"context_line":"    \u0027conductors\u0027,"},{"line_number":33,"context_line":"    \u0027conductor_hardware_interfaces\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"484060f6_ebd2f82e","line":30,"updated":"2026-01-28 19:39:04.000000000","message":"I\u0027m not saying it is incomplete, but how do we know this list is complete?","commit_id":"339946c9ac7327a02a1207cd2354d89bb31d8ab8"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"6b62709c76315ca1c6ba790fc3dbe50e70be5720","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# List of all tables that need to be converted to UTF8MB4"},{"line_number":30,"context_line":"TABLES \u003d ["},{"line_number":31,"context_line":"    \u0027chassis\u0027,"},{"line_number":32,"context_line":"    \u0027conductors\u0027,"},{"line_number":33,"context_line":"    \u0027conductor_hardware_interfaces\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"6d2067d1_5d58ed47","line":30,"in_reply_to":"484060f6_ebd2f82e","updated":"2026-01-29 13:41:03.000000000","message":"the list is complete, it\u0027s taken from models.py\nit can be generated dynamically from database metadata at runtime, but it\u0027s more complex","commit_id":"339946c9ac7327a02a1207cd2354d89bb31d8ab8"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"619f0b8618c60027fa144f8bca28bfffd4d56ee0","unresolved":true,"context_lines":[{"line_number":55,"context_line":"# character capacity (since UTF8MB4 uses 4 bytes per character vs 3 for"},{"line_number":56,"context_line":"# UTF8MB3). We need to explicitly restore these columns to TEXT type."},{"line_number":57,"context_line":"# This includes both plain Text columns and oslo.db\u0027s JsonEncodedDict/List"},{"line_number":58,"context_line":"# types which are stored as TEXT in MySQL."},{"line_number":59,"context_line":"# Format: (table_name, column_name, nullable)"},{"line_number":60,"context_line":"TEXT_COLUMNS \u003d ["},{"line_number":61,"context_line":"    # Plain Text columns"}],"source_content_type":"text/x-python","patch_set":5,"id":"cab8f520_e2ea90f9","line":58,"updated":"2026-01-27 20:49:33.000000000","message":"What\u0027s the downside of just swapping to MEDIUMTEXT at the same time? Just curious.","commit_id":"339946c9ac7327a02a1207cd2354d89bb31d8ab8"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"89880194a76e5f2ed1f3f07f783dcc74ff6ab82e","unresolved":true,"context_lines":[{"line_number":55,"context_line":"# character capacity (since UTF8MB4 uses 4 bytes per character vs 3 for"},{"line_number":56,"context_line":"# UTF8MB3). We need to explicitly restore these columns to TEXT type."},{"line_number":57,"context_line":"# This includes both plain Text columns and oslo.db\u0027s JsonEncodedDict/List"},{"line_number":58,"context_line":"# types which are stored as TEXT in MySQL."},{"line_number":59,"context_line":"# Format: (table_name, column_name, nullable)"},{"line_number":60,"context_line":"TEXT_COLUMNS \u003d ["},{"line_number":61,"context_line":"    # Plain Text columns"}],"source_content_type":"text/x-python","patch_set":5,"id":"5d227919_685cd134","line":58,"in_reply_to":"cab8f520_e2ea90f9","updated":"2026-01-28 14:47:30.000000000","message":"Besides the need of changes the models, I think there\u0027s a kind of incompatibility with what oslo.db does, the JsonEncodedDict and JsonEncodedList types from oslo.db use TEXT internally.\nAlso MEDIUMTEXT requires a little bit more storage, which adds up when having many columns/rows.","commit_id":"339946c9ac7327a02a1207cd2354d89bb31d8ab8"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"608ac3b3bd329e7d444ac1b4b7ffbb6f6f64507d","unresolved":true,"context_lines":[{"line_number":57,"context_line":"# This includes both plain Text columns and oslo.db\u0027s JsonEncodedDict/List"},{"line_number":58,"context_line":"# types which are stored as TEXT in MySQL."},{"line_number":59,"context_line":"# Format: (table_name, column_name, nullable)"},{"line_number":60,"context_line":"TEXT_COLUMNS \u003d ["},{"line_number":61,"context_line":"    # Plain Text columns"},{"line_number":62,"context_line":"    (\u0027allocations\u0027, \u0027last_error\u0027, True),"},{"line_number":63,"context_line":"    (\u0027bios_settings\u0027, \u0027value\u0027, True),"}],"source_content_type":"text/x-python","patch_set":5,"id":"ffe4aa6d_2e041c15","line":60,"updated":"2026-01-28 19:39:04.000000000","message":"Same comment about completeness.","commit_id":"339946c9ac7327a02a1207cd2354d89bb31d8ab8"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"6b62709c76315ca1c6ba790fc3dbe50e70be5720","unresolved":true,"context_lines":[{"line_number":57,"context_line":"# This includes both plain Text columns and oslo.db\u0027s JsonEncodedDict/List"},{"line_number":58,"context_line":"# types which are stored as TEXT in MySQL."},{"line_number":59,"context_line":"# Format: (table_name, column_name, nullable)"},{"line_number":60,"context_line":"TEXT_COLUMNS \u003d ["},{"line_number":61,"context_line":"    # Plain Text columns"},{"line_number":62,"context_line":"    (\u0027allocations\u0027, \u0027last_error\u0027, True),"},{"line_number":63,"context_line":"    (\u0027bios_settings\u0027, \u0027value\u0027, True),"}],"source_content_type":"text/x-python","patch_set":5,"id":"b542b96a_0f9914d4","line":60,"in_reply_to":"ffe4aa6d_2e041c15","updated":"2026-01-29 13:41:03.000000000","message":"same reply :)","commit_id":"339946c9ac7327a02a1207cd2354d89bb31d8ab8"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"608ac3b3bd329e7d444ac1b4b7ffbb6f6f64507d","unresolved":true,"context_lines":[{"line_number":125,"context_line":"        null_str \u003d \"NULL\" if nullable else \"NOT NULL\""},{"line_number":126,"context_line":"        op.execute("},{"line_number":127,"context_line":"            sa.text("},{"line_number":128,"context_line":"                f\"ALTER TABLE {table} MODIFY COLUMN {column} TEXT \""},{"line_number":129,"context_line":"                f\"CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci {null_str}\""},{"line_number":130,"context_line":"            )"},{"line_number":131,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"a420f1ff_2eb3c4a2","line":128,"updated":"2026-01-28 19:39:04.000000000","message":"ALTER TABLE can handle the modification of several columns at once, can we change this to make one call per table?","commit_id":"339946c9ac7327a02a1207cd2354d89bb31d8ab8"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"6b62709c76315ca1c6ba790fc3dbe50e70be5720","unresolved":true,"context_lines":[{"line_number":125,"context_line":"        null_str \u003d \"NULL\" if nullable else \"NOT NULL\""},{"line_number":126,"context_line":"        op.execute("},{"line_number":127,"context_line":"            sa.text("},{"line_number":128,"context_line":"                f\"ALTER TABLE {table} MODIFY COLUMN {column} TEXT \""},{"line_number":129,"context_line":"                f\"CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci {null_str}\""},{"line_number":130,"context_line":"            )"},{"line_number":131,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"dbe20df3_96b21aa5","line":128,"in_reply_to":"a420f1ff_2eb3c4a2","updated":"2026-01-29 13:41:03.000000000","message":"this can do","commit_id":"339946c9ac7327a02a1207cd2354d89bb31d8ab8"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"48ed3d41d1c446ca1d505381bceddbc817cb2e43","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        null_str \u003d \"NULL\" if nullable else \"NOT NULL\""},{"line_number":126,"context_line":"        op.execute("},{"line_number":127,"context_line":"            sa.text("},{"line_number":128,"context_line":"                f\"ALTER TABLE {table} MODIFY COLUMN {column} TEXT \""},{"line_number":129,"context_line":"                f\"CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci {null_str}\""},{"line_number":130,"context_line":"            )"},{"line_number":131,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"3bb7be1a_cc126868","line":128,"in_reply_to":"dbe20df3_96b21aa5","updated":"2026-01-29 13:47:10.000000000","message":"Done","commit_id":"339946c9ac7327a02a1207cd2354d89bb31d8ab8"}],"releasenotes/notes/utf8mb4-migration-4cbde1fe756875f5.yaml":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"5614dc309bf2872dadb37aa6cdebfbf7f2ff3bc5","unresolved":true,"context_lines":[{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    The database migration will automatically convert all existing tables"},{"line_number":9,"context_line":"    from ``UTF8MB3`` (3-byte UTF-8) to ``UTF8MB4``. This conversion may"},{"line_number":10,"context_line":"    temporarily lock tables during the upgrade process. Operators should"},{"line_number":11,"context_line":"    plan for brief downtime during the database migration."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    Benefits of UTF8MB4:"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":2,"id":"07f9fe4d_1eb1d08e","line":11,"range":{"start_line":10,"start_character":56,"end_line":11,"end_character":58},"updated":"2026-01-23 15:14:15.000000000","message":"Yeah, the alter table commands will lock the tables while being re-written.","commit_id":"f4a9b06776fb3312a9880e05bb41fc037daf8856"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"48ed3d41d1c446ca1d505381bceddbc817cb2e43","unresolved":false,"context_lines":[{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    The database migration will automatically convert all existing tables"},{"line_number":9,"context_line":"    from ``UTF8MB3`` (3-byte UTF-8) to ``UTF8MB4``. This conversion may"},{"line_number":10,"context_line":"    temporarily lock tables during the upgrade process. Operators should"},{"line_number":11,"context_line":"    plan for brief downtime during the database migration."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    Benefits of UTF8MB4:"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":2,"id":"2cf7b382_a381c1d2","line":11,"range":{"start_line":10,"start_character":56,"end_line":11,"end_character":58},"in_reply_to":"07f9fe4d_1eb1d08e","updated":"2026-01-29 13:47:10.000000000","message":"Acknowledged","commit_id":"f4a9b06776fb3312a9880e05bb41fc037daf8856"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"608ac3b3bd329e7d444ac1b4b7ffbb6f6f64507d","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    .. code-block:: sql"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"       CREATE DATABASE ironic CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    For existing installations, the migration is handled automatically by"},{"line_number":33,"context_line":"    running ``ironic-dbsync upgrade``."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"bd13b62a_f0e106cc","line":30,"updated":"2026-01-28 19:39:04.000000000","message":"This needs to be updated in other places as well:\njay@jf-poc ~/odev/ironic $ rg \u0027CREATE \u0027\ntools/test-setup.sh\n29:    CREATE USER \u0027$DB_USER\u0027@\u0027%\u0027 IDENTIFIED BY \u0027$DB_PW\u0027;\n36:    CREATE DATABASE openstack_citest CHARACTER SET utf8;\"\n\ndoc/source/install/include/common-prerequisites.inc\n25:   mysql\u003e CREATE DATABASE ironic CHARACTER SET utf8mb3;","commit_id":"339946c9ac7327a02a1207cd2354d89bb31d8ab8"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"bca6c2e9dc3b8f43e8302240226b31e383dd8c9b","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    .. code-block:: sql"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"       CREATE DATABASE ironic CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    For existing installations, the migration is handled automatically by"},{"line_number":33,"context_line":"    running ``ironic-dbsync upgrade``."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"d4f70bed_e79d7ee0","line":30,"in_reply_to":"101217a8_ff7fba26","updated":"2026-02-03 21:23:57.000000000","message":"Just a bad comment by me then","commit_id":"339946c9ac7327a02a1207cd2354d89bb31d8ab8"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"72256cd3adc59907af9379dc68f1bb5bcfa9143c","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    .. code-block:: sql"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"       CREATE DATABASE ironic CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    For existing installations, the migration is handled automatically by"},{"line_number":33,"context_line":"    running ``ironic-dbsync upgrade``."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"101217a8_ff7fba26","line":30,"in_reply_to":"7768fcd8_a362f1b1","updated":"2026-01-29 14:30:26.000000000","message":"@jay@jvf.cc Were there other places? Because Riccardo is right, those places have been touched in this change.","commit_id":"339946c9ac7327a02a1207cd2354d89bb31d8ab8"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"6b62709c76315ca1c6ba790fc3dbe50e70be5720","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    .. code-block:: sql"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"       CREATE DATABASE ironic CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    For existing installations, the migration is handled automatically by"},{"line_number":33,"context_line":"    running ``ironic-dbsync upgrade``."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"7768fcd8_a362f1b1","line":30,"in_reply_to":"bd13b62a_f0e106cc","updated":"2026-01-29 13:41:03.000000000","message":"I think I\u0027ve done that already... no?","commit_id":"339946c9ac7327a02a1207cd2354d89bb31d8ab8"}]}
