)]}'
{"nova/objects/instance.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d6242b663478fded7eb6ab25d17186e90f232ce9","unresolved":false,"context_lines":[{"line_number":753,"context_line":"        end \u003d timeutils.parse_isotime(end) if end else None"},{"line_number":754,"context_line":"        db_inst_list \u003d db.instance_get_active_by_window_joined("},{"line_number":755,"context_line":"            context, begin, end, project_id, host,"},{"line_number":756,"context_line":"            columns_to_join\u003dexpected_attrs)"},{"line_number":757,"context_line":"        return _make_instance_list(context, cls(), db_inst_list,"},{"line_number":758,"context_line":"                                   expected_attrs)"},{"line_number":759,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9aa7fdbe_343a2899","line":756,"updated":"2014-10-28 16:28:25.000000000","message":"Technically this needs a version bump because it changes what the caller can expect from a result. Even though it\u0027s not part of the explicit interface, it does change the behavior.","commit_id":"2e4c1a9775f473a41c179258796844b54716daa2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"38c8f1f204c7e2da90d0e798ab805410f7c735fe","unresolved":false,"context_lines":[{"line_number":771,"context_line":"        end \u003d timeutils.parse_isotime(end) if end else None"},{"line_number":772,"context_line":"        db_inst_list \u003d db.instance_get_active_by_window_joined("},{"line_number":773,"context_line":"            context, begin, end, project_id, host,"},{"line_number":774,"context_line":"            columns_to_join\u003dexpected_attrs)"},{"line_number":775,"context_line":"        return _make_instance_list(context, cls(), db_inst_list,"},{"line_number":776,"context_line":"                                   expected_attrs)"},{"line_number":777,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_a967db4b","line":774,"updated":"2014-11-15 13:30:21.000000000","message":"Hmm, looks like I should be wrapping expected_attrs in _expected_cols() here?  I\u0027m not sure why though.  Looks like that just protects against someone passing in things that aren\u0027t recognized in the _INSTANCE_OPTIONAL_JOINED_FIELDS list.","commit_id":"2b3fc599cde487b645b9788dc9c13f3f5841c8a3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"285d50dadf709d72e33ae7663b1eeb16587bf6cb","unresolved":false,"context_lines":[{"line_number":771,"context_line":"        end \u003d timeutils.parse_isotime(end) if end else None"},{"line_number":772,"context_line":"        db_inst_list \u003d db.instance_get_active_by_window_joined("},{"line_number":773,"context_line":"            context, begin, end, project_id, host,"},{"line_number":774,"context_line":"            columns_to_join\u003dexpected_attrs)"},{"line_number":775,"context_line":"        return _make_instance_list(context, cls(), db_inst_list,"},{"line_number":776,"context_line":"                                   expected_attrs)"},{"line_number":777,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_0209852b","line":774,"in_reply_to":"5a890539_92e06cce","updated":"2014-11-17 18:18:45.000000000","message":"I\u0027ll fix the copy issue in bug 1393491.","commit_id":"2b3fc599cde487b645b9788dc9c13f3f5841c8a3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5721386541d5d1849b952cb60a426f4d2a0c0b1b","unresolved":false,"context_lines":[{"line_number":771,"context_line":"        end \u003d timeutils.parse_isotime(end) if end else None"},{"line_number":772,"context_line":"        db_inst_list \u003d db.instance_get_active_by_window_joined("},{"line_number":773,"context_line":"            context, begin, end, project_id, host,"},{"line_number":774,"context_line":"            columns_to_join\u003dexpected_attrs)"},{"line_number":775,"context_line":"        return _make_instance_list(context, cls(), db_inst_list,"},{"line_number":776,"context_line":"                                   expected_attrs)"},{"line_number":777,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_92e06cce","line":774,"in_reply_to":"5a890539_a967db4b","updated":"2014-11-17 16:32:20.000000000","message":"So it looks like what happened before wrapping expected_attrs in _expected_cols was we eventually call http://git.openstack.org/cgit/openstack/nova/tree/nova/db/sqlalchemy/api.py#n1824 which mutates (and removes) the system_metadata entry from columns_to_join, so once we come back up and pass expected_attrs to _make_instance_list, we aren\u0027t telling it that we want system_metadata loaded with the instance - so later when the test tries to load it from the deleted instance it\u0027s not there and it blows up.\n\nSeems that http://git.openstack.org/cgit/openstack/nova/tree/nova/db/sqlalchemy/api.py#n1824 should be making a copy of columns_to_join rather than assuming the caller is handling that themselves.","commit_id":"2b3fc599cde487b645b9788dc9c13f3f5841c8a3"}]}
