)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"4a891197e2dcf3faa27eb7870eb982e900964025","unresolved":false,"context_lines":[{"line_number":19,"context_line":"chain all can\u0027t be deleted if user don\u0027t remove the tail one."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"It lead to poor user experence and is a waste of storage resource."},{"line_number":22,"context_line":"This patch provides a method to delete a referenced snapshot/volume."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Change-Id: I472905da8e744d12496be8e8eaff0b6e8d0b1c5f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa31d9ce_cd9356f9","line":22,"range":{"start_line":22,"start_character":10,"end_line":22,"end_character":28},"updated":"2017-02-10 15:22:11.000000000","message":"Can you describe the method.  Given that this is a somewhat complicated change I think it is important to be clear.  Also, given, reading the code, the addition of the \u0027.deleted\u0027 snapshots isn\u0027t obvious.","commit_id":"8ec22020d923ec8f491e276bf855d87dd94fa19d"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"83a7c6cb57c1dab13daf810e57672e88a04e3d16","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"The snap5 is referenced by volume6, it can\u0027t be deleted until"},{"line_number":15,"context_line":"volume6 is deleted; and we also can\u0027t delete volume5 because"},{"line_number":16,"context_line":"it is depend by snap5, and so on... This means volumes and"},{"line_number":17,"context_line":"snapshots in this chain all can\u0027t be deleted if user don\u0027t"},{"line_number":18,"context_line":"remove the tail one."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"fa31d9ce_397df86e","line":16,"range":{"start_line":16,"start_character":6,"end_line":16,"end_character":12},"updated":"2017-02-11 21:46:58.000000000","message":"needed","commit_id":"ae3affb8093ea7dee4879330f3711ee9b528f5a2"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"83a7c6cb57c1dab13daf810e57672e88a04e3d16","unresolved":false,"context_lines":[{"line_number":14,"context_line":"The snap5 is referenced by volume6, it can\u0027t be deleted until"},{"line_number":15,"context_line":"volume6 is deleted; and we also can\u0027t delete volume5 because"},{"line_number":16,"context_line":"it is depend by snap5, and so on... This means volumes and"},{"line_number":17,"context_line":"snapshots in this chain all can\u0027t be deleted if user don\u0027t"},{"line_number":18,"context_line":"remove the tail one."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"It lead to poor user experence and is a waste of storage resource."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"fa31d9ce_5980ec46","line":17,"range":{"start_line":17,"start_character":53,"end_line":17,"end_character":58},"updated":"2017-02-11 21:46:58.000000000","message":"doesn\u0027t","commit_id":"ae3affb8093ea7dee4879330f3711ee9b528f5a2"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"83a7c6cb57c1dab13daf810e57672e88a04e3d16","unresolved":false,"context_lines":[{"line_number":17,"context_line":"snapshots in this chain all can\u0027t be deleted if user don\u0027t"},{"line_number":18,"context_line":"remove the tail one."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"It lead to poor user experence and is a waste of storage resource."},{"line_number":21,"context_line":"In this patch, we provide a method to fix the problem: If a"},{"line_number":22,"context_line":"snapshot has copy-on-write child we keep it as a silent snapshot"},{"line_number":23,"context_line":"by marking it as \u0027.deleted\u0027 in rbd backend and will delete it when"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"fa31d9ce_9992649e","line":20,"range":{"start_line":20,"start_character":3,"end_line":20,"end_character":15},"updated":"2017-02-11 21:46:58.000000000","message":"leads to a poor","commit_id":"ae3affb8093ea7dee4879330f3711ee9b528f5a2"}],"cinder/volume/drivers/rbd.py":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"4a891197e2dcf3faa27eb7870eb982e900964025","unresolved":false,"context_lines":[{"line_number":789,"context_line":"                    # info in case the volume has been flattened."},{"line_number":790,"context_line":"                    clone_or_silent_snap \u003d snap[\u0027name\u0027]"},{"line_number":791,"context_line":""},{"line_number":792,"context_line":"                LOG.debug(\"volume has clone or silent snapshot(s)\")"},{"line_number":793,"context_line":""},{"line_number":794,"context_line":"                _pool, parent, parent_snap \u003d self._get_parent_info("},{"line_number":795,"context_line":"                    rbd_image,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_2d1792a4","line":792,"range":{"start_line":792,"start_character":16,"end_line":792,"end_character":67},"updated":"2017-02-10 15:22:11.000000000","message":"This would be more useful if we it had the volume you are talking about in the debug message.","commit_id":"8ec22020d923ec8f491e276bf855d87dd94fa19d"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"4a891197e2dcf3faa27eb7870eb982e900964025","unresolved":false,"context_lines":[{"line_number":828,"context_line":"                # parent chain deleting references."},{"line_number":829,"context_line":"                if (parent_snap and (parent_snap.endswith(\u0027.clone_snap\u0027)"},{"line_number":830,"context_line":"                                     or parent_snap.endswith(\u0027.deleted\u0027))):"},{"line_number":831,"context_line":"                    LOG.debug(\"try to delete references of the volume\")"},{"line_number":832,"context_line":"                    self._del_clone_or_silent_refs(client, parent, parent_snap)"},{"line_number":833,"context_line":"            else:"},{"line_number":834,"context_line":"                # If the volume has clone or silent snapshots we will not be"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_ad51c264","line":831,"range":{"start_line":831,"start_character":20,"end_line":831,"end_character":71},"updated":"2017-02-10 15:22:11.000000000","message":"Same comment here.","commit_id":"8ec22020d923ec8f491e276bf855d87dd94fa19d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"b8ce15403c7855f9f39b30d25cc71bc293927764","unresolved":false,"context_lines":[{"line_number":689,"context_line":"        \"\"\"List parent info for the given volume."},{"line_number":690,"context_line":""},{"line_number":691,"context_line":"        Returns a tuple of (pool, parent, snap). A snapshot may optionally be"},{"line_number":692,"context_line":"        provided for the case where a cloned volume has been flattened but it\u0027s"},{"line_number":693,"context_line":"        snapshot still depends on the parent."},{"line_number":694,"context_line":"        \"\"\""},{"line_number":695,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_d3d081fa","line":692,"range":{"start_line":692,"start_character":75,"end_line":692,"end_character":79},"updated":"2017-05-16 10:15:36.000000000","message":"nit: its","commit_id":"a75f3b2030aabc7b40e2b4dd8a5f73558d626971"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"b8ce15403c7855f9f39b30d25cc71bc293927764","unresolved":false,"context_lines":[{"line_number":702,"context_line":""},{"line_number":703,"context_line":"        except self.rbd.ImageNotFound:"},{"line_number":704,"context_line":"            LOG.debug(\"Volume %s is not a clone.\", volume_name)"},{"line_number":705,"context_line":"            volume.set_snap(None)"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":"        return (None, None, None)"},{"line_number":708,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_b35cd54b","line":705,"updated":"2017-05-16 10:15:36.000000000","message":"-1: You only have to do this if you set the snap before on L697, right?  So it would be best to create a finally section that did L699-700 for both cases.","commit_id":"a75f3b2030aabc7b40e2b4dd8a5f73558d626971"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"b8ce15403c7855f9f39b30d25cc71bc293927764","unresolved":false,"context_lines":[{"line_number":734,"context_line":"                                                                   parent_name,"},{"line_number":735,"context_line":"                                                                   parent_snap)"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"            if (parent_snap.endswith(\u0027.deleted\u0027) and"},{"line_number":738,"context_line":"                    self._get_children_info(parent_rbd, parent_snap)):"},{"line_number":739,"context_line":"                # Parent_snap still has a child, we can delete neither itself"},{"line_number":740,"context_line":"                # nor the parent volume."}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_f33ffdd3","line":737,"updated":"2017-05-16 10:15:36.000000000","message":"-1: parent_snap could be None, and this call to endswith would fail","commit_id":"a75f3b2030aabc7b40e2b4dd8a5f73558d626971"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a1774be9f99405e0a09c99a2c5651dcd61fcd95f","unresolved":false,"context_lines":[{"line_number":734,"context_line":"                                                                   parent_name,"},{"line_number":735,"context_line":"                                                                   parent_snap)"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"            if (parent_snap.endswith(\u0027.deleted\u0027) and"},{"line_number":738,"context_line":"                    self._get_children_info(parent_rbd, parent_snap)):"},{"line_number":739,"context_line":"                # Parent_snap still has a child, we can delete neither itself"},{"line_number":740,"context_line":"                # nor the parent volume."}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_ddcce76b","line":737,"in_reply_to":"1f013ff3_9cca0118","updated":"2017-05-17 09:03:34.000000000","message":"Yup, my bad, I misread it as `g_parent_snap.endswith`","commit_id":"a75f3b2030aabc7b40e2b4dd8a5f73558d626971"},{"author":{"_account_id":18967,"name":"zhangsong","email":"zhangsong@cmss.chinamobile.com","username":"zhangsong"},"change_message_id":"cb495760cd0eca7246afbe02ec4f97d113cf2fbd","unresolved":false,"context_lines":[{"line_number":734,"context_line":"                                                                   parent_name,"},{"line_number":735,"context_line":"                                                                   parent_snap)"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"            if (parent_snap.endswith(\u0027.deleted\u0027) and"},{"line_number":738,"context_line":"                    self._get_children_info(parent_rbd, parent_snap)):"},{"line_number":739,"context_line":"                # Parent_snap still has a child, we can delete neither itself"},{"line_number":740,"context_line":"                # nor the parent volume."}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_9cca0118","line":737,"in_reply_to":"1f013ff3_f33ffdd3","updated":"2017-05-16 15:33:34.000000000","message":"parent_snap would never be none, it either ends with \u0027.deleted\u0027 or ends with \u0027.clone_snap\u0027 in this method.","commit_id":"a75f3b2030aabc7b40e2b4dd8a5f73558d626971"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"b8ce15403c7855f9f39b30d25cc71bc293927764","unresolved":false,"context_lines":[{"line_number":789,"context_line":"                    # info in case the volume has been flattened."},{"line_number":790,"context_line":"                    clone_or_silent_snap \u003d snap[\u0027name\u0027]"},{"line_number":791,"context_line":""},{"line_number":792,"context_line":"                LOG.debug(\"volume %s has clone or silent snapshot(s).\","},{"line_number":793,"context_line":"                          volume_name)"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"                _pool, parent, parent_snap \u003d self._get_parent_info("}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_33cc4534","line":792,"updated":"2017-05-16 10:15:36.000000000","message":"-1: Isn\u0027t this incorrect?  You should check if you actually have snaps before logging this.","commit_id":"a75f3b2030aabc7b40e2b4dd8a5f73558d626971"},{"author":{"_account_id":18967,"name":"zhangsong","email":"zhangsong@cmss.chinamobile.com","username":"zhangsong"},"change_message_id":"cb495760cd0eca7246afbe02ec4f97d113cf2fbd","unresolved":false,"context_lines":[{"line_number":789,"context_line":"                    # info in case the volume has been flattened."},{"line_number":790,"context_line":"                    clone_or_silent_snap \u003d snap[\u0027name\u0027]"},{"line_number":791,"context_line":""},{"line_number":792,"context_line":"                LOG.debug(\"volume %s has clone or silent snapshot(s).\","},{"line_number":793,"context_line":"                          volume_name)"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"                _pool, parent, parent_snap \u003d self._get_parent_info("}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_2d23b907","line":792,"in_reply_to":"1f013ff3_33cc4534","updated":"2017-05-16 15:33:34.000000000","message":"Yes, you are right. I\u0027ll update it later, thanks.","commit_id":"a75f3b2030aabc7b40e2b4dd8a5f73558d626971"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"b8ce15403c7855f9f39b30d25cc71bc293927764","unresolved":false,"context_lines":[{"line_number":835,"context_line":"            else:"},{"line_number":836,"context_line":"                # If the volume has clone or silent snapshots we will not be"},{"line_number":837,"context_line":"                # able to delete it. Instead we will keep it as a silent volume"},{"line_number":838,"context_line":"                # which will be deleted when it\u0027s snapshots are deleted."},{"line_number":839,"context_line":"                new_name \u003d \"%s.deleted\" % (volume_name)"},{"line_number":840,"context_line":"                self.RBDProxy().rename(client.ioctx, volume_name, new_name)"},{"line_number":841,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_33f56558","line":838,"range":{"start_line":838,"start_character":45,"end_line":838,"end_character":49},"updated":"2017-05-16 10:15:36.000000000","message":"nit: its","commit_id":"a75f3b2030aabc7b40e2b4dd8a5f73558d626971"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"b8ce15403c7855f9f39b30d25cc71bc293927764","unresolved":false,"context_lines":[{"line_number":877,"context_line":"                        volume.rename_snap(snap_name, new_name)"},{"line_number":878,"context_line":"                    except AttributeError:"},{"line_number":879,"context_line":"                        # If an AttributeError is raised, it means that current"},{"line_number":880,"context_line":"                        # version(Harmer or earlier) doesn\u0027t support rename a"},{"line_number":881,"context_line":"                        # snapshot, so we just raise a SnapshotIsBusy error."},{"line_number":882,"context_line":"                        raise exception.SnapshotIsBusy(snapshot_name\u003dsnap_name)"},{"line_number":883,"context_line":"                    return"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_b3ccd589","line":880,"range":{"start_line":880,"start_character":32,"end_line":880,"end_character":34},"updated":"2017-05-16 10:15:36.000000000","message":"nit: missing space","commit_id":"a75f3b2030aabc7b40e2b4dd8a5f73558d626971"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"b8ce15403c7855f9f39b30d25cc71bc293927764","unresolved":false,"context_lines":[{"line_number":878,"context_line":"                    except AttributeError:"},{"line_number":879,"context_line":"                        # If an AttributeError is raised, it means that current"},{"line_number":880,"context_line":"                        # version(Harmer or earlier) doesn\u0027t support rename a"},{"line_number":881,"context_line":"                        # snapshot, so we just raise a SnapshotIsBusy error."},{"line_number":882,"context_line":"                        raise exception.SnapshotIsBusy(snapshot_name\u003dsnap_name)"},{"line_number":883,"context_line":"                    return"},{"line_number":884,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_739bed71","line":881,"updated":"2017-05-16 10:15:36.000000000","message":"-1: In this case please keep the old logging that reports the dependent images.","commit_id":"a75f3b2030aabc7b40e2b4dd8a5f73558d626971"}]}
