)]}'
{"karbor/services/operationengine/operations/protect_operation.py":[{"author":{"_account_id":18908,"name":"shoppon","email":"shopppon@gmail.com","username":"shoppon"},"change_message_id":"d63e7eb9137f953abcd586a9d6eafdbd6926cc6c","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            sort_keys\u003d[\"created_at\"]"},{"line_number":96,"context_line":"        )"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        available_items \u003d ["},{"line_number":99,"context_line":"            item for item in backup_items if"},{"line_number":100,"context_line":"            item.status \u003d\u003d constants.CHECKPOINT_STATUS_AVAILABLE"},{"line_number":101,"context_line":"            ]"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_be21b4a1","line":98,"range":{"start_line":98,"start_character":2,"end_line":98,"end_character":5},"updated":"2016-11-25 02:34:25.000000000","message":"Don\u0027t clean failed backups?","commit_id":"9cf8fe01d338a2d67e8369eb786e0dc99d9982f2"},{"author":{"_account_id":18908,"name":"shoppon","email":"shopppon@gmail.com","username":"shoppon"},"change_message_id":"d7fa931b741ea05487c2be92243da3f59328f929","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            sort_keys\u003d[\"created_at\"]"},{"line_number":96,"context_line":"        )"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        available_items \u003d ["},{"line_number":99,"context_line":"            item for item in backup_items if"},{"line_number":100,"context_line":"            item.status \u003d\u003d constants.CHECKPOINT_STATUS_AVAILABLE"},{"line_number":101,"context_line":"            ]"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_1e9388a4","line":98,"range":{"start_line":98,"start_character":2,"end_line":98,"end_character":5},"in_reply_to":"5a74a57a_9e787891","updated":"2016-11-25 02:41:04.000000000","message":"Done","commit_id":"9cf8fe01d338a2d67e8369eb786e0dc99d9982f2"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"b2096671ab63848e0f3ec89b713a36b90855de9a","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            sort_keys\u003d[\"created_at\"]"},{"line_number":96,"context_line":"        )"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        available_items \u003d ["},{"line_number":99,"context_line":"            item for item in backup_items if"},{"line_number":100,"context_line":"            item.status \u003d\u003d constants.CHECKPOINT_STATUS_AVAILABLE"},{"line_number":101,"context_line":"            ]"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_9e787891","line":98,"range":{"start_line":98,"start_character":2,"end_line":98,"end_character":5},"in_reply_to":"5a74a57a_be21b4a1","updated":"2016-11-25 02:36:59.000000000","message":"Failed checkpoint will clean by Garbage collection mechanism future.","commit_id":"9cf8fe01d338a2d67e8369eb786e0dc99d9982f2"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"2c74103d4e3ef9b1d1c3c9aeaaa900689ae122d7","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            sort_keys\u003d[\"created_at\"]"},{"line_number":98,"context_line":"        )"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        available_items \u003d ["},{"line_number":101,"context_line":"            item for item in backup_items if"},{"line_number":102,"context_line":"            item.status \u003d\u003d constants.CHECKPOINT_STATUS_AVAILABLE"},{"line_number":103,"context_line":"            ]"},{"line_number":104,"context_line":"        count \u003d len(available_items)"},{"line_number":105,"context_line":"        if count \u003e max_backups:"},{"line_number":106,"context_line":"            for item in available_items[:count - max_backups]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_e5a29298","line":103,"range":{"start_line":100,"start_character":0,"end_line":103,"end_character":13},"updated":"2016-12-06 01:41:14.000000000","message":"Why don\u0027t you pass the status to get_by_filters method, as a condition of this query method?","commit_id":"d29081fa9ad9b19cc9fd4d37f8a3f930ebe0ae95"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"929b2f8b7c995f0d21d097660ae684abb5eb607d","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            sort_keys\u003d[\"created_at\"]"},{"line_number":98,"context_line":"        )"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        available_items \u003d ["},{"line_number":101,"context_line":"            item for item in backup_items if"},{"line_number":102,"context_line":"            item.status \u003d\u003d constants.CHECKPOINT_STATUS_AVAILABLE"},{"line_number":103,"context_line":"            ]"},{"line_number":104,"context_line":"        count \u003d len(available_items)"},{"line_number":105,"context_line":"        if count \u003e max_backups:"},{"line_number":106,"context_line":"            for item in available_items[:count - max_backups]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_0fc14b54","line":103,"range":{"start_line":100,"start_character":0,"end_line":103,"end_character":13},"in_reply_to":"3a71b18c_e5a29298","updated":"2016-12-06 02:28:57.000000000","message":"You are right, I will update it.","commit_id":"d29081fa9ad9b19cc9fd4d37f8a3f930ebe0ae95"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"2c74103d4e3ef9b1d1c3c9aeaaa900689ae122d7","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        now \u003d datetime.utcnow()"},{"line_number":130,"context_line":"        for item in backup_items:"},{"line_number":131,"context_line":"            interval \u003d (now - item[\u0027created_at\u0027]).days"},{"line_number":132,"context_line":"            if (interval / 7) \u003e retention_duration:"},{"line_number":133,"context_line":"                try:"},{"line_number":134,"context_line":"                    client.checkpoints.delete(provider_id, item.id)"},{"line_number":135,"context_line":"                except Exception:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_650be28e","line":132,"range":{"start_line":132,"start_character":32,"end_line":132,"end_character":50},"updated":"2016-12-06 01:41:14.000000000","message":"Does the unit of retention_duration only support week?","commit_id":"d29081fa9ad9b19cc9fd4d37f8a3f930ebe0ae95"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"929b2f8b7c995f0d21d097660ae684abb5eb607d","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        now \u003d datetime.utcnow()"},{"line_number":130,"context_line":"        for item in backup_items:"},{"line_number":131,"context_line":"            interval \u003d (now - item[\u0027created_at\u0027]).days"},{"line_number":132,"context_line":"            if (interval / 7) \u003e retention_duration:"},{"line_number":133,"context_line":"                try:"},{"line_number":134,"context_line":"                    client.checkpoints.delete(provider_id, item.id)"},{"line_number":135,"context_line":"                except Exception:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_af18571f","line":132,"range":{"start_line":132,"start_character":32,"end_line":132,"end_character":50},"in_reply_to":"3a71b18c_650be28e","updated":"2016-12-06 02:28:57.000000000","message":"Yes, do you have any good suggestions?","commit_id":"d29081fa9ad9b19cc9fd4d37f8a3f930ebe0ae95"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"8f97b62fbb5bc0fa424bdbb740d7a11a3740d0e1","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        now \u003d datetime.utcnow()"},{"line_number":130,"context_line":"        for item in backup_items:"},{"line_number":131,"context_line":"            interval \u003d (now - item[\u0027created_at\u0027]).days"},{"line_number":132,"context_line":"            if (interval / 7) \u003e retention_duration:"},{"line_number":133,"context_line":"                try:"},{"line_number":134,"context_line":"                    client.checkpoints.delete(provider_id, item.id)"},{"line_number":135,"context_line":"                except Exception:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_e15fc3e2","line":132,"range":{"start_line":132,"start_character":32,"end_line":132,"end_character":50},"in_reply_to":"3a71b18c_af18571f","updated":"2016-12-06 02:59:23.000000000","message":"The unit of retention_duration here could be day. In the horizon, if user set this value to be week or month. It can be  converted to days.","commit_id":"d29081fa9ad9b19cc9fd4d37f8a3f930ebe0ae95"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"c9c586afb3b711b1f25ef1cf0ed0caa67fe49bcd","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        now \u003d datetime.utcnow()"},{"line_number":130,"context_line":"        for item in backup_items:"},{"line_number":131,"context_line":"            interval \u003d (now - item[\u0027created_at\u0027]).days"},{"line_number":132,"context_line":"            if (interval / 7) \u003e retention_duration:"},{"line_number":133,"context_line":"                try:"},{"line_number":134,"context_line":"                    client.checkpoints.delete(provider_id, item.id)"},{"line_number":135,"context_line":"                except Exception:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_41aeb798","line":132,"range":{"start_line":132,"start_character":32,"end_line":132,"end_character":50},"in_reply_to":"3a71b18c_e15fc3e2","updated":"2016-12-06 03:05:29.000000000","message":"OK, thank you.","commit_id":"d29081fa9ad9b19cc9fd4d37f8a3f930ebe0ae95"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"ade54e0fdb7772933f14f35a6cdd3ed4a3893432","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            retention_duration \u003d extra_info.get(\"retention_duration\", -1)"},{"line_number":76,"context_line":"            cls._delete_old_backup_by_max_backups("},{"line_number":77,"context_line":"                client, max_backups, provider_id, plan_id"},{"line_number":78,"context_line":"            )"},{"line_number":79,"context_line":"            cls._delete_old_backup_by_duration("},{"line_number":80,"context_line":"                client, retention_duration, provider_id, plan_id"},{"line_number":81,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a6eadb0_7f7f0466","line":78,"range":{"start_line":78,"start_character":0,"end_line":78,"end_character":13},"updated":"2016-12-21 02:30:34.000000000","message":"It is better to move \u0027)\u0027 to the end of line above.","commit_id":"02bf8257d71b2112069a28f770247a8badb5cf6e"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"7ec7c4d67745fa5a535014f3d75d2bae884975b4","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            retention_duration \u003d extra_info.get(\"retention_duration\", -1)"},{"line_number":76,"context_line":"            cls._delete_old_backup_by_max_backups("},{"line_number":77,"context_line":"                client, max_backups, provider_id, plan_id"},{"line_number":78,"context_line":"            )"},{"line_number":79,"context_line":"            cls._delete_old_backup_by_duration("},{"line_number":80,"context_line":"                client, retention_duration, provider_id, plan_id"},{"line_number":81,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a6eadb0_9f8940cd","line":78,"range":{"start_line":78,"start_character":0,"end_line":78,"end_character":13},"in_reply_to":"1a6eadb0_7f7f0466","updated":"2016-12-21 02:52:00.000000000","message":"Maybe it is more clear like this.","commit_id":"02bf8257d71b2112069a28f770247a8badb5cf6e"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"ade54e0fdb7772933f14f35a6cdd3ed4a3893432","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            state \u003d constants.OPERATION_EXE_STATE_SUCCESS"},{"line_number":70,"context_line":"        finally:"},{"line_number":71,"context_line":"            cls._update_log_when_operation_finished(log_ref, state)"},{"line_number":72,"context_line":"            plan \u003d client.plans.get(plan_id)"},{"line_number":73,"context_line":"            extra_info \u003d plan.extra_info"},{"line_number":74,"context_line":"            max_backups \u003d extra_info.get(\"max_backups\", -1)"},{"line_number":75,"context_line":"            retention_duration \u003d extra_info.get(\"retention_duration\", -1)"},{"line_number":76,"context_line":"            cls._delete_old_backup_by_max_backups("},{"line_number":77,"context_line":"                client, max_backups, provider_id, plan_id"},{"line_number":78,"context_line":"            )"},{"line_number":79,"context_line":"            cls._delete_old_backup_by_duration("},{"line_number":80,"context_line":"                client, retention_duration, provider_id, plan_id"},{"line_number":81,"context_line":"            )"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @staticmethod"},{"line_number":84,"context_line":"    def _delete_old_backup_by_max_backups("}],"source_content_type":"text/x-python","patch_set":9,"id":"1a6eadb0_9f6860bc","line":81,"range":{"start_line":72,"start_character":0,"end_line":81,"end_character":13},"updated":"2016-12-21 02:30:34.000000000","message":"It is better to encapsulate these codes into \u0027try...except\u0027, because if any exception happen, it may impact the executor.","commit_id":"02bf8257d71b2112069a28f770247a8badb5cf6e"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"7ec7c4d67745fa5a535014f3d75d2bae884975b4","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            state \u003d constants.OPERATION_EXE_STATE_SUCCESS"},{"line_number":70,"context_line":"        finally:"},{"line_number":71,"context_line":"            cls._update_log_when_operation_finished(log_ref, state)"},{"line_number":72,"context_line":"            plan \u003d client.plans.get(plan_id)"},{"line_number":73,"context_line":"            extra_info \u003d plan.extra_info"},{"line_number":74,"context_line":"            max_backups \u003d extra_info.get(\"max_backups\", -1)"},{"line_number":75,"context_line":"            retention_duration \u003d extra_info.get(\"retention_duration\", -1)"},{"line_number":76,"context_line":"            cls._delete_old_backup_by_max_backups("},{"line_number":77,"context_line":"                client, max_backups, provider_id, plan_id"},{"line_number":78,"context_line":"            )"},{"line_number":79,"context_line":"            cls._delete_old_backup_by_duration("},{"line_number":80,"context_line":"                client, retention_duration, provider_id, plan_id"},{"line_number":81,"context_line":"            )"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @staticmethod"},{"line_number":84,"context_line":"    def _delete_old_backup_by_max_backups("}],"source_content_type":"text/x-python","patch_set":9,"id":"1a6eadb0_5fb6c88a","line":81,"range":{"start_line":72,"start_character":0,"end_line":81,"end_character":13},"in_reply_to":"1a6eadb0_9f6860bc","updated":"2016-12-21 02:52:00.000000000","message":"Yes, thanks for your suggestion.","commit_id":"02bf8257d71b2112069a28f770247a8badb5cf6e"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"27d4bd4d212b98b83f42608df351510947518882","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        finally:"},{"line_number":71,"context_line":"            cls._update_log_when_operation_finished(log_ref, state)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        plan \u003d client.plans.get(plan_id)"},{"line_number":74,"context_line":"        extra_info \u003d plan.extra_info"},{"line_number":75,"context_line":"        max_backups \u003d extra_info.get(\"max_backups\", -1)"},{"line_number":76,"context_line":"        retention_duration \u003d extra_info.get(\"retention_duration\", -1)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_646547e0","line":73,"range":{"start_line":73,"start_character":8,"end_line":73,"end_character":40},"updated":"2016-12-22 02:56:56.000000000","message":"move this codes to line 78. because it may fail to access Karbor by client.","commit_id":"3052f48d04f7330148f421e8daca691c5dccc496"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"7d4c210b6dce64fdb71d7d989e2beddd92ae64eb","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        finally:"},{"line_number":71,"context_line":"            cls._update_log_when_operation_finished(log_ref, state)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        plan \u003d client.plans.get(plan_id)"},{"line_number":74,"context_line":"        extra_info \u003d plan.extra_info"},{"line_number":75,"context_line":"        max_backups \u003d extra_info.get(\"max_backups\", -1)"},{"line_number":76,"context_line":"        retention_duration \u003d extra_info.get(\"retention_duration\", -1)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_84adcb8a","line":73,"range":{"start_line":73,"start_character":8,"end_line":73,"end_character":40},"in_reply_to":"da4df55a_646547e0","updated":"2016-12-22 03:13:46.000000000","message":"OK, yes, you are right. thanks for your suggestion.","commit_id":"3052f48d04f7330148f421e8daca691c5dccc496"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"46505c2d550bf5df92021c4f08d8231ff694b69c","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        filters \u003d {\"create_by\": operation_by,"},{"line_number":103,"context_line":"                   \"plan_id\": plan_id,"},{"line_number":104,"context_line":"                   \"checkpoint_status\": constants.CHECKPOINT_STATUS_AVAILABLE}"},{"line_number":105,"context_line":"        context_ \u003d context.get_admin_context()"},{"line_number":106,"context_line":"        backup_items \u003d objects.CheckpointRecordList.get_by_filters("},{"line_number":107,"context_line":"            context_,"},{"line_number":108,"context_line":"            filters,"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a30ddce_904b55b0","line":105,"range":{"start_line":105,"start_character":8,"end_line":105,"end_character":16},"updated":"2017-03-07 03:04:16.000000000","message":"IMO, it is not a good variable name. It is better to use \u0027admin_context\u0027 instead.","commit_id":"5683e8a8fd9429cd88630180d6a9be17dbe1307b"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"19904a91568bed1310d188ea8c73af4d0243a030","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        filters \u003d {\"create_by\": operation_by,"},{"line_number":103,"context_line":"                   \"plan_id\": plan_id,"},{"line_number":104,"context_line":"                   \"checkpoint_status\": constants.CHECKPOINT_STATUS_AVAILABLE}"},{"line_number":105,"context_line":"        context_ \u003d context.get_admin_context()"},{"line_number":106,"context_line":"        backup_items \u003d objects.CheckpointRecordList.get_by_filters("},{"line_number":107,"context_line":"            context_,"},{"line_number":108,"context_line":"            filters,"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a30ddce_e6e69be7","line":105,"range":{"start_line":105,"start_character":8,"end_line":105,"end_character":16},"in_reply_to":"9a30ddce_904b55b0","updated":"2017-03-07 05:39:05.000000000","message":"Done","commit_id":"5683e8a8fd9429cd88630180d6a9be17dbe1307b"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"46505c2d550bf5df92021c4f08d8231ff694b69c","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        count \u003d len(backup_items)"},{"line_number":113,"context_line":"        if count \u003e max_backups:"},{"line_number":114,"context_line":"            for item in backup_items[:count - max_backups]:"},{"line_number":115,"context_line":"                try:"},{"line_number":116,"context_line":"                    client.checkpoints.delete(provider_id, item.id)"},{"line_number":117,"context_line":"                except Exception as e:"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a30ddce_13bbef73","line":114,"range":{"start_line":114,"start_character":12,"end_line":114,"end_character":58},"updated":"2017-03-07 03:04:16.000000000","message":"If I understand correctly, you want to delete the oldest (count - max_backups) records. Unfortunately, you delete the newest ones. Because records in \u0027backup_items\u0027 are sorted by \u0027created_at\u0027 in  desc order(you can check again). That means backup_item[0] is the newest record, and backup_item[-1] is oldest one. backup_items[:count - max_backups] \u003d [backup_items[0], .., backup_items[count - max_backups - 1]]. So the correct records are backup_items[max_backups:]. By the way, backup_items[x:y] will generate another new list, from the perspective of efficiency, it is better to visit the list by index, for example, \u0027for i in xrange(max_backups, count)\u0027.","commit_id":"5683e8a8fd9429cd88630180d6a9be17dbe1307b"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"19904a91568bed1310d188ea8c73af4d0243a030","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        count \u003d len(backup_items)"},{"line_number":113,"context_line":"        if count \u003e max_backups:"},{"line_number":114,"context_line":"            for item in backup_items[:count - max_backups]:"},{"line_number":115,"context_line":"                try:"},{"line_number":116,"context_line":"                    client.checkpoints.delete(provider_id, item.id)"},{"line_number":117,"context_line":"                except Exception as e:"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a30ddce_9feefeea","line":114,"range":{"start_line":114,"start_character":12,"end_line":114,"end_character":58},"in_reply_to":"9a30ddce_13bbef73","updated":"2017-03-07 05:39:05.000000000","message":"default_dir\u003d\u0027desc\u0027, So backup_items[0] is the oldest one.","commit_id":"5683e8a8fd9429cd88630180d6a9be17dbe1307b"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"46505c2d550bf5df92021c4f08d8231ff694b69c","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        if count \u003e max_backups:"},{"line_number":114,"context_line":"            for item in backup_items[:count - max_backups]:"},{"line_number":115,"context_line":"                try:"},{"line_number":116,"context_line":"                    client.checkpoints.delete(provider_id, item.id)"},{"line_number":117,"context_line":"                except Exception as e:"},{"line_number":118,"context_line":"                    reason \u003d (_(\"Failed to delete checkpoint: %(cp_id)s by \""},{"line_number":119,"context_line":"                                \"max_backups with the reasion: %(reason)s\") %"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a30ddce_330c7342","line":116,"range":{"start_line":116,"start_character":20,"end_line":116,"end_character":67},"updated":"2017-03-07 03:04:16.000000000","message":"The checkpoint is deleted, but the corresponding \u0027checkpoint record\u0027 still in the DB. So, next time you will get that record again from DB, and delete it from \u0027bank\u0027. Unfortunately, this time it must be failed, because it had been deleted. It is a design problem. So I advise you to discuss it on the IRC meeting.","commit_id":"5683e8a8fd9429cd88630180d6a9be17dbe1307b"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"19904a91568bed1310d188ea8c73af4d0243a030","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        if count \u003e max_backups:"},{"line_number":114,"context_line":"            for item in backup_items[:count - max_backups]:"},{"line_number":115,"context_line":"                try:"},{"line_number":116,"context_line":"                    client.checkpoints.delete(provider_id, item.id)"},{"line_number":117,"context_line":"                except Exception as e:"},{"line_number":118,"context_line":"                    reason \u003d (_(\"Failed to delete checkpoint: %(cp_id)s by \""},{"line_number":119,"context_line":"                                \"max_backups with the reasion: %(reason)s\") %"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a30ddce_5fe4860c","line":116,"range":{"start_line":116,"start_character":20,"end_line":116,"end_character":67},"in_reply_to":"9a30ddce_330c7342","updated":"2017-03-07 05:39:05.000000000","message":"pls see https://review.openstack.org/#/c/398892/ ,when delete checkpoint, the \"deleted\" in checkpoint_record db will be placed \"1\".","commit_id":"5683e8a8fd9429cd88630180d6a9be17dbe1307b"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"46505c2d550bf5df92021c4f08d8231ff694b69c","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        if retention_duration \u003d\u003d -1:"},{"line_number":129,"context_line":"            return"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        context_ \u003d context.get_admin_context()"},{"line_number":132,"context_line":"        filters \u003d {\"create_by\": operation_by,"},{"line_number":133,"context_line":"                   \"plan_id\": plan_id,"},{"line_number":134,"context_line":"                   \"checkpoint_status\": constants.CHECKPOINT_STATUS_AVAILABLE}"},{"line_number":135,"context_line":"        backup_items \u003d objects.CheckpointRecordList.get_by_filters("},{"line_number":136,"context_line":"            context_,"},{"line_number":137,"context_line":"            filters,"},{"line_number":138,"context_line":"            sort_keys\u003d[\"created_at\"]"},{"line_number":139,"context_line":"        )"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        now \u003d datetime.utcnow()"},{"line_number":142,"context_line":"        for item in backup_items:"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a30ddce_b0493991","line":139,"range":{"start_line":131,"start_character":0,"end_line":139,"end_character":9},"updated":"2017-03-07 03:04:16.000000000","message":"These are same codes in \u0027_delete_old_backup_by_max_backups\u0027. It is better to move them to another function and invoke it in \u0027_run\u0027, then pass the result as a parameter to these two function.","commit_id":"5683e8a8fd9429cd88630180d6a9be17dbe1307b"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"19904a91568bed1310d188ea8c73af4d0243a030","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        if retention_duration \u003d\u003d -1:"},{"line_number":129,"context_line":"            return"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        context_ \u003d context.get_admin_context()"},{"line_number":132,"context_line":"        filters \u003d {\"create_by\": operation_by,"},{"line_number":133,"context_line":"                   \"plan_id\": plan_id,"},{"line_number":134,"context_line":"                   \"checkpoint_status\": constants.CHECKPOINT_STATUS_AVAILABLE}"},{"line_number":135,"context_line":"        backup_items \u003d objects.CheckpointRecordList.get_by_filters("},{"line_number":136,"context_line":"            context_,"},{"line_number":137,"context_line":"            filters,"},{"line_number":138,"context_line":"            sort_keys\u003d[\"created_at\"]"},{"line_number":139,"context_line":"        )"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        now \u003d datetime.utcnow()"},{"line_number":142,"context_line":"        for item in backup_items:"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a30ddce_5f79e62e","line":139,"range":{"start_line":131,"start_character":0,"end_line":139,"end_character":9},"in_reply_to":"9a30ddce_b0493991","updated":"2017-03-07 05:39:05.000000000","message":"OK, but IMO, it should be invoked by \"_delete_old_backup_by_max_backups\" and \" _delete_old_backup_by_duration\", avoid deleting two times.","commit_id":"5683e8a8fd9429cd88630180d6a9be17dbe1307b"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"46505c2d550bf5df92021c4f08d8231ff694b69c","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        )"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        now \u003d datetime.utcnow()"},{"line_number":142,"context_line":"        for item in backup_items:"},{"line_number":143,"context_line":"            interval \u003d (now - item[\u0027created_at\u0027]).days"},{"line_number":144,"context_line":"            if interval \u003e retention_duration:"},{"line_number":145,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a30ddce_86487f5d","line":142,"range":{"start_line":142,"start_character":8,"end_line":142,"end_character":33},"updated":"2017-03-07 03:04:16.000000000","message":"\u0027backup_items\u0027 are sorted by \u0027created_at\u0027 in  desc order. So it is better to visit \u0027backup_items\u0027 from tail to head, if one record does not exceed \u0027retention_duration\u0027, just break.","commit_id":"5683e8a8fd9429cd88630180d6a9be17dbe1307b"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"46505c2d550bf5df92021c4f08d8231ff694b69c","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            interval \u003d (now - item[\u0027created_at\u0027]).days"},{"line_number":144,"context_line":"            if interval \u003e retention_duration:"},{"line_number":145,"context_line":"                try:"},{"line_number":146,"context_line":"                    client.checkpoints.delete(provider_id, item.id)"},{"line_number":147,"context_line":"                except Exception as e:"},{"line_number":148,"context_line":"                    reason \u003d (_(\"Failed to delete checkpoint: %(cp_id)s \""},{"line_number":149,"context_line":"                                \"by retention_duration with the reasion: \""}],"source_content_type":"text/x-python","patch_set":18,"id":"9a30ddce_865f9f0d","line":146,"range":{"start_line":146,"start_character":20,"end_line":146,"end_character":45},"updated":"2017-03-07 03:04:16.000000000","message":"ditto","commit_id":"5683e8a8fd9429cd88630180d6a9be17dbe1307b"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"d4c5e1f5219d7b82dbe6558ca1cec5dffdfca82a","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                                                       operation_by)"},{"line_number":115,"context_line":"        count \u003d len(backup_items)"},{"line_number":116,"context_line":"        if count \u003e max_backups:"},{"line_number":117,"context_line":"            for item in backup_items[count:]:"},{"line_number":118,"context_line":"                try:"},{"line_number":119,"context_line":"                    client.checkpoints.delete(provider_id, item.id)"},{"line_number":120,"context_line":"                except Exception as e:"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a30ddce_e3f544cb","line":117,"range":{"start_line":117,"start_character":24,"end_line":117,"end_character":44},"updated":"2017-03-09 03:20:19.000000000","message":"backup_items[count:] should be []. The correct list is backup_items[max_backups:]","commit_id":"bc1173b40df2a4b1fbdd5908d332e30bed6d74a1"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"aeef0a1a0ae0761d16c481a2dcf7ef9b700d95dc","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                                                       operation_by)"},{"line_number":115,"context_line":"        count \u003d len(backup_items)"},{"line_number":116,"context_line":"        if count \u003e max_backups:"},{"line_number":117,"context_line":"            for item in backup_items[count:]:"},{"line_number":118,"context_line":"                try:"},{"line_number":119,"context_line":"                    client.checkpoints.delete(provider_id, item.id)"},{"line_number":120,"context_line":"                except Exception as e:"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a30ddce_83ac88a1","line":117,"range":{"start_line":117,"start_character":24,"end_line":117,"end_character":44},"in_reply_to":"9a30ddce_e3f544cb","updated":"2017-03-09 03:25:38.000000000","message":"I\u0027m sorry. How careless of me.","commit_id":"bc1173b40df2a4b1fbdd5908d332e30bed6d74a1"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"c3c8fab0e6389dc1ee6627c7dfe9239d41ea3558","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            self._update_log_when_operation_finished(log_ref, state)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        try:"},{"line_number":73,"context_line":"            plan \u003d client.plans.get(plan_id)"},{"line_number":74,"context_line":"            parameters \u003d plan.parameters"},{"line_number":75,"context_line":"            max_backups \u003d parameters.get(\"max_backups\", -1)"},{"line_number":76,"context_line":"            retention_duration \u003d parameters.get(\"retention_duration\", -1)"},{"line_number":77,"context_line":"        except Exception:"},{"line_number":78,"context_line":"            reason \u003d _(\"Failed to get plan by plan_id: %s\") % plan_id"},{"line_number":79,"context_line":"            raise exception.InvalidOperationDefinition(reason\u003dreason)"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f4b6375_44a48ab9","line":76,"range":{"start_line":73,"start_character":44,"end_line":76,"end_character":73},"updated":"2017-11-01 08:02:35.000000000","message":"Is there a case where plan doesn\u0027t have parameters? if not this can all go outside the try,","commit_id":"46c9407dfb49a587a36d1f0538257f69195e5ea6"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"c3c8fab0e6389dc1ee6627c7dfe9239d41ea3558","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                    client.checkpoints.delete(provider_id, item.id)"},{"line_number":120,"context_line":"                except Exception as e:"},{"line_number":121,"context_line":"                    reason \u003d (_(\"Failed to delete checkpoint: %(cp_id)s by \""},{"line_number":122,"context_line":"                                \"max_backups with the reasion: %(reason)s\") %"},{"line_number":123,"context_line":"                              {\"cp_id\": item.id, \"reason\": e})"},{"line_number":124,"context_line":"                    raise exception.InvalidOperationDefinition(reason\u003dreason)"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"3f4b6375_64b8a6c7","line":122,"range":{"start_line":122,"start_character":54,"end_line":122,"end_character":61},"updated":"2017-11-01 08:02:35.000000000","message":"reason","commit_id":"46c9407dfb49a587a36d1f0538257f69195e5ea6"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"c3c8fab0e6389dc1ee6627c7dfe9239d41ea3558","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                    reason \u003d (_(\"Failed to delete checkpoint: %(cp_id)s by \""},{"line_number":122,"context_line":"                                \"max_backups with the reasion: %(reason)s\") %"},{"line_number":123,"context_line":"                              {\"cp_id\": item.id, \"reason\": e})"},{"line_number":124,"context_line":"                    raise exception.InvalidOperationDefinition(reason\u003dreason)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _delete_old_backup_by_duration("},{"line_number":127,"context_line":"            self, client, retention_duration, provider_id, plan_id,"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f4b6375_c4c63a4a","line":124,"range":{"start_line":124,"start_character":20,"end_line":124,"end_character":77},"updated":"2017-11-01 08:02:35.000000000","message":"Maybe we should process all possible deletions and then raise an error with all the failed deletions. This way we don\u0027t get backups not being removed just because some other backups failed to delete.","commit_id":"46c9407dfb49a587a36d1f0538257f69195e5ea6"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"c3c8fab0e6389dc1ee6627c7dfe9239d41ea3558","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                    client.checkpoints.delete(provider_id, item.id)"},{"line_number":141,"context_line":"                except Exception as e:"},{"line_number":142,"context_line":"                    reason \u003d (_(\"Failed to delete checkpoint: %(cp_id)s \""},{"line_number":143,"context_line":"                                \"by retention_duration with the reasion: \""},{"line_number":144,"context_line":"                                \"%(reason)s\") %"},{"line_number":145,"context_line":"                              {\"cp_id\": item.id, \"reason\": e})"},{"line_number":146,"context_line":"                    raise exception.InvalidOperationDefinition(reason\u003dreason)"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f4b6375_a4c57e3e","line":143,"range":{"start_line":143,"start_character":64,"end_line":143,"end_character":71},"updated":"2017-11-01 08:02:35.000000000","message":"reason","commit_id":"46c9407dfb49a587a36d1f0538257f69195e5ea6"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"c3c8fab0e6389dc1ee6627c7dfe9239d41ea3558","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                                \"by retention_duration with the reasion: \""},{"line_number":144,"context_line":"                                \"%(reason)s\") %"},{"line_number":145,"context_line":"                              {\"cp_id\": item.id, \"reason\": e})"},{"line_number":146,"context_line":"                    raise exception.InvalidOperationDefinition(reason\u003dreason)"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f4b6375_a4da1e14","line":146,"range":{"start_line":146,"start_character":20,"end_line":146,"end_character":77},"updated":"2017-11-01 08:02:35.000000000","message":"same comments as above. mabey we should delete everything that we can before halting the operation.","commit_id":"46c9407dfb49a587a36d1f0538257f69195e5ea6"}]}
