)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":10,"context_line":"volume service in ways that prevent scaling out backup services"},{"line_number":11,"context_line":"horizontally across multiple physical nodes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch is to loose this coupling to enable backup processes"},{"line_number":14,"context_line":"to run on multiple nodes without having to be colocated with volume"},{"line_number":15,"context_line":"services."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"fa69d971_7a296c9a","line":13,"updated":"2016-01-11 18:56:40.000000000","message":"s/loose/loosen/","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":11224,"name":"Swami Reddy","email":"swamireddy@gmail.com","username":"swamireddy"},"change_message_id":"b7375ec146cc08969310b8cf74ebad8defd8e330","unresolved":false,"context_lines":[{"line_number":19,"context_line":"2. Vendor specific work."},{"line_number":20,"context_line":"3. Remove current backup_volume in driver."},{"line_number":21,"context_line":"4. Rolling upgrades."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I743e676372703e74178c79683dd622d530981e04"},{"line_number":24,"context_line":"Partial-Implements: bp scalable-backup-service"},{"line_number":25,"context_line":"Co-Authored-By: Tom Barron \u003ctpb@dyncloud.net\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"ba63e191_d78ee626","line":22,"updated":"2016-01-18 18:21:31.000000000","message":"Is this patch require any documentation changes? If yes please add \"DocImpact\"","commit_id":"3be914544131b16eeb47a306af4139b485d66794"}],"cinder/backup/api.py":[{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":41,"context_line":"import cinder.volume"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"backup_api_opts \u003d ["},{"line_number":44,"context_line":"    cfg.BoolOpt(\u0027backup_use_same_backend\u0027,"},{"line_number":45,"context_line":"                default\u003dFalse,"},{"line_number":46,"context_line":"                help\u003d\u0027Backup services use same backend.\u0027)"},{"line_number":47,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_5a7ee8af","line":44,"updated":"2016-01-11 18:56:40.000000000","message":"I see this option used in a test but not (yet) in the functional code.  Not sure I understand its purpose yet ...","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        Call backup manager to execute backup delete or force delete operation."},{"line_number":86,"context_line":"        :param context: running context"},{"line_number":87,"context_line":"        :param backup: the dict of backup that is got from DB."},{"line_number":88,"context_line":"        :param force: indicate force delete or not"},{"line_number":89,"context_line":"        :raises: InvalidBackup"},{"line_number":90,"context_line":"        :raises: BackupDriverException"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_7a7bacbe","line":87,"updated":"2016-01-11 18:56:40.000000000","message":"We should change this to \u0027backup object\u0027 rather than dict.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            )"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        return backups"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def _is_backup_service_enabled(self, availability_zone, host):"},{"line_number":143,"context_line":"        \"\"\"Check if there is a backup service available.\"\"\""},{"line_number":144,"context_line":"        topic \u003d CONF.backup_topic"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_1a4b9088","line":141,"updated":"2016-01-11 18:56:40.000000000","message":"Suggest:\n    def az_matched(service, availability_zone):\n        return ((not availability_zone) or\n                service.availability_zone \u003d\u003d availability_zone)","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        for srv in services:"},{"line_number":149,"context_line":"            az_matched \u003d ((not availability_zone) or"},{"line_number":150,"context_line":"                          srv.availability_zone \u003d\u003d availability_zone)"},{"line_number":151,"context_line":"            if (az_matched and"},{"line_number":152,"context_line":"                    srv.host \u003d\u003d host and"},{"line_number":153,"context_line":"                    utils.service_is_up(srv)):"},{"line_number":154,"context_line":"                return True"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_3a50d431","line":151,"updated":"2016-01-11 18:56:40.000000000","message":"Suggest using \u0027if az_matched(srv, availability_zone)\u0027 instead of the previous three lines.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                return True"},{"line_number":155,"context_line":"        return False"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def _get_any_available_backup_service(self, availability_zone):"},{"line_number":158,"context_line":"        \"\"\"Get an available backup service host.\"\"\""},{"line_number":159,"context_line":"        services \u003d self._list_backup_services()"},{"line_number":160,"context_line":"        index \u003d 0"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_da409861","line":157,"updated":"2016-01-11 18:56:40.000000000","message":"Suggest:\n    def _get_any_availabble_backup_service_host(self, availability_zone):\n    \"\"\"Get an available backup service host in the specified availability zone.\"\"\"","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        return False"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def _get_any_available_backup_service(self, availability_zone):"},{"line_number":158,"context_line":"        \"\"\"Get an available backup service host.\"\"\""},{"line_number":159,"context_line":"        services \u003d self._list_backup_services()"},{"line_number":160,"context_line":"        index \u003d 0"},{"line_number":161,"context_line":"        while self.last_used_host and index \u003c len(services):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_fa455c6e","line":158,"updated":"2016-01-11 18:56:40.000000000","message":"# Find the last service used in the list.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        while self.last_used_host and index \u003c len(services):"},{"line_number":162,"context_line":"            if self.last_used_host \u003d\u003d services[index].host:"},{"line_number":163,"context_line":"                break"},{"line_number":164,"context_line":"            index \u003d index + 1"},{"line_number":165,"context_line":"        idx \u003d index"},{"line_number":166,"context_line":"        while idx \u003c index + len(services):"},{"line_number":167,"context_line":"            srv \u003d services[idx % len(services)]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_9a5f8040","line":164,"updated":"2016-01-11 18:56:40.000000000","message":"# Get the next running service with matching availability zone.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            srv \u003d services[idx % len(services)]"},{"line_number":168,"context_line":"            az_matched \u003d ((not availability_zone) or"},{"line_number":169,"context_line":"                          srv.availability_zone \u003d\u003d availability_zone)"},{"line_number":170,"context_line":"            if(az_matched and"},{"line_number":171,"context_line":"               utils.service_is_up(srv)):"},{"line_number":172,"context_line":"                self.last_used_host \u003d srv.host"},{"line_number":173,"context_line":"                return self.last_used_host"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_ba5cc44b","line":170,"updated":"2016-01-11 18:56:40.000000000","message":"Suggest using \u0027if (az_matched(srv, availability_zone)\u0027 instead of the previous three lines.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            idx \u003d idx + 1"},{"line_number":175,"context_line":"        return None"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def _get_available_backup_service(self, host, availability_zone):"},{"line_number":178,"context_line":"        \"\"\"Return backup service.\"\"\""},{"line_number":179,"context_line":"        backup_host \u003d None"},{"line_number":180,"context_line":"        if host and self._is_backup_service_enabled(availability_zone, host):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_5a55881b","line":177,"updated":"2016-01-11 18:56:40.000000000","message":"Suggest:\n    def _get_available_backup_service_host(...)\n        \"\"\"Return an appropriate backup service host.\"\"\"","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            backup_host \u003d host"},{"line_number":182,"context_line":"        if not backup_host and (not host or CONF.backup_use_same_backend):"},{"line_number":183,"context_line":"            backup_host \u003d self._get_any_available_backup_service("},{"line_number":184,"context_line":"                availability_zone)"},{"line_number":185,"context_line":"        return backup_host"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _list_backup_services(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_7a52cc36","line":184,"updated":"2016-01-11 18:56:40.000000000","message":"Suggest:\n        if not backup_host:\n            raise exception.ServiceNotFound(service_id\u003d\u0027cinder-backup\u0027)","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        topic \u003d CONF.backup_topic"},{"line_number":193,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":194,"context_line":"        services \u003d objects.ServiceList.get_all_by_topic("},{"line_number":195,"context_line":"            ctxt, topic, disabled\u003dFalse)"},{"line_number":196,"context_line":"        return services"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    def _list_backup_hosts(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_1a32b010","line":195,"updated":"2016-01-11 18:56:40.000000000","message":"Nice.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        previous_status \u003d volume[\u0027status\u0027]"},{"line_number":229,"context_line":"        host \u003d self._get_available_backup_service("},{"line_number":230,"context_line":"            None, volume.availability_zone)"},{"line_number":231,"context_line":"        if not host:"},{"line_number":232,"context_line":"            raise exception.ServiceNotFound(service_id\u003d\u0027cinder-backup\u0027)"},{"line_number":233,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_3a377400","line":230,"updated":"2016-01-11 18:56:40.000000000","message":"@3 can drop the next two lines if the excpetion is raised in _get_available_backup_service().","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":441,"context_line":"        backup \u003d self.get(context, backup_id)"},{"line_number":442,"context_line":"        host \u003d self._get_available_backup_service(backup.host,"},{"line_number":443,"context_line":"                                                  backup.availability_zone)"},{"line_number":444,"context_line":"        backup.host \u003d host"},{"line_number":445,"context_line":"        backup.save()"},{"line_number":446,"context_line":"        # send to manager to do reset operation"},{"line_number":447,"context_line":"        self.backup_rpcapi.reset_status(ctxt\u003dcontext, backup\u003dbackup,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_da3738fc","line":444,"updated":"2016-01-11 18:56:40.000000000","message":"We can just do backup.host \u003d self._get_available_backup_service(...)\n\nThis method does not currently raise an exception if there is no available service, but offhand that does not seem correct.  If I\u0027m wrong and that is the correct behavior, then we\u0027d need to catch and ignore the exception here if we raise it inside _get_available_backup_service()","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":473,"context_line":""},{"line_number":474,"context_line":"        host \u003d self._get_available_backup_service(backup.host,"},{"line_number":475,"context_line":"                                                  backup.availability_zone)"},{"line_number":476,"context_line":"        backup.host \u003d host"},{"line_number":477,"context_line":"        backup.save()"},{"line_number":478,"context_line":"        export_data \u003d self.backup_rpcapi.export_record(context, backup)"},{"line_number":479,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_fa3c7ce2","line":476,"updated":"2016-01-11 18:56:40.000000000","message":"We can just do backup.host \u003d self._get_available_backup_service(...)\nAs in the case of reset_status, I think we should be raising an exception if there is no available backup service.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":559,"context_line":"        # We  send it to the first backup service host, and the backup manager"},{"line_number":560,"context_line":"        # on that host will forward it to other hosts on the hosts list if it"},{"line_number":561,"context_line":"        # cannot support correct service itself."},{"line_number":562,"context_line":"        hosts \u003d self._list_backup_hosts()"},{"line_number":563,"context_line":"        if len(hosts) \u003d\u003d 0:"},{"line_number":564,"context_line":"            raise exception.ServiceNotFound(service_id\u003dbackup_service)"},{"line_number":565,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_9a26a0cc","line":562,"updated":"2016-01-11 18:56:40.000000000","message":"I think we could raise the exception inside _list_backup_hosts() ...","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"23c1d7976250d6d215ba05c6b0b343e1e6081327","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def _az_matched(self, service, availability_zone):"},{"line_number":140,"context_line":"        return ((not availability_zone) or"},{"line_number":141,"context_line":"                service.availability_zone \u003d\u003d availability_zone)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _is_backup_service_enabled(self, availability_zone, host):"},{"line_number":144,"context_line":"        \"\"\"Check if there is a backup service available.\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_307c45eb","line":141,"updated":"2016-01-15 14:42:08.000000000","message":"Do we need to get the same behaviour as c-voluse has [1]? From my PoV I don\u0027t like this option and won\u0027t block patch but other core and community members ould not agree with mee\n\n\n[1] https://github.com/openstack/cinder/blob/master/cinder/common/config.py#L139","commit_id":"59a310a6216d8e2abd7f932dfccb4dfd90512e2d"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"5af85b8b81ce3cac4be903adf73c0704484c7fc2","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def _az_matched(self, service, availability_zone):"},{"line_number":140,"context_line":"        return ((not availability_zone) or"},{"line_number":141,"context_line":"                service.availability_zone \u003d\u003d availability_zone)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _is_backup_service_enabled(self, availability_zone, host):"},{"line_number":144,"context_line":"        \"\"\"Check if there is a backup service available.\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_72362ee9","line":141,"in_reply_to":"da6ed579_307c45eb","updated":"2016-01-15 21:36:56.000000000","message":"I don\u0027t think we do. We\u0027re never getting a backup_create request from *someone else* with *someones* impression on AZs. The problem the option you mention solves (in a clumsy way…) is to allow having no coupling between Nova\u0027s and Cinder\u0027s AZs.\n\nBackups are asked for by the user. In that case - if he specifies a non-existing AZ - that\u0027s his problem. If he doesn\u0027t care about AZ he shouldn\u0027t specify it in the first place.","commit_id":"59a310a6216d8e2abd7f932dfccb4dfd90512e2d"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"5af85b8b81ce3cac4be903adf73c0704484c7fc2","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        availability zone."},{"line_number":161,"context_line":"        \"\"\""},{"line_number":162,"context_line":"        # Find the last service used in the list."},{"line_number":163,"context_line":"        services \u003d self._list_backup_services()"},{"line_number":164,"context_line":"        index \u003d 0"},{"line_number":165,"context_line":"        while self.last_used_host and index \u003c len(services):"},{"line_number":166,"context_line":"            if self.last_used_host \u003d\u003d services[index].host:"},{"line_number":167,"context_line":"                break"},{"line_number":168,"context_line":"            index \u003d index + 1"},{"line_number":169,"context_line":"        # Get the next running service with matching availability zone."},{"line_number":170,"context_line":"        idx \u003d index"},{"line_number":171,"context_line":"        while idx \u003c index + len(services):"},{"line_number":172,"context_line":"            srv \u003d services[idx % len(services)]"},{"line_number":173,"context_line":"            if(self._az_matched(srv, availability_zone) and"},{"line_number":174,"context_line":"               utils.service_is_up(srv)):"},{"line_number":175,"context_line":"                self.last_used_host \u003d srv.host"},{"line_number":176,"context_line":"                return self.last_used_host"},{"line_number":177,"context_line":"            idx \u003d idx + 1"},{"line_number":178,"context_line":"        return None"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def _get_available_backup_service_host(self, host, availability_zone):"},{"line_number":181,"context_line":"        \"\"\"Return an appropriate backup service host.\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_f28bfe1c","line":178,"range":{"start_line":163,"start_character":0,"end_line":178,"end_character":19},"updated":"2016-01-15 21:36:56.000000000","message":"I don\u0027t have a proof that this may be a real issue and this certainly may be tweaked in the future after some testing, so don\u0027t treat it as a remark. I just want to share my thoughts.\n\nI wonder if simply shuffling service list and picking first one matching isn\u0027t simpler and more effective in scattering the jobs. Or maybe a kind of hash ring based on backup id would be?\n\nWith this solution if we have a periodical task requesting a certain AZ that has only a single host and it\u0027s in the back of the list, we may end up with services in the front of the list never being selected.","commit_id":"59a310a6216d8e2abd7f932dfccb4dfd90512e2d"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"81a5dceef1cb752ebe244e5adcd1970e04ed14e5","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        availability zone."},{"line_number":161,"context_line":"        \"\"\""},{"line_number":162,"context_line":"        # Find the last service used in the list."},{"line_number":163,"context_line":"        services \u003d self._list_backup_services()"},{"line_number":164,"context_line":"        index \u003d 0"},{"line_number":165,"context_line":"        while self.last_used_host and index \u003c len(services):"},{"line_number":166,"context_line":"            if self.last_used_host \u003d\u003d services[index].host:"},{"line_number":167,"context_line":"                break"},{"line_number":168,"context_line":"            index \u003d index + 1"},{"line_number":169,"context_line":"        # Get the next running service with matching availability zone."},{"line_number":170,"context_line":"        idx \u003d index"},{"line_number":171,"context_line":"        while idx \u003c index + len(services):"},{"line_number":172,"context_line":"            srv \u003d services[idx % len(services)]"},{"line_number":173,"context_line":"            if(self._az_matched(srv, availability_zone) and"},{"line_number":174,"context_line":"               utils.service_is_up(srv)):"},{"line_number":175,"context_line":"                self.last_used_host \u003d srv.host"},{"line_number":176,"context_line":"                return self.last_used_host"},{"line_number":177,"context_line":"            idx \u003d idx + 1"},{"line_number":178,"context_line":"        return None"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def _get_available_backup_service_host(self, host, availability_zone):"},{"line_number":181,"context_line":"        \"\"\"Return an appropriate backup service host.\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_38394c42","line":178,"range":{"start_line":163,"start_character":0,"end_line":178,"end_character":19},"in_reply_to":"da6ed579_f28bfe1c","updated":"2016-01-18 04:07:28.000000000","message":"I use shuffle instead. And then from the beginning to find a match node.","commit_id":"59a310a6216d8e2abd7f932dfccb4dfd90512e2d"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"218f4e38c6d439d35a5342df79e453c7de8dc43a","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                return True"},{"line_number":153,"context_line":"        return False"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def _get_any_available_backup_service(self, availability_zone):"},{"line_number":156,"context_line":"        \"\"\"Get an available backup service host."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        Get an available backup service host in the specified"},{"line_number":159,"context_line":"        availability zone."},{"line_number":160,"context_line":"        \"\"\""},{"line_number":161,"context_line":"        services \u003d [srv for srv in self._list_backup_services()]"},{"line_number":162,"context_line":"        random.shuffle(services)"},{"line_number":163,"context_line":"        # Get the next running service with matching availability zone."},{"line_number":164,"context_line":"        idx \u003d 0"},{"line_number":165,"context_line":"        while idx \u003c len(services):"},{"line_number":166,"context_line":"            srv \u003d services[idx]"},{"line_number":167,"context_line":"            if(self._az_matched(srv, availability_zone) and"},{"line_number":168,"context_line":"               utils.service_is_up(srv)):"},{"line_number":169,"context_line":"                return srv.host"},{"line_number":170,"context_line":"            idx \u003d idx + 1"},{"line_number":171,"context_line":"        return None"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def _get_available_backup_service_host(self, host, availability_zone):"},{"line_number":174,"context_line":"        \"\"\"Return an appropriate backup service host.\"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"da6ed579_541dda64","line":171,"range":{"start_line":155,"start_character":0,"end_line":171,"end_character":19},"updated":"2016-01-18 12:17:00.000000000","message":"I\u0027ve talked this through with my colleagues from my team working on scheduling problems and they think that this simple solution with shuffle is better here. Anyway I would feel better if someone more experienced also gave his feedback on that. Ivan? Tom?","commit_id":"3be914544131b16eeb47a306af4139b485d66794"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"cbb7de20be6c5e05e2aa8a4caf90876185411bd1","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        # for each error condition, it should be a very small window"},{"line_number":407,"context_line":"        backup.host \u003d self._get_available_backup_service_host("},{"line_number":408,"context_line":"            backup.host, backup.availability_zone)"},{"line_number":409,"context_line":"        backup.status \u003d fields.BackupStatus.RESTORING"},{"line_number":410,"context_line":"        backup.save()"},{"line_number":411,"context_line":"        self.db.volume_update(context, volume_id, {\u0027status\u0027:"},{"line_number":412,"context_line":"                                                   \u0027restoring-backup\u0027})"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba63e191_af1f5a5a","line":409,"range":{"start_line":409,"start_character":8,"end_line":409,"end_character":53},"updated":"2016-01-18 19:16:54.000000000","message":"In patchset 10 we\u0027ve had:\n\n backup.restore_volume_id \u003d volume.id\n\njust after this line. Isn\u0027t removing it a mistake?","commit_id":"438fcff876aea8da2e7fe11cefa2bd06cf3ed087"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"c1691864ced9e501ecb0d4742ac7acdd902572f7","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        # for each error condition, it should be a very small window"},{"line_number":407,"context_line":"        backup.host \u003d self._get_available_backup_service_host("},{"line_number":408,"context_line":"            backup.host, backup.availability_zone)"},{"line_number":409,"context_line":"        backup.status \u003d fields.BackupStatus.RESTORING"},{"line_number":410,"context_line":"        backup.save()"},{"line_number":411,"context_line":"        self.db.volume_update(context, volume_id, {\u0027status\u0027:"},{"line_number":412,"context_line":"                                                   \u0027restoring-backup\u0027})"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba63e191_2f904a95","line":409,"range":{"start_line":409,"start_character":8,"end_line":409,"end_character":53},"in_reply_to":"ba63e191_af1f5a5a","updated":"2016-01-18 19:25:07.000000000","message":"Yes!\n\nFixing.","commit_id":"438fcff876aea8da2e7fe11cefa2bd06cf3ed087"}],"cinder/backup/manager.py":[{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"c0b696354236b182a8a586455c1b44f7dc0c054f","unresolved":false,"context_lines":[{"line_number":791,"context_line":"        \"\"\""},{"line_number":792,"context_line":"        backup_service \u003d self.service.get_backup_driver(context)"},{"line_number":793,"context_line":"        return backup_service.support_force_delete"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"    def _attach_device(self, context, backup_device,"},{"line_number":796,"context_line":"                       properties, is_snapshot\u003dFalse):"},{"line_number":797,"context_line":"        \"\"\"Attach backup device.\"\"\""},{"line_number":798,"context_line":"        if not is_snapshot:"},{"line_number":799,"context_line":"            return self._attach_volume(context, backup_device, properties)"},{"line_number":800,"context_line":"        else:"},{"line_number":801,"context_line":"            msg \u003d _(\"Can\u0027t attach snapshot.\")"},{"line_number":802,"context_line":"            raise NotImplementedError(msg)"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    def _attach_volume(self, context, volume, properties):"},{"line_number":805,"context_line":"        \"\"\"Attach a volume.\"\"\""},{"line_number":806,"context_line":""},{"line_number":807,"context_line":"        try:"},{"line_number":808,"context_line":"            conn \u003d self.volume_rpcapi.initialize_connection(context,"},{"line_number":809,"context_line":"                                                            volume,"},{"line_number":810,"context_line":"                                                            properties)"},{"line_number":811,"context_line":"            return self._connect_device(conn)"},{"line_number":812,"context_line":"        except Exception:"},{"line_number":813,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":814,"context_line":"                try:"},{"line_number":815,"context_line":"                    self.volume_rpcapi.terminate_connection(context, volume,"},{"line_number":816,"context_line":"                                                            properties,"},{"line_number":817,"context_line":"                                                            force\u003dTrue)"},{"line_number":818,"context_line":"                except Exception:"},{"line_number":819,"context_line":"                    LOG.warning(_LW(\"Failed to terminate the connection \""},{"line_number":820,"context_line":"                                    \"of volume %(volume_id)s, but it is \""},{"line_number":821,"context_line":"                                    \"acceptable.\"),"},{"line_number":822,"context_line":"                                {\u0027volume_id\u0027, volume.id})"},{"line_number":823,"context_line":""},{"line_number":824,"context_line":"    def _connect_device(self, conn):"},{"line_number":825,"context_line":"        # find out multiple options"},{"line_number":826,"context_line":"        use_multipath \u003d CONF.backup_use_multipath"},{"line_number":827,"context_line":"        device_scan_attempts \u003d CONF.backup_num_volume_device_scan_tries"},{"line_number":828,"context_line":"        protocol \u003d conn[\u0027driver_volume_type\u0027]"},{"line_number":829,"context_line":"        connector \u003d utils.brick_get_connector("},{"line_number":830,"context_line":"            protocol,"},{"line_number":831,"context_line":"            use_multipath\u003duse_multipath,"},{"line_number":832,"context_line":"            device_scan_attempts\u003ddevice_scan_attempts,"},{"line_number":833,"context_line":"            conn\u003dconn)"},{"line_number":834,"context_line":"        vol_handle \u003d connector.connect_volume(conn[\u0027data\u0027])"},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        return {\u0027conn\u0027: conn, \u0027device\u0027: vol_handle, \u0027connector\u0027: connector}"},{"line_number":837,"context_line":""},{"line_number":838,"context_line":"    def _detach_device(self, context, attach_info, volume,"},{"line_number":839,"context_line":"                       properties, is_snapshot\u003dFalse, force\u003dFalse):"},{"line_number":840,"context_line":"        \"\"\"Disconnect the volume from the host. \"\"\""},{"line_number":841,"context_line":"        connector \u003d attach_info[\u0027connector\u0027]"},{"line_number":842,"context_line":"        connector.disconnect_volume(attach_info[\u0027conn\u0027][\u0027data\u0027],"},{"line_number":843,"context_line":"                                    attach_info[\u0027device\u0027])"},{"line_number":844,"context_line":""},{"line_number":845,"context_line":"        rpcapi \u003d self.volume_rpcapi"},{"line_number":846,"context_line":"        rpcapi.terminate_connection(context, volume, properties, force\u003dforce)"},{"line_number":847,"context_line":"        rpcapi.remove_export(context, volume)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_2d04c313","line":847,"range":{"start_line":794,"start_character":0,"end_line":847,"end_character":45},"updated":"2015-12-30 10:46:24.000000000","message":"is it possible to place these logic to backup/driver.py to align with volume/driver.py implementation?\n\nThanks\nPeter","commit_id":"63d57c6b0202f27f76fab11dd13efb89c5519a36"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"049388b22b09473b2bd9d491043653eac75566d1","unresolved":false,"context_lines":[{"line_number":791,"context_line":"        \"\"\""},{"line_number":792,"context_line":"        backup_service \u003d self.service.get_backup_driver(context)"},{"line_number":793,"context_line":"        return backup_service.support_force_delete"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"    def _attach_device(self, context, backup_device,"},{"line_number":796,"context_line":"                       properties, is_snapshot\u003dFalse):"},{"line_number":797,"context_line":"        \"\"\"Attach backup device.\"\"\""},{"line_number":798,"context_line":"        if not is_snapshot:"},{"line_number":799,"context_line":"            return self._attach_volume(context, backup_device, properties)"},{"line_number":800,"context_line":"        else:"},{"line_number":801,"context_line":"            msg \u003d _(\"Can\u0027t attach snapshot.\")"},{"line_number":802,"context_line":"            raise NotImplementedError(msg)"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    def _attach_volume(self, context, volume, properties):"},{"line_number":805,"context_line":"        \"\"\"Attach a volume.\"\"\""},{"line_number":806,"context_line":""},{"line_number":807,"context_line":"        try:"},{"line_number":808,"context_line":"            conn \u003d self.volume_rpcapi.initialize_connection(context,"},{"line_number":809,"context_line":"                                                            volume,"},{"line_number":810,"context_line":"                                                            properties)"},{"line_number":811,"context_line":"            return self._connect_device(conn)"},{"line_number":812,"context_line":"        except Exception:"},{"line_number":813,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":814,"context_line":"                try:"},{"line_number":815,"context_line":"                    self.volume_rpcapi.terminate_connection(context, volume,"},{"line_number":816,"context_line":"                                                            properties,"},{"line_number":817,"context_line":"                                                            force\u003dTrue)"},{"line_number":818,"context_line":"                except Exception:"},{"line_number":819,"context_line":"                    LOG.warning(_LW(\"Failed to terminate the connection \""},{"line_number":820,"context_line":"                                    \"of volume %(volume_id)s, but it is \""},{"line_number":821,"context_line":"                                    \"acceptable.\"),"},{"line_number":822,"context_line":"                                {\u0027volume_id\u0027, volume.id})"},{"line_number":823,"context_line":""},{"line_number":824,"context_line":"    def _connect_device(self, conn):"},{"line_number":825,"context_line":"        # find out multiple options"},{"line_number":826,"context_line":"        use_multipath \u003d CONF.backup_use_multipath"},{"line_number":827,"context_line":"        device_scan_attempts \u003d CONF.backup_num_volume_device_scan_tries"},{"line_number":828,"context_line":"        protocol \u003d conn[\u0027driver_volume_type\u0027]"},{"line_number":829,"context_line":"        connector \u003d utils.brick_get_connector("},{"line_number":830,"context_line":"            protocol,"},{"line_number":831,"context_line":"            use_multipath\u003duse_multipath,"},{"line_number":832,"context_line":"            device_scan_attempts\u003ddevice_scan_attempts,"},{"line_number":833,"context_line":"            conn\u003dconn)"},{"line_number":834,"context_line":"        vol_handle \u003d connector.connect_volume(conn[\u0027data\u0027])"},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        return {\u0027conn\u0027: conn, \u0027device\u0027: vol_handle, \u0027connector\u0027: connector}"},{"line_number":837,"context_line":""},{"line_number":838,"context_line":"    def _detach_device(self, context, attach_info, volume,"},{"line_number":839,"context_line":"                       properties, is_snapshot\u003dFalse, force\u003dFalse):"},{"line_number":840,"context_line":"        \"\"\"Disconnect the volume from the host. \"\"\""},{"line_number":841,"context_line":"        connector \u003d attach_info[\u0027connector\u0027]"},{"line_number":842,"context_line":"        connector.disconnect_volume(attach_info[\u0027conn\u0027][\u0027data\u0027],"},{"line_number":843,"context_line":"                                    attach_info[\u0027device\u0027])"},{"line_number":844,"context_line":""},{"line_number":845,"context_line":"        rpcapi \u003d self.volume_rpcapi"},{"line_number":846,"context_line":"        rpcapi.terminate_connection(context, volume, properties, force\u003dforce)"},{"line_number":847,"context_line":"        rpcapi.remove_export(context, volume)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_375f1b74","line":847,"range":{"start_line":794,"start_character":0,"end_line":847,"end_character":45},"in_reply_to":"fa69d971_2d04c313","updated":"2015-12-31 03:38:27.000000000","message":"backup/driver.py is related to backup driver. The attach/detach operations are related to volume. They should not be includes in backup/driver.","commit_id":"63d57c6b0202f27f76fab11dd13efb89c5519a36"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":"            err \u003d \u0027incomplete backup reset on manager restart\u0027"},{"line_number":176,"context_line":"            self._update_backup_error(backup, ctxt, err)"},{"line_number":177,"context_line":"        if backup[\u0027status\u0027] \u003d\u003d fields.BackupStatus.RESTORING:"},{"line_number":178,"context_line":"            LOG.info(_LI(\u0027Resetting backup %s to \u0027"},{"line_number":179,"context_line":"                         \u0027available (was restoring).\u0027),"},{"line_number":180,"context_line":"                     backup[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_35054510","line":177,"updated":"2016-01-11 18:56:40.000000000","message":"Should this be an \u0027elif\u0027?","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":183,"context_line":""},{"line_number":184,"context_line":"            backup.status \u003d fields.BackupStatus.AVAILABLE"},{"line_number":185,"context_line":"            backup.save()"},{"line_number":186,"context_line":"        if backup[\u0027status\u0027] \u003d\u003d fields.BackupStatus.DELETING:"},{"line_number":187,"context_line":"            LOG.info(_LI(\u0027Resuming delete on backup: %s.\u0027), backup[\u0027id\u0027])"},{"line_number":188,"context_line":"            if CONF.backup_service_inithost_offload:"},{"line_number":189,"context_line":"                # Offload all the pending backup delete operations to the"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_d505c90f","line":186,"updated":"2016-01-11 18:56:40.000000000","message":"Should this be an \u0027elif\u0027?","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":832,"context_line":"                                {\u0027volume_id\u0027, volume.id})"},{"line_number":833,"context_line":""},{"line_number":834,"context_line":"    def _connect_device(self, conn):"},{"line_number":835,"context_line":"        # find out multiple options"},{"line_number":836,"context_line":"        use_multipath \u003d CONF.backup_use_multipath"},{"line_number":837,"context_line":"        device_scan_attempts \u003d CONF.backup_num_volume_device_scan_tries"},{"line_number":838,"context_line":"        protocol \u003d conn[\u0027driver_volume_type\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_f50a4d1f","line":835,"updated":"2016-01-11 18:56:40.000000000","message":"Did you mean \u0027multipath\u0027?","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"5af85b8b81ce3cac4be903adf73c0704484c7fc2","unresolved":false,"context_lines":[{"line_number":194,"context_line":"                # By default, delete backups sequentially"},{"line_number":195,"context_line":"                self.delete_backup(ctxt, backup)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def is_working(self):"},{"line_number":198,"context_line":"        \"\"\"Return if Manager is ready to accept requests."},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        This is to inform Service class that in case of volume manager(s)"},{"line_number":201,"context_line":"        initialization failure the manager is actually down and"},{"line_number":202,"context_line":"        may not accept some or all requests."},{"line_number":203,"context_line":"        \"\"\""},{"line_number":204,"context_line":"        return True"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def _detach_all_attachments(self, ctxt, volume):"},{"line_number":207,"context_line":"        attachments \u003d volume[\u0027volume_attachment\u0027] or []"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_525d2a47","line":204,"range":{"start_line":197,"start_character":0,"end_line":204,"end_character":19},"updated":"2016-01-15 21:36:56.000000000","message":"No need to keep this method here, as base Manager already returns True.","commit_id":"59a310a6216d8e2abd7f932dfccb4dfd90512e2d"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"763c397a15e521cb9d691ccc31daa3b2d0808395","unresolved":false,"context_lines":[{"line_number":194,"context_line":"                # By default, delete backups sequentially"},{"line_number":195,"context_line":"                self.delete_backup(ctxt, backup)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def is_working(self):"},{"line_number":198,"context_line":"        \"\"\"Return if Manager is ready to accept requests."},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        This is to inform Service class that in case of volume manager(s)"},{"line_number":201,"context_line":"        initialization failure the manager is actually down and"},{"line_number":202,"context_line":"        may not accept some or all requests."},{"line_number":203,"context_line":"        \"\"\""},{"line_number":204,"context_line":"        return True"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def _detach_all_attachments(self, ctxt, volume):"},{"line_number":207,"context_line":"        attachments \u003d volume[\u0027volume_attachment\u0027] or []"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_02ac17ec","line":204,"range":{"start_line":197,"start_character":0,"end_line":204,"end_character":19},"in_reply_to":"da6ed579_525d2a47","updated":"2016-01-18 03:31:41.000000000","message":"Done","commit_id":"59a310a6216d8e2abd7f932dfccb4dfd90512e2d"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"a2ef73b8191c600a88db0371c30e957a37b71777","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    cfg.BoolOpt(\u0027backup_use_multipath\u0027,"},{"line_number":68,"context_line":"                default\u003dFalse,"},{"line_number":69,"context_line":"                help\u003d\u0027Use multipath\u0027),"},{"line_number":70,"context_line":"    cfg.IntOpt(\u0027backup_num_volume_device_scan_tries\u0027,"},{"line_number":71,"context_line":"               default\u003d3,"},{"line_number":72,"context_line":"               help\u003d\u0027The maximum number of times to rescan targets\u0027"},{"line_number":73,"context_line":"                    \u0027 to find volume\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"dae33548_43875661","line":70,"updated":"2016-02-15 12:05:34.000000000","message":"Can\u0027t we re-use the config options defined in volume manager?","commit_id":"9bbad7436fd514ad486a4fa91ee4d34a5be44b6a"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"4f1cc46f246911bff4240b3b2c5f8a23426fcc8f","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    cfg.BoolOpt(\u0027backup_use_multipath\u0027,"},{"line_number":68,"context_line":"                default\u003dFalse,"},{"line_number":69,"context_line":"                help\u003d\u0027Use multipath\u0027),"},{"line_number":70,"context_line":"    cfg.IntOpt(\u0027backup_num_volume_device_scan_tries\u0027,"},{"line_number":71,"context_line":"               default\u003d3,"},{"line_number":72,"context_line":"               help\u003d\u0027The maximum number of times to rescan targets\u0027"},{"line_number":73,"context_line":"                    \u0027 to find volume\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"dae33548_65cb59a6","line":70,"updated":"2016-02-16 07:45:10.000000000","message":"The volume config can be set in global scope, although we allows driver to overwrite it.  It isn\u0027t part of backup services config because it existing code doesn\u0027t use it until this change.  I don\u0027t see the value adding very similar config options for exact same purpose.","commit_id":"9bbad7436fd514ad486a4fa91ee4d34a5be44b6a"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e41590201d5cc4e4684a568cb7595444db056c1f","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    cfg.BoolOpt(\u0027backup_use_multipath\u0027,"},{"line_number":68,"context_line":"                default\u003dFalse,"},{"line_number":69,"context_line":"                help\u003d\u0027Use multipath\u0027),"},{"line_number":70,"context_line":"    cfg.IntOpt(\u0027backup_num_volume_device_scan_tries\u0027,"},{"line_number":71,"context_line":"               default\u003d3,"},{"line_number":72,"context_line":"               help\u003d\u0027The maximum number of times to rescan targets\u0027"},{"line_number":73,"context_line":"                    \u0027 to find volume\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"dae33548_e9d80420","line":70,"in_reply_to":"dae33548_43875661","updated":"2016-02-15 14:25:41.000000000","message":"Good point. I don\u0027t think there is a reason from operators standpoint to configure it differently than for c-vol. And if there is ops can always feed c-bak with different config file.","commit_id":"9bbad7436fd514ad486a4fa91ee4d34a5be44b6a"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"758d941642edbdffa0bfa49973f01cc3a95e4bd2","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    cfg.BoolOpt(\u0027backup_use_multipath\u0027,"},{"line_number":68,"context_line":"                default\u003dFalse,"},{"line_number":69,"context_line":"                help\u003d\u0027Use multipath\u0027),"},{"line_number":70,"context_line":"    cfg.IntOpt(\u0027backup_num_volume_device_scan_tries\u0027,"},{"line_number":71,"context_line":"               default\u003d3,"},{"line_number":72,"context_line":"               help\u003d\u0027The maximum number of times to rescan targets\u0027"},{"line_number":73,"context_line":"                    \u0027 to find volume\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"dae33548_18759497","line":70,"in_reply_to":"dae33548_65cb59a6","updated":"2016-02-16 08:10:35.000000000","message":"Exactly.\n\nThank you for pointing it out.\n\nUpdated.","commit_id":"9bbad7436fd514ad486a4fa91ee4d34a5be44b6a"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"0744790453d2ea71502f0f57536b57e998d5bc24","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    cfg.BoolOpt(\u0027backup_use_multipath\u0027,"},{"line_number":68,"context_line":"                default\u003dFalse,"},{"line_number":69,"context_line":"                help\u003d\u0027Use multipath\u0027),"},{"line_number":70,"context_line":"    cfg.IntOpt(\u0027backup_num_volume_device_scan_tries\u0027,"},{"line_number":71,"context_line":"               default\u003d3,"},{"line_number":72,"context_line":"               help\u003d\u0027The maximum number of times to rescan targets\u0027"},{"line_number":73,"context_line":"                    \u0027 to find volume\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"dae33548_f3b9f8cc","line":70,"in_reply_to":"dae33548_e9d80420","updated":"2016-02-16 06:17:11.000000000","message":"Currently in volume, this configs are under different drivers. \n\nhttps://github.com/openstack/cinder/blob/master/cinder/volume/driver.py#L64\n\nFor example,\n\n[lvm]\n\nnum_volume_device_scan_tries\u003d4\n\nThe volume part of config in backup host is not required. \nAs a result, I think it is not reasonable to use the fields in backup service.","commit_id":"9bbad7436fd514ad486a4fa91ee4d34a5be44b6a"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"a2ef73b8191c600a88db0371c30e957a37b71777","unresolved":false,"context_lines":[{"line_number":811,"context_line":"            msg \u003d _(\"Can\u0027t attach snapshot.\")"},{"line_number":812,"context_line":"            raise NotImplementedError(msg)"},{"line_number":813,"context_line":""},{"line_number":814,"context_line":"    def _attach_volume(self, context, volume, properties):"},{"line_number":815,"context_line":"        \"\"\"Attach a volume.\"\"\""},{"line_number":816,"context_line":""},{"line_number":817,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"dae33548_a37c6273","line":814,"updated":"2016-02-15 12:05:34.000000000","message":"This function and the function below has a lot of duplication of similar functions in volume manager.  They should be extracted out to be helper functions in utils module.","commit_id":"9bbad7436fd514ad486a4fa91ee4d34a5be44b6a"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"0744790453d2ea71502f0f57536b57e998d5bc24","unresolved":false,"context_lines":[{"line_number":811,"context_line":"            msg \u003d _(\"Can\u0027t attach snapshot.\")"},{"line_number":812,"context_line":"            raise NotImplementedError(msg)"},{"line_number":813,"context_line":""},{"line_number":814,"context_line":"    def _attach_volume(self, context, volume, properties):"},{"line_number":815,"context_line":"        \"\"\"Attach a volume.\"\"\""},{"line_number":816,"context_line":""},{"line_number":817,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"dae33548_93cb4c53","line":814,"in_reply_to":"dae33548_a37c6273","updated":"2016-02-16 06:17:11.000000000","message":"I would like to do it in later patch.","commit_id":"9bbad7436fd514ad486a4fa91ee4d34a5be44b6a"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"4f1cc46f246911bff4240b3b2c5f8a23426fcc8f","unresolved":false,"context_lines":[{"line_number":834,"context_line":"    def _connect_device(self, conn):"},{"line_number":835,"context_line":"        \"\"\"Establish connection to device.\"\"\""},{"line_number":836,"context_line":"        use_multipath \u003d CONF.backup_use_multipath"},{"line_number":837,"context_line":"        device_scan_attempts \u003d CONF.backup_num_volume_device_scan_tries"},{"line_number":838,"context_line":"        protocol \u003d conn[\u0027driver_volume_type\u0027]"},{"line_number":839,"context_line":"        connector \u003d utils.brick_get_connector("},{"line_number":840,"context_line":"            protocol,"}],"source_content_type":"text/x-python","patch_set":15,"id":"dae33548_45ce15b5","line":837,"updated":"2016-02-16 07:45:10.000000000","message":"If these helper functions were separated from volume and backup manager, we don\u0027t need manager specific config options.","commit_id":"9bbad7436fd514ad486a4fa91ee4d34a5be44b6a"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"758d941642edbdffa0bfa49973f01cc3a95e4bd2","unresolved":false,"context_lines":[{"line_number":834,"context_line":"    def _connect_device(self, conn):"},{"line_number":835,"context_line":"        \"\"\"Establish connection to device.\"\"\""},{"line_number":836,"context_line":"        use_multipath \u003d CONF.backup_use_multipath"},{"line_number":837,"context_line":"        device_scan_attempts \u003d CONF.backup_num_volume_device_scan_tries"},{"line_number":838,"context_line":"        protocol \u003d conn[\u0027driver_volume_type\u0027]"},{"line_number":839,"context_line":"        connector \u003d utils.brick_get_connector("},{"line_number":840,"context_line":"            protocol,"}],"source_content_type":"text/x-python","patch_set":15,"id":"dae33548_b847484a","line":837,"in_reply_to":"dae33548_45ce15b5","updated":"2016-02-16 08:10:35.000000000","message":"I agree with you.","commit_id":"9bbad7436fd514ad486a4fa91ee4d34a5be44b6a"}],"cinder/tests/unit/api/contrib/test_backups.py":[{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":556,"context_line":"    def test_create_backup_json(self, mock_validate,"},{"line_number":557,"context_line":"                                _mock_service_get_all_by_topic):"},{"line_number":558,"context_line":"        _mock_service_get_all_by_topic.return_value \u003d ["},{"line_number":559,"context_line":"            {\u0027availability_zone\u0027: \"fake_az\", \u0027host\u0027: \u0027testhost\u0027,"},{"line_number":560,"context_line":"             \u0027disabled\u0027: 0, \u0027updated_at\u0027: timeutils.utcnow()}]"},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"        volume_id \u003d utils.create_volume(self.context, size\u003d5)[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_1a195088","line":559,"updated":"2016-01-11 18:56:40.000000000","message":"We might as well put single quotes on \u0027fake_az\u0027 if we\u0027re touching this line.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":587,"context_line":"    def test_create_backup_inuse_no_force(self,"},{"line_number":588,"context_line":"                                          _mock_service_get_all_by_topic):"},{"line_number":589,"context_line":"        _mock_service_get_all_by_topic.return_value \u003d ["},{"line_number":590,"context_line":"            {\u0027availability_zone\u0027: \"fake_az\", \u0027host\u0027: \u0027testhost\u0027,"},{"line_number":591,"context_line":"             \u0027disabled\u0027: 0, \u0027updated_at\u0027: timeutils.utcnow()}]"},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"        volume_id \u003d utils.create_volume(self.context, size\u003d5,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_3a1e9470","line":590,"updated":"2016-01-11 18:56:40.000000000","message":"Ditto.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":617,"context_line":"    @mock.patch(\u0027cinder.db.service_get_all_by_topic\u0027)"},{"line_number":618,"context_line":"    def test_create_backup_inuse_force(self, _mock_service_get_all_by_topic):"},{"line_number":619,"context_line":"        _mock_service_get_all_by_topic.return_value \u003d ["},{"line_number":620,"context_line":"            {\u0027availability_zone\u0027: \"fake_az\", \u0027host\u0027: \u0027testhost\u0027,"},{"line_number":621,"context_line":"             \u0027disabled\u0027: 0, \u0027updated_at\u0027: timeutils.utcnow()}]"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"        volume_id \u003d utils.create_volume(self.context, size\u003d5,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_da0e583c","line":620,"updated":"2016-01-11 18:56:40.000000000","message":"Ditto.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":653,"context_line":"    def test_create_backup_snapshot_json(self, mock_validate,"},{"line_number":654,"context_line":"                                         _mock_service_get_all_by_topic):"},{"line_number":655,"context_line":"        _mock_service_get_all_by_topic.return_value \u003d ["},{"line_number":656,"context_line":"            {\u0027availability_zone\u0027: \"fake_az\", \u0027host\u0027: \u0027testhost\u0027,"},{"line_number":657,"context_line":"             \u0027disabled\u0027: 0, \u0027updated_at\u0027: timeutils.utcnow()}]"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"        volume_id \u003d utils.create_volume(self.context, size\u003d5,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_fa131c63","line":656,"updated":"2016-01-11 18:56:40.000000000","message":"Ditto.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":686,"context_line":"    def test_create_backup_xml(self, mock_validate,"},{"line_number":687,"context_line":"                               _mock_service_get_all_by_topic):"},{"line_number":688,"context_line":"        _mock_service_get_all_by_topic.return_value \u003d ["},{"line_number":689,"context_line":"            {\u0027availability_zone\u0027: \"fake_az\", \u0027host\u0027: \u0027testhost\u0027,"},{"line_number":690,"context_line":"             \u0027disabled\u0027: 0, \u0027updated_at\u0027: timeutils.utcnow()}]"},{"line_number":691,"context_line":""},{"line_number":692,"context_line":"        volume_id \u003d utils.create_volume(self.context, size\u003d2)[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_9a0d4040","line":689,"updated":"2016-01-11 18:56:40.000000000","message":"Ditto.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":717,"context_line":"                                 mock_validate,"},{"line_number":718,"context_line":"                                 _mock_service_get_all_by_topic):"},{"line_number":719,"context_line":"        _mock_service_get_all_by_topic.return_value \u003d ["},{"line_number":720,"context_line":"            {\u0027availability_zone\u0027: \"fake_az\", \u0027host\u0027: \u0027testhost\u0027,"},{"line_number":721,"context_line":"             \u0027disabled\u0027: 0, \u0027updated_at\u0027: timeutils.utcnow()}]"},{"line_number":722,"context_line":""},{"line_number":723,"context_line":"        volume_id \u003d utils.create_volume(self.context, size\u003d5)[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_ba0a8424","line":720,"updated":"2016-01-11 18:56:40.000000000","message":"Ditto.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":900,"context_line":"    def test_create_incremental_backup_invalid_no_full("},{"line_number":901,"context_line":"            self, _mock_service_get_all_by_topic):"},{"line_number":902,"context_line":"        _mock_service_get_all_by_topic.return_value \u003d ["},{"line_number":903,"context_line":"            {\u0027availability_zone\u0027: \"fake_az\", \u0027host\u0027: \u0027testhost\u0027,"},{"line_number":904,"context_line":"             \u0027disabled\u0027: 0, \u0027updated_at\u0027: timeutils.utcnow()}]"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":"        volume_id \u003d utils.create_volume(self.context, size\u003d5,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_5a034810","line":903,"updated":"2016-01-11 18:56:40.000000000","message":"Ditto.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":938,"context_line":"        host_not_match \u003d [{\u0027availability_zone\u0027: \"fake_az\", \u0027host\u0027: alt_host,"},{"line_number":939,"context_line":"                           \u0027disabled\u0027: 0, \u0027updated_at\u0027: timeutils.utcnow()}]"},{"line_number":940,"context_line":"        # service az not match with volume\u0027s az"},{"line_number":941,"context_line":"        az_not_match \u003d [{\u0027availability_zone\u0027: \"strange_az\", \u0027host\u0027: testhost,"},{"line_number":942,"context_line":"                         \u0027disabled\u0027: 0, \u0027updated_at\u0027: timeutils.utcnow()}]"},{"line_number":943,"context_line":"        # service disabled"},{"line_number":944,"context_line":"        disabled_service \u003d []"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_7a008c02","line":941,"updated":"2016-01-11 18:56:40.000000000","message":"We can single quote \u0027strange_az\u0027.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":950,"context_line":"        # first service\u0027s host not match but second one works."},{"line_number":951,"context_line":"        multi_services \u003d [{\u0027availability_zone\u0027: \"fake_az\", \u0027host\u0027: alt_host,"},{"line_number":952,"context_line":"                           \u0027disabled\u0027: 0, \u0027updated_at\u0027: timeutils.utcnow()},"},{"line_number":953,"context_line":"                          {\u0027availability_zone\u0027: \"fake_az\", \u0027host\u0027: testhost,"},{"line_number":954,"context_line":"                           \u0027disabled\u0027: 0, \u0027updated_at\u0027: timeutils.utcnow()}]"},{"line_number":955,"context_line":""},{"line_number":956,"context_line":"        # Setup mock to run through the following service cases"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_15004100","line":953,"updated":"2016-01-11 18:56:40.000000000","message":"We can single quote \u0027fake_az\u0027.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"5af85b8b81ce3cac4be903adf73c0704484c7fc2","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Tests for Backup code."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import json"},{"line_number":21,"context_line":"from xml.dom import minidom"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_7d927fa1","side":"PARENT","line":19,"updated":"2016-01-15 21:36:56.000000000","message":"Do we need to remove this line in this patch?","commit_id":"64cdf93cac42562db400697f593aef821a72b579"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"763c397a15e521cb9d691ccc31daa3b2d0808395","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Tests for Backup code."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import json"},{"line_number":21,"context_line":"from xml.dom import minidom"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_82e1e7d2","side":"PARENT","line":19,"in_reply_to":"da6ed579_7d927fa1","updated":"2016-01-18 03:31:41.000000000","message":"No. I will add it back.","commit_id":"64cdf93cac42562db400697f593aef821a72b579"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"5af85b8b81ce3cac4be903adf73c0704484c7fc2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"da6ed579_1d8fc376","updated":"2016-01-15 21:36:56.000000000","message":"Aren\u0027t a lot of changes in this file a simple stylistic ones? I don\u0027t think these belong here.","commit_id":"59a310a6216d8e2abd7f932dfccb4dfd90512e2d"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"763c397a15e521cb9d691ccc31daa3b2d0808395","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"da6ed579_a21f4bb6","in_reply_to":"da6ed579_1d8fc376","updated":"2016-01-18 03:31:41.000000000","message":"The host name needs to change, as I change the behaviors in api.py. The host needs to exists.\n\nAs I need to change host name, I change \"\" to \u0027\u0027 in same line.","commit_id":"59a310a6216d8e2abd7f932dfccb4dfd90512e2d"}],"cinder/volume/driver.py":[{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"c0b696354236b182a8a586455c1b44f7dc0c054f","unresolved":false,"context_lines":[{"line_number":1072,"context_line":"        return False"},{"line_number":1073,"context_line":""},{"line_number":1074,"context_line":"    def snapshot_remote_attable(self):"},{"line_number":1075,"context_line":"        # The method will be deleted later when remote"},{"line_number":1076,"context_line":"        # attach snapshot is implemented."},{"line_number":1077,"context_line":"        return False"},{"line_number":1078,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_2ca609c2","line":1075,"updated":"2015-12-30 10:46:24.000000000","message":"Maybe add a TODO tag?","commit_id":"63d57c6b0202f27f76fab11dd13efb89c5519a36"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"049388b22b09473b2bd9d491043653eac75566d1","unresolved":false,"context_lines":[{"line_number":1072,"context_line":"        return False"},{"line_number":1073,"context_line":""},{"line_number":1074,"context_line":"    def snapshot_remote_attable(self):"},{"line_number":1075,"context_line":"        # The method will be deleted later when remote"},{"line_number":1076,"context_line":"        # attach snapshot is implemented."},{"line_number":1077,"context_line":"        return False"},{"line_number":1078,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_f76ae319","line":1075,"in_reply_to":"fa69d971_2ca609c2","updated":"2015-12-31 03:38:27.000000000","message":"Done","commit_id":"63d57c6b0202f27f76fab11dd13efb89c5519a36"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":1077,"context_line":"    def backup_use_temp_snapshot(self):"},{"line_number":1078,"context_line":"        return False"},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"    def snapshot_remote_attable(self):"},{"line_number":1081,"context_line":"        # TODO(lixiaoy1): the method will be deleted later when remote"},{"line_number":1082,"context_line":"        # attach snapshot is implemented."},{"line_number":1083,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_ba2364bc","line":1080,"updated":"2016-01-11 18:56:40.000000000","message":"snapshot_remote_attachable?","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"5af85b8b81ce3cac4be903adf73c0704484c7fc2","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"        return False"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"    def get_backup_device(self, context, backup):"},{"line_number":1086,"context_line":"        \"\"\"Get a backup device. \"\"\""},{"line_number":1087,"context_line":"        backup_device \u003d None"},{"line_number":1088,"context_line":"        is_snapshot \u003d False"},{"line_number":1089,"context_line":"        if (self.backup_use_temp_snapshot() and"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_fde0afce","line":1086,"range":{"start_line":1086,"start_character":0,"end_line":1086,"end_character":35},"updated":"2016-01-15 21:36:56.000000000","message":"Can we get a more detailed explanation of what this does in the docstring? It\u0027s useful for driver maintainers.","commit_id":"59a310a6216d8e2abd7f932dfccb4dfd90512e2d"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"763c397a15e521cb9d691ccc31daa3b2d0808395","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"        return False"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"    def get_backup_device(self, context, backup):"},{"line_number":1086,"context_line":"        \"\"\"Get a backup device. \"\"\""},{"line_number":1087,"context_line":"        backup_device \u003d None"},{"line_number":1088,"context_line":"        is_snapshot \u003d False"},{"line_number":1089,"context_line":"        if (self.backup_use_temp_snapshot() and"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_3d729eae","line":1086,"range":{"start_line":1086,"start_character":0,"end_line":1086,"end_character":35},"in_reply_to":"da6ed579_fde0afce","updated":"2016-01-18 03:31:41.000000000","message":"Done","commit_id":"59a310a6216d8e2abd7f932dfccb4dfd90512e2d"}],"cinder/volume/manager.py":[{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4d8950c454aaaffcd248d4ed8dde8acd2d063f3a","unresolved":false,"context_lines":[{"line_number":3489,"context_line":"        dic \u003d {\u0027backup_device\u0027: backup_device,"},{"line_number":3490,"context_line":"               \u0027secure_enabled\u0027: secure_enabled,"},{"line_number":3491,"context_line":"               \u0027is_snapshot\u0027: is_snapshot, }"},{"line_number":3492,"context_line":"        return dic"},{"line_number":3493,"context_line":""},{"line_number":3494,"context_line":"    def secure_file_operations_enabled(self, ctxt, volume):"},{"line_number":3495,"context_line":"        secure_enabled \u003d self.driver.secure_file_operations_enabled()"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_5a2ca8ab","line":3492,"updated":"2016-01-11 18:56:40.000000000","message":"We may want to use a more descriptive name than \u0027dic\u0027 here.","commit_id":"b4cc2fa426328b6dd52b02453e223ddc1dce4bcf"}],"cinder/volume/rpcapi.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"5af85b8b81ce3cac4be903adf73c0704484c7fc2","unresolved":false,"context_lines":[{"line_number":87,"context_line":"               migrate_volume_completion(), and update_migrated_volume()."},{"line_number":88,"context_line":"        1.37 - Adds old_reservations parameter to retype to support quota"},{"line_number":89,"context_line":"               checks in the API."},{"line_number":90,"context_line":"        1.38 - Scabling backup service"},{"line_number":91,"context_line":"    \"\"\""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    BASE_RPC_API_VERSION \u003d \u00271.0\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_5d4a1b29","line":90,"range":{"start_line":90,"start_character":15,"end_line":90,"end_character":23},"updated":"2016-01-15 21:36:56.000000000","message":"s/Scabling/scaling\n\nBut in general I think it\u0027s more appropriate to mention the exact methods added.","commit_id":"59a310a6216d8e2abd7f932dfccb4dfd90512e2d"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"5af85b8b81ce3cac4be903adf73c0704484c7fc2","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.29\u0027)"},{"line_number":366,"context_line":"        return cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"    def get_backup_device(self, ctxt, backup, volume):"},{"line_number":369,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":370,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.38\u0027)"},{"line_number":371,"context_line":"        return cctxt.call(ctxt, \u0027get_backup_device\u0027,"},{"line_number":372,"context_line":"                          backup\u003dbackup)"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    def secure_file_operations_enabled(self, ctxt, volume):"},{"line_number":375,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":376,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.38\u0027)"},{"line_number":377,"context_line":"        return cctxt.call(ctxt, \u0027secure_file_operations_enabled\u0027,"},{"line_number":378,"context_line":"                          volume\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_fd98af1d","line":378,"range":{"start_line":368,"start_character":0,"end_line":378,"end_character":40},"updated":"2016-01-15 21:36:56.000000000","message":"In Mitaka we intent to keep RPC APIs backward compatible. This means RPC version pinning. In current model it may happen that these methods will be unavailable on cinder-volume RPC API. Is there any workaround we may use if it happens? It would probably be possible to default the second one to something, but I doubt on the first one.\n\nWe may think of forcing the order of upgrades to c-api-\u003ec-sch-\u003ec-vol-\u003ec-bak. This way we\u0027re certain that once Mitaka\u0027s c-bak is up it has Mitaka\u0027s c-vol that support these methods.\n\nThis seems correct to me, can you think of it a moment and confirm I\u0027m not missing something important here?","commit_id":"59a310a6216d8e2abd7f932dfccb4dfd90512e2d"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"763c397a15e521cb9d691ccc31daa3b2d0808395","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.29\u0027)"},{"line_number":366,"context_line":"        return cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"    def get_backup_device(self, ctxt, backup, volume):"},{"line_number":369,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":370,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.38\u0027)"},{"line_number":371,"context_line":"        return cctxt.call(ctxt, \u0027get_backup_device\u0027,"},{"line_number":372,"context_line":"                          backup\u003dbackup)"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    def secure_file_operations_enabled(self, ctxt, volume):"},{"line_number":375,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":376,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.38\u0027)"},{"line_number":377,"context_line":"        return cctxt.call(ctxt, \u0027secure_file_operations_enabled\u0027,"},{"line_number":378,"context_line":"                          volume\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_5d03d276","line":378,"range":{"start_line":368,"start_character":0,"end_line":378,"end_character":40},"in_reply_to":"da6ed579_fd98af1d","updated":"2016-01-18 03:31:41.000000000","message":"I will think it and submit patches.","commit_id":"59a310a6216d8e2abd7f932dfccb4dfd90512e2d"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"218f4e38c6d439d35a5342df79e453c7de8dc43a","unresolved":false,"context_lines":[{"line_number":87,"context_line":"               migrate_volume_completion(), and update_migrated_volume()."},{"line_number":88,"context_line":"        1.37 - Adds old_reservations parameter to retype to support quota"},{"line_number":89,"context_line":"               checks in the API."},{"line_number":90,"context_line":"        1.38 - Scabling backup service, add get_backup_device() and"},{"line_number":91,"context_line":"               secure_file_operations_enabled()"},{"line_number":92,"context_line":"    \"\"\""},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"da6ed579_b491b69c","line":90,"range":{"start_line":90,"start_character":15,"end_line":90,"end_character":23},"updated":"2016-01-18 12:17:00.000000000","message":"Still there\u0027s typo in \"Scabling\".","commit_id":"3be914544131b16eeb47a306af4139b485d66794"}]}
