)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"ca74b598d613a2283cadf5eefb5370388780753b","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Goutham Pacha Ravi \u003cgouthamr@netapp.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-17 06:25:38 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix volume state when manage operation fails."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add revert call to ManageExistingTask in the volume"},{"line_number":10,"context_line":"manager\u0027s tasks."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"dada55a8_de02216f","line":7,"range":{"start_line":7,"start_character":44,"end_line":7,"end_character":45},"updated":"2016-07-18 01:12:13.000000000","message":"The full stop is no need in the title of commit message.","commit_id":"fb21eade76f6c439484679c3c628670e4f86f9fa"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"c3a4e73c27c78eb6b6f1c0dda95f6134ce9750f1","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Goutham Pacha Ravi \u003cgouthamr@netapp.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-17 06:25:38 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix volume state when manage operation fails."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add revert call to ManageExistingTask in the volume"},{"line_number":10,"context_line":"manager\u0027s tasks."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"dada55a8_5eef51b0","line":7,"range":{"start_line":7,"start_character":44,"end_line":7,"end_character":45},"in_reply_to":"dada55a8_de02216f","updated":"2016-07-18 01:13:06.000000000","message":"Done","commit_id":"fb21eade76f6c439484679c3c628670e4f86f9fa"}],"cinder/tests/unit/volume/flows/test_manage_volume_flow.py":[{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"8799a77e50c109f4dcb4d8dc85eeba1ec4dddce6","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            volume_ref, mock_manage_existing_ref)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def test_prepare_for_quota_reservation_task_revert(self):"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        mock_db \u003d mock.MagicMock()"},{"line_number":90,"context_line":"        mock_driver \u003d mock.MagicMock()"},{"line_number":91,"context_line":"        mock_result \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":5,"id":"dada55a8_ab125660","line":88,"updated":"2016-07-19 00:44:45.000000000","message":"Should we better remove this blank line?","commit_id":"617079703948ea08a4db29b8edd8e99e981c4503"},{"author":{"_account_id":16212,"name":"Chuck Fouts","email":"fchuck@netapp.com","username":"cFouts"},"change_message_id":"3c49c52bfa2df3db7c9f7b235bc05abe4d461a80","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            volume_ref, mock_manage_existing_ref)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def test_prepare_for_quota_reservation_task_revert(self):"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        mock_db \u003d mock.MagicMock()"},{"line_number":90,"context_line":"        mock_driver \u003d mock.MagicMock()"},{"line_number":91,"context_line":"        mock_result \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":5,"id":"dada55a8_ed5d627a","line":88,"in_reply_to":"dada55a8_ab125660","updated":"2016-07-19 14:24:54.000000000","message":"Done","commit_id":"617079703948ea08a4db29b8edd8e99e981c4503"}],"cinder/volume/flows/manager/manage_existing.py":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"90f0ef90fd0bbe099663e85d1e0fa1a5bb79cdf1","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def execute(self, context, volume_ref, manage_existing_ref, size):"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        try:"},{"line_number":78,"context_line":"            model_update \u003d self.driver.manage_existing(volume_ref,"},{"line_number":79,"context_line":"                                                       manage_existing_ref)"},{"line_number":80,"context_line":"        except Exception:"},{"line_number":81,"context_line":"            msg \u003d \"Failed to manage existing volume.\""},{"line_number":82,"context_line":"            LOG.exception(_LE(msg))"},{"line_number":83,"context_line":"            flow_common.error_out_volume(context, self.db, volume_ref.id,"},{"line_number":84,"context_line":"                                         reason\u003d_(msg))"},{"line_number":85,"context_line":"            raise"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        if not model_update:"},{"line_number":88,"context_line":"            model_update \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"fad55976_d9d76aeb","line":85,"range":{"start_line":77,"start_character":0,"end_line":85,"end_character":17},"updated":"2016-07-17 05:19:54.000000000","message":"TaskFlow has a way to handle exceptions... This class needs a \u0027revert\u0027 method to handle exceptions correctly..","commit_id":"83494e37dde3e6f4dfebef52f6339c0e108053bb"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"63cfd19fb55f9b5723170736c6cfbb12bfea9bdd","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        return {\u0027volume\u0027: volume_ref}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def revert(self, context, result, flow_failures, volume_ref, **kwargs):"},{"line_number":94,"context_line":"        # Set the volume to error status."},{"line_number":95,"context_line":"        volume_id \u003d volume_ref.id"},{"line_number":96,"context_line":"        flow_common.error_out_volume(context, self.db, volume_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"dada55a8_2af840e5","line":93,"range":{"start_line":93,"start_character":0,"end_line":93,"end_character":75},"updated":"2016-07-18 13:04:31.000000000","message":"Reverts in TaskFlow are rather tricky. Basically when task A fails, its own revert is called, and then all the reverts of tasks executed prior to A (in reversed order of course). To make sure this will get called also when self.driver.manage_existing_get_size() fails we need to add that revert to PrepareForQuotaReservationTask.","commit_id":"2741cc95b4c3d9ecdb506abe021499145bc94c22"},{"author":{"_account_id":16212,"name":"Chuck Fouts","email":"fchuck@netapp.com","username":"cFouts"},"change_message_id":"858b2da06ee75b2d0cd1c48c6835ef81b43ea73f","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        return {\u0027volume\u0027: volume_ref}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def revert(self, context, result, flow_failures, volume_ref, **kwargs):"},{"line_number":94,"context_line":"        # Set the volume to error status."},{"line_number":95,"context_line":"        volume_id \u003d volume_ref.id"},{"line_number":96,"context_line":"        flow_common.error_out_volume(context, self.db, volume_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"dada55a8_bf129860","line":93,"range":{"start_line":93,"start_character":0,"end_line":93,"end_character":75},"in_reply_to":"dada55a8_2af840e5","updated":"2016-07-18 22:10:02.000000000","message":"The bug appears to have been introduced when the ExtractVolumeRefTask was removed as the first task in get_flow (https://review.openstack.org/#/c/258132/8/cinder/volume/flows/manager/manage_existing.py). I\u0027ve moved the revert method to PrepareForQuotaReservationTask. When I tested it only PrepareForQuotaReservationTask#revert was called. ManageExistingTask#revert was not subsequently called.","commit_id":"2741cc95b4c3d9ecdb506abe021499145bc94c22"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"63cfd19fb55f9b5723170736c6cfbb12bfea9bdd","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        volume_id \u003d volume_ref.id"},{"line_number":96,"context_line":"        flow_common.error_out_volume(context, self.db, volume_id)"},{"line_number":97,"context_line":"        LOG.error(_LE(\"Volume %s: manage failed.\"), volume_id)"},{"line_number":98,"context_line":"        return False"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"def get_flow(context, db, driver, host, volume, ref):"}],"source_content_type":"text/x-python","patch_set":4,"id":"dada55a8_6ada387a","line":98,"range":{"start_line":98,"start_character":0,"end_line":98,"end_character":20},"updated":"2016-07-18 13:04:31.000000000","message":"I think this method shouldn\u0027t return False.","commit_id":"2741cc95b4c3d9ecdb506abe021499145bc94c22"},{"author":{"_account_id":16212,"name":"Chuck Fouts","email":"fchuck@netapp.com","username":"cFouts"},"change_message_id":"858b2da06ee75b2d0cd1c48c6835ef81b43ea73f","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        volume_id \u003d volume_ref.id"},{"line_number":96,"context_line":"        flow_common.error_out_volume(context, self.db, volume_id)"},{"line_number":97,"context_line":"        LOG.error(_LE(\"Volume %s: manage failed.\"), volume_id)"},{"line_number":98,"context_line":"        return False"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"def get_flow(context, db, driver, host, volume, ref):"}],"source_content_type":"text/x-python","patch_set":4,"id":"dada55a8_3f07c81d","line":98,"range":{"start_line":98,"start_character":0,"end_line":98,"end_character":20},"in_reply_to":"dada55a8_6ada387a","updated":"2016-07-18 22:10:02.000000000","message":"Done","commit_id":"2741cc95b4c3d9ecdb506abe021499145bc94c22"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"8799a77e50c109f4dcb4d8dc85eeba1ec4dddce6","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        reason \u003d _(\u0027Volume create failed while extracting volume ref.\u0027)"},{"line_number":72,"context_line":"        flow_common.error_out_volume(context, self.db,"},{"line_number":73,"context_line":"                                     volume_id, reason\u003dreason)"},{"line_number":74,"context_line":"        LOG.error(_LE(\"Volume %s: create failed\"), volume_id)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"class ManageExistingTask(flow_utils.CinderTask):"}],"source_content_type":"text/x-python","patch_set":5,"id":"dada55a8_e613e55a","line":74,"range":{"start_line":74,"start_character":41,"end_line":74,"end_character":47},"updated":"2016-07-19 00:44:45.000000000","message":"Miss a full stop?","commit_id":"617079703948ea08a4db29b8edd8e99e981c4503"},{"author":{"_account_id":16212,"name":"Chuck Fouts","email":"fchuck@netapp.com","username":"cFouts"},"change_message_id":"3c49c52bfa2df3db7c9f7b235bc05abe4d461a80","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        reason \u003d _(\u0027Volume create failed while extracting volume ref.\u0027)"},{"line_number":72,"context_line":"        flow_common.error_out_volume(context, self.db,"},{"line_number":73,"context_line":"                                     volume_id, reason\u003dreason)"},{"line_number":74,"context_line":"        LOG.error(_LE(\"Volume %s: create failed\"), volume_id)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"class ManageExistingTask(flow_utils.CinderTask):"}],"source_content_type":"text/x-python","patch_set":5,"id":"dada55a8_4d6e2e30","line":74,"range":{"start_line":74,"start_character":41,"end_line":74,"end_character":47},"in_reply_to":"dada55a8_e613e55a","updated":"2016-07-19 14:24:54.000000000","message":"Done","commit_id":"617079703948ea08a4db29b8edd8e99e981c4503"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"cbed70a641f757895839e250c5be83313963e46e","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                                \u0027volume_id\u0027: volume_id}}"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def revert(self, context, result, flow_failures, volume_ref, **kwargs):"},{"line_number":66,"context_line":"        # We never produced a result and therefore can\u0027t destroy anything."},{"line_number":67,"context_line":"        if isinstance(result, ft.Failure):"},{"line_number":68,"context_line":"            return"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        volume_id \u003d volume_ref.id"},{"line_number":71,"context_line":"        reason \u003d _(\u0027Volume create failed while extracting volume ref.\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_b69d7a5b","line":68,"range":{"start_line":66,"start_character":0,"end_line":68,"end_character":18},"updated":"2016-07-19 15:27:56.000000000","message":"I don\u0027t think we need that check. I believe you\u0027ve copied it from elsewhere, but in this case we do have volume_ref (it was passed into the flow from manager directly) and we know that the entry in the DB is created (it was created by c-api). We can error stuff out even if PrepareForQuotaReservationTask failed.","commit_id":"35950b9e66b6d4a0a34519f918dfbbf26da42116"},{"author":{"_account_id":16212,"name":"Chuck Fouts","email":"fchuck@netapp.com","username":"cFouts"},"change_message_id":"b16e805b7e15480415c2713310f0420fbd8fd7b3","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                                \u0027volume_id\u0027: volume_id}}"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def revert(self, context, result, flow_failures, volume_ref, **kwargs):"},{"line_number":66,"context_line":"        # We never produced a result and therefore can\u0027t destroy anything."},{"line_number":67,"context_line":"        if isinstance(result, ft.Failure):"},{"line_number":68,"context_line":"            return"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        volume_id \u003d volume_ref.id"},{"line_number":71,"context_line":"        reason \u003d _(\u0027Volume create failed while extracting volume ref.\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_e110ca03","line":68,"range":{"start_line":66,"start_character":0,"end_line":68,"end_character":18},"in_reply_to":"dada55a8_b69d7a5b","updated":"2016-07-19 15:44:29.000000000","message":"Thanks for explaining this check. I noticed it in several other revert methods so I did copy it.","commit_id":"35950b9e66b6d4a0a34519f918dfbbf26da42116"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"cbed70a641f757895839e250c5be83313963e46e","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            return"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        volume_id \u003d volume_ref.id"},{"line_number":71,"context_line":"        reason \u003d _(\u0027Volume create failed while extracting volume ref.\u0027)"},{"line_number":72,"context_line":"        flow_common.error_out_volume(context, self.db,"},{"line_number":73,"context_line":"                                     volume_id, reason\u003dreason)"},{"line_number":74,"context_line":"        LOG.error(_LE(\"Volume %s: create failed.\"), volume_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_f37384e5","line":71,"range":{"start_line":71,"start_character":20,"end_line":71,"end_character":69},"updated":"2016-07-19 15:27:56.000000000","message":"It\u0027s not exactly true. I would reword this just to \"Volume manage failed.\".","commit_id":"35950b9e66b6d4a0a34519f918dfbbf26da42116"},{"author":{"_account_id":16212,"name":"Chuck Fouts","email":"fchuck@netapp.com","username":"cFouts"},"change_message_id":"b16e805b7e15480415c2713310f0420fbd8fd7b3","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            return"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        volume_id \u003d volume_ref.id"},{"line_number":71,"context_line":"        reason \u003d _(\u0027Volume create failed while extracting volume ref.\u0027)"},{"line_number":72,"context_line":"        flow_common.error_out_volume(context, self.db,"},{"line_number":73,"context_line":"                                     volume_id, reason\u003dreason)"},{"line_number":74,"context_line":"        LOG.error(_LE(\"Volume %s: create failed.\"), volume_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_21fb02c3","line":71,"range":{"start_line":71,"start_character":20,"end_line":71,"end_character":69},"in_reply_to":"dada55a8_f37384e5","updated":"2016-07-19 15:44:29.000000000","message":"Thanks for catching this. I should have reread it after copying it from another task. Copy/paste proves to be bug introducing again.","commit_id":"35950b9e66b6d4a0a34519f918dfbbf26da42116"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"cbed70a641f757895839e250c5be83313963e46e","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self.driver \u003d driver"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def execute(self, context, volume_ref, manage_existing_ref, size):"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        model_update \u003d self.driver.manage_existing("},{"line_number":90,"context_line":"            volume_ref, manage_existing_ref)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        if not model_update:"},{"line_number":93,"context_line":"            model_update \u003d {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_d33c80e4","line":90,"range":{"start_line":88,"start_character":0,"end_line":90,"end_character":44},"updated":"2016-07-19 15:27:56.000000000","message":"This refactor isn\u0027t really needed in this patch.","commit_id":"35950b9e66b6d4a0a34519f918dfbbf26da42116"},{"author":{"_account_id":16212,"name":"Chuck Fouts","email":"fchuck@netapp.com","username":"cFouts"},"change_message_id":"b16e805b7e15480415c2713310f0420fbd8fd7b3","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self.driver \u003d driver"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def execute(self, context, volume_ref, manage_existing_ref, size):"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        model_update \u003d self.driver.manage_existing("},{"line_number":90,"context_line":"            volume_ref, manage_existing_ref)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        if not model_update:"},{"line_number":93,"context_line":"            model_update \u003d {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_6105faba","line":90,"range":{"start_line":88,"start_character":0,"end_line":90,"end_character":44},"in_reply_to":"dada55a8_d33c80e4","updated":"2016-07-19 15:44:29.000000000","message":"Done","commit_id":"35950b9e66b6d4a0a34519f918dfbbf26da42116"}]}
