)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"05471a80f007fc8dff1c1f5157b05328d8c3162a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Cale Rath \u003cctrath@us.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-07-20 17:26:00 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implements: blueprint Purge Deleted Instances"},{"line_number":8,"context_line":"Blueprint URL: https://goo.gl/cgWawy"},{"line_number":9,"context_line":"Spec URL: https://review.openstack.org/#/c/200224/"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a50d1a3_ccb649dc","line":7,"updated":"2015-07-20 18:15:34.000000000","message":"The implements should be going at the end of the commit message. It should also be of the form Implements: blueprint purge-deleted-instances-cmd","commit_id":"e0a79f687c95f0b6149988fc440a779eef9550c3"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"05471a80f007fc8dff1c1f5157b05328d8c3162a","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2015-07-20 17:26:00 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implements: blueprint Purge Deleted Instances"},{"line_number":8,"context_line":"Blueprint URL: https://goo.gl/cgWawy"},{"line_number":9,"context_line":"Spec URL: https://review.openstack.org/#/c/200224/"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"This commit adds the functionality to purge soft-deleted"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a50d1a3_acec1dc8","line":8,"updated":"2015-07-20 18:15:34.000000000","message":"When you have the Implements line as shown above, it will auto-link it (like it did in the comment) so you don\u0027t need this URL anymore.","commit_id":"e0a79f687c95f0b6149988fc440a779eef9550c3"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"05471a80f007fc8dff1c1f5157b05328d8c3162a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implements: blueprint Purge Deleted Instances"},{"line_number":8,"context_line":"Blueprint URL: https://goo.gl/cgWawy"},{"line_number":9,"context_line":"Spec URL: https://review.openstack.org/#/c/200224/"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"This commit adds the functionality to purge soft-deleted"},{"line_number":12,"context_line":"instances from the DB, along with data in tables"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a50d1a3_cc2ba9ea","line":9,"updated":"2015-07-20 18:15:34.000000000","message":"Gerrit also thinks the title is everything until it sees a blank line. So it will cobble these 3 lines together and try to put them all as the title. Here\u0027s a good link for doing git commit messages: https://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure","commit_id":"e0a79f687c95f0b6149988fc440a779eef9550c3"},{"author":{"_account_id":20191,"name":"Dinesh Bhor","email":"bhordinesh07@gmail.com","username":"dineshbhor"},"change_message_id":"69095ffab10ec105cde422c538e87164ae3c02da","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Cale Rath \u003cctrath@us.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-21 16:17:17 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Purge soft-deleted instances cmd"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This commit adds the functionality to purge soft-deleted"},{"line_number":10,"context_line":"instances from the DB, along with data in tables"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"1a122d0e_88e85018","line":7,"range":{"start_line":7,"start_character":6,"end_line":7,"end_character":18},"updated":"2016-04-22 13:29:08.000000000","message":"This is bit misleading as it is deleting all the instances whose deleted field is not equal to zero(deleted!\u003d0).","commit_id":"ad30e795f0e310fe619a1a723c87ba6c4f455614"}],"nova/cmd/manage.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3a68dc6fe02f0c8c5e12b07f041f9b1315c7536a","unresolved":false,"context_lines":[{"line_number":991,"context_line":"                                max_number\u003dNone):"},{"line_number":992,"context_line":"        \"\"\"Removes soft deleted instance data\"\"\""},{"line_number":993,"context_line":"        admin_context \u003d context.get_admin_context(read_deleted\u003d\u0027yes\u0027)"},{"line_number":994,"context_line":"        db.instances_purge_deleted(admin_context, dry_run, older_than,"},{"line_number":995,"context_line":"                                    max_number)"},{"line_number":996,"context_line":""},{"line_number":997,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_3086e2b9","line":994,"updated":"2015-07-21 16:59:02.000000000","message":"We should be printing how many instances were deleted, or would be deleted in the case of a dry run.","commit_id":"49205d726766aa9c5b3e4ea5c5743093b5e81ea4"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"300addcade3abcca8438aa9b2121b106608a10ee","unresolved":false,"context_lines":[{"line_number":1000,"context_line":"            print (_(\"There are %d instances in the DB that are soft \""},{"line_number":1001,"context_line":"                     \"deleted.  Run this command again without the dry-run \""},{"line_number":1002,"context_line":"                     \"option to purge these soft-deleted instances.\")"},{"line_number":1003,"context_line":"                     % instance_count)"},{"line_number":1004,"context_line":""},{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"class ApiDbCommands(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_f0a6afbf","line":1003,"updated":"2015-07-23 18:55:01.000000000","message":"You should say \"at least %d\", as the count is limited","commit_id":"5c9d826c6800f6a28f9e38ceee2a828b499cdd5a"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"11afe522558c3ee9b896404863a76ff96fa2daa0","unresolved":false,"context_lines":[{"line_number":990,"context_line":"    def purge_deleted_instances(self, dry_run\u003dFalse, older_than\u003d90,"},{"line_number":991,"context_line":"                                max_number\u003dNone):"},{"line_number":992,"context_line":"        \"\"\"Removes soft deleted instance data\"\"\""},{"line_number":993,"context_line":"        admin_context \u003d context.get_admin_context(read_deleted\u003d\u0027yes\u0027)"},{"line_number":994,"context_line":"        instance_count \u003d db.instances_purge_deleted(admin_context, dry_run,"},{"line_number":995,"context_line":"                                                    older_than,"},{"line_number":996,"context_line":"                                                    max_number)"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a2ca52d_6a6eba02","line":993,"updated":"2015-10-15 08:24:34.000000000","message":"We already removed all the db layer hard-code permission checks, so I think we use non-admin context at here.","commit_id":"137af11dd1a6963b5db491521fa0d29081193b61"},{"author":{"_account_id":20191,"name":"Dinesh Bhor","email":"bhordinesh07@gmail.com","username":"dineshbhor"},"change_message_id":"69095ffab10ec105cde422c538e87164ae3c02da","unresolved":false,"context_lines":[{"line_number":991,"context_line":"          default\u003d90, help\u003d\u0027Days from today to begin purging\u0027)"},{"line_number":992,"context_line":"    @args(\u0027--max-number\u0027, metavar\u003d\u0027\u003cnumber\u003e\u0027, dest\u003d\u0027max_number\u0027,"},{"line_number":993,"context_line":"          help\u003d\u0027Maximum number of instances to consider\u0027)"},{"line_number":994,"context_line":"    def purge_deleted_instances(self, dry_run\u003dFalse, older_than\u003d90,"},{"line_number":995,"context_line":"                                max_number\u003dNone):"},{"line_number":996,"context_line":"        \"\"\"Removes soft deleted instance data\"\"\""},{"line_number":997,"context_line":"        admin_context \u003d context.get_admin_context(read_deleted\u003d\u0027yes\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a122d0e_68785490","line":994,"range":{"start_line":994,"start_character":53,"end_line":994,"end_character":64},"updated":"2016-04-22 13:29:08.000000000","message":"It raises Overflow error if we give a long integer number as a value to --older-than argument.","commit_id":"ad30e795f0e310fe619a1a723c87ba6c4f455614"},{"author":{"_account_id":20191,"name":"Dinesh Bhor","email":"bhordinesh07@gmail.com","username":"dineshbhor"},"change_message_id":"69095ffab10ec105cde422c538e87164ae3c02da","unresolved":false,"context_lines":[{"line_number":1001,"context_line":"        if not dry_run:"},{"line_number":1002,"context_line":"            print(_(\"Purged %d instances from the DB\") % instance_count)"},{"line_number":1003,"context_line":"        else:"},{"line_number":1004,"context_line":"            print (_(\"There are at least %d instances in the DB that are soft \""},{"line_number":1005,"context_line":"                     \"deleted.  Run this command again without the dry-run \""},{"line_number":1006,"context_line":"                     \"option to purge these soft-deleted instances.\")"},{"line_number":1007,"context_line":"                     % instance_count)"},{"line_number":1008,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"1a122d0e_28693c8c","line":1005,"range":{"start_line":1004,"start_character":73,"end_line":1005,"end_character":30},"updated":"2016-04-22 13:29:08.000000000","message":"Here it is giving count of instances whose deleted field is not equal to zero( i.e., instances which are hard deleted).\nI think the message is bit misleading.","commit_id":"ad30e795f0e310fe619a1a723c87ba6c4f455614"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3a68dc6fe02f0c8c5e12b07f041f9b1315c7536a","unresolved":false,"context_lines":[{"line_number":1734,"context_line":"# stored in the DB"},{"line_number":1735,"context_line":"        q_offset \u003d 0"},{"line_number":1736,"context_line":"        more_instances \u003d True"},{"line_number":1737,"context_line":"        limit \u003d 100"},{"line_number":1738,"context_line":"        while (more_instances):"},{"line_number":1739,"context_line":"            more_instances \u003d False"},{"line_number":1740,"context_line":"            if max_number is not None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_30c7c246","line":1737,"updated":"2015-07-21 16:59:02.000000000","message":"I think we have something in the nova-api for default limits, we should use that config option if possible.","commit_id":"49205d726766aa9c5b3e4ea5c5743093b5e81ea4"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"1ec0e397da927a4fbb1f7736af1d8a5cb82993a0","unresolved":false,"context_lines":[{"line_number":1734,"context_line":"# stored in the DB"},{"line_number":1735,"context_line":"        q_offset \u003d 0"},{"line_number":1736,"context_line":"        more_instances \u003d True"},{"line_number":1737,"context_line":"        limit \u003d 100"},{"line_number":1738,"context_line":"        while (more_instances):"},{"line_number":1739,"context_line":"            more_instances \u003d False"},{"line_number":1740,"context_line":"            if max_number is not None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_2486a4b9","line":1737,"in_reply_to":"3a50d1a3_30c7c246","updated":"2015-07-21 18:12:21.000000000","message":"There\u0027s DEFAULT/osapi_max_limit \u003d 1000","commit_id":"49205d726766aa9c5b3e4ea5c5743093b5e81ea4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3a68dc6fe02f0c8c5e12b07f041f9b1315c7536a","unresolved":false,"context_lines":[{"line_number":1749,"context_line":"                    % (instance[\u0027uuid\u0027], instance[\u0027name\u0027],"},{"line_number":1750,"context_line":"                        instance[\u0027deleted_at\u0027]))"},{"line_number":1751,"context_line":""},{"line_number":1752,"context_line":"                secgroups_query \u003d model_query(context,"},{"line_number":1753,"context_line":"                                    models.SecurityGroupInstanceAssociation,"},{"line_number":1754,"context_line":"                                    session\u003dsession).\\"},{"line_number":1755,"context_line":"                                    filter_by(instance_uuid\u003dinstance[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_b01672a5","line":1752,"updated":"2015-07-21 16:59:02.000000000","message":"For everything with a foreign key to instance[\u0027uuid\u0027] I think we could probably make this cleaner with a list of the model objects to iterate over since they should have an instance_uuid column.  We could make this all more generic IMO, which would make it easier to add new resources to as needed.\n\nI actually wonder if we could just join all of these results with the instance we\u0027re going to delete and delete them in one big call.","commit_id":"49205d726766aa9c5b3e4ea5c5743093b5e81ea4"},{"author":{"_account_id":16839,"name":"Cale Rath","email":"ctrath@us.ibm.com","username":"ctrath"},"change_message_id":"0a6871de535cc1b7c06a97773983848851dab378","unresolved":false,"context_lines":[{"line_number":1749,"context_line":"                    % (instance[\u0027uuid\u0027], instance[\u0027name\u0027],"},{"line_number":1750,"context_line":"                        instance[\u0027deleted_at\u0027]))"},{"line_number":1751,"context_line":""},{"line_number":1752,"context_line":"                secgroups_query \u003d model_query(context,"},{"line_number":1753,"context_line":"                                    models.SecurityGroupInstanceAssociation,"},{"line_number":1754,"context_line":"                                    session\u003dsession).\\"},{"line_number":1755,"context_line":"                                    filter_by(instance_uuid\u003dinstance[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_f35e4411","line":1752,"in_reply_to":"3a50d1a3_b01672a5","updated":"2015-07-21 17:04:43.000000000","message":"That\u0027s a good point.. On your last point, is there a way that I can roll all of the deletes within a transaction, so if a delete fails, we rollback the data for the given instance?","commit_id":"49205d726766aa9c5b3e4ea5c5743093b5e81ea4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b303b0bfe2363a6462b5e55b796d8384b61cc332","unresolved":false,"context_lines":[{"line_number":1749,"context_line":"                    % (instance[\u0027uuid\u0027], instance[\u0027name\u0027],"},{"line_number":1750,"context_line":"                        instance[\u0027deleted_at\u0027]))"},{"line_number":1751,"context_line":""},{"line_number":1752,"context_line":"                secgroups_query \u003d model_query(context,"},{"line_number":1753,"context_line":"                                    models.SecurityGroupInstanceAssociation,"},{"line_number":1754,"context_line":"                                    session\u003dsession).\\"},{"line_number":1755,"context_line":"                                    filter_by(instance_uuid\u003dinstance[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_ca734614","line":1752,"in_reply_to":"3a50d1a3_f35e4411","updated":"2015-07-21 19:45:13.000000000","message":"Well I thought that\u0027s what the sqlalchemy session was for, a transaction, but I could be wrong - we could ask jaypipes or zzzeek.","commit_id":"49205d726766aa9c5b3e4ea5c5743093b5e81ea4"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"300addcade3abcca8438aa9b2121b106608a10ee","unresolved":false,"context_lines":[{"line_number":1764,"context_line":"                        instance[\u0027deleted_at\u0027]))"},{"line_number":1765,"context_line":""},{"line_number":1766,"context_line":"                for related_instance_model in related_instance_models:"},{"line_number":1767,"context_line":"                    related_model_query \u003d model_query(context,"},{"line_number":1768,"context_line":"                                            related_instance_model,"},{"line_number":1769,"context_line":"                                            session\u003dsession).\\"},{"line_number":1770,"context_line":"                                    filter_by(instance_uuid\u003dinstance[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_30df37d7","line":1767,"updated":"2015-07-23 18:55:01.000000000","message":"can the guts of this loop be factored out for readability please?","commit_id":"5c9d826c6800f6a28f9e38ceee2a828b499cdd5a"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"300addcade3abcca8438aa9b2121b106608a10ee","unresolved":false,"context_lines":[{"line_number":1772,"context_line":"                    for result in results:"},{"line_number":1773,"context_line":"                        LOG.debug(\u0027  \u003c%s(id\u003d%s)\u003e\u0027"},{"line_number":1774,"context_line":"                                    % (type(result).__name__, result[\u0027id\u0027]))"},{"line_number":1775,"context_line":"                    if dry_run is False:"},{"line_number":1776,"context_line":"                        related_model_query.delete()"},{"line_number":1777,"context_line":""},{"line_number":1778,"context_line":"                    tags_query \u003d model_query(context,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_10579b26","line":1775,"updated":"2015-07-23 18:55:01.000000000","message":"I\u0027m told \"if not dry_run\" is more Pythonic","commit_id":"5c9d826c6800f6a28f9e38ceee2a828b499cdd5a"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"300addcade3abcca8438aa9b2121b106608a10ee","unresolved":false,"context_lines":[{"line_number":1775,"context_line":"                    if dry_run is False:"},{"line_number":1776,"context_line":"                        related_model_query.delete()"},{"line_number":1777,"context_line":""},{"line_number":1778,"context_line":"                    tags_query \u003d model_query(context,"},{"line_number":1779,"context_line":"                                                models.Tag, session\u003dsession).\\"},{"line_number":1780,"context_line":"                                    filter_by(resource_id\u003dinstance[\u0027uuid\u0027])"},{"line_number":1781,"context_line":"                    tags \u003d tags_query.all()"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_700a9f27","line":1778,"updated":"2015-07-23 18:55:01.000000000","message":"why is this part of the related_instance_model loop?","commit_id":"5c9d826c6800f6a28f9e38ceee2a828b499cdd5a"},{"author":{"_account_id":16839,"name":"Cale Rath","email":"ctrath@us.ibm.com","username":"ctrath"},"change_message_id":"75afaad59c27e281da01f62390288f598987baf4","unresolved":false,"context_lines":[{"line_number":1775,"context_line":"                    if dry_run is False:"},{"line_number":1776,"context_line":"                        related_model_query.delete()"},{"line_number":1777,"context_line":""},{"line_number":1778,"context_line":"                    tags_query \u003d model_query(context,"},{"line_number":1779,"context_line":"                                                models.Tag, session\u003dsession).\\"},{"line_number":1780,"context_line":"                                    filter_by(resource_id\u003dinstance[\u0027uuid\u0027])"},{"line_number":1781,"context_line":"                    tags \u003d tags_query.all()"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_4b981878","line":1778,"in_reply_to":"3a50d1a3_700a9f27","updated":"2015-07-23 19:04:16.000000000","message":"The issue is that all of the related tables, except for tags, have a field named \u0027instance_uuid\u0027; whereas, the field name in tags is named \u0027resource_id\u0027.  I don\u0027t know why it\u0027s different than every other table.","commit_id":"5c9d826c6800f6a28f9e38ceee2a828b499cdd5a"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"300addcade3abcca8438aa9b2121b106608a10ee","unresolved":false,"context_lines":[{"line_number":1776,"context_line":"                        related_model_query.delete()"},{"line_number":1777,"context_line":""},{"line_number":1778,"context_line":"                    tags_query \u003d model_query(context,"},{"line_number":1779,"context_line":"                                                models.Tag, session\u003dsession).\\"},{"line_number":1780,"context_line":"                                    filter_by(resource_id\u003dinstance[\u0027uuid\u0027])"},{"line_number":1781,"context_line":"                    tags \u003d tags_query.all()"},{"line_number":1782,"context_line":"                    for tag in tags:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_70237fbd","line":1779,"updated":"2015-07-23 18:55:01.000000000","message":"nit: indentation seems weird here (also line 1768)","commit_id":"5c9d826c6800f6a28f9e38ceee2a828b499cdd5a"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"300addcade3abcca8438aa9b2121b106608a10ee","unresolved":false,"context_lines":[{"line_number":1778,"context_line":"                    tags_query \u003d model_query(context,"},{"line_number":1779,"context_line":"                                                models.Tag, session\u003dsession).\\"},{"line_number":1780,"context_line":"                                    filter_by(resource_id\u003dinstance[\u0027uuid\u0027])"},{"line_number":1781,"context_line":"                    tags \u003d tags_query.all()"},{"line_number":1782,"context_line":"                    for tag in tags:"},{"line_number":1783,"context_line":"                        LOG.debug(\u0027  \u003cTag(tag\u003d%s)\u003e\u0027 % tag[\u0027tag\u0027])"},{"line_number":1784,"context_line":"                    if (dry_run is False):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_ab219c9f","line":1781,"updated":"2015-07-23 18:55:01.000000000","message":"seems to be some commonality between 1771-1776 and here","commit_id":"5c9d826c6800f6a28f9e38ceee2a828b499cdd5a"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"300addcade3abcca8438aa9b2121b106608a10ee","unresolved":false,"context_lines":[{"line_number":1786,"context_line":"                deleted_instances +\u003d 1"},{"line_number":1787,"context_line":"            q_offset +\u003d CONF.osapi_max_limit"},{"line_number":1788,"context_line":"        if dry_run is False:"},{"line_number":1789,"context_line":"            instance_query.delete()"},{"line_number":1790,"context_line":"    return deleted_instances"},{"line_number":1791,"context_line":""},{"line_number":1792,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_ab6f5cc2","line":1789,"updated":"2015-07-23 18:55:01.000000000","message":"doesn\u0027t this need to be inside the session?","commit_id":"5c9d826c6800f6a28f9e38ceee2a828b499cdd5a"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"2ce665b31392c541c03ed3e35cb1b4de4ef49401","unresolved":false,"context_lines":[{"line_number":1732,"context_line":"                               models.Console,"},{"line_number":1733,"context_line":"                               models.PciDevice,"},{"line_number":1734,"context_line":"                               models.Migration,"},{"line_number":1735,"context_line":"                               models.VirtualInterface]"},{"line_number":1736,"context_line":""},{"line_number":1737,"context_line":"    for related_instance_model in related_instance_models:"},{"line_number":1738,"context_line":"        related_model_query \u003d model_query(context,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_124c186f","line":1735,"updated":"2015-07-27 11:03:10.000000000","message":"-1: what about InstanceActionEvents? And other second-degree relations of Instance","commit_id":"f9a0bf5a198f8808dd39c906497e46aab8d17f5e"},{"author":{"_account_id":16839,"name":"Cale Rath","email":"ctrath@us.ibm.com","username":"ctrath"},"change_message_id":"e5eab7bc3358b3e4b6913451b8bcd220785feea6","unresolved":false,"context_lines":[{"line_number":1732,"context_line":"                               models.Console,"},{"line_number":1733,"context_line":"                               models.PciDevice,"},{"line_number":1734,"context_line":"                               models.Migration,"},{"line_number":1735,"context_line":"                               models.VirtualInterface]"},{"line_number":1736,"context_line":""},{"line_number":1737,"context_line":"    for related_instance_model in related_instance_models:"},{"line_number":1738,"context_line":"        related_model_query \u003d model_query(context,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_a931360d","line":1735,"in_reply_to":"3a50d1a3_124c186f","updated":"2015-07-27 13:23:48.000000000","message":"I\u0027ll let somebody else comment on this.. I pulled this list directly from the spec: https://review.openstack.org/#/c/200224/8/specs/backlog/approved/purge-deleted-instances-cmd.rst","commit_id":"f9a0bf5a198f8808dd39c906497e46aab8d17f5e"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"2ce665b31392c541c03ed3e35cb1b4de4ef49401","unresolved":false,"context_lines":[{"line_number":1735,"context_line":"                               models.VirtualInterface]"},{"line_number":1736,"context_line":""},{"line_number":1737,"context_line":"    for related_instance_model in related_instance_models:"},{"line_number":1738,"context_line":"        related_model_query \u003d model_query(context,"},{"line_number":1739,"context_line":"                                          related_instance_model,"},{"line_number":1740,"context_line":"                                          session\u003dsession).\\"},{"line_number":1741,"context_line":"                                filter_by(instance_uuid\u003dinstance[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_b2a8c4dc","line":1738,"updated":"2015-07-27 11:03:10.000000000","message":"nit: now you\u0027re in a private function you could use shorter var names, but this is fine","commit_id":"f9a0bf5a198f8808dd39c906497e46aab8d17f5e"},{"author":{"_account_id":6608,"name":"Paul Carlton","email":"paul.carlton2@hpe.com","username":"paul-carlton2"},"change_message_id":"134689112313d27265b562550c2c130da9046aee","unresolved":false,"context_lines":[{"line_number":1742,"context_line":"        results \u003d related_model_query.all()"},{"line_number":1743,"context_line":"        for result in results:"},{"line_number":1744,"context_line":"            LOG.debug(\u0027  \u003c%s(id\u003d%s)\u003e\u0027"},{"line_number":1745,"context_line":"                        % (type(result).__name__, result[\u0027id\u0027]))"},{"line_number":1746,"context_line":"        if not dry_run:"},{"line_number":1747,"context_line":"            related_model_query.delete()"},{"line_number":1748,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_bec73511","line":1745,"updated":"2015-07-27 15:47:01.000000000","message":"over indented, would actually fit on one line","commit_id":"f9a0bf5a198f8808dd39c906497e46aab8d17f5e"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"2ce665b31392c541c03ed3e35cb1b4de4ef49401","unresolved":false,"context_lines":[{"line_number":1788,"context_line":"            with session.begin():"},{"line_number":1789,"context_line":"                _instance_purge(context, session, dry_run, instance)"},{"line_number":1790,"context_line":"                deleted_instances +\u003d 1"},{"line_number":1791,"context_line":"            q_offset +\u003d CONF.osapi_max_limit"},{"line_number":1792,"context_line":"    return deleted_instances"},{"line_number":1793,"context_line":""},{"line_number":1794,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_8dca4da0","line":1791,"updated":"2015-07-27 11:03:10.000000000","message":"-1: thinking about it... we only need to offset in dry_run mode? as otherwise we expect the first batch to have been deleted by now\n\nI\u0027m assuming that SQLAlchemy requeries every time you hit line 1786; if it doesn\u0027t, we have a different problem that an unlimited number of rows are queried on line 1772.","commit_id":"f9a0bf5a198f8808dd39c906497e46aab8d17f5e"},{"author":{"_account_id":6608,"name":"Paul Carlton","email":"paul.carlton2@hpe.com","username":"paul-carlton2"},"change_message_id":"ee633867671f24c51163dab3309dd8b04d00fcef","unresolved":false,"context_lines":[{"line_number":1788,"context_line":"            with session.begin():"},{"line_number":1789,"context_line":"                _instance_purge(context, session, dry_run, instance)"},{"line_number":1790,"context_line":"                deleted_instances +\u003d 1"},{"line_number":1791,"context_line":"            q_offset +\u003d CONF.osapi_max_limit"},{"line_number":1792,"context_line":"    return deleted_instances"},{"line_number":1793,"context_line":""},{"line_number":1794,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_9b47eb76","line":1791,"updated":"2015-07-27 09:28:02.000000000","message":"shouldn\u0027t this be +\u003d limit","commit_id":"f9a0bf5a198f8808dd39c906497e46aab8d17f5e"},{"author":{"_account_id":16839,"name":"Cale Rath","email":"ctrath@us.ibm.com","username":"ctrath"},"change_message_id":"e5eab7bc3358b3e4b6913451b8bcd220785feea6","unresolved":false,"context_lines":[{"line_number":1788,"context_line":"            with session.begin():"},{"line_number":1789,"context_line":"                _instance_purge(context, session, dry_run, instance)"},{"line_number":1790,"context_line":"                deleted_instances +\u003d 1"},{"line_number":1791,"context_line":"            q_offset +\u003d CONF.osapi_max_limit"},{"line_number":1792,"context_line":"    return deleted_instances"},{"line_number":1793,"context_line":""},{"line_number":1794,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_e9e5fea7","line":1791,"in_reply_to":"3a50d1a3_8dca4da0","updated":"2015-07-27 13:23:48.000000000","message":"From what I understand, this moves the statement cursor in the DB and limit doesn\u0027t return all records and store them in memory for each read.  So, this should work in either instance.","commit_id":"f9a0bf5a198f8808dd39c906497e46aab8d17f5e"},{"author":{"_account_id":16839,"name":"Cale Rath","email":"ctrath@us.ibm.com","username":"ctrath"},"change_message_id":"e5eab7bc3358b3e4b6913451b8bcd220785feea6","unresolved":false,"context_lines":[{"line_number":1788,"context_line":"            with session.begin():"},{"line_number":1789,"context_line":"                _instance_purge(context, session, dry_run, instance)"},{"line_number":1790,"context_line":"                deleted_instances +\u003d 1"},{"line_number":1791,"context_line":"            q_offset +\u003d CONF.osapi_max_limit"},{"line_number":1792,"context_line":"    return deleted_instances"},{"line_number":1793,"context_line":""},{"line_number":1794,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_a9b616da","line":1791,"in_reply_to":"3a50d1a3_9b47eb76","updated":"2015-07-27 13:23:48.000000000","message":"I thought about that too.. Either will work.  For instance, if there are only 200 instances, and osapi_max_limit is 1000, only 200 instances will be returned.  On the next iteration of the loop, q_offset is going to be 1000, but the loop won\u0027t be iterated over again, since we have already read all of the instances.","commit_id":"f9a0bf5a198f8808dd39c906497e46aab8d17f5e"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"8fe2b77797a5af47f74d107fbb9ae8cb66e3d8bb","unresolved":false,"context_lines":[{"line_number":1788,"context_line":"            with session.begin():"},{"line_number":1789,"context_line":"                _instance_purge(context, session, dry_run, instance)"},{"line_number":1790,"context_line":"                deleted_instances +\u003d 1"},{"line_number":1791,"context_line":"            q_offset +\u003d CONF.osapi_max_limit"},{"line_number":1792,"context_line":"    return deleted_instances"},{"line_number":1793,"context_line":""},{"line_number":1794,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_f9d03755","line":1791,"in_reply_to":"3a50d1a3_e9e5fea7","updated":"2015-07-28 12:04:26.000000000","message":"Right, cursors. Been awhile since I did DB stuff!","commit_id":"f9a0bf5a198f8808dd39c906497e46aab8d17f5e"},{"author":{"_account_id":8264,"name":"Shunli Zhou","username":"ShunliZhou"},"change_message_id":"0c87070c7e7c0f2c21d9fa196d22c4b1e46cfc04","unresolved":false,"context_lines":[{"line_number":1743,"context_line":"            LOG.debug(\u0027  \u003c%s(id\u003d%s)\u003e\u0027"},{"line_number":1744,"context_line":"                        % (type(result).__name__, result[\u0027id\u0027]))"},{"line_number":1745,"context_line":"        if not dry_run:"},{"line_number":1746,"context_line":"            related_model_query.delete()"},{"line_number":1747,"context_line":""},{"line_number":1748,"context_line":"    tags_query \u003d model_query(context,"},{"line_number":1749,"context_line":"                             models.Tag, session\u003dsession).\\"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_9935efa9","line":1746,"updated":"2015-08-14 09:27:29.000000000","message":"I also encountered below error. I guess need to delete instance_actions_events  before delete instance_action:\n\nTRACE nova DBError: (IntegrityError) (1451, \u0027Cannot delete or update a parent row: a foreign key constraint fails (`nova`.`instance_actions_events`, CONSTRAINT `instance_actions_events_ibfk_1` FOREIGN KEY (`action_id`) REFERENCES `instance_actions` (`id`))\u0027) \u0027DELETE FROM instance_actions WHERE instance_actions.instance_uuid \u003d %s\u0027 (\u00272fb06f9f-9bc9-4a74-a57a-0104156030c5\u0027,)","commit_id":"e27b62d7c872d0d26b07e5a4690dc318bc9764af"},{"author":{"_account_id":16839,"name":"Cale Rath","email":"ctrath@us.ibm.com","username":"ctrath"},"change_message_id":"8f900c9d5cc8162b87cbef2b3d46e1cd7508273b","unresolved":false,"context_lines":[{"line_number":1743,"context_line":"            LOG.debug(\u0027  \u003c%s(id\u003d%s)\u003e\u0027"},{"line_number":1744,"context_line":"                        % (type(result).__name__, result[\u0027id\u0027]))"},{"line_number":1745,"context_line":"        if not dry_run:"},{"line_number":1746,"context_line":"            related_model_query.delete()"},{"line_number":1747,"context_line":""},{"line_number":1748,"context_line":"    tags_query \u003d model_query(context,"},{"line_number":1749,"context_line":"                             models.Tag, session\u003dsession).\\"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa1b9901_5967bce8","line":1746,"in_reply_to":"1a4dcd0f_9935efa9","updated":"2015-08-20 18:59:45.000000000","message":"Done","commit_id":"e27b62d7c872d0d26b07e5a4690dc318bc9764af"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9cedec28c10aa7b162d8c2a3900d2a9f8739020a","unresolved":false,"context_lines":[{"line_number":1743,"context_line":"            LOG.debug(\u0027  \u003c%s(id\u003d%s)\u003e\u0027"},{"line_number":1744,"context_line":"                        % (type(result).__name__, result[\u0027id\u0027]))"},{"line_number":1745,"context_line":"        if not dry_run:"},{"line_number":1746,"context_line":"            related_model_query.delete()"},{"line_number":1747,"context_line":""},{"line_number":1748,"context_line":"    tags_query \u003d model_query(context,"},{"line_number":1749,"context_line":"                             models.Tag, session\u003dsession).\\"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa1b9901_f9ee458a","line":1746,"in_reply_to":"1a4dcd0f_9935efa9","updated":"2015-08-18 19:55:18.000000000","message":"Yeah that came up in the spec review:\n\nhttps://review.openstack.org/#/c/184645/13/specs/backlog/approved/no-more-soft-delete.rst\n\nI missed that since it\u0027s not in the data model as a table with a foreign key back to the instances table.","commit_id":"e27b62d7c872d0d26b07e5a4690dc318bc9764af"},{"author":{"_account_id":16839,"name":"Cale Rath","email":"ctrath@us.ibm.com","username":"ctrath"},"change_message_id":"8f900c9d5cc8162b87cbef2b3d46e1cd7508273b","unresolved":false,"context_lines":[{"line_number":1743,"context_line":"            LOG.debug(\u0027  \u003c%s(id\u003d%s)\u003e\u0027"},{"line_number":1744,"context_line":"                        % (type(result).__name__, result[\u0027id\u0027]))"},{"line_number":1745,"context_line":"        if not dry_run:"},{"line_number":1746,"context_line":"            related_model_query.delete()"},{"line_number":1747,"context_line":""},{"line_number":1748,"context_line":"    tags_query \u003d model_query(context,"},{"line_number":1749,"context_line":"                             models.Tag, session\u003dsession).\\"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa1b9901_195dc414","line":1746,"in_reply_to":"fa1b9901_f9ee458a","updated":"2015-08-20 18:59:45.000000000","message":"Done","commit_id":"e27b62d7c872d0d26b07e5a4690dc318bc9764af"},{"author":{"_account_id":8264,"name":"Shunli Zhou","username":"ShunliZhou"},"change_message_id":"36ee335fd894843a9ceb2645d474cf52c2ce348e","unresolved":false,"context_lines":[{"line_number":1765,"context_line":"def instances_purge_deleted(context, dry_run\u003dFalse, older_than\u003d90,"},{"line_number":1766,"context_line":"                            max_number\u003dNone):"},{"line_number":1767,"context_line":"    purge_before_datetime \u003d timeutils.utcnow() - \\"},{"line_number":1768,"context_line":"                            datetime.timedelta(days\u003dolder_than)"},{"line_number":1769,"context_line":"    session \u003d get_session()"},{"line_number":1770,"context_line":"    deleted_instances \u003d 0"},{"line_number":1771,"context_line":"    instance_query \u003d model_query(context, models.Instance, session\u003dsession).\\"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_627074dd","line":1768,"updated":"2015-08-14 08:06:44.000000000","message":"\"old_than\" get from the CLI maybe a unicode string, pass to timedelta will cause an exception.","commit_id":"e27b62d7c872d0d26b07e5a4690dc318bc9764af"},{"author":{"_account_id":16839,"name":"Cale Rath","email":"ctrath@us.ibm.com","username":"ctrath"},"change_message_id":"8f900c9d5cc8162b87cbef2b3d46e1cd7508273b","unresolved":false,"context_lines":[{"line_number":1765,"context_line":"def instances_purge_deleted(context, dry_run\u003dFalse, older_than\u003d90,"},{"line_number":1766,"context_line":"                            max_number\u003dNone):"},{"line_number":1767,"context_line":"    purge_before_datetime \u003d timeutils.utcnow() - \\"},{"line_number":1768,"context_line":"                            datetime.timedelta(days\u003dolder_than)"},{"line_number":1769,"context_line":"    session \u003d get_session()"},{"line_number":1770,"context_line":"    deleted_instances \u003d 0"},{"line_number":1771,"context_line":"    instance_query \u003d model_query(context, models.Instance, session\u003dsession).\\"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa1b9901_d9a18cf9","line":1768,"in_reply_to":"1a4dcd0f_627074dd","updated":"2015-08-20 18:59:45.000000000","message":"Done","commit_id":"e27b62d7c872d0d26b07e5a4690dc318bc9764af"},{"author":{"_account_id":8264,"name":"Shunli Zhou","username":"ShunliZhou"},"change_message_id":"36ee335fd894843a9ceb2645d474cf52c2ce348e","unresolved":false,"context_lines":[{"line_number":1778,"context_line":"    while more_instances:"},{"line_number":1779,"context_line":"        more_instances \u003d False"},{"line_number":1780,"context_line":"        if max_number is not None:"},{"line_number":1781,"context_line":"            if deleted_instances \u003e\u003d max_number:"},{"line_number":1782,"context_line":"                break"},{"line_number":1783,"context_line":"            if limit \u003e (max_number - deleted_instances):"},{"line_number":1784,"context_line":"                limit \u003d max_number - deleted_instances"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a4dcd0f_a5020608","line":1781,"updated":"2015-08-14 08:06:44.000000000","message":"ditto, compare integer with string will lead to error result","commit_id":"e27b62d7c872d0d26b07e5a4690dc318bc9764af"},{"author":{"_account_id":16839,"name":"Cale Rath","email":"ctrath@us.ibm.com","username":"ctrath"},"change_message_id":"8f900c9d5cc8162b87cbef2b3d46e1cd7508273b","unresolved":false,"context_lines":[{"line_number":1778,"context_line":"    while more_instances:"},{"line_number":1779,"context_line":"        more_instances \u003d False"},{"line_number":1780,"context_line":"        if max_number is not None:"},{"line_number":1781,"context_line":"            if deleted_instances \u003e\u003d max_number:"},{"line_number":1782,"context_line":"                break"},{"line_number":1783,"context_line":"            if limit \u003e (max_number - deleted_instances):"},{"line_number":1784,"context_line":"                limit \u003d max_number - deleted_instances"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa1b9901_39b3e851","line":1781,"in_reply_to":"1a4dcd0f_a5020608","updated":"2015-08-20 18:59:45.000000000","message":"Done","commit_id":"e27b62d7c872d0d26b07e5a4690dc318bc9764af"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"ede6cd819d9f8a7ca11cc1918f7bff51eb359bed","unresolved":false,"context_lines":[{"line_number":1750,"context_line":"                # foreign key to the instance_actions table must be first"},{"line_number":1751,"context_line":"                # deleted prior to deleting the related field in"},{"line_number":1752,"context_line":"                # the instance_actions table"},{"line_number":1753,"context_line":"                instance_action_events_query \u003d model_query(context,"},{"line_number":1754,"context_line":"                                                models.InstanceActionEvent,"},{"line_number":1755,"context_line":"                                                session\u003dsession).\\"},{"line_number":1756,"context_line":"                                                filter_by(action_id\u003d"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_6cfc6872","line":1753,"updated":"2015-09-29 13:36:50.000000000","message":"We\u0027re running this query once per InstanceAction. Could we do something like this?\n\n  iae_ids \u003d [x[\u0027id\u0027] for x in related_model_query_results\n             if isinstance(x, models.InstanceAction)]\n  iae_q \u003d model_query(context, models.InstanceActionEvent, session\u003dsession).\\\n          filter_by(action_id in iae_ids)","commit_id":"22512dee3accb87fa35b19a63d67fd1996dc8418"},{"author":{"_account_id":16839,"name":"Cale Rath","email":"ctrath@us.ibm.com","username":"ctrath"},"change_message_id":"de561c1bf4573dc6e708aa37605f7b3bd78bb3c4","unresolved":false,"context_lines":[{"line_number":1750,"context_line":"                # foreign key to the instance_actions table must be first"},{"line_number":1751,"context_line":"                # deleted prior to deleting the related field in"},{"line_number":1752,"context_line":"                # the instance_actions table"},{"line_number":1753,"context_line":"                instance_action_events_query \u003d model_query(context,"},{"line_number":1754,"context_line":"                                                models.InstanceActionEvent,"},{"line_number":1755,"context_line":"                                                session\u003dsession).\\"},{"line_number":1756,"context_line":"                                                filter_by(action_id\u003d"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_3f91a7f1","line":1753,"in_reply_to":"9a1a9d01_6cfc6872","updated":"2015-10-08 16:12:31.000000000","message":"Done","commit_id":"22512dee3accb87fa35b19a63d67fd1996dc8418"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"ede6cd819d9f8a7ca11cc1918f7bff51eb359bed","unresolved":false,"context_lines":[{"line_number":1791,"context_line":"    except exception.InvalidInput as e:"},{"line_number":1792,"context_line":"        raise exception.InvalidInput(message\u003de.format_message())"},{"line_number":1793,"context_line":""},{"line_number":1794,"context_line":"    purge_before_datetime \u003d timeutils.utcnow() - \\"},{"line_number":1795,"context_line":"                            datetime.timedelta(days\u003dolder_than)"},{"line_number":1796,"context_line":"    session \u003d get_session()"},{"line_number":1797,"context_line":"    deleted_instances \u003d 0"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_c77b0f8b","line":1794,"range":{"start_line":1794,"start_character":16,"end_line":1794,"end_character":25},"updated":"2015-09-29 13:36:50.000000000","message":"nit: don\u0027t need type info in the var name","commit_id":"22512dee3accb87fa35b19a63d67fd1996dc8418"},{"author":{"_account_id":16839,"name":"Cale Rath","email":"ctrath@us.ibm.com","username":"ctrath"},"change_message_id":"de561c1bf4573dc6e708aa37605f7b3bd78bb3c4","unresolved":false,"context_lines":[{"line_number":1791,"context_line":"    except exception.InvalidInput as e:"},{"line_number":1792,"context_line":"        raise exception.InvalidInput(message\u003de.format_message())"},{"line_number":1793,"context_line":""},{"line_number":1794,"context_line":"    purge_before_datetime \u003d timeutils.utcnow() - \\"},{"line_number":1795,"context_line":"                            datetime.timedelta(days\u003dolder_than)"},{"line_number":1796,"context_line":"    session \u003d get_session()"},{"line_number":1797,"context_line":"    deleted_instances \u003d 0"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_9faf9b29","line":1794,"in_reply_to":"9a1a9d01_c77b0f8b","updated":"2015-10-08 16:12:31.000000000","message":"Done","commit_id":"22512dee3accb87fa35b19a63d67fd1996dc8418"},{"author":{"_account_id":8264,"name":"Shunli Zhou","username":"ShunliZhou"},"change_message_id":"0c1bdb63f4a4d4b67bd7dd93838e9a62f1eddb53","unresolved":false,"context_lines":[{"line_number":1814,"context_line":"            with session.begin():"},{"line_number":1815,"context_line":"                _instance_purge(context, session, dry_run, instance)"},{"line_number":1816,"context_line":"                deleted_instances +\u003d 1"},{"line_number":1817,"context_line":"            q_offset +\u003d CONF.osapi_max_limit"},{"line_number":1818,"context_line":"    return deleted_instances"},{"line_number":1819,"context_line":""},{"line_number":1820,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_2e65481c","line":1817,"updated":"2015-09-10 03:08:32.000000000","message":"seems this line is over indented. if aged instances over than max_limit, only max_limit aged instances will be deleted. Need to execute more times to delete other instances.","commit_id":"22512dee3accb87fa35b19a63d67fd1996dc8418"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"ede6cd819d9f8a7ca11cc1918f7bff51eb359bed","unresolved":false,"context_lines":[{"line_number":1814,"context_line":"            with session.begin():"},{"line_number":1815,"context_line":"                _instance_purge(context, session, dry_run, instance)"},{"line_number":1816,"context_line":"                deleted_instances +\u003d 1"},{"line_number":1817,"context_line":"            q_offset +\u003d CONF.osapi_max_limit"},{"line_number":1818,"context_line":"    return deleted_instances"},{"line_number":1819,"context_line":""},{"line_number":1820,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_c706af1c","line":1817,"in_reply_to":"da20952f_2e65481c","updated":"2015-09-29 13:36:50.000000000","message":"+1","commit_id":"22512dee3accb87fa35b19a63d67fd1996dc8418"},{"author":{"_account_id":16839,"name":"Cale Rath","email":"ctrath@us.ibm.com","username":"ctrath"},"change_message_id":"de561c1bf4573dc6e708aa37605f7b3bd78bb3c4","unresolved":false,"context_lines":[{"line_number":1814,"context_line":"            with session.begin():"},{"line_number":1815,"context_line":"                _instance_purge(context, session, dry_run, instance)"},{"line_number":1816,"context_line":"                deleted_instances +\u003d 1"},{"line_number":1817,"context_line":"            q_offset +\u003d CONF.osapi_max_limit"},{"line_number":1818,"context_line":"    return deleted_instances"},{"line_number":1819,"context_line":""},{"line_number":1820,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_3fa8c71f","line":1817,"in_reply_to":"da20952f_2e65481c","updated":"2015-10-08 16:12:31.000000000","message":"Done","commit_id":"22512dee3accb87fa35b19a63d67fd1996dc8418"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"11afe522558c3ee9b896404863a76ff96fa2daa0","unresolved":false,"context_lines":[{"line_number":128,"context_line":"CONF.register_opts(oslo_db_options.database_opts, \u0027database\u0027)"},{"line_number":129,"context_line":"CONF.register_opts(api_db_opts, group\u003d\u0027api_database\u0027)"},{"line_number":130,"context_line":"CONF.import_opt(\u0027until_refresh\u0027, \u0027nova.quota\u0027)"},{"line_number":131,"context_line":"CONF.import_opt(\u0027osapi_max_limit\u0027, \u0027nova.api.openstack.common\u0027)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"5a2ca52d_ed3504da","line":131,"updated":"2015-10-15 08:24:34.000000000","message":"I think this option is specific for api pagination.","commit_id":"137af11dd1a6963b5db491521fa0d29081193b61"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"816a6f7b17febf45e3721b9e4223584f08f7a282","unresolved":false,"context_lines":[{"line_number":128,"context_line":"CONF.register_opts(oslo_db_options.database_opts, \u0027database\u0027)"},{"line_number":129,"context_line":"CONF.register_opts(api_db_opts, group\u003d\u0027api_database\u0027)"},{"line_number":130,"context_line":"CONF.import_opt(\u0027until_refresh\u0027, \u0027nova.quota\u0027)"},{"line_number":131,"context_line":"CONF.import_opt(\u0027osapi_max_limit\u0027, \u0027nova.api.openstack.common\u0027)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"da85f559_88189076","line":131,"in_reply_to":"5a2ca52d_ed3504da","updated":"2015-11-11 19:20:07.000000000","message":"Is there a problem in re-using it here?  The idea is the same I believe, and the limit from the API is what\u0027s passed down to the DB API during paging, right?","commit_id":"137af11dd1a6963b5db491521fa0d29081193b61"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"71b8f74ec06097d5fd37c1aeffe1dd46c7211a32","unresolved":false,"context_lines":[{"line_number":128,"context_line":"CONF.register_opts(oslo_db_options.database_opts, \u0027database\u0027)"},{"line_number":129,"context_line":"CONF.register_opts(api_db_opts, group\u003d\u0027api_database\u0027)"},{"line_number":130,"context_line":"CONF.import_opt(\u0027until_refresh\u0027, \u0027nova.quota\u0027)"},{"line_number":131,"context_line":"CONF.import_opt(\u0027osapi_max_limit\u0027, \u0027nova.api.openstack.common\u0027)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"da85f559_0a2481c2","line":131,"in_reply_to":"da85f559_88189076","updated":"2015-11-12 05:32:27.000000000","message":"yea, looks like re-using it make sense. I just think about people may just have different configuration for api and this manage command. After rethinking looks like fine, re-using is more easy for user.","commit_id":"137af11dd1a6963b5db491521fa0d29081193b61"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"11afe522558c3ee9b896404863a76ff96fa2daa0","unresolved":false,"context_lines":[{"line_number":1727,"context_line":"              % (instance[\u0027uuid\u0027], instance[\u0027name\u0027],"},{"line_number":1728,"context_line":"                 instance[\u0027deleted_at\u0027]))"},{"line_number":1729,"context_line":""},{"line_number":1730,"context_line":"    related_instance_models \u003d [models.SecurityGroupInstanceAssociation,"},{"line_number":1731,"context_line":"                               models.InstanceInfoCache,"},{"line_number":1732,"context_line":"                               models.InstanceMetadata,"},{"line_number":1733,"context_line":"                               models.InstanceFault,"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a2ca52d_2ddf7c6a","line":1730,"updated":"2015-10-15 08:24:34.000000000","message":"Is it possible we iterate the table metadata to get the list instead of hard-code one? Because after we added new table, people may forget add new entry at here.","commit_id":"137af11dd1a6963b5db491521fa0d29081193b61"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"816a6f7b17febf45e3721b9e4223584f08f7a282","unresolved":false,"context_lines":[{"line_number":1727,"context_line":"              % (instance[\u0027uuid\u0027], instance[\u0027name\u0027],"},{"line_number":1728,"context_line":"                 instance[\u0027deleted_at\u0027]))"},{"line_number":1729,"context_line":""},{"line_number":1730,"context_line":"    related_instance_models \u003d [models.SecurityGroupInstanceAssociation,"},{"line_number":1731,"context_line":"                               models.InstanceInfoCache,"},{"line_number":1732,"context_line":"                               models.InstanceMetadata,"},{"line_number":1733,"context_line":"                               models.InstanceFault,"}],"source_content_type":"text/x-python","patch_set":14,"id":"da85f559_4d1f1a6c","line":1730,"in_reply_to":"5a2ca52d_2ddf7c6a","updated":"2015-11-11 19:20:07.000000000","message":"Might be able to do something using metadata like is done in this database migration:\n\nhttps://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/migrate_repo/versions/267_instance_uuid_non_nullable.py\n\nIt keys off the instance_uuid column in related tables (reverse sorted so we don\u0027t have FKey issues on delete), and then processes the instances table last.","commit_id":"137af11dd1a6963b5db491521fa0d29081193b61"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"850840ffdf4900d3a8b1d0c0d9aaacf704591d66","unresolved":false,"context_lines":[{"line_number":1747,"context_line":"                                filter_by(instance_uuid\u003dinstance[\u0027uuid\u0027])"},{"line_number":1748,"context_line":"        results \u003d related_model_query.all()"},{"line_number":1749,"context_line":""},{"line_number":1750,"context_line":"        if related_instance_model \u003d\u003d models.InstanceAction and \\"},{"line_number":1751,"context_line":"            len(results) \u003e 0:"},{"line_number":1752,"context_line":"            _instance_action_events_purge(context, session, dry_run, results)"},{"line_number":1753,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba8a016a_06a91c7b","line":1750,"updated":"2015-11-18 15:55:13.000000000","message":"Per the ML thread here:\n\nhttp://lists.openstack.org/pipermail/openstack-dev/2015-November/079701.html\n\nHow is this deleting instance_actions since we don\u0027t soft delete instance_actions?  The problem I\u0027m running into with archive is that instances are soft deleted but instance_actions aren\u0027t, and the instance_actions have a foreign key back to instances, so when we try to hard delete the instances it fails b/c of the ref to instance_actions (which aren\u0027t deleted).\n\nI\u0027m assuming this is all passing b/c your tests are either not creating related instance_actions or they are getting soft deleted in your test setup before calling this?","commit_id":"137af11dd1a6963b5db491521fa0d29081193b61"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"89fb4208efc8499a2f8e060a4b57161ca80e7d28","unresolved":false,"context_lines":[{"line_number":1747,"context_line":"                                filter_by(instance_uuid\u003dinstance[\u0027uuid\u0027])"},{"line_number":1748,"context_line":"        results \u003d related_model_query.all()"},{"line_number":1749,"context_line":""},{"line_number":1750,"context_line":"        if related_instance_model \u003d\u003d models.InstanceAction and \\"},{"line_number":1751,"context_line":"            len(results) \u003e 0:"},{"line_number":1752,"context_line":"            _instance_action_events_purge(context, session, dry_run, results)"},{"line_number":1753,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba8a016a_a654bbfd","line":1750,"in_reply_to":"ba8a016a_06a91c7b","updated":"2015-11-18 22:52:38.000000000","message":"Yup, see what I\u0027m doing here:\n\nhttps://review.openstack.org/#/c/246635/\n\nYou have to configure sqlite to enforce foreign keys in the tests.","commit_id":"137af11dd1a6963b5db491521fa0d29081193b61"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"2344c77d9f1dc2a0ebe4fef706653d8bc48b563f","unresolved":false,"context_lines":[{"line_number":1775,"context_line":"    :param model: The model in which the query represents"},{"line_number":1776,"context_line":"    :param context: DB context"},{"line_number":1777,"context_line":"    :param session: DB session"},{"line_number":1778,"context_line":"    :param dry_run: If true, don\u0027t perform an actual delete"},{"line_number":1779,"context_line":"    :return:"},{"line_number":1780,"context_line":"    \"\"\""},{"line_number":1781,"context_line":"    fks \u003d _related_fks_get(model.__tablename__)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a68dd71_2f3f6425","line":1778,"updated":"2016-01-22 15:31:05.000000000","message":"doc max_number?","commit_id":"ad30e795f0e310fe619a1a723c87ba6c4f455614"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"2344c77d9f1dc2a0ebe4fef706653d8bc48b563f","unresolved":false,"context_lines":[{"line_number":1780,"context_line":"    \"\"\""},{"line_number":1781,"context_line":"    fks \u003d _related_fks_get(model.__tablename__)"},{"line_number":1782,"context_line":""},{"line_number":1783,"context_line":"    q_offset \u003d 0"},{"line_number":1784,"context_line":"    limit \u003d 50"},{"line_number":1785,"context_line":"    while True:"},{"line_number":1786,"context_line":"        if max_number is not None:"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a68dd71_cfe328a3","line":1783,"updated":"2016-01-22 15:31:05.000000000","message":"nit: why q_offset not just offset?","commit_id":"ad30e795f0e310fe619a1a723c87ba6c4f455614"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"2344c77d9f1dc2a0ebe4fef706653d8bc48b563f","unresolved":false,"context_lines":[{"line_number":1823,"context_line":"                                                          session\u003dsession).\\"},{"line_number":1824,"context_line":"                                                filter(method_attr.in_(fk_ids))"},{"line_number":1825,"context_line":"                        _purge_records(related_model_query, model_class,"},{"line_number":1826,"context_line":"                                       context, session, dry_run)"},{"line_number":1827,"context_line":""},{"line_number":1828,"context_line":"        # The original \u0027query\u0027 can\u0027t be used for delete because a delete"},{"line_number":1829,"context_line":"        # is not allowed when a limit is set.  Therefore, here I generate a"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a68dd71_2a3af2cc","line":1826,"updated":"2016-01-22 15:31:05.000000000","message":"Can 1801-1826 be a separate method?","commit_id":"ad30e795f0e310fe619a1a723c87ba6c4f455614"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"2344c77d9f1dc2a0ebe4fef706653d8bc48b563f","unresolved":false,"context_lines":[{"line_number":1835,"context_line":"        for pk_column in pk_columns:"},{"line_number":1836,"context_line":"            pk_attr \u003d getattr(model, pk_column)"},{"line_number":1837,"context_line":"            delete_query \u003d delete_query.filter("},{"line_number":1838,"context_line":"                pk_attr.in_([x[pk_column] for x in results]))"},{"line_number":1839,"context_line":""},{"line_number":1840,"context_line":"        if not dry_run:"},{"line_number":1841,"context_line":"            delete_query.delete(synchronize_session\u003d\u0027fetch\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a68dd71_ca01d6b0","line":1838,"updated":"2016-01-22 15:31:05.000000000","message":"so if we have PK columns PKA and PKB, with results [(\u0027A1\u0027, \u0027B1\u0027), (\u0027A2\u0027, \u0027B2\u0027)]. Won\u0027t that generate something like:\n\n  delete from \u003cmodel\u003e m where m.pka in (\u0027A1\u0027, \u0027A2\u0027) and m.pkb in (\u0027B1\u0027, \u0027B2\u0027);\n\nResulting in the inadvertent deletion of row (\u0027A1\u0027, \u0027B2\u0027)?","commit_id":"ad30e795f0e310fe619a1a723c87ba6c4f455614"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"2344c77d9f1dc2a0ebe4fef706653d8bc48b563f","unresolved":false,"context_lines":[{"line_number":1838,"context_line":"                pk_attr.in_([x[pk_column] for x in results]))"},{"line_number":1839,"context_line":""},{"line_number":1840,"context_line":"        if not dry_run:"},{"line_number":1841,"context_line":"            delete_query.delete(synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":1842,"context_line":"    return q_offset"},{"line_number":1843,"context_line":""},{"line_number":1844,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9a68dd71_6a5a2a2c","line":1841,"updated":"2016-01-22 15:31:05.000000000","message":"same 1828-1841","commit_id":"ad30e795f0e310fe619a1a723c87ba6c4f455614"},{"author":{"_account_id":20191,"name":"Dinesh Bhor","email":"bhordinesh07@gmail.com","username":"dineshbhor"},"change_message_id":"69095ffab10ec105cde422c538e87164ae3c02da","unresolved":false,"context_lines":[{"line_number":1844,"context_line":""},{"line_number":1845,"context_line":"def instances_purge_deleted(context, dry_run\u003dFalse, older_than\u003d90,"},{"line_number":1846,"context_line":"                            max_number\u003dNone):"},{"line_number":1847,"context_line":"    purge_before \u003d timeutils.utcnow() - datetime.timedelta(days\u003dolder_than)"},{"line_number":1848,"context_line":"    session \u003d get_session()"},{"line_number":1849,"context_line":"    instance_query \u003d model_query(context, models.Instance, session\u003dsession).\\"},{"line_number":1850,"context_line":"                         filter(and_(models.Instance.deleted !\u003d 0,"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a122d0e_357eb5ae","line":1847,"range":{"start_line":1847,"start_character":59,"end_line":1847,"end_character":74},"updated":"2016-04-22 13:29:08.000000000","message":"Looks like type validation for --max-number and --older-than is not done.\nFor ex.\nCommand:\nnova-manage db purge_deleted_instances --older-than 10\n\t\nOutput error:\n2016-04-19 11:17:32.693 TRACE nova TypeError: unsupported type for timedelta days component: unicode\n\t\nCommand: \nnova-manage db purge_deleted_instances --max-number 3\n\t\nOutput error:\n2016-04-19 13:22:44.398 TRACE nova TypeError: unsupported operand type(s) for -: \u0027unicode\u0027 and \u0027int\u0027\n\t\nCommand line arguments are unicode string\u0027s, they needs to be converted to expected types before processing.","commit_id":"ad30e795f0e310fe619a1a723c87ba6c4f455614"}]}
