)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"7faa0ecae95e3e2d156a830c8170ebb44a0235fb","unresolved":false,"context_lines":[{"line_number":14,"context_line":"groups and from cgsnapshots to group_snapshots. Migrated consistency"},{"line_number":15,"context_line":"groups and cgsnapshots will be removed from the database."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"It depends on the following patch that adds generic code for"},{"line_number":18,"context_line":"online data migrations:"},{"line_number":19,"context_line":"    https://review.openstack.org/#/c/330391/"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Run the following command to migrate CGs:"},{"line_number":22,"context_line":"    cinder-manage db online_data_migrations"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":27,"id":"1a6eadb0_380b817e","line":19,"range":{"start_line":17,"start_character":0,"end_line":19,"end_character":44},"updated":"2016-12-16 15:03:10.000000000","message":"I don\u0027t think this is useful as git tree provides same info, but no it\u0027s no harm.","commit_id":"dd62f4428645a4cadaec6007714264845595f940"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9cc41c375b79d790957be38ea4cc7f65187161b1","unresolved":false,"context_lines":[{"line_number":14,"context_line":"groups and from cgsnapshots to group_snapshots. Migrated consistency"},{"line_number":15,"context_line":"groups and cgsnapshots will be removed from the database."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"It depends on the following patch that adds generic code for"},{"line_number":18,"context_line":"online data migrations:"},{"line_number":19,"context_line":"    https://review.openstack.org/#/c/330391/"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Run the following command to migrate CGs:"},{"line_number":22,"context_line":"    cinder-manage db online_data_migrations"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":27,"id":"1a6eadb0_c95481cb","line":19,"range":{"start_line":17,"start_character":0,"end_line":19,"end_character":44},"in_reply_to":"1a6eadb0_380b817e","updated":"2016-12-16 16:09:18.000000000","message":"This is just easy for people to look without searching in the git tree.  At least it is helpful for myself.","commit_id":"dd62f4428645a4cadaec6007714264845595f940"}],"cinder/cmd/manage.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"68e3ffa4e6abaf0de9b62559e58d68148dbb1f60","unresolved":false,"context_lines":[{"line_number":208,"context_line":"class DbCommands(object):"},{"line_number":209,"context_line":"    \"\"\"Class for managing the database.\"\"\""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    online_migrations \u003d (db.migrate_consistencygroups_to_groups)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def __init__(self):"},{"line_number":214,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a629dbe_e9c89324","line":211,"range":{"start_line":211,"start_character":0,"end_line":211,"end_character":64},"updated":"2016-11-10 14:37:18.000000000","message":"This will get evaluated by dropping the parentheses. You either need\n\n    online_migrations \u003d (db.migrate_consistencygroups_to_groups,)\n\nor\n\n    online_migrations \u003d [db.migrate_consistencygroups_to_groups]","commit_id":"0e8edd6496c91c00e5cd2b053e689e5e4f73be23"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"5412678b08ead8617e86a8d283712d25a435558c","unresolved":false,"context_lines":[{"line_number":208,"context_line":"class DbCommands(object):"},{"line_number":209,"context_line":"    \"\"\"Class for managing the database.\"\"\""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    online_migrations \u003d (db.migrate_consistencygroups_to_groups)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def __init__(self):"},{"line_number":214,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a629dbe_810b5423","line":211,"range":{"start_line":211,"start_character":0,"end_line":211,"end_character":64},"in_reply_to":"9a629dbe_e9c89324","updated":"2016-11-11 04:52:05.000000000","message":"Done","commit_id":"0e8edd6496c91c00e5cd2b053e689e5e4f73be23"}],"cinder/db/sqlalchemy/api.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"151fb3b19f50b695a0bf487bb0be4df523a5859e","unresolved":false,"context_lines":[{"line_number":5530,"context_line":"            }"},{"line_number":5531,"context_line":"            grp_specs \u003d models.GroupTypeSpecs()"},{"line_number":5532,"context_line":"            grp_specs.update(group_spec_dicts)"},{"line_number":5533,"context_line":"            session.add(grp_specs)"},{"line_number":5534,"context_line":""},{"line_number":5535,"context_line":"    count_all \u003d 0"},{"line_number":5536,"context_line":"    count_hit \u003d 0"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a629dbe_07c8e273","line":5533,"updated":"2016-11-15 21:25:41.000000000","message":"I have the same thought:).  Moved to a regular DB migration.","commit_id":"9fddaf7707e77a049b05f9454264aa922ffeba6c"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"15e4f1d4e55d54cf056b1cc819d7e7f5b4d12a5e","unresolved":false,"context_lines":[{"line_number":5489,"context_line":"    query \u003d model_query(context, models.ConsistencyGroup)"},{"line_number":5490,"context_line":"    cgs \u003d query.limit(max_count)"},{"line_number":5491,"context_line":""},{"line_number":5492,"context_line":"    # Create a default group_type for migrating cgsnapshots"},{"line_number":5493,"context_line":"    session \u003d get_session()"},{"line_number":5494,"context_line":"    grp_type_id \u003d None"},{"line_number":5495,"context_line":"    with session.begin():"},{"line_number":5496,"context_line":"        result \u003d (model_query(context, models.GroupTypes,"},{"line_number":5497,"context_line":"                              project_only\u003dTrue)."},{"line_number":5498,"context_line":"                  filter_by(name\u003d\u0027default_cgsnapshot_type\u0027)."},{"line_number":5499,"context_line":"                  first())"},{"line_number":5500,"context_line":"        if not result:"},{"line_number":5501,"context_line":"            grp_type_id \u003d six.text_type(uuid.uuid4())"},{"line_number":5502,"context_line":"            group_type_dicts \u003d {"},{"line_number":5503,"context_line":"                \u0027id\u0027: grp_type_id,"},{"line_number":5504,"context_line":"                \u0027name\u0027: \u0027default_cgsnapshot_type\u0027,"},{"line_number":5505,"context_line":"                \u0027description\u0027: \u0027Default group type for migrating cgsnapshot\u0027,"},{"line_number":5506,"context_line":"                \u0027created_at\u0027: now,"},{"line_number":5507,"context_line":"                \u0027updated_at\u0027: now,"},{"line_number":5508,"context_line":"                \u0027deleted\u0027: False,"},{"line_number":5509,"context_line":"                \u0027is_public\u0027: True,"},{"line_number":5510,"context_line":"            }"},{"line_number":5511,"context_line":"            grp_type \u003d models.GroupTypes()"},{"line_number":5512,"context_line":"            grp_type.update(group_type_dicts)"},{"line_number":5513,"context_line":"            session.add(grp_type)"},{"line_number":5514,"context_line":"        else:"},{"line_number":5515,"context_line":"            grp_type_id \u003d result[\u0027id\u0027]"},{"line_number":5516,"context_line":""},{"line_number":5517,"context_line":"        results \u003d (model_query(context, models.GroupTypeSpecs,"},{"line_number":5518,"context_line":"                               project_only\u003dTrue)."},{"line_number":5519,"context_line":"                   filter_by(group_type_id\u003dgrp_type_id)."},{"line_number":5520,"context_line":"                   first())"},{"line_number":5521,"context_line":""},{"line_number":5522,"context_line":"        if not results:"},{"line_number":5523,"context_line":"            group_spec_dicts \u003d {"},{"line_number":5524,"context_line":"                \u0027key\u0027: \u0027consistent_group_snapshot_enabled\u0027,"},{"line_number":5525,"context_line":"                \u0027value\u0027: \u0027\u003cis\u003e True\u0027,"},{"line_number":5526,"context_line":"                \u0027group_type_id\u0027: grp_type_id,"},{"line_number":5527,"context_line":"                \u0027created_at\u0027: now,"},{"line_number":5528,"context_line":"                \u0027updated_at\u0027: now,"},{"line_number":5529,"context_line":"                \u0027deleted\u0027: False,"},{"line_number":5530,"context_line":"            }"},{"line_number":5531,"context_line":"            grp_specs \u003d models.GroupTypeSpecs()"},{"line_number":5532,"context_line":"            grp_specs.update(group_spec_dicts)"},{"line_number":5533,"context_line":"            session.add(grp_specs)"},{"line_number":5534,"context_line":""},{"line_number":5535,"context_line":"    count_all \u003d 0"},{"line_number":5536,"context_line":"    count_hit \u003d 0"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a77a97e_44657343","line":5533,"range":{"start_line":5492,"start_character":0,"end_line":5533,"end_character":34},"updated":"2016-11-15 14:03:11.000000000","message":"I think this should go in as a regular DB migration - it\u0027s not stressful for the DB, and it\u0027s complexity is O(1), regardless of any number of DB records.","commit_id":"9fddaf7707e77a049b05f9454264aa922ffeba6c"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"15e4f1d4e55d54cf056b1cc819d7e7f5b4d12a5e","unresolved":false,"context_lines":[{"line_number":5546,"context_line":"                # nothing to worry about."},{"line_number":5547,"context_line":"                continue"},{"line_number":5548,"context_line":""},{"line_number":5549,"context_line":"            # NOTE(dulek): We should avoid modifying consistency groups that"},{"line_number":5550,"context_line":"            # are in the middle of some operation."},{"line_number":5551,"context_line":"            if not force:"},{"line_number":5552,"context_line":"                if cg.status not in (fields.ConsistencyGroupStatus.AVAILABLE,"},{"line_number":5553,"context_line":"                                     fields.ConsistencyGroupStatus.ERROR,"},{"line_number":5554,"context_line":"                                     fields.ConsistencyGroupStatus.DELETING):"},{"line_number":5555,"context_line":"                    continue"},{"line_number":5556,"context_line":""},{"line_number":5557,"context_line":"            # Migrate CG to group"},{"line_number":5558,"context_line":"            grp \u003d model_query(context, models.Group,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a77a97e_c4d8a3f2","line":5555,"range":{"start_line":5549,"start_character":0,"end_line":5555,"end_character":28},"updated":"2016-11-15 14:03:11.000000000","message":"@Xing: I guess this assumption is still pretty much correct? We better not touch any in-progress resources.","commit_id":"9fddaf7707e77a049b05f9454264aa922ffeba6c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"151fb3b19f50b695a0bf487bb0be4df523a5859e","unresolved":false,"context_lines":[{"line_number":5546,"context_line":"                # nothing to worry about."},{"line_number":5547,"context_line":"                continue"},{"line_number":5548,"context_line":""},{"line_number":5549,"context_line":"            # NOTE(dulek): We should avoid modifying consistency groups that"},{"line_number":5550,"context_line":"            # are in the middle of some operation."},{"line_number":5551,"context_line":"            if not force:"},{"line_number":5552,"context_line":"                if cg.status not in (fields.ConsistencyGroupStatus.AVAILABLE,"},{"line_number":5553,"context_line":"                                     fields.ConsistencyGroupStatus.ERROR,"},{"line_number":5554,"context_line":"                                     fields.ConsistencyGroupStatus.DELETING):"},{"line_number":5555,"context_line":"                    continue"},{"line_number":5556,"context_line":""},{"line_number":5557,"context_line":"            # Migrate CG to group"},{"line_number":5558,"context_line":"            grp \u003d model_query(context, models.Group,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a77a97e_152d67a7","line":5555,"range":{"start_line":5549,"start_character":0,"end_line":5555,"end_character":28},"in_reply_to":"7a77a97e_c4d8a3f2","updated":"2016-11-15 21:25:41.000000000","message":"Yes, I think so.","commit_id":"9fddaf7707e77a049b05f9454264aa922ffeba6c"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"15e4f1d4e55d54cf056b1cc819d7e7f5b4d12a5e","unresolved":false,"context_lines":[{"line_number":5579,"context_line":"                      }"},{"line_number":5580,"context_line":""},{"line_number":5581,"context_line":"            mappings \u003d []"},{"line_number":5582,"context_line":"            for item in cg.volume_type_id.rstrip(\u0027,\u0027).split():"},{"line_number":5583,"context_line":"                mapping \u003d models.GroupVolumeTypeMapping()"},{"line_number":5584,"context_line":"                mapping[\u0027volume_type_id\u0027] \u003d item"},{"line_number":5585,"context_line":"                mapping[\u0027group_id\u0027] \u003d cg.id"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a77a97e_64b6ef8b","line":5582,"range":{"start_line":5582,"start_character":0,"end_line":5582,"end_character":62},"updated":"2016-11-15 14:03:11.000000000","message":"This will not work as expected:\n\n In [2]: \u0027id1,id2,id3,\u0027.rstrip(\u0027,\u0027).split()\n Out[2]: [\u0027id1,id2,id3\u0027]\n\nI think we want:\n\n In [5]: \u0027id1,id2,id3,\u0027.rstrip(\u0027,\u0027).split(\u0027,\u0027)\n Out[5]: [\u0027id1\u0027, \u0027id2\u0027, \u0027id3\u0027]","commit_id":"9fddaf7707e77a049b05f9454264aa922ffeba6c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"151fb3b19f50b695a0bf487bb0be4df523a5859e","unresolved":false,"context_lines":[{"line_number":5579,"context_line":"                      }"},{"line_number":5580,"context_line":""},{"line_number":5581,"context_line":"            mappings \u003d []"},{"line_number":5582,"context_line":"            for item in cg.volume_type_id.rstrip(\u0027,\u0027).split():"},{"line_number":5583,"context_line":"                mapping \u003d models.GroupVolumeTypeMapping()"},{"line_number":5584,"context_line":"                mapping[\u0027volume_type_id\u0027] \u003d item"},{"line_number":5585,"context_line":"                mapping[\u0027group_id\u0027] \u003d cg.id"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a77a97e_900ee532","line":5582,"range":{"start_line":5582,"start_character":0,"end_line":5582,"end_character":62},"in_reply_to":"7a77a97e_64b6ef8b","updated":"2016-11-15 21:25:41.000000000","message":"You are right!","commit_id":"9fddaf7707e77a049b05f9454264aa922ffeba6c"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"15e4f1d4e55d54cf056b1cc819d7e7f5b4d12a5e","unresolved":false,"context_lines":[{"line_number":5592,"context_line":"            session.add(grp)"},{"line_number":5593,"context_line":""},{"line_number":5594,"context_line":"            # Update group_id in volumes"},{"line_number":5595,"context_line":"            vol_list \u003d (model_query(context, models.Volume,"},{"line_number":5596,"context_line":"                                    session\u003dsession)."},{"line_number":5597,"context_line":"                        filter_by(consistencygroup_id\u003dcg.id))"},{"line_number":5598,"context_line":"            for vol in vol_list:"},{"line_number":5599,"context_line":"                vol.group_id \u003d cg.id"},{"line_number":5600,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7a77a97e_a45e4743","line":5597,"range":{"start_line":5595,"start_character":0,"end_line":5597,"end_character":61},"updated":"2016-11-15 14:03:11.000000000","message":"Aren\u0027t we missing .all() here?","commit_id":"9fddaf7707e77a049b05f9454264aa922ffeba6c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"151fb3b19f50b695a0bf487bb0be4df523a5859e","unresolved":false,"context_lines":[{"line_number":5592,"context_line":"            session.add(grp)"},{"line_number":5593,"context_line":""},{"line_number":5594,"context_line":"            # Update group_id in volumes"},{"line_number":5595,"context_line":"            vol_list \u003d (model_query(context, models.Volume,"},{"line_number":5596,"context_line":"                                    session\u003dsession)."},{"line_number":5597,"context_line":"                        filter_by(consistencygroup_id\u003dcg.id))"},{"line_number":5598,"context_line":"            for vol in vol_list:"},{"line_number":5599,"context_line":"                vol.group_id \u003d cg.id"},{"line_number":5600,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7a77a97e_399dee65","line":5597,"range":{"start_line":5595,"start_character":0,"end_line":5597,"end_character":61},"in_reply_to":"7a77a97e_a45e4743","updated":"2016-11-15 21:25:41.000000000","message":"Done","commit_id":"9fddaf7707e77a049b05f9454264aa922ffeba6c"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"15e4f1d4e55d54cf056b1cc819d7e7f5b4d12a5e","unresolved":false,"context_lines":[{"line_number":5598,"context_line":"            for vol in vol_list:"},{"line_number":5599,"context_line":"                vol.group_id \u003d cg.id"},{"line_number":5600,"context_line":""},{"line_number":5601,"context_line":"            # Migrate data from cgsnapshots to group_snapshots"},{"line_number":5602,"context_line":"            cgsnapshot_list \u003d (model_query(context, models.Cgsnapshot,"},{"line_number":5603,"context_line":"                                           session\u003dsession)."},{"line_number":5604,"context_line":"                               filter_by(consistencygroup_id\u003dcg.id))"},{"line_number":5605,"context_line":""},{"line_number":5606,"context_line":"            for cgsnap in cgsnapshot_list:"},{"line_number":5607,"context_line":"                grp_snap \u003d (model_query(context, models.GroupSnapshot,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a77a97e_c45b4353","line":5604,"range":{"start_line":5601,"start_character":0,"end_line":5604,"end_character":68},"updated":"2016-11-15 14:03:11.000000000","message":"ditto","commit_id":"9fddaf7707e77a049b05f9454264aa922ffeba6c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"151fb3b19f50b695a0bf487bb0be4df523a5859e","unresolved":false,"context_lines":[{"line_number":5598,"context_line":"            for vol in vol_list:"},{"line_number":5599,"context_line":"                vol.group_id \u003d cg.id"},{"line_number":5600,"context_line":""},{"line_number":5601,"context_line":"            # Migrate data from cgsnapshots to group_snapshots"},{"line_number":5602,"context_line":"            cgsnapshot_list \u003d (model_query(context, models.Cgsnapshot,"},{"line_number":5603,"context_line":"                                           session\u003dsession)."},{"line_number":5604,"context_line":"                               filter_by(consistencygroup_id\u003dcg.id))"},{"line_number":5605,"context_line":""},{"line_number":5606,"context_line":"            for cgsnap in cgsnapshot_list:"},{"line_number":5607,"context_line":"                grp_snap \u003d (model_query(context, models.GroupSnapshot,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a77a97e_f979b630","line":5604,"range":{"start_line":5601,"start_character":0,"end_line":5604,"end_character":68},"in_reply_to":"7a77a97e_c45b4353","updated":"2016-11-15 21:25:41.000000000","message":"Done","commit_id":"9fddaf7707e77a049b05f9454264aa922ffeba6c"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"cf567c2aeb2dbfb77a9b2b35e628937392d97225","unresolved":false,"context_lines":[{"line_number":5580,"context_line":"             filter(models.ConsistencyGroup.id.notin_(ids)))"},{"line_number":5581,"context_line":"    cgs \u003d query.limit(max_count)"},{"line_number":5582,"context_line":""},{"line_number":5583,"context_line":"    # Create a default group_type for migrating cgsnapshots"},{"line_number":5584,"context_line":"    result \u003d (model_query(context, models.GroupTypes,"},{"line_number":5585,"context_line":"                          project_only\u003dTrue)."},{"line_number":5586,"context_line":"              filter_by(name\u003dgroup_types.DEFAULT_CGSNAPSHOT_TYPE)."}],"source_content_type":"text/x-python","patch_set":21,"id":"7a77a97e_b9b5a532","line":5583,"range":{"start_line":5583,"start_character":0,"end_line":5583,"end_character":59},"updated":"2016-11-21 15:27:58.000000000","message":"I think this comment is invalid now.","commit_id":"c182ad9a7ea3be5bcb849383f986f4fc164efe2b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4690178b1f11f23376a5cc9fb9682977a6d97768","unresolved":false,"context_lines":[{"line_number":5580,"context_line":"             filter(models.ConsistencyGroup.id.notin_(ids)))"},{"line_number":5581,"context_line":"    cgs \u003d query.limit(max_count)"},{"line_number":5582,"context_line":""},{"line_number":5583,"context_line":"    # Create a default group_type for migrating cgsnapshots"},{"line_number":5584,"context_line":"    result \u003d (model_query(context, models.GroupTypes,"},{"line_number":5585,"context_line":"                          project_only\u003dTrue)."},{"line_number":5586,"context_line":"              filter_by(name\u003dgroup_types.DEFAULT_CGSNAPSHOT_TYPE)."}],"source_content_type":"text/x-python","patch_set":21,"id":"7a77a97e_7fdcca74","line":5583,"range":{"start_line":5583,"start_character":0,"end_line":5583,"end_character":59},"in_reply_to":"7a77a97e_b9b5a532","updated":"2016-11-21 17:44:54.000000000","message":"Will remove this.","commit_id":"c182ad9a7ea3be5bcb849383f986f4fc164efe2b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"cf567c2aeb2dbfb77a9b2b35e628937392d97225","unresolved":false,"context_lines":[{"line_number":5586,"context_line":"              filter_by(name\u003dgroup_types.DEFAULT_CGSNAPSHOT_TYPE)."},{"line_number":5587,"context_line":"              first())"},{"line_number":5588,"context_line":"    if not result:"},{"line_number":5589,"context_line":"        raise exception.GroupTypeNotFoundByName("},{"line_number":5590,"context_line":"            group_type_name\u003dgroup_types.DEFAULT_CGSNAPSHOT_TYPE)"},{"line_number":5591,"context_line":"    grp_type_id \u003d result[\u0027id\u0027]"},{"line_number":5592,"context_line":""},{"line_number":5593,"context_line":"    count_all \u003d 0"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a77a97e_d95c21f3","line":5590,"range":{"start_line":5589,"start_character":0,"end_line":5590,"end_character":64},"updated":"2016-11-21 15:27:58.000000000","message":"Yes, when we moved its creation to the migration it should be unusual. Maybe we can suggest the user to rerun this particular DB migration here? I\u0027m not sure however if it\u0027s possible through cinder-manage…","commit_id":"c182ad9a7ea3be5bcb849383f986f4fc164efe2b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4690178b1f11f23376a5cc9fb9682977a6d97768","unresolved":false,"context_lines":[{"line_number":5586,"context_line":"              filter_by(name\u003dgroup_types.DEFAULT_CGSNAPSHOT_TYPE)."},{"line_number":5587,"context_line":"              first())"},{"line_number":5588,"context_line":"    if not result:"},{"line_number":5589,"context_line":"        raise exception.GroupTypeNotFoundByName("},{"line_number":5590,"context_line":"            group_type_name\u003dgroup_types.DEFAULT_CGSNAPSHOT_TYPE)"},{"line_number":5591,"context_line":"    grp_type_id \u003d result[\u0027id\u0027]"},{"line_number":5592,"context_line":""},{"line_number":5593,"context_line":"    count_all \u003d 0"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a77a97e_df515eda","line":5590,"range":{"start_line":5589,"start_character":0,"end_line":5590,"end_character":64},"in_reply_to":"7a77a97e_d95c21f3","updated":"2016-11-21 17:44:54.000000000","message":"I can add message here to ask user to run DB migration.  Would it better to create default cgsnapshot group type if not found here?","commit_id":"c182ad9a7ea3be5bcb849383f986f4fc164efe2b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"cf567c2aeb2dbfb77a9b2b35e628937392d97225","unresolved":false,"context_lines":[{"line_number":6679,"context_line":"    # Return True if we were able to change any DB entry, False otherwise"},{"line_number":6680,"context_line":"    result \u003d query.update(values, **update_args)"},{"line_number":6681,"context_line":""},{"line_number":6682,"context_line":"    if result:"},{"line_number":6683,"context_line":"        # NOTE(xyang): For consistencygroups/cgsnapshots, also update relevant"},{"line_number":6684,"context_line":"        # entries in groups/group_snapshots tables if exists"},{"line_number":6685,"context_line":"        if model.__tablename__ \u003d\u003d \u0027consistencygroups\u0027:"},{"line_number":6686,"context_line":"            try:"},{"line_number":6687,"context_line":"                group_update(context, expected_values[\u0027id\u0027], values)"},{"line_number":6688,"context_line":"            except exception.GroupNotFound:"},{"line_number":6689,"context_line":"                pass"},{"line_number":6690,"context_line":"        if model.__tablename__ \u003d\u003d \u0027cgsnapshots\u0027:"},{"line_number":6691,"context_line":"            try:"},{"line_number":6692,"context_line":"                group_snapshot_update(context, expected_values[\u0027id\u0027], values)"},{"line_number":6693,"context_line":"            except exception.GroupSnapshotNotFound:"},{"line_number":6694,"context_line":"                pass"},{"line_number":6695,"context_line":""},{"line_number":6696,"context_line":"    return 0 !\u003d result"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a77a97e_9919c925","line":6694,"range":{"start_line":6682,"start_character":0,"end_line":6694,"end_character":20},"updated":"2016-11-21 15:27:58.000000000","message":"Good catch! I would feel safer about it if Gorka could take a look.\n\nAt a glance this could potentially be pretty race-condition-prone if someone is mixing operations on groups/group snaps and cgs/cgsnaps. We however cannot do conditional update on multiple tables, so we may need some trade offs here.","commit_id":"c182ad9a7ea3be5bcb849383f986f4fc164efe2b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4690178b1f11f23376a5cc9fb9682977a6d97768","unresolved":false,"context_lines":[{"line_number":6679,"context_line":"    # Return True if we were able to change any DB entry, False otherwise"},{"line_number":6680,"context_line":"    result \u003d query.update(values, **update_args)"},{"line_number":6681,"context_line":""},{"line_number":6682,"context_line":"    if result:"},{"line_number":6683,"context_line":"        # NOTE(xyang): For consistencygroups/cgsnapshots, also update relevant"},{"line_number":6684,"context_line":"        # entries in groups/group_snapshots tables if exists"},{"line_number":6685,"context_line":"        if model.__tablename__ \u003d\u003d \u0027consistencygroups\u0027:"},{"line_number":6686,"context_line":"            try:"},{"line_number":6687,"context_line":"                group_update(context, expected_values[\u0027id\u0027], values)"},{"line_number":6688,"context_line":"            except exception.GroupNotFound:"},{"line_number":6689,"context_line":"                pass"},{"line_number":6690,"context_line":"        if model.__tablename__ \u003d\u003d \u0027cgsnapshots\u0027:"},{"line_number":6691,"context_line":"            try:"},{"line_number":6692,"context_line":"                group_snapshot_update(context, expected_values[\u0027id\u0027], values)"},{"line_number":6693,"context_line":"            except exception.GroupSnapshotNotFound:"},{"line_number":6694,"context_line":"                pass"},{"line_number":6695,"context_line":""},{"line_number":6696,"context_line":"    return 0 !\u003d result"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a77a97e_7f1f6a09","line":6694,"range":{"start_line":6682,"start_character":0,"end_line":6694,"end_character":20},"in_reply_to":"7a77a97e_9919c925","updated":"2016-11-21 17:44:54.000000000","message":"Sure, I\u0027ll add Gorka as a reviewer.","commit_id":"c182ad9a7ea3be5bcb849383f986f4fc164efe2b"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"60c035eab96ea5deeb5734fce74bd97051bd2e36","unresolved":false,"context_lines":[{"line_number":5508,"context_line":"    grps \u003d model_query(context, models.Group)"},{"line_number":5509,"context_line":"    ids \u003d [grp.id for grp in grps] if grps else []"},{"line_number":5510,"context_line":"    query \u003d (model_query(context, models.ConsistencyGroup)."},{"line_number":5511,"context_line":"             filter(models.ConsistencyGroup.id.notin_(ids)))"},{"line_number":5512,"context_line":"    cgs \u003d query.limit(max_count)"},{"line_number":5513,"context_line":""},{"line_number":5514,"context_line":"    # Check if default group_type for migrating cgsnapshots exists"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a71b18c_9f0a0d78","line":5511,"updated":"2016-12-05 11:57:23.000000000","message":"Why do we have same IDs for CGs and Generic groups?","commit_id":"fd6050b96b44809e0ef7f4c36fb90ceaf84cedf0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b400a14a04e05d0fc9eb69bd48e81aa2a5cbc06f","unresolved":false,"context_lines":[{"line_number":5508,"context_line":"    grps \u003d model_query(context, models.Group)"},{"line_number":5509,"context_line":"    ids \u003d [grp.id for grp in grps] if grps else []"},{"line_number":5510,"context_line":"    query \u003d (model_query(context, models.ConsistencyGroup)."},{"line_number":5511,"context_line":"             filter(models.ConsistencyGroup.id.notin_(ids)))"},{"line_number":5512,"context_line":"    cgs \u003d query.limit(max_count)"},{"line_number":5513,"context_line":""},{"line_number":5514,"context_line":"    # Check if default group_type for migrating cgsnapshots exists"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a71b18c_f14c0d44","line":5511,"in_reply_to":"3a71b18c_9f0a0d78","updated":"2016-12-11 18:24:34.000000000","message":"This is because we are deleting the entry from CG table after migrating it to Group table.  Also when user query a CG id, we will display it whether it is in CG table or in Group table.\n\nWithout using the same ID, we\u0027ll have to add a column in Generic group to correlate it with the CG entry so we know whether it has been migrated or not.  It makes things more complicated especially because the CG entry will be removed after migration.\n\nAdded a note here to explain the reason.","commit_id":"fd6050b96b44809e0ef7f4c36fb90ceaf84cedf0"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"60c035eab96ea5deeb5734fce74bd97051bd2e36","unresolved":false,"context_lines":[{"line_number":5525,"context_line":""},{"line_number":5526,"context_line":"    count_all \u003d 0"},{"line_number":5527,"context_line":"    count_hit \u003d 0"},{"line_number":5528,"context_line":"    for cg in cgs:"},{"line_number":5529,"context_line":"        count_all +\u003d 1"},{"line_number":5530,"context_line":"        cgsnapshot_list \u003d []"},{"line_number":5531,"context_line":"        vol_list \u003d []"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a71b18c_1f4d1dc4","line":5528,"updated":"2016-12-05 11:57:23.000000000","message":"nit: you can use \u0027enumerate\u0027 function here to get all counter","commit_id":"fd6050b96b44809e0ef7f4c36fb90ceaf84cedf0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b400a14a04e05d0fc9eb69bd48e81aa2a5cbc06f","unresolved":false,"context_lines":[{"line_number":5525,"context_line":""},{"line_number":5526,"context_line":"    count_all \u003d 0"},{"line_number":5527,"context_line":"    count_hit \u003d 0"},{"line_number":5528,"context_line":"    for cg in cgs:"},{"line_number":5529,"context_line":"        count_all +\u003d 1"},{"line_number":5530,"context_line":"        cgsnapshot_list \u003d []"},{"line_number":5531,"context_line":"        vol_list \u003d []"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a71b18c_d1cc71bd","line":5528,"in_reply_to":"3a71b18c_1f4d1dc4","updated":"2016-12-11 18:24:34.000000000","message":"Done","commit_id":"fd6050b96b44809e0ef7f4c36fb90ceaf84cedf0"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"60c035eab96ea5deeb5734fce74bd97051bd2e36","unresolved":false,"context_lines":[{"line_number":5638,"context_line":"                # Set cgsnapshot_id to None"},{"line_number":5639,"context_line":"                snap.cgsnapshot_id \u003d None"},{"line_number":5640,"context_line":"            # Delete cgsnapshot entry in DB"},{"line_number":5641,"context_line":"            cgsnapshot_destroy(context, cgsnap.id)"},{"line_number":5642,"context_line":""},{"line_number":5643,"context_line":"        for vol in vol_list:"},{"line_number":5644,"context_line":"            # Set consistencygroup_id to None"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a71b18c_3fa65953","line":5641,"updated":"2016-12-05 11:57:23.000000000","message":"Can we get one call to delete all cg_snapshots/CGs instead of deleting one by one?","commit_id":"fd6050b96b44809e0ef7f4c36fb90ceaf84cedf0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b400a14a04e05d0fc9eb69bd48e81aa2a5cbc06f","unresolved":false,"context_lines":[{"line_number":5638,"context_line":"                # Set cgsnapshot_id to None"},{"line_number":5639,"context_line":"                snap.cgsnapshot_id \u003d None"},{"line_number":5640,"context_line":"            # Delete cgsnapshot entry in DB"},{"line_number":5641,"context_line":"            cgsnapshot_destroy(context, cgsnap.id)"},{"line_number":5642,"context_line":""},{"line_number":5643,"context_line":"        for vol in vol_list:"},{"line_number":5644,"context_line":"            # Set consistencygroup_id to None"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a71b18c_11c3498a","line":5641,"in_reply_to":"3a71b18c_3fa65953","updated":"2016-12-11 18:24:34.000000000","message":"Done","commit_id":"fd6050b96b44809e0ef7f4c36fb90ceaf84cedf0"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"7faa0ecae95e3e2d156a830c8170ebb44a0235fb","unresolved":false,"context_lines":[{"line_number":5557,"context_line":"    # complicated especially because the CG entry will be removed after"},{"line_number":5558,"context_line":"    # migration."},{"line_number":5559,"context_line":"    query \u003d (model_query(context, models.ConsistencyGroup)."},{"line_number":5560,"context_line":"             filter(models.ConsistencyGroup.id.notin_(ids)))"},{"line_number":5561,"context_line":"    cgs \u003d query.limit(max_count)"},{"line_number":5562,"context_line":""},{"line_number":5563,"context_line":"    # Check if default group_type for migrating cgsnapshots exists"}],"source_content_type":"text/x-python","patch_set":27,"id":"1a6eadb0_635aaef3","line":5560,"range":{"start_line":5560,"start_character":0,"end_line":5560,"end_character":60},"updated":"2016-12-16 15:03:10.000000000","message":"We could used EXISTS SQL clause and do it in DB, but there\u0027s nothing too bad with this approach either.","commit_id":"dd62f4428645a4cadaec6007714264845595f940"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"52621523f62c005471e0cd27eb3d994bc780a650","unresolved":false,"context_lines":[{"line_number":5557,"context_line":"    # complicated especially because the CG entry will be removed after"},{"line_number":5558,"context_line":"    # migration."},{"line_number":5559,"context_line":"    query \u003d (model_query(context, models.ConsistencyGroup)."},{"line_number":5560,"context_line":"             filter(models.ConsistencyGroup.id.notin_(ids)))"},{"line_number":5561,"context_line":"    cgs \u003d query.limit(max_count)"},{"line_number":5562,"context_line":""},{"line_number":5563,"context_line":"    # Check if default group_type for migrating cgsnapshots exists"}],"source_content_type":"text/x-python","patch_set":27,"id":"1a6eadb0_99db9b21","line":5560,"range":{"start_line":5560,"start_character":0,"end_line":5560,"end_character":60},"in_reply_to":"1a6eadb0_635aaef3","updated":"2016-12-18 03:10:31.000000000","message":"Sure.  If there\u0027s nothing wrong with this approach, I\u0027ll keep it then.","commit_id":"dd62f4428645a4cadaec6007714264845595f940"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"7faa0ecae95e3e2d156a830c8170ebb44a0235fb","unresolved":false,"context_lines":[{"line_number":5679,"context_line":""},{"line_number":5680,"context_line":"            count_hit +\u003d 1"},{"line_number":5681,"context_line":""},{"line_number":5682,"context_line":"    # Delete entries in CG and CGSnapshot tables"},{"line_number":5683,"context_line":"    cg_cgsnapshot_destroy_all_by_ids(context, cg_ids, cgsnapshot_ids,"},{"line_number":5684,"context_line":"                                     volume_ids, snapshot_ids)"},{"line_number":5685,"context_line":""},{"line_number":5686,"context_line":"    return count_all, count_hit"},{"line_number":5687,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"1a6eadb0_4325b259","line":5684,"range":{"start_line":5682,"start_character":0,"end_line":5684,"end_character":62},"updated":"2016-12-16 15:03:10.000000000","message":"I think this should happen in the transaction started in line 5585. We should probably roll back if there\u0027s an error with deleting this group. What do you think?","commit_id":"dd62f4428645a4cadaec6007714264845595f940"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9cc41c375b79d790957be38ea4cc7f65187161b1","unresolved":false,"context_lines":[{"line_number":5679,"context_line":""},{"line_number":5680,"context_line":"            count_hit +\u003d 1"},{"line_number":5681,"context_line":""},{"line_number":5682,"context_line":"    # Delete entries in CG and CGSnapshot tables"},{"line_number":5683,"context_line":"    cg_cgsnapshot_destroy_all_by_ids(context, cg_ids, cgsnapshot_ids,"},{"line_number":5684,"context_line":"                                     volume_ids, snapshot_ids)"},{"line_number":5685,"context_line":""},{"line_number":5686,"context_line":"    return count_all, count_hit"},{"line_number":5687,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"1a6eadb0_e9521d34","line":5684,"range":{"start_line":5682,"start_character":0,"end_line":5684,"end_character":62},"in_reply_to":"1a6eadb0_4325b259","updated":"2016-12-16 16:09:18.000000000","message":"Right now on line 5582, I have \"with session.begin():\".  All CGs are migrated with the same session.  Is it better if I begin a session for each CG instead?\n\nAlso right now cleanup of migrated CG entries happened after all CGs have been migrated.  Is it better to clean up DB entries for 1 CG right after it is migrated within the same session?\n\nFrom line 5582 I\u0027ll change to the following:\n\nfor cg in cgs.all():\n    session \u003d get_session()\n    with session.begin():\n            count_all +\u003d 1\n            ……….\n           # migrate cg to generic volume group\n           # delete database entries for this one cg just migrated\n           cg_cgsnapshot_destroy_all_by_ids(context, cg.id, cgsnapshot_ids,\n                                                                       volume_ids, snapshot_ids)\n\n\nThoughts?","commit_id":"dd62f4428645a4cadaec6007714264845595f940"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"52621523f62c005471e0cd27eb3d994bc780a650","unresolved":false,"context_lines":[{"line_number":5679,"context_line":""},{"line_number":5680,"context_line":"            count_hit +\u003d 1"},{"line_number":5681,"context_line":""},{"line_number":5682,"context_line":"    # Delete entries in CG and CGSnapshot tables"},{"line_number":5683,"context_line":"    cg_cgsnapshot_destroy_all_by_ids(context, cg_ids, cgsnapshot_ids,"},{"line_number":5684,"context_line":"                                     volume_ids, snapshot_ids)"},{"line_number":5685,"context_line":""},{"line_number":5686,"context_line":"    return count_all, count_hit"},{"line_number":5687,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"1a6eadb0_59aca38c","line":5684,"range":{"start_line":5682,"start_character":0,"end_line":5684,"end_character":62},"in_reply_to":"1a6eadb0_e9521d34","updated":"2016-12-18 03:10:31.000000000","message":"I\u0027ve made this change.  Let me know what you think.","commit_id":"dd62f4428645a4cadaec6007714264845595f940"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"f560fd09b7c68aed4d7deba44ec031116f34f0ad","unresolved":false,"context_lines":[{"line_number":5684,"context_line":"        volume_ids \u003d []"},{"line_number":5685,"context_line":"        snapshot_ids \u003d []"},{"line_number":5686,"context_line":"        session \u003d get_session()"},{"line_number":5687,"context_line":"        with session.begin():"},{"line_number":5688,"context_line":"            count_all +\u003d 1"},{"line_number":5689,"context_line":"            cgsnapshot_list \u003d []"},{"line_number":5690,"context_line":"            vol_list \u003d []"}],"source_content_type":"text/x-python","patch_set":29,"id":"1a6eadb0_1b8644db","line":5687,"range":{"start_line":5687,"start_character":8,"end_line":5687,"end_character":29},"updated":"2016-12-20 13:08:23.000000000","message":"A transaction per each CG with its CG snapshots should be safest bet here. Thanks for analyzing this!","commit_id":"5a979c2db93d1aa62e856eb8c1a2a5bf138fd309"}],"cinder/tests/unit/test_db_api.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"60c035eab96ea5deeb5734fce74bd97051bd2e36","unresolved":false,"context_lines":[{"line_number":1812,"context_line":"        db.volume_create(self.ctxt, {\u0027volume_type_id\u0027: \u0027b\u0027,"},{"line_number":1813,"context_line":"                                     \u0027consistencygroup_id\u0027: \u00276\u0027,"},{"line_number":1814,"context_line":"                                     \u0027status\u0027: \u0027available\u0027,"},{"line_number":1815,"context_line":"                                     \u0027size\u0027: 1})"},{"line_number":1816,"context_line":""},{"line_number":1817,"context_line":"    def _assert_migrated(self, migrated, not_migrated):"},{"line_number":1818,"context_line":"        for cg_id, cgsnap_id in migrated.items():"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a71b18c_bf3ee9d7","line":1815,"updated":"2016-12-05 11:57:23.000000000","message":"Do we need to delete everything created in cleanUp method?","commit_id":"fd6050b96b44809e0ef7f4c36fb90ceaf84cedf0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b400a14a04e05d0fc9eb69bd48e81aa2a5cbc06f","unresolved":false,"context_lines":[{"line_number":1812,"context_line":"        db.volume_create(self.ctxt, {\u0027volume_type_id\u0027: \u0027b\u0027,"},{"line_number":1813,"context_line":"                                     \u0027consistencygroup_id\u0027: \u00276\u0027,"},{"line_number":1814,"context_line":"                                     \u0027status\u0027: \u0027available\u0027,"},{"line_number":1815,"context_line":"                                     \u0027size\u0027: 1})"},{"line_number":1816,"context_line":""},{"line_number":1817,"context_line":"    def _assert_migrated(self, migrated, not_migrated):"},{"line_number":1818,"context_line":"        for cg_id, cgsnap_id in migrated.items():"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a71b18c_91d6794d","line":1815,"in_reply_to":"3a71b18c_bf3ee9d7","updated":"2016-12-11 18:24:34.000000000","message":"Done","commit_id":"fd6050b96b44809e0ef7f4c36fb90ceaf84cedf0"}],"cinder/volume/group_types.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"60c035eab96ea5deeb5734fce74bd97051bd2e36","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    except exception.GroupTypeNotFoundByName:"},{"line_number":152,"context_line":"        # Couldn\u0027t find DEFAULT_CGSNAPSHOT_TYPE group type."},{"line_number":153,"context_line":"        # Record this issue and move on."},{"line_number":154,"context_line":"        LOG.exception(_LE(\u0027Default cgsnapshot type %s is not found.\u0027)"},{"line_number":155,"context_line":"                      % DEFAULT_CGSNAPSHOT_TYPE)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    return grp_type"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a71b18c_5f1a357e","line":154,"updated":"2016-12-05 11:57:23.000000000","message":"IMO, we don\u0027t need LOG.exception here.","commit_id":"fd6050b96b44809e0ef7f4c36fb90ceaf84cedf0"}]}
