)]}'
{"nova/db/sqlalchemy/migrate_repo/versions/347_add_updated_at_index.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4c3cfc7967e2516f2b618460aaaec50b8842d190","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"INDEX_COLUMNS \u003d [\u0027updated_at\u0027]"},{"line_number":21,"context_line":"INDEX_NAME \u003d \u0027instances_updated_at_idx\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a77a97e_eafcba73","line":20,"updated":"2016-11-20 15:40:09.000000000","message":"Looks good based on this:\n\nhttps://github.com/openstack/nova/blob/0f152eb66153e16d4d8aba0f8afebaab046aea35/nova/db/sqlalchemy/api.py#L2136-L2139\n\nFor a non-admin query we\u0027re also going to at least get project_id or user_id in here (probably project_id):\n\nhttps://github.com/openstack/nova/blob/0f152eb66153e16d4d8aba0f8afebaab046aea35/nova/db/sqlalchemy/api.py#L2212\n\nSo I wonder if we should have project_id in the index or not.\n\nAt first I thought we should also included deleted in the index, but changes-since is special in the REST API such that if you specify changes-since then we don\u0027t automatically excluded deleted instances:\n\nhttps://github.com/openstack/nova/blob/0f152eb66153e16d4d8aba0f8afebaab046aea35/nova/api/openstack/compute/servers.py#L259\n\nSo I guess my only open question is on adding project_id or not to the index. We could probably run a \u0027nova list --changes-since\u0027 query with SQL statement trace turned on to find out the actual query that\u0027s used. To do that I think you set connection_trace\u003dTrue in the [database] section of nova.conf.","commit_id":"c6c4c6cde1e24d79e484d74d1f6377fddfb503ec"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"21f5e3da87ef3addee7e40ffe438d3da6304e550","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"INDEX_COLUMNS \u003d [\u0027project_id\u0027, \u0027updated_at\u0027]"},{"line_number":21,"context_line":"INDEX_NAME \u003d \u0027instances_project_id_updated_at_idx\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_be54ab21","line":20,"updated":"2016-11-21 15:20:24.000000000","message":"Perhaps we should switch the order of columns to be:\n\n [\u0027updated_at\u0027, \u0027project_id\u0027]\n\nso that this index can also be used for queries produced by\n\n  nova list --changes-since ... --all-tenants 1\n\nwhich look like:\n\n  FROM instances\n  WHERE instances.updated_at \u003e\u003d %(updated_at_1)s ORDER BY  instances.created_at DESC, instances.id DESC","commit_id":"a5e0b426a9572650e916bdbfff77022ccce439bb"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"21f5e3da87ef3addee7e40ffe438d3da6304e550","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    meta \u003d MetaData()"},{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":"    table \u003d Table(\u0027instances\u0027, meta, autoload\u003dTrue)"},{"line_number":28,"context_line":"    for idx in table.indexes:"},{"line_number":29,"context_line":"        if idx.columns.keys() \u003d\u003d INDEX_COLUMNS:"},{"line_number":30,"context_line":"            break"},{"line_number":31,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_7e2133b4","line":28,"updated":"2016-11-21 15:20:24.000000000","message":"(optional) nit: I personally prefer http://docs.sqlalchemy.org/en/latest/core/reflection.html?highlight\u003dget_indexes#sqlalchemy.engine.reflection.Inspector.get_indexes to only reflect things we actually need instead of loading more tables via FK relationships, but that\u0027s not critical in this case","commit_id":"a5e0b426a9572650e916bdbfff77022ccce439bb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03abc0f517ee25aeb1ee2d58bffbfd8dd2f71479","unresolved":false,"context_lines":[{"line_number":27,"context_line":"TABLE_NAME \u003d \u0027instances\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def _get_table_index(migrate_engine, table_name, index_volumns):"},{"line_number":31,"context_line":"    inspector \u003d reflection.Inspector.from_engine(migrate_engine)"},{"line_number":32,"context_line":"    for idx in inspector.get_indexes(table_name):"},{"line_number":33,"context_line":"        if idx[\u0027column_names\u0027] \u003d\u003d index_volumns:"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a77a97e_3549838f","line":30,"range":{"start_line":30,"start_character":55,"end_line":30,"end_character":56},"updated":"2016-11-22 01:40:15.000000000","message":"s/v/c/","commit_id":"32bbb0e41d7ecdf2a1170fc30733f441a5658e34"}]}
