)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"13278d89c4e9b46979435851eae0046f0550ec4f","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds new methods to our failover mechanism to allow failover"},{"line_number":10,"context_line":"to work when a backend is clustered."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Adds REST API microversion 3.19 that adds a new `failover` method"},{"line_number":13,"context_line":"equivalent to `failover_host` but accepting `cluster` field as well as"},{"line_number":14,"context_line":"the `host` field."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":49,"id":"7a3c09a3_37c0da7c","line":12,"range":{"start_line":12,"start_character":27,"end_line":12,"end_character":31},"updated":"2017-01-18 18:44:17.000000000","message":"-1: It\u0027s 3.25 now","commit_id":"9431557c941c1e18c68ea5bd70f3d34526bb47f7"}],"cinder/api/common.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"244be19b1027c64e230165ea5ccafd5b4d7289fd","unresolved":false,"context_lines":[{"line_number":373,"context_line":""},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"def get_cluster_host(req, params, cluster_version\u003dNone):"},{"line_number":376,"context_line":"    if (cluster_version is not False and"},{"line_number":377,"context_line":"            req.api_version_request.matches(cluster_version)):"},{"line_number":378,"context_line":"        cluster_name \u003d params.get(\u0027cluster\u0027)"},{"line_number":379,"context_line":"        msg \u003d _(\u0027One and only one of cluster and host must be set.\u0027)"}],"source_content_type":"text/x-python","patch_set":50,"id":"7a3c09a3_0b481287","line":376,"range":{"start_line":376,"start_character":8,"end_line":376,"end_character":36},"updated":"2017-01-18 21:55:05.000000000","message":"Is there a reason why you are checking whether it is not False, but not checking whether it is not None?  The default is None.","commit_id":"203948830aea2c901db40224029be61850d9743d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"bde5035c61d4c7ef0131164ddefac24c91eaa435","unresolved":false,"context_lines":[{"line_number":373,"context_line":""},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"def get_cluster_host(req, params, cluster_version\u003dNone):"},{"line_number":376,"context_line":"    if (cluster_version is not False and"},{"line_number":377,"context_line":"            req.api_version_request.matches(cluster_version)):"},{"line_number":378,"context_line":"        cluster_name \u003d params.get(\u0027cluster\u0027)"},{"line_number":379,"context_line":"        msg \u003d _(\u0027One and only one of cluster and host must be set.\u0027)"}],"source_content_type":"text/x-python","patch_set":50,"id":"7a3c09a3_5c71ff76","line":376,"range":{"start_line":376,"start_character":8,"end_line":376,"end_character":36},"in_reply_to":"7a3c09a3_0b481287","updated":"2017-01-18 22:51:43.000000000","message":"Because we can have different values for cluster_version: None, False, and a string value representing the minimum cluster version.\n\nFor False we don\u0027t support cluster, for None we always want to get the cluster, and for a string value it will depend on the version of the request.\n\nI\u0027ll add a docstring to clarify.","commit_id":"203948830aea2c901db40224029be61850d9743d"}],"cinder/api/contrib/services.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"244be19b1027c64e230165ea5ccafd5b4d7289fd","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        return self.volume_api.thaw_host(context, host, cluster_name)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def _failover(self, context, req, body, clustered):"},{"line_number":123,"context_line":"        version \u003d \u00273.25\u0027 if clustered else False"},{"line_number":124,"context_line":"        cluster_name, host \u003d common.get_cluster_host(req, body, version)"},{"line_number":125,"context_line":"        self.volume_api.failover(context, host, cluster_name,"},{"line_number":126,"context_line":"                                 body.get(\u0027backend_id\u0027))"}],"source_content_type":"text/x-python","patch_set":50,"id":"7a3c09a3_2e407c35","line":123,"range":{"start_line":123,"start_character":43,"end_line":123,"end_character":48},"updated":"2017-01-18 21:55:05.000000000","message":"Maybe I\u0027m missing something here.  Why setting version to False not None?","commit_id":"203948830aea2c901db40224029be61850d9743d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"bde5035c61d4c7ef0131164ddefac24c91eaa435","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        return self.volume_api.thaw_host(context, host, cluster_name)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def _failover(self, context, req, body, clustered):"},{"line_number":123,"context_line":"        version \u003d \u00273.25\u0027 if clustered else False"},{"line_number":124,"context_line":"        cluster_name, host \u003d common.get_cluster_host(req, body, version)"},{"line_number":125,"context_line":"        self.volume_api.failover(context, host, cluster_name,"},{"line_number":126,"context_line":"                                 body.get(\u0027backend_id\u0027))"}],"source_content_type":"text/x-python","patch_set":50,"id":"7a3c09a3_5ccd7f85","line":123,"range":{"start_line":123,"start_character":43,"end_line":123,"end_character":48},"in_reply_to":"7a3c09a3_2e407c35","updated":"2017-01-18 22:51:43.000000000","message":"Because None would mean that we always want to get the cluster name from the body, while False is that we don\u0027t want to get it ever and \u00273.25\u0027 means that we only want it when the requested version is 3.25 or higher.","commit_id":"203948830aea2c901db40224029be61850d9743d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ae5e20589cdf8133e80dcf95dead583470078f29","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        cluster_name, host \u003d common.get_cluster_host(req, body, \u00273.25\u0027)"},{"line_number":120,"context_line":"        return self.volume_api.thaw_host(context, host, cluster_name)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def _failover(self, context, req, body, clustered):"},{"line_number":123,"context_line":"        version \u003d \u00273.25\u0027 if clustered else False"},{"line_number":124,"context_line":"        cluster_name, host \u003d common.get_cluster_host(req, body, version)"},{"line_number":125,"context_line":"        self.volume_api.failover(context, host, cluster_name,"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a3905b3_b68cce36","line":122,"updated":"2017-01-19 02:45:18.000000000","message":"Please add a brief comment here.  I found this very confusing.\n\nYour explanation from the previous patch set looks good here as a comment:\n\n# None would mean that we always want to get the cluster name from the body, while False is that we don\u0027t want to get it ever and \u00273.25\u0027 means that we only want it when the requested version is 3.25 or higher.","commit_id":"026189663f9b7c79b8135354f7db1283d611cdfa"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"5361cb1fa4367cb083f26c2d47657b686cd2fe31","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        cluster_name, host \u003d common.get_cluster_host(req, body, \u00273.25\u0027)"},{"line_number":120,"context_line":"        return self.volume_api.thaw_host(context, host, cluster_name)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def _failover(self, context, req, body, clustered):"},{"line_number":123,"context_line":"        version \u003d \u00273.25\u0027 if clustered else False"},{"line_number":124,"context_line":"        cluster_name, host \u003d common.get_cluster_host(req, body, version)"},{"line_number":125,"context_line":"        self.volume_api.failover(context, host, cluster_name,"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a3905b3_5bd105fb","line":122,"in_reply_to":"5a3905b3_b68cce36","updated":"2017-01-19 09:33:11.000000000","message":"Done","commit_id":"026189663f9b7c79b8135354f7db1283d611cdfa"}],"cinder/api/openstack/rest_api_version_history.rst":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"64141b4e91ba1a70a3e76f9cc07cc2a8ee54f883","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"  - Cluster listing accepts ``replication_status``, ``frozen`` and"},{"line_number":258,"context_line":"    ``active_backend_id`` as filters, and returns additional fields for each"},{"line_number":259,"context_line":"    cluster: ``replication_status`, ``frozen``, ``active_backend_id``."}],"source_content_type":"text/x-rst","patch_set":39,"id":"da4df55a_1794a135","line":259,"range":{"start_line":259,"start_character":33,"end_line":259,"end_character":34},"updated":"2016-12-22 14:35:56.000000000","message":"You\u0027ve missed one tick here.","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"865d78fa6afd4eb88a101f0b92342fb1cb4bdb8e","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"  - Cluster listing accepts ``replication_status``, ``frozen`` and"},{"line_number":258,"context_line":"    ``active_backend_id`` as filters, and returns additional fields for each"},{"line_number":259,"context_line":"    cluster: ``replication_status`, ``frozen``, ``active_backend_id``."}],"source_content_type":"text/x-rst","patch_set":39,"id":"da4df55a_7c276012","line":259,"range":{"start_line":259,"start_character":33,"end_line":259,"end_character":34},"in_reply_to":"da4df55a_1794a135","updated":"2016-12-23 11:54:42.000000000","message":"Done","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"}],"cinder/db/sqlalchemy/migrate_repo/versions/087_add_replication_info_to_cluster.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"865d78fa6afd4eb88a101f0b92342fb1cb4bdb8e","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def upgrade(migrate_engine):"},{"line_number":21,"context_line":"    \"\"\"Add replication info to services table.\"\"\""},{"line_number":22,"context_line":"    meta \u003d MetaData()"},{"line_number":23,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_7c5f6041","line":21,"range":{"start_line":21,"start_character":31,"end_line":21,"end_character":39},"updated":"2016-12-23 11:54:42.000000000","message":"nit: clusters","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"}],"cinder/db/sqlalchemy/models.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"64141b4e91ba1a70a3e76f9cc07cc2a8ee54f883","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    disabled_reason \u003d Column(String(255))"},{"line_number":123,"context_line":"    race_preventer \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    replication_status \u003d Column(String(255), default\u003d\"not-capable\")"},{"line_number":126,"context_line":"    active_backend_id \u003d Column(String(255))"},{"line_number":127,"context_line":"    frozen \u003d Column(Boolean, nullable\u003dFalse, default\u003dFalse)"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_92da5f77","line":125,"range":{"start_line":125,"start_character":4,"end_line":125,"end_character":67},"updated":"2016-12-22 14:35:56.000000000","message":"In migration script this field is String(36). I guess this was copied from commit that added migration 065. We shouldn\u0027t make the same mistake here.\n\nI\u0027ll make a commit that switches the model to match the DB schema in Services table.","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"865d78fa6afd4eb88a101f0b92342fb1cb4bdb8e","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    disabled_reason \u003d Column(String(255))"},{"line_number":123,"context_line":"    race_preventer \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    replication_status \u003d Column(String(255), default\u003d\"not-capable\")"},{"line_number":126,"context_line":"    active_backend_id \u003d Column(String(255))"},{"line_number":127,"context_line":"    frozen \u003d Column(Boolean, nullable\u003dFalse, default\u003dFalse)"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_fcbc306e","line":125,"range":{"start_line":125,"start_character":4,"end_line":125,"end_character":67},"in_reply_to":"da4df55a_92da5f77","updated":"2016-12-23 11:54:42.000000000","message":"Done, changed to 36","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"64141b4e91ba1a70a3e76f9cc07cc2a8ee54f883","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    replication_status \u003d Column(String(255), default\u003d\"not-capable\")"},{"line_number":126,"context_line":"    active_backend_id \u003d Column(String(255))"},{"line_number":127,"context_line":"    frozen \u003d Column(Boolean, nullable\u003dFalse, default\u003dFalse)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    # Last heartbeat reported by any of the services of this cluster.  This is"},{"line_number":130,"context_line":"    # not deferred since we always want to load this field."}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_726dfb31","line":127,"range":{"start_line":127,"start_character":0,"end_line":127,"end_character":59},"updated":"2016-12-22 14:35:56.000000000","message":"Actually DB schema in MySQL tells me that this turns out to be nullable.","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"865d78fa6afd4eb88a101f0b92342fb1cb4bdb8e","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    replication_status \u003d Column(String(255), default\u003d\"not-capable\")"},{"line_number":126,"context_line":"    active_backend_id \u003d Column(String(255))"},{"line_number":127,"context_line":"    frozen \u003d Column(Boolean, nullable\u003dFalse, default\u003dFalse)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    # Last heartbeat reported by any of the services of this cluster.  This is"},{"line_number":130,"context_line":"    # not deferred since we always want to load this field."}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_5cba9c6f","line":127,"range":{"start_line":127,"start_character":0,"end_line":127,"end_character":59},"in_reply_to":"da4df55a_726dfb31","updated":"2016-12-23 11:54:42.000000000","message":"I updated the DB schema","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"}],"cinder/objects/cluster.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"64141b4e91ba1a70a3e76f9cc07cc2a8ee54f883","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                                       read_only\u003dTrue),"},{"line_number":59,"context_line":"        # Replication properties"},{"line_number":60,"context_line":"        \u0027replication_status\u0027: c_fields.ReplicationStatusField(nullable\u003dTrue),"},{"line_number":61,"context_line":"        \u0027frozen\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":62,"context_line":"        \u0027active_backend_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":63,"context_line":"    }"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_12174fa4","line":61,"range":{"start_line":61,"start_character":8,"end_line":61,"end_character":53},"updated":"2016-12-22 14:35:56.000000000","message":"In the DB schema this is also nullable.","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"865d78fa6afd4eb88a101f0b92342fb1cb4bdb8e","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                                       read_only\u003dTrue),"},{"line_number":59,"context_line":"        # Replication properties"},{"line_number":60,"context_line":"        \u0027replication_status\u0027: c_fields.ReplicationStatusField(nullable\u003dTrue),"},{"line_number":61,"context_line":"        \u0027frozen\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":62,"context_line":"        \u0027active_backend_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":63,"context_line":"    }"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_3c3cf8e1","line":61,"range":{"start_line":61,"start_character":8,"end_line":61,"end_character":53},"in_reply_to":"da4df55a_12174fa4","updated":"2016-12-23 11:54:42.000000000","message":"I\u0027ve updated the DB schema","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"}],"cinder/service.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"9590c670a2db309922c7c92729a9752295bb14aa","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            # will not be using."},{"line_number":282,"context_line":"            target \u003d messaging.Target("},{"line_number":283,"context_line":"                topic\u003d\u0027%s.%s\u0027 % (self.topic, self.cluster),"},{"line_number":284,"context_line":"                server\u003dvol_utils.extract_host(self.host, \u0027host\u0027))"},{"line_number":285,"context_line":"            serializer \u003d objects_base.CinderObjectSerializer(obj_version_cap)"},{"line_number":286,"context_line":"            self.cluster_rpcserver \u003d rpc.get_server(target, endpoints,"},{"line_number":287,"context_line":"                                                    serializer)"}],"source_content_type":"text/x-python","patch_set":45,"id":"7a3c09a3_44706ba4","line":284,"updated":"2017-01-18 12:58:49.000000000","message":"-1: This no longer works after we changed the way we handled topics to support multibackend (cinder-zeromq-support) [1]\n\n[1] https://review.openstack.org/#/c/398452/","commit_id":"7ea37c10f9b2640187ff64b88910bc25460b62c9"}],"cinder/utils.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"64141b4e91ba1a70a3e76f9cc07cc2a8ee54f883","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"            datetime.timedelta(seconds\u003dCONF.service_down_time))"},{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":""},{"line_number":1077,"context_line":"def as_tuple(string):"},{"line_number":1078,"context_line":"    return tuple(int(x) for x in string.split(\u0027.\u0027))"}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_cde2869f","line":1078,"range":{"start_line":1077,"start_character":0,"end_line":1078,"end_character":51},"updated":"2016-12-22 14:35:56.000000000","message":"That\u0027s for semver string? You could just use [1].\n\n[1] https://github.com/openstack/oslo.utils/blob/master/oslo_utils/versionutils.py#L83-L88","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"865d78fa6afd4eb88a101f0b92342fb1cb4bdb8e","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"            datetime.timedelta(seconds\u003dCONF.service_down_time))"},{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":""},{"line_number":1077,"context_line":"def as_tuple(string):"},{"line_number":1078,"context_line":"    return tuple(int(x) for x in string.split(\u0027.\u0027))"}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_370a5322","line":1078,"range":{"start_line":1077,"start_character":0,"end_line":1078,"end_character":51},"in_reply_to":"da4df55a_cde2869f","updated":"2016-12-23 11:54:42.000000000","message":"lol, the exact same code.  Done","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"}],"cinder/volume/api.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"244be19b1027c64e230165ea5ccafd5b4d7289fd","unresolved":false,"context_lines":[{"line_number":1743,"context_line":"            expected \u003d utils.build_or_str(six.text_type(expected_value))"},{"line_number":1744,"context_line":"            up_msg \u003d \u0027and must be up \u0027 if check_up else \u0027\u0027"},{"line_number":1745,"context_line":"            msg \u003d (_(\u0027%(field)s in %(service)s must be %(expected)s \u0027"},{"line_number":1746,"context_line":"                     \u0027%(up_msg)sto failover.\u0027)"},{"line_number":1747,"context_line":"                   % {\u0027field\u0027: field, \u0027service\u0027: service,"},{"line_number":1748,"context_line":"                      \u0027expected\u0027: expected, \u0027up_msg\u0027: up_msg})"},{"line_number":1749,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":50,"id":"7a3c09a3_6450e35f","line":1746,"range":{"start_line":1746,"start_character":22,"end_line":1746,"end_character":34},"updated":"2017-01-18 21:55:05.000000000","message":"Need a space between %(up_msg)s and to, otherwise I don\u0027t think this will format correctly.","commit_id":"203948830aea2c901db40224029be61850d9743d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"bde5035c61d4c7ef0131164ddefac24c91eaa435","unresolved":false,"context_lines":[{"line_number":1743,"context_line":"            expected \u003d utils.build_or_str(six.text_type(expected_value))"},{"line_number":1744,"context_line":"            up_msg \u003d \u0027and must be up \u0027 if check_up else \u0027\u0027"},{"line_number":1745,"context_line":"            msg \u003d (_(\u0027%(field)s in %(service)s must be %(expected)s \u0027"},{"line_number":1746,"context_line":"                     \u0027%(up_msg)sto failover.\u0027)"},{"line_number":1747,"context_line":"                   % {\u0027field\u0027: field, \u0027service\u0027: service,"},{"line_number":1748,"context_line":"                      \u0027expected\u0027: expected, \u0027up_msg\u0027: up_msg})"},{"line_number":1749,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":50,"id":"7a3c09a3_1c8137fc","line":1746,"range":{"start_line":1746,"start_character":22,"end_line":1746,"end_character":34},"in_reply_to":"7a3c09a3_6450e35f","updated":"2017-01-18 22:51:43.000000000","message":"it will format correctly, and there is no missing space, the space is either at the end of up_message if check_up is evaluated to True or it\u0027s just not necessary because it\u0027s at the end of the previous line.","commit_id":"203948830aea2c901db40224029be61850d9743d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"244be19b1027c64e230165ea5ccafd5b4d7289fd","unresolved":false,"context_lines":[{"line_number":1816,"context_line":""},{"line_number":1817,"context_line":"        expected \u003d False"},{"line_number":1818,"context_line":"        new_value \u003d True"},{"line_number":1819,"context_line":"        cluster, services \u003d self. _replication_db_change("},{"line_number":1820,"context_line":"            ctxt, \u0027frozen\u0027, expected, new_value, host, cluster_name,"},{"line_number":1821,"context_line":"            check_up\u003dFalse)"},{"line_number":1822,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"7a3c09a3_648543ac","line":1819,"range":{"start_line":1819,"start_character":33,"end_line":1819,"end_character":34},"updated":"2017-01-18 21:55:05.000000000","message":"Is there a space between self. and the function name _replication_db_change?","commit_id":"203948830aea2c901db40224029be61850d9743d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"244be19b1027c64e230165ea5ccafd5b4d7289fd","unresolved":false,"context_lines":[{"line_number":1831,"context_line":""},{"line_number":1832,"context_line":"        expected \u003d True"},{"line_number":1833,"context_line":"        new_value \u003d False"},{"line_number":1834,"context_line":"        cluster, services \u003d self. _replication_db_change("},{"line_number":1835,"context_line":"            ctxt, \u0027frozen\u0027, expected, new_value, host, cluster_name,"},{"line_number":1836,"context_line":"            check_up\u003dFalse)"},{"line_number":1837,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"7a3c09a3_c4ba7771","line":1834,"range":{"start_line":1834,"start_character":33,"end_line":1834,"end_character":34},"updated":"2017-01-18 21:55:05.000000000","message":"a space there","commit_id":"203948830aea2c901db40224029be61850d9743d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ae5e20589cdf8133e80dcf95dead583470078f29","unresolved":false,"context_lines":[{"line_number":1743,"context_line":"            expected \u003d utils.build_or_str(six.text_type(expected_value))"},{"line_number":1744,"context_line":"            up_msg \u003d \u0027and must be up \u0027 if check_up else \u0027\u0027"},{"line_number":1745,"context_line":"            msg \u003d (_(\u0027%(field)s in %(service)s must be %(expected)s \u0027"},{"line_number":1746,"context_line":"                     \u0027%(up_msg)sto failover.\u0027)"},{"line_number":1747,"context_line":"                   % {\u0027field\u0027: field, \u0027service\u0027: service,"},{"line_number":1748,"context_line":"                      \u0027expected\u0027: expected, \u0027up_msg\u0027: up_msg})"},{"line_number":1749,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a3905b3_965d12ef","line":1746,"range":{"start_line":1746,"start_character":22,"end_line":1746,"end_character":34},"updated":"2017-01-19 02:45:18.000000000","message":"I have to say this looks very confusing and you should add a space to make it clear even if there\u0027s no syntax error.","commit_id":"026189663f9b7c79b8135354f7db1283d611cdfa"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"95a45c48b2c3bb104004391077f1f4435d700efc","unresolved":false,"context_lines":[{"line_number":1743,"context_line":"            expected \u003d utils.build_or_str(six.text_type(expected_value))"},{"line_number":1744,"context_line":"            up_msg \u003d \u0027and must be up \u0027 if check_up else \u0027\u0027"},{"line_number":1745,"context_line":"            msg \u003d (_(\u0027%(field)s in %(service)s must be %(expected)s \u0027"},{"line_number":1746,"context_line":"                     \u0027%(up_msg)sto failover.\u0027)"},{"line_number":1747,"context_line":"                   % {\u0027field\u0027: field, \u0027service\u0027: service,"},{"line_number":1748,"context_line":"                      \u0027expected\u0027: expected, \u0027up_msg\u0027: up_msg})"},{"line_number":1749,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a3905b3_a23c5a94","line":1746,"range":{"start_line":1746,"start_character":22,"end_line":1746,"end_character":34},"in_reply_to":"5a3905b3_5bad8630","updated":"2017-01-19 18:37:37.000000000","message":"If you change to the following, you won\u0027t get 2 spaces and it looks more clear.\n\n            up_msg \u003d \u0027 and must be up\u0027 if check_up else \u0027\u0027\n            msg \u003d (_(\u0027%(field)s in %(service)s must be %(expected)s\u0027\n                     \u0027%(up_msg)s to failover.\u0027)\n                   % {\u0027field\u0027: field, \u0027service\u0027: service,\n                      \u0027expected\u0027: expected, \u0027up_msg\u0027: up_msg})","commit_id":"026189663f9b7c79b8135354f7db1283d611cdfa"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"5361cb1fa4367cb083f26c2d47657b686cd2fe31","unresolved":false,"context_lines":[{"line_number":1743,"context_line":"            expected \u003d utils.build_or_str(six.text_type(expected_value))"},{"line_number":1744,"context_line":"            up_msg \u003d \u0027and must be up \u0027 if check_up else \u0027\u0027"},{"line_number":1745,"context_line":"            msg \u003d (_(\u0027%(field)s in %(service)s must be %(expected)s \u0027"},{"line_number":1746,"context_line":"                     \u0027%(up_msg)sto failover.\u0027)"},{"line_number":1747,"context_line":"                   % {\u0027field\u0027: field, \u0027service\u0027: service,"},{"line_number":1748,"context_line":"                      \u0027expected\u0027: expected, \u0027up_msg\u0027: up_msg})"},{"line_number":1749,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a3905b3_5bad8630","line":1746,"range":{"start_line":1746,"start_character":22,"end_line":1746,"end_character":34},"in_reply_to":"5a3905b3_965d12ef","updated":"2017-01-19 09:33:11.000000000","message":"If I add a space here it will turn into 2 spaces once formatted.","commit_id":"026189663f9b7c79b8135354f7db1283d611cdfa"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"ece0ea6ab08ca9c898eb9fa951535297b306e743","unresolved":false,"context_lines":[{"line_number":1743,"context_line":"            expected \u003d utils.build_or_str(six.text_type(expected_value))"},{"line_number":1744,"context_line":"            up_msg \u003d \u0027and must be up \u0027 if check_up else \u0027\u0027"},{"line_number":1745,"context_line":"            msg \u003d (_(\u0027%(field)s in %(service)s must be %(expected)s \u0027"},{"line_number":1746,"context_line":"                     \u0027%(up_msg)sto failover.\u0027)"},{"line_number":1747,"context_line":"                   % {\u0027field\u0027: field, \u0027service\u0027: service,"},{"line_number":1748,"context_line":"                      \u0027expected\u0027: expected, \u0027up_msg\u0027: up_msg})"},{"line_number":1749,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a3905b3_65535ce2","line":1746,"range":{"start_line":1746,"start_character":22,"end_line":1746,"end_character":34},"in_reply_to":"5a3905b3_a23c5a94","updated":"2017-01-19 18:54:04.000000000","message":"I could do that, but then it\u0027s more likely for people to think that it\u0027s a mistake (we\u0027ve had lots of those in the messages) and add an additional space in a patch.\n\nIf you think this is important or it\u0027s bothering you just to look at it I can change it.","commit_id":"026189663f9b7c79b8135354f7db1283d611cdfa"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"5361cb1fa4367cb083f26c2d47657b686cd2fe31","unresolved":false,"context_lines":[{"line_number":1804,"context_line":"        expected_values \u003d [rep_fields.ENABLED, rep_fields.FAILED_OVER]"},{"line_number":1805,"context_line":"        new_value \u003d rep_fields.FAILING_OVER"},{"line_number":1806,"context_line":""},{"line_number":1807,"context_line":"        cluster, services \u003d self. _replication_db_change("},{"line_number":1808,"context_line":"            ctxt, \u0027replication_status\u0027, expected_values, new_value, host,"},{"line_number":1809,"context_line":"            cluster_name, check_up\u003dTrue)"},{"line_number":1810,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"5a3905b3_7bac01ee","line":1807,"range":{"start_line":1807,"start_character":33,"end_line":1807,"end_character":34},"updated":"2017-01-19 09:33:11.000000000","message":"will remove this space as well","commit_id":"026189663f9b7c79b8135354f7db1283d611cdfa"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ae5e20589cdf8133e80dcf95dead583470078f29","unresolved":false,"context_lines":[{"line_number":1816,"context_line":""},{"line_number":1817,"context_line":"        expected \u003d False"},{"line_number":1818,"context_line":"        new_value \u003d True"},{"line_number":1819,"context_line":"        cluster, services \u003d self. _replication_db_change("},{"line_number":1820,"context_line":"            ctxt, \u0027frozen\u0027, expected, new_value, host, cluster_name,"},{"line_number":1821,"context_line":"            check_up\u003dFalse)"},{"line_number":1822,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"5a3905b3_f6b816e8","line":1819,"range":{"start_line":1819,"start_character":33,"end_line":1819,"end_character":34},"updated":"2017-01-19 02:45:18.000000000","message":"Why is there a space here?","commit_id":"026189663f9b7c79b8135354f7db1283d611cdfa"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"5361cb1fa4367cb083f26c2d47657b686cd2fe31","unresolved":false,"context_lines":[{"line_number":1816,"context_line":""},{"line_number":1817,"context_line":"        expected \u003d False"},{"line_number":1818,"context_line":"        new_value \u003d True"},{"line_number":1819,"context_line":"        cluster, services \u003d self. _replication_db_change("},{"line_number":1820,"context_line":"            ctxt, \u0027frozen\u0027, expected, new_value, host, cluster_name,"},{"line_number":1821,"context_line":"            check_up\u003dFalse)"},{"line_number":1822,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"5a3905b3_5bc4a591","line":1819,"range":{"start_line":1819,"start_character":33,"end_line":1819,"end_character":34},"in_reply_to":"5a3905b3_f6b816e8","updated":"2017-01-19 09:33:11.000000000","message":"It\u0027s valid python (that\u0027s why the code doesn\u0027t fail and pep8 doesn\u0027t complain) but I put that space by mistake (and then copy-pasted it).","commit_id":"026189663f9b7c79b8135354f7db1283d611cdfa"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ae5e20589cdf8133e80dcf95dead583470078f29","unresolved":false,"context_lines":[{"line_number":1831,"context_line":""},{"line_number":1832,"context_line":"        expected \u003d True"},{"line_number":1833,"context_line":"        new_value \u003d False"},{"line_number":1834,"context_line":"        cluster, services \u003d self. _replication_db_change("},{"line_number":1835,"context_line":"            ctxt, \u0027frozen\u0027, expected, new_value, host, cluster_name,"},{"line_number":1836,"context_line":"            check_up\u003dFalse)"},{"line_number":1837,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"5a3905b3_16ce8283","line":1834,"range":{"start_line":1834,"start_character":33,"end_line":1834,"end_character":34},"updated":"2017-01-19 02:45:18.000000000","message":"same","commit_id":"026189663f9b7c79b8135354f7db1283d611cdfa"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"5361cb1fa4367cb083f26c2d47657b686cd2fe31","unresolved":false,"context_lines":[{"line_number":1831,"context_line":""},{"line_number":1832,"context_line":"        expected \u003d True"},{"line_number":1833,"context_line":"        new_value \u003d False"},{"line_number":1834,"context_line":"        cluster, services \u003d self. _replication_db_change("},{"line_number":1835,"context_line":"            ctxt, \u0027frozen\u0027, expected, new_value, host, cluster_name,"},{"line_number":1836,"context_line":"            check_up\u003dFalse)"},{"line_number":1837,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"5a3905b3_7bc16180","line":1834,"range":{"start_line":1834,"start_character":33,"end_line":1834,"end_character":34},"in_reply_to":"5a3905b3_16ce8283","updated":"2017-01-19 09:33:11.000000000","message":"Done","commit_id":"026189663f9b7c79b8135354f7db1283d611cdfa"}],"cinder/volume/driver.py":[{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"aa28f148fa78427ec584a0461d9ff0cfae692d38","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    # Methods checked to detect a driver implements a replication feature"},{"line_number":333,"context_line":"    REPLICATION_FEATURE_CHECKERS \u003d {\u0027v2.1\u0027: \u0027failover_host\u0027,"},{"line_number":334,"context_line":"                                    \u0027a/a\u0027: \u0027failover_completed\u0027}"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"    def __init__(self, execute\u003dutils.execute, *args, **kwargs):"},{"line_number":337,"context_line":"        # NOTE(vish): db is set by Manager"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a74a57a_941a90c4","line":334,"range":{"start_line":334,"start_character":35,"end_line":334,"end_character":64},"updated":"2016-11-29 13:36:53.000000000","message":"Hi Gorka, I haven\u0027t had the time to look in all a/a patches but it seems that this is mixing 2 different things. 1 is the A/A support and other is the replication support. Is it possible that a driver supports a/a but replication is not a/a? If that is the case, then IMO the driver should not report it supports a/a. If the driver has N features, all should support a/a in order to it be considered a/a.","commit_id":"92a649139cc8d02225b15529f1f4da0920159f1b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"fa1023ecb684fa97b8f2766b4652c55f77ea0a73","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    # Methods checked to detect a driver implements a replication feature"},{"line_number":333,"context_line":"    REPLICATION_FEATURE_CHECKERS \u003d {\u0027v2.1\u0027: \u0027failover_host\u0027,"},{"line_number":334,"context_line":"                                    \u0027a/a\u0027: \u0027failover_completed\u0027}"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"    def __init__(self, execute\u003dutils.execute, *args, **kwargs):"},{"line_number":337,"context_line":"        # NOTE(vish): db is set by Manager"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a74a57a_059c5968","line":334,"range":{"start_line":334,"start_character":35,"end_line":334,"end_character":64},"in_reply_to":"5a74a57a_941a90c4","updated":"2016-11-30 10:43:01.000000000","message":"I don\u0027t see it that way, a driver could support A/A because it always had and the limitation was in Cinder\u0027s core code, or because it has been added to the driver using Tooz, so after the A/A work is merged the driver can be deployed in A/A as long as you are not using replication as well.\n\nI think it\u0027s an unnecessary restriction to force drivers to support A/A and Replication A/A before they can deploy non replicated systems in A/A considering that Replication is an optional driver feature that does not need to be enabled on all systems.  The key word being \"optional\".","commit_id":"92a649139cc8d02225b15529f1f4da0920159f1b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"64141b4e91ba1a70a3e76f9cc07cc2a8ee54f883","unresolved":false,"context_lines":[{"line_number":1731,"context_line":"    def _is_base_method(cls, method_name):"},{"line_number":1732,"context_line":"        method \u003d getattr(cls, method_name)"},{"line_number":1733,"context_line":"        return method.__module__ \u003d\u003d getattr(BaseVD, method_name).__module__"},{"line_number":1734,"context_line":""},{"line_number":1735,"context_line":"    @classmethod"},{"line_number":1736,"context_line":"    def supports_replication_feature(cls, feature):"},{"line_number":1737,"context_line":"        \"\"\"Check if driver class supports replication features."},{"line_number":1738,"context_line":""},{"line_number":1739,"context_line":"        Feature is a string that must be one of:"},{"line_number":1740,"context_line":"            - v2.1"},{"line_number":1741,"context_line":"            - a/a"},{"line_number":1742,"context_line":"        \"\"\""},{"line_number":1743,"context_line":"        if feature not in cls.REPLICATION_FEATURE_CHECKERS:"},{"line_number":1744,"context_line":"            return False"},{"line_number":1745,"context_line":""},{"line_number":1746,"context_line":"        # Check if method is being implemented/overwritten by the driver"},{"line_number":1747,"context_line":"        method_name \u003d cls.REPLICATION_FEATURE_CHECKERS[feature]"},{"line_number":1748,"context_line":"        return not cls._is_base_method(method_name)"},{"line_number":1749,"context_line":""},{"line_number":1750,"context_line":"    def get_replication_updates(self, context):"},{"line_number":1751,"context_line":"        \"\"\"Old replication update method, deprecate.\"\"\""}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_e274b0d0","line":1748,"range":{"start_line":1734,"start_character":0,"end_line":1748,"end_character":51},"updated":"2016-12-22 14:35:56.000000000","message":"Isn\u0027t it overly complicated? You could just run failover_completed or failover_host and see if it raises NotImplementedError.","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"865d78fa6afd4eb88a101f0b92342fb1cb4bdb8e","unresolved":false,"context_lines":[{"line_number":1731,"context_line":"    def _is_base_method(cls, method_name):"},{"line_number":1732,"context_line":"        method \u003d getattr(cls, method_name)"},{"line_number":1733,"context_line":"        return method.__module__ \u003d\u003d getattr(BaseVD, method_name).__module__"},{"line_number":1734,"context_line":""},{"line_number":1735,"context_line":"    @classmethod"},{"line_number":1736,"context_line":"    def supports_replication_feature(cls, feature):"},{"line_number":1737,"context_line":"        \"\"\"Check if driver class supports replication features."},{"line_number":1738,"context_line":""},{"line_number":1739,"context_line":"        Feature is a string that must be one of:"},{"line_number":1740,"context_line":"            - v2.1"},{"line_number":1741,"context_line":"            - a/a"},{"line_number":1742,"context_line":"        \"\"\""},{"line_number":1743,"context_line":"        if feature not in cls.REPLICATION_FEATURE_CHECKERS:"},{"line_number":1744,"context_line":"            return False"},{"line_number":1745,"context_line":""},{"line_number":1746,"context_line":"        # Check if method is being implemented/overwritten by the driver"},{"line_number":1747,"context_line":"        method_name \u003d cls.REPLICATION_FEATURE_CHECKERS[feature]"},{"line_number":1748,"context_line":"        return not cls._is_base_method(method_name)"},{"line_number":1749,"context_line":""},{"line_number":1750,"context_line":"    def get_replication_updates(self, context):"},{"line_number":1751,"context_line":"        \"\"\"Old replication update method, deprecate.\"\"\""}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_b7f2c3d0","line":1748,"range":{"start_line":1734,"start_character":0,"end_line":1748,"end_character":51},"in_reply_to":"da4df55a_e274b0d0","updated":"2016-12-23 11:54:42.000000000","message":"Because that won\u0027t do.  First of all this is a class method (we\u0027ll need it to be for driver info generation [1]), so we can\u0027t call normal methods, and eve if we could, calling the failover_host method to check if it\u0027s implemented on a driver that does would actually trigger a failover!!\n\n[1] https://review.openstack.org/403854","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"244be19b1027c64e230165ea5ccafd5b4d7289fd","unresolved":false,"context_lines":[{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    # Methods checked to detect a driver implements a replication feature"},{"line_number":339,"context_line":"    REPLICATION_FEATURE_CHECKERS \u003d {\u0027v2.1\u0027: \u0027failover_host\u0027,"},{"line_number":340,"context_line":"                                    \u0027a/a\u0027: \u0027failover_completed\u0027}"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def __init__(self, execute\u003dutils.execute, *args, **kwargs):"},{"line_number":343,"context_line":"        # NOTE(vish): db is set by Manager"}],"source_content_type":"text/x-python","patch_set":50,"id":"7a3c09a3_1fce8cb4","line":340,"range":{"start_line":340,"start_character":37,"end_line":340,"end_character":40},"updated":"2017-01-18 21:55:05.000000000","message":"I see that you use v2.2 for the newer replication API in other places.  Why not using \u0027v2.2\u0027 here?","commit_id":"203948830aea2c901db40224029be61850d9743d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"bde5035c61d4c7ef0131164ddefac24c91eaa435","unresolved":false,"context_lines":[{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    # Methods checked to detect a driver implements a replication feature"},{"line_number":339,"context_line":"    REPLICATION_FEATURE_CHECKERS \u003d {\u0027v2.1\u0027: \u0027failover_host\u0027,"},{"line_number":340,"context_line":"                                    \u0027a/a\u0027: \u0027failover_completed\u0027}"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def __init__(self, execute\u003dutils.execute, *args, **kwargs):"},{"line_number":343,"context_line":"        # NOTE(vish): db is set by Manager"}],"source_content_type":"text/x-python","patch_set":50,"id":"7a3c09a3_3c027370","line":340,"range":{"start_line":340,"start_character":37,"end_line":340,"end_character":40},"in_reply_to":"7a3c09a3_1fce8cb4","updated":"2017-01-18 22:51:43.000000000","message":"Those places where v2.2 appear should be changed, since I originally intended to call it v2.2 and use versions instead of features, but then decided it was not a good idea, as doing it as features was more flexible.  I\u0027ll fix those instances.","commit_id":"203948830aea2c901db40224029be61850d9743d"}],"cinder/volume/manager.py":[{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"c32d2a3090b3a0fcf2ca2f905290dd5c766d75bb","unresolved":false,"context_lines":[{"line_number":4075,"context_line":"        # volume services, including this one."},{"line_number":4076,"context_line":"        if service.cluster_name:"},{"line_number":4077,"context_line":"            rpcapi \u003d volume_rpcapi.VolumeAPI()"},{"line_number":4078,"context_line":"            rpcapi.failover_completed(context, service, updates)"},{"line_number":4079,"context_line":"            # We have to update the cluster with the same data."},{"line_number":4080,"context_line":"            if service.cluster_name:"},{"line_number":4081,"context_line":"                for key, value in updates.items():"},{"line_number":4082,"context_line":"                    setattr(service.cluster, key, value)"},{"line_number":4083,"context_line":"                service.cluster.save()"},{"line_number":4084,"context_line":"        else:"},{"line_number":4085,"context_line":"            service.update(updates)"},{"line_number":4086,"context_line":"            service.save()"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa6399be_8f8ba967","line":4083,"range":{"start_line":4078,"start_character":12,"end_line":4083,"end_character":38},"updated":"2016-10-13 20:47:35.000000000","message":"One potential issue for some of the drivers is that we ended up pushing some state into them with cheesecake where the driver keeps track of the active backend id to know where to issue api requests.\n\nAs-is (if I\u0027m understanding this correctly) we would update the service db entries for all the c-vol\u0027s in the cluster, but those driver instances wouldn\u0027t really know something happened if they are holding that backend id state from when they initialized or handled a failover last.\n\nSeems like the safest thing would be to start querying the db for the current backend id from the driver (or in the manager and pass it to the driver) for each driver api call. I suppose alternatively we could broadcast failover_completed (or similar) to each c-vol service so the running drivers have a way to pick up the new backend id.\n\nThoughts?","commit_id":"fb9547a86230bc1b46d3cb4f4487c5097fdf79cd"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"fb530c9d2ae373bf7acaa8491987ec81faea83c2","unresolved":false,"context_lines":[{"line_number":4075,"context_line":"        # volume services, including this one."},{"line_number":4076,"context_line":"        if service.cluster_name:"},{"line_number":4077,"context_line":"            rpcapi \u003d volume_rpcapi.VolumeAPI()"},{"line_number":4078,"context_line":"            rpcapi.failover_completed(context, service, updates)"},{"line_number":4079,"context_line":"            # We have to update the cluster with the same data."},{"line_number":4080,"context_line":"            if service.cluster_name:"},{"line_number":4081,"context_line":"                for key, value in updates.items():"},{"line_number":4082,"context_line":"                    setattr(service.cluster, key, value)"},{"line_number":4083,"context_line":"                service.cluster.save()"},{"line_number":4084,"context_line":"        else:"},{"line_number":4085,"context_line":"            service.update(updates)"},{"line_number":4086,"context_line":"            service.save()"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa6399be_977542cc","line":4083,"range":{"start_line":4078,"start_character":12,"end_line":4083,"end_character":38},"in_reply_to":"fa6399be_20f611f9","updated":"2016-10-16 13:50:21.000000000","message":"Sounds good, I\u0027m on board with doing it that way. If we\u0027ve got the fanout working so all the services know whats going on it should be good to go.","commit_id":"fb9547a86230bc1b46d3cb4f4487c5097fdf79cd"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"54fa772b91887b912db1db349d599512d230d0d6","unresolved":false,"context_lines":[{"line_number":4075,"context_line":"        # volume services, including this one."},{"line_number":4076,"context_line":"        if service.cluster_name:"},{"line_number":4077,"context_line":"            rpcapi \u003d volume_rpcapi.VolumeAPI()"},{"line_number":4078,"context_line":"            rpcapi.failover_completed(context, service, updates)"},{"line_number":4079,"context_line":"            # We have to update the cluster with the same data."},{"line_number":4080,"context_line":"            if service.cluster_name:"},{"line_number":4081,"context_line":"                for key, value in updates.items():"},{"line_number":4082,"context_line":"                    setattr(service.cluster, key, value)"},{"line_number":4083,"context_line":"                service.cluster.save()"},{"line_number":4084,"context_line":"        else:"},{"line_number":4085,"context_line":"            service.update(updates)"},{"line_number":4086,"context_line":"            service.save()"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa6399be_20f611f9","line":4083,"range":{"start_line":4078,"start_character":12,"end_line":4083,"end_character":38},"in_reply_to":"fa6399be_8f8ba967","updated":"2016-10-14 15:41:38.000000000","message":"The idea is, to do the failover on non clustered backends as it is done now: call `failover_host` driver method locally and update the service here.\n\nBut for clustered backends we would call `failover` driver method instead, then do an RPC call broadcast to all services\u0027 method `failover_completed` -which will update the service\u0027s entry in the DB and call the driver\u0027s failover_completed method on each service with the current active_backend_id so they can update themselves (see L4104)- and here we also apply on the cluster DB entry the same changes we are applying to each of the services.\n\nSince none of the backends will support A/A replication by default that\u0027s why we raise an exception on initialization if we try to initialize a driver with replication enabled in a clustered c-vol service.\n\nMy intention is to create a v2.2 specs to reflect these changes as soon as I have time.\n\nI just realized that although the RPC call to `failover_completed` is specifying the `fanout\u003dTrue`, it won\u0027t work as it is, because back when I created the the cluster topic queues I didn\u0027t make it so they would support fanout, so I\u0027ll update the patch to support it .  :-)","commit_id":"fb9547a86230bc1b46d3cb4f4487c5097fdf79cd"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7737bb2aabb7772a7104d1918c06466b0b54efa2","unresolved":false,"context_lines":[{"line_number":4075,"context_line":"        # volume services, including this one."},{"line_number":4076,"context_line":"        if service.cluster_name:"},{"line_number":4077,"context_line":"            rpcapi \u003d volume_rpcapi.VolumeAPI()"},{"line_number":4078,"context_line":"            rpcapi.failover_completed(context, service, updates)"},{"line_number":4079,"context_line":"            # We have to update the cluster with the same data."},{"line_number":4080,"context_line":"            if service.cluster_name:"},{"line_number":4081,"context_line":"                for key, value in updates.items():"},{"line_number":4082,"context_line":"                    setattr(service.cluster, key, value)"},{"line_number":4083,"context_line":"                service.cluster.save()"},{"line_number":4084,"context_line":"        else:"},{"line_number":4085,"context_line":"            service.update(updates)"},{"line_number":4086,"context_line":"            service.save()"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa6399be_10f5aaeb","line":4083,"range":{"start_line":4078,"start_character":12,"end_line":4083,"end_character":38},"in_reply_to":"fa6399be_977542cc","updated":"2016-10-17 09:31:15.000000000","message":"I update the patch to make the fanout work: https://review.openstack.org/#/c/381835/6/cinder/service.py@262","commit_id":"fb9547a86230bc1b46d3cb4f4487c5097fdf79cd"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"64141b4e91ba1a70a3e76f9cc07cc2a8ee54f883","unresolved":false,"context_lines":[{"line_number":4034,"context_line":""},{"line_number":4035,"context_line":"        :param context: security context"},{"line_number":4036,"context_line":"        :param secondary_backend_id: Specifies backend_id to fail over to"},{"line_number":4037,"context_line":"        :param clustered: Whether this is a failover of a clustered backend"},{"line_number":4038,"context_line":"        \"\"\""},{"line_number":4039,"context_line":"        updates \u003d {}"},{"line_number":4040,"context_line":"        repl_status \u003d fields.ReplicationStatus"}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_a25d48eb","line":4037,"range":{"start_line":4037,"start_character":0,"end_line":4037,"end_character":75},"updated":"2016-12-22 14:35:56.000000000","message":"This parameter is missing from the argument list.","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"865d78fa6afd4eb88a101f0b92342fb1cb4bdb8e","unresolved":false,"context_lines":[{"line_number":4034,"context_line":""},{"line_number":4035,"context_line":"        :param context: security context"},{"line_number":4036,"context_line":"        :param secondary_backend_id: Specifies backend_id to fail over to"},{"line_number":4037,"context_line":"        :param clustered: Whether this is a failover of a clustered backend"},{"line_number":4038,"context_line":"        \"\"\""},{"line_number":4039,"context_line":"        updates \u003d {}"},{"line_number":4040,"context_line":"        repl_status \u003d fields.ReplicationStatus"}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_d7c0272d","line":4037,"range":{"start_line":4037,"start_character":0,"end_line":4037,"end_character":75},"in_reply_to":"da4df55a_a25d48eb","updated":"2016-12-23 11:54:42.000000000","message":"This was before I found it unnecessary since that info can be gathered from service.is_clustered","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"64141b4e91ba1a70a3e76f9cc07cc2a8ee54f883","unresolved":false,"context_lines":[{"line_number":4083,"context_line":"                          \"replication failover.\"))"},{"line_number":4084,"context_line":"            updates.update("},{"line_number":4085,"context_line":"                disabled\u003dTrue,"},{"line_number":4086,"context_line":"                replication_status\u003dfields.ReplicationStatus.FAILOVER_ERROR)"},{"line_number":4087,"context_line":"        if exception_encountered:"},{"line_number":4088,"context_line":"            LOG.error("},{"line_number":4089,"context_line":"                _LE(\"Error encountered during failover on host: \""}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_62bb60c5","line":4086,"range":{"start_line":4086,"start_character":35,"end_line":4086,"end_character":74},"updated":"2016-12-22 14:35:56.000000000","message":"If you\u0027re already shortening this in line 4040…","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"865d78fa6afd4eb88a101f0b92342fb1cb4bdb8e","unresolved":false,"context_lines":[{"line_number":4083,"context_line":"                          \"replication failover.\"))"},{"line_number":4084,"context_line":"            updates.update("},{"line_number":4085,"context_line":"                disabled\u003dTrue,"},{"line_number":4086,"context_line":"                replication_status\u003dfields.ReplicationStatus.FAILOVER_ERROR)"},{"line_number":4087,"context_line":"        if exception_encountered:"},{"line_number":4088,"context_line":"            LOG.error("},{"line_number":4089,"context_line":"                _LE(\"Error encountered during failover on host: \""}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_77d21b02","line":4086,"range":{"start_line":4086,"start_character":35,"end_line":4086,"end_character":74},"in_reply_to":"da4df55a_62bb60c5","updated":"2016-12-23 11:54:42.000000000","message":"Done","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"499ba8e72bea2d50fc529167fb36b857c4866b29","unresolved":false,"context_lines":[{"line_number":4262,"context_line":"            # We have to update the cluster with the same data, and we do it"},{"line_number":4263,"context_line":"            # before broadcasting the failover_completed RPC call to prevent"},{"line_number":4264,"context_line":"            # races with services that may be starting.."},{"line_number":4265,"context_line":"            if service.is_clustered:"},{"line_number":4266,"context_line":"                for key, value in updates.items():"},{"line_number":4267,"context_line":"                    setattr(service.cluster, key, value)"},{"line_number":4268,"context_line":"                service.cluster.save()"}],"source_content_type":"text/x-python","patch_set":48,"id":"7a3c09a3_f4f493f1","line":4265,"updated":"2017-01-18 17:56:07.000000000","message":"Duplicate check for service.is_clustered.","commit_id":"37d145d964bf919738939cb2ca30cbcd1e0ad901"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"44da9f143f950b541c524bfa70395eeaab666daa","unresolved":false,"context_lines":[{"line_number":4262,"context_line":"            # We have to update the cluster with the same data, and we do it"},{"line_number":4263,"context_line":"            # before broadcasting the failover_completed RPC call to prevent"},{"line_number":4264,"context_line":"            # races with services that may be starting.."},{"line_number":4265,"context_line":"            if service.is_clustered:"},{"line_number":4266,"context_line":"                for key, value in updates.items():"},{"line_number":4267,"context_line":"                    setattr(service.cluster, key, value)"},{"line_number":4268,"context_line":"                service.cluster.save()"}],"source_content_type":"text/x-python","patch_set":48,"id":"7a3c09a3_b4368b00","line":4265,"in_reply_to":"7a3c09a3_f4f493f1","updated":"2017-01-18 18:13:54.000000000","message":"What was I thinking?","commit_id":"37d145d964bf919738939cb2ca30cbcd1e0ad901"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"244be19b1027c64e230165ea5ccafd5b4d7289fd","unresolved":false,"context_lines":[{"line_number":4289,"context_line":"        try:"},{"line_number":4290,"context_line":"            self.driver.failover_completed(context, service.active_backend_id)"},{"line_number":4291,"context_line":"        except Exception:"},{"line_number":4292,"context_line":"            msg \u003d _(\u0027Driver reported error during replication failover \u0027"},{"line_number":4293,"context_line":"                    \u0027completion.\u0027)"},{"line_number":4294,"context_line":"            LOG.exception(msg)"},{"line_number":4295,"context_line":"            service.disabled \u003d True"}],"source_content_type":"text/x-python","patch_set":50,"id":"7a3c09a3_3f1fc80a","line":4292,"range":{"start_line":4292,"start_character":18,"end_line":4292,"end_character":19},"updated":"2017-01-18 21:55:05.000000000","message":"Should use _LE here as it is not raised in an exception.  It is just logged by LOG.exception()","commit_id":"203948830aea2c901db40224029be61850d9743d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"bde5035c61d4c7ef0131164ddefac24c91eaa435","unresolved":false,"context_lines":[{"line_number":4289,"context_line":"        try:"},{"line_number":4290,"context_line":"            self.driver.failover_completed(context, service.active_backend_id)"},{"line_number":4291,"context_line":"        except Exception:"},{"line_number":4292,"context_line":"            msg \u003d _(\u0027Driver reported error during replication failover \u0027"},{"line_number":4293,"context_line":"                    \u0027completion.\u0027)"},{"line_number":4294,"context_line":"            LOG.exception(msg)"},{"line_number":4295,"context_line":"            service.disabled \u003d True"}],"source_content_type":"text/x-python","patch_set":50,"id":"7a3c09a3_bc1ca3c2","line":4292,"range":{"start_line":4292,"start_character":18,"end_line":4292,"end_character":19},"in_reply_to":"7a3c09a3_3f1fc80a","updated":"2017-01-18 22:51:43.000000000","message":"It\u0027s not raised, but it\u0027s stored in disabled reason, therefore needs to be translated accordingly.","commit_id":"203948830aea2c901db40224029be61850d9743d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ae5e20589cdf8133e80dcf95dead583470078f29","unresolved":false,"context_lines":[{"line_number":4289,"context_line":"        try:"},{"line_number":4290,"context_line":"            self.driver.failover_completed(context, service.active_backend_id)"},{"line_number":4291,"context_line":"        except Exception:"},{"line_number":4292,"context_line":"            msg \u003d _(\u0027Driver reported error during replication failover \u0027"},{"line_number":4293,"context_line":"                    \u0027completion.\u0027)"},{"line_number":4294,"context_line":"            LOG.exception(msg)"},{"line_number":4295,"context_line":"            service.disabled \u003d True"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a3905b3_96d27233","line":4292,"range":{"start_line":4292,"start_character":18,"end_line":4292,"end_character":19},"updated":"2017-01-19 02:45:18.000000000","message":"Should be _LE here.  Using _LE will translate properly for LOG.exception as well as for the disabled_reason.","commit_id":"026189663f9b7c79b8135354f7db1283d611cdfa"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"5361cb1fa4367cb083f26c2d47657b686cd2fe31","unresolved":false,"context_lines":[{"line_number":4289,"context_line":"        try:"},{"line_number":4290,"context_line":"            self.driver.failover_completed(context, service.active_backend_id)"},{"line_number":4291,"context_line":"        except Exception:"},{"line_number":4292,"context_line":"            msg \u003d _(\u0027Driver reported error during replication failover \u0027"},{"line_number":4293,"context_line":"                    \u0027completion.\u0027)"},{"line_number":4294,"context_line":"            LOG.exception(msg)"},{"line_number":4295,"context_line":"            service.disabled \u003d True"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a3905b3_1bb4ddf0","line":4292,"range":{"start_line":4292,"start_character":18,"end_line":4292,"end_character":19},"in_reply_to":"5a3905b3_96d27233","updated":"2017-01-19 09:33:11.000000000","message":"It should not be _LE, it should be _ since its the preferred marker \"for any user facing message, even if it is also going to a log file\" as stated in the i18n guidelines.","commit_id":"026189663f9b7c79b8135354f7db1283d611cdfa"}],"cinder/volume/rpcapi.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"64141b4e91ba1a70a3e76f9cc07cc2a8ee54f883","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        cctxt \u003d self._get_cctxt(service.service_topic_queue, version)"},{"line_number":318,"context_line":"        cctxt.cast(ctxt, method, secondary_backend_id\u003dsecondary_backend_id)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    def failover_completed(self, ctxt, service, updates):"},{"line_number":321,"context_line":"        \"\"\"Complete failover on all services of the cluster.\"\"\""},{"line_number":322,"context_line":"        cctxt \u003d self._get_cctxt(service.service_topic_queue, \u00273.7\u0027,"},{"line_number":323,"context_line":"                                fanout\u003dTrue)"},{"line_number":324,"context_line":"        cctxt.cast(ctxt, \u0027failover_completed\u0027, updates\u003dupdates)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    def manage_existing_snapshot(self, ctxt, snapshot, ref, backend):"},{"line_number":327,"context_line":"        cctxt \u003d self._get_cctxt(backend)"}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_02e8d40f","line":324,"range":{"start_line":320,"start_character":0,"end_line":324,"end_character":63},"updated":"2016-12-22 14:35:56.000000000","message":"You\u0027re sending this unconditionally is due to the fact that failover will be blocked during upgrade, right?","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"865d78fa6afd4eb88a101f0b92342fb1cb4bdb8e","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        cctxt \u003d self._get_cctxt(service.service_topic_queue, version)"},{"line_number":318,"context_line":"        cctxt.cast(ctxt, method, secondary_backend_id\u003dsecondary_backend_id)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    def failover_completed(self, ctxt, service, updates):"},{"line_number":321,"context_line":"        \"\"\"Complete failover on all services of the cluster.\"\"\""},{"line_number":322,"context_line":"        cctxt \u003d self._get_cctxt(service.service_topic_queue, \u00273.7\u0027,"},{"line_number":323,"context_line":"                                fanout\u003dTrue)"},{"line_number":324,"context_line":"        cctxt.cast(ctxt, \u0027failover_completed\u0027, updates\u003dupdates)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    def manage_existing_snapshot(self, ctxt, snapshot, ref, backend):"},{"line_number":327,"context_line":"        cctxt \u003d self._get_cctxt(backend)"}],"source_content_type":"text/x-python","patch_set":39,"id":"da4df55a_57a3574f","line":324,"range":{"start_line":320,"start_character":0,"end_line":324,"end_character":63},"in_reply_to":"da4df55a_02e8d40f","updated":"2016-12-23 11:54:42.000000000","message":"There are multiple reasons, the most important one is the one you say, but we also have the fact that this is only called on clustered replicated deployments with drivers that support it, and we have none of those so the service won\u0027t start with that configuration, and we have release notes saying that for the time being nobody should be using A/A until we say so.","commit_id":"9a6124d16c7e03ee93bed7283b22c733f7eab3c2"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"830ede1070c7f0d1a65d156ae53490e38cb65683","unresolved":false,"context_lines":[{"line_number":122,"context_line":"               of @backend suffixes in server names."},{"line_number":123,"context_line":"        3.7  - Adds do_cleanup method to do volume cleanups from other nodes"},{"line_number":124,"context_line":"               that we were doing in init_host."},{"line_number":125,"context_line":"        3.7  - Make failover_host cluster aware and add failover_completed."},{"line_number":126,"context_line":"    \"\"\""},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    RPC_API_VERSION \u003d \u00273.7\u0027"}],"source_content_type":"text/x-python","patch_set":44,"id":"7a3c09a3_a478b290","line":125,"range":{"start_line":125,"start_character":8,"end_line":125,"end_character":11},"updated":"2017-01-16 11:26:13.000000000","message":"This should be 3.8.","commit_id":"cd408fef8f58044056003079ce923ee178042e3d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"2851c8003267e9946dc5cfbf2bfeeefc6303c1ee","unresolved":false,"context_lines":[{"line_number":122,"context_line":"               of @backend suffixes in server names."},{"line_number":123,"context_line":"        3.7  - Adds do_cleanup method to do volume cleanups from other nodes"},{"line_number":124,"context_line":"               that we were doing in init_host."},{"line_number":125,"context_line":"        3.7  - Make failover_host cluster aware and add failover_completed."},{"line_number":126,"context_line":"    \"\"\""},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    RPC_API_VERSION \u003d \u00273.7\u0027"}],"source_content_type":"text/x-python","patch_set":44,"id":"7a3c09a3_c703fd40","line":125,"range":{"start_line":125,"start_character":8,"end_line":125,"end_character":11},"in_reply_to":"7a3c09a3_a478b290","updated":"2017-01-16 13:15:05.000000000","message":"Done","commit_id":"cd408fef8f58044056003079ce923ee178042e3d"}]}
