)]}'
{"dragonflow/db/drivers/redis_calckey.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"6d61fd8f00f291247fca7a89dcae1423583ff741","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    This also works for binary keys that is used in python 3."},{"line_number":23,"context_line":"    \"\"\""},{"line_number":24,"context_line":"    k \u003d unicode(key)"},{"line_number":25,"context_line":"    start \u003d k.find(\"{\")"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    if start \u003e -1:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_3c498dd1","line":24,"updated":"2016-03-06 09:00:47.000000000","message":"It looks like you calculate the slot number only on \u0027key\u0027 in \u0027{key}\u0027, but use the whole \u0027{key}\u0027 as key. Is this intentional?","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":20298,"name":"feipeng","email":"feipeng1@huawei.com","username":"feipeng"},"change_message_id":"e37154035bfea3564bb06bff7d79cb8b385950a8","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    This also works for binary keys that is used in python 3."},{"line_number":23,"context_line":"    \"\"\""},{"line_number":24,"context_line":"    k \u003d unicode(key)"},{"line_number":25,"context_line":"    start \u003d k.find(\"{\")"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    if start \u003e -1:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_c95ff770","line":24,"in_reply_to":"7af24918_3c498dd1","updated":"2016-03-08 01:25:32.000000000","message":"Yes, according to Redis ,it is a HASHTAG, if it did not contain \u0027{\u0027 then it will calculate the whole string.","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"}],"dragonflow/db/drivers/redis_db_driver.py":[{"author":{"_account_id":20188,"name":"zhuweiqiong","email":"zhuweiqiong@huawei.com","username":"zhuweiqiong"},"change_message_id":"2c28ec8c7da697c413af0e17a6010ce9260e4623","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            try:"},{"line_number":112,"context_line":"                for key in self.clients:"},{"line_number":113,"context_line":"                    local_keys \u003d self.clients[key].keys(local_key)"},{"line_number":114,"context_line":"                    for tmp_key in local_keys:"},{"line_number":115,"context_line":"                        res.append(self.clients[key].get(tmp_key))"},{"line_number":116,"context_line":"                return res"},{"line_number":117,"context_line":"            except Exception as e:"},{"line_number":118,"context_line":"                LOG.error(_LE(\"exception %(key)s: %(e)s\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_ffc76d61","line":115,"range":{"start_line":114,"start_character":0,"end_line":115,"end_character":66},"updated":"2016-03-01 09:05:05.000000000","message":"Try to use pipeline to group these commands into one request to improve the speed.","commit_id":"fea8d77cea975b4438d02a84d3e96f5eec6d478f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        RedisDbDriver.redis_mgt.get_cluster_topology()"},{"line_number":35,"context_line":"        self.remote_server_lists \u003d RedisDbDriver.redis_mgt.get_master_list()"},{"line_number":36,"context_line":"        for remote in self.remote_server_lists:"},{"line_number":37,"context_line":"            ip_port \u003d remote[\u0027ip_port\u0027].split(\u0027:\u0027)"},{"line_number":38,"context_line":"            self.clients[remote[\u0027ip_port\u0027]] \u003d \\"},{"line_number":39,"context_line":"                redis.client.StrictRedis(host\u003dip_port[0], port\u003dip_port[1])"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_70fe7839","line":37,"range":{"start_line":37,"start_character":22,"end_line":37,"end_character":39},"updated":"2016-03-02 09:17:48.000000000","message":"Consider extracting to a local variable.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        if topic is None:"},{"line_number":46,"context_line":"            local_key \u003d self.uuid_to_key(table, key, \u0027*\u0027)"},{"line_number":47,"context_line":"            try:"},{"line_number":48,"context_line":"                for key in self.clients:"},{"line_number":49,"context_line":"                    local_keys \u003d self.clients[key].keys(local_key)"},{"line_number":50,"context_line":"                    for tmp_key in local_keys:"},{"line_number":51,"context_line":"                        return self.clients[key].get(tmp_key)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_f0bf285e","line":48,"updated":"2016-03-02 09:17:48.000000000","message":"key is only used to get self.clients values. Consider using the loop:\nfor client in self.clients.itervalues():\n    ...\n\nThis will also correct the fact that you\u0027re shadowing the argument \u0027key\u0027.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                    local_keys \u003d self.clients[key].keys(local_key)"},{"line_number":50,"context_line":"                    for tmp_key in local_keys:"},{"line_number":51,"context_line":"                        return self.clients[key].get(tmp_key)"},{"line_number":52,"context_line":"                return None"},{"line_number":53,"context_line":"            except Exception as e:"},{"line_number":54,"context_line":"                LOG.error(_LE(\"exception %(key)s: %(e)s\")"},{"line_number":55,"context_line":"                          % {\u0027key\u0027: local_key, \u0027e\u0027: e})"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_abf8914a","line":52,"updated":"2016-03-02 09:17:48.000000000","message":"I am not sure I understand the code here. You search each client, until you find one that contain keys matching local_key (which has a wildcard), and then return the first matching key?\n\nIf that\u0027s the case, it is very difficult to understand from the code. It may be clearer not to iterate over local_keys, but to test its length, and then return the value of the first key, e.g.:\nlocal_keys \u003d client.keys(local_key)\nif len(local_keys) \u003e 0:\n    return client.get(local_keys[0])\n\nThis way, the intent of you\u0027re code is clearer. You could also verify that local_key is unique, by len(local_keys) \u003d\u003d 1.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                        return self.clients[key].get(tmp_key)"},{"line_number":52,"context_line":"                return None"},{"line_number":53,"context_line":"            except Exception as e:"},{"line_number":54,"context_line":"                LOG.error(_LE(\"exception %(key)s: %(e)s\")"},{"line_number":55,"context_line":"                          % {\u0027key\u0027: local_key, \u0027e\u0027: e})"},{"line_number":56,"context_line":"                raise df_exceptions.DBKeyNotFound(key\u003dlocal_key)"},{"line_number":57,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_0b838557","line":54,"updated":"2016-03-02 09:17:48.000000000","message":"Consider using LOG.exception to display exceptions.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                client.delete(local_key)"},{"line_number":75,"context_line":"            return res"},{"line_number":76,"context_line":"        except Exception as e:"},{"line_number":77,"context_line":"            LOG.error(_LE(\"exception %(key)s: %(e)s\")"},{"line_number":78,"context_line":"                      % {\u0027key\u0027: local_key, \u0027e\u0027: e})"},{"line_number":79,"context_line":"            raise df_exceptions.DBKeyNotFound(key\u003dlocal_key)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_8b5f9540","line":77,"updated":"2016-03-02 09:17:48.000000000","message":"Consider logging exceptions with LOG.exception.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                      % {\u0027key\u0027: local_key, \u0027e\u0027: e})"},{"line_number":79,"context_line":"            raise df_exceptions.DBKeyNotFound(key\u003dlocal_key)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def create_key(self, table, key, value, topic\u003dNone):"},{"line_number":82,"context_line":"        local_key \u003d self.uuid_to_key(table, key, topic)"},{"line_number":83,"context_line":"        try:"},{"line_number":84,"context_line":"            client \u003d self._get_client(local_key)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_4b3c6de2","line":81,"updated":"2016-03-02 09:17:48.000000000","message":"This method is identical to set_key. Consider calling one from the other.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        local_key \u003d self.uuid_to_key(table, key, local_topic)"},{"line_number":97,"context_line":"        try:"},{"line_number":98,"context_line":"            client \u003d self._get_client(local_key)"},{"line_number":99,"context_line":"            # return 0 if not found"},{"line_number":100,"context_line":"            return client.delete(local_key)"},{"line_number":101,"context_line":"        except Exception as e:"},{"line_number":102,"context_line":"            LOG.error(_LE(\"exception %(key)s: %(e)s\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_8b0dd540","line":99,"updated":"2016-03-02 09:17:48.000000000","message":"Consider removing this comment. If this information is important, consider adding as docstring.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    def get_all_entries(self, table, topic\u003dNone):"},{"line_number":107,"context_line":"        res \u003d []"},{"line_number":108,"context_line":"        if topic is None:"},{"line_number":109,"context_line":"            local_topic \u003d \u0027*\u0027"},{"line_number":110,"context_line":"            local_key \u003d self.uuid_to_key(table, \u0027*\u0027, local_topic)"},{"line_number":111,"context_line":"            try:"},{"line_number":112,"context_line":"                for key in self.clients:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_3d0de837","line":109,"updated":"2016-03-02 09:17:48.000000000","message":"Local parameter used only once. Consider using value directly.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            try:"},{"line_number":112,"context_line":"                for key in self.clients:"},{"line_number":113,"context_line":"                    local_keys \u003d self.clients[key].keys(local_key)"},{"line_number":114,"context_line":"                    for tmp_key in local_keys:"},{"line_number":115,"context_line":"                        res.append(self.clients[key].get(tmp_key))"},{"line_number":116,"context_line":"                return res"},{"line_number":117,"context_line":"            except Exception as e:"},{"line_number":118,"context_line":"                LOG.error(_LE(\"exception %(key)s: %(e)s\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_bde3b832","line":115,"range":{"start_line":114,"start_character":0,"end_line":115,"end_character":66},"updated":"2016-03-02 09:17:48.000000000","message":"Consider using res.extend(client.mget(local_keys)).","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                        res.append(self.clients[key].get(tmp_key))"},{"line_number":116,"context_line":"                return res"},{"line_number":117,"context_line":"            except Exception as e:"},{"line_number":118,"context_line":"                LOG.error(_LE(\"exception %(key)s: %(e)s\")"},{"line_number":119,"context_line":"                          % {\u0027key\u0027: local_key, \u0027e\u0027: e})"},{"line_number":120,"context_line":"                raise df_exceptions.DBKeyNotFound(key\u003dlocal_key)"},{"line_number":121,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_bdba9808","line":118,"updated":"2016-03-02 09:17:48.000000000","message":"See above re: logging exceptions.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        else:"},{"line_number":122,"context_line":"            local_key \u003d self.uuid_to_key(table, \u0027*\u0027, topic)"},{"line_number":123,"context_line":"            try:"},{"line_number":124,"context_line":"                client \u003d self._get_client(local_key)"},{"line_number":125,"context_line":"                local_keys \u003d client.keys(local_key)"},{"line_number":126,"context_line":"                for tmp_key in local_keys:"},{"line_number":127,"context_line":"                    res.append(client.get(tmp_key))"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_9dfa3cbc","line":124,"updated":"2016-03-02 09:17:48.000000000","message":"Don\u0027t you need to iterate all clients here as well?\nIf so, consider unifying with code above, as it is very similar.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                    res.append(client.get(tmp_key))"},{"line_number":128,"context_line":"                return res"},{"line_number":129,"context_line":"            except Exception as e:"},{"line_number":130,"context_line":"                LOG.error(_LE(\"exception %(key)s: %(e)s\")"},{"line_number":131,"context_line":"                          % {\u0027key\u0027: local_key, \u0027e\u0027: e})"},{"line_number":132,"context_line":"                raise df_exceptions.DBKeyNotFound(key\u003dlocal_key)"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_1dbbcce6","line":130,"updated":"2016-03-02 09:17:48.000000000","message":"See above re: logging exceptions","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                raise df_exceptions.DBKeyNotFound(key\u003dlocal_key)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def get_all_keys(self, table, topic\u003dNone):"},{"line_number":135,"context_line":"        local_topic \u003d topic"},{"line_number":136,"context_line":"        local_key \u003d self.uuid_to_key(table, \u0027*\u0027, local_topic)"},{"line_number":137,"context_line":"        try:"},{"line_number":138,"context_line":"            client \u003d self._get_client(local_key)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_9d7d1c1f","line":135,"updated":"2016-03-02 09:17:48.000000000","message":"If topic is None, shouldn\u0027t local_topic be \u0027*\u0027?","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        local_topic \u003d topic"},{"line_number":136,"context_line":"        local_key \u003d self.uuid_to_key(table, \u0027*\u0027, local_topic)"},{"line_number":137,"context_line":"        try:"},{"line_number":138,"context_line":"            client \u003d self._get_client(local_key)"},{"line_number":139,"context_line":"            return client.keys(local_key)"},{"line_number":140,"context_line":"        except Exception as e:"},{"line_number":141,"context_line":"            LOG.error(_LE(\"exception %(key)s: %(e)s\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_9da4fca6","line":138,"updated":"2016-03-02 09:17:48.000000000","message":"Don\u0027t you need to iterate all clients like in get_all_entries?","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            client \u003d self._get_client(local_key)"},{"line_number":139,"context_line":"            return client.keys(local_key)"},{"line_number":140,"context_line":"        except Exception as e:"},{"line_number":141,"context_line":"            LOG.error(_LE(\"exception %(key)s: %(e)s\")"},{"line_number":142,"context_line":"                      % {\u0027key\u0027: local_key, \u0027e\u0027: e})"},{"line_number":143,"context_line":"        raise df_exceptions.DBKeyNotFound(key\u003dlocal_key)"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_fda420ba","line":141,"updated":"2016-03-02 09:17:48.000000000","message":"See above re: logging exceptions","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        prev_value \u003d 0"},{"line_number":148,"context_line":"        client \u003d None"},{"line_number":149,"context_line":"        try:"},{"line_number":150,"context_line":"            client \u003d self._get_client(local_key)"},{"line_number":151,"context_line":"            prev_value \u003d int(client.get(local_key))"},{"line_number":152,"context_line":"            client.set(local_key, str(prev_value + 1))"},{"line_number":153,"context_line":"            return prev_value + 1"},{"line_number":154,"context_line":"        except Exception as e:"},{"line_number":155,"context_line":"            if (prev_value \u003d\u003d 0) and (client is not None):"},{"line_number":156,"context_line":"                client.set(local_key, \"1\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_5d45546e","line":153,"range":{"start_line":150,"start_character":0,"end_line":153,"end_character":33},"updated":"2016-03-02 09:17:48.000000000","message":"I suspect there may be a possible race condition here. If two drivers run this code at the same time on the same client, then both my get the same value.\n\nConsider using client.incr(local_key).","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            raise e"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def allocate_unique_key(self):"},{"line_number":161,"context_line":"        while True:"},{"line_number":162,"context_line":"            try:"},{"line_number":163,"context_line":"                return self._allocate_unique_key()"},{"line_number":164,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_bd2bb893","line":161,"updated":"2016-03-02 09:17:48.000000000","message":"Why use a loop here? It will always run exactly once.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    def register_notification_callback(self, callback, topics\u003dNone):"},{"line_number":170,"context_line":"        pass"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def uuid_to_key(self, table, key, topic):"},{"line_number":173,"context_line":"        if topic is None:"},{"line_number":174,"context_line":"            local_key \u003d (\u0027{\u0027 + table + \u0027.\u0027 + \u0027}\u0027 + \u0027.\u0027 + key)"},{"line_number":175,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_bd029809","line":172,"updated":"2016-03-02 09:17:48.000000000","message":"Is this method public or private? If private, consider renaming to _uuid_to_key.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":179,"context_line":"    def check_connection(self, ip_port):"},{"line_number":180,"context_line":"        try:"},{"line_number":181,"context_line":"            if self.clients[ip_port] is None:"},{"line_number":182,"context_line":"                raise redis.exceptions.ConnectionError"},{"line_number":183,"context_line":"            self.clients[ip_port].get(None)"},{"line_number":184,"context_line":"        except (redis.exceptions.ConnectionError,"},{"line_number":185,"context_line":"                redis.exceptions.BusyLoadingError):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_606fc3c5","line":182,"updated":"2016-03-02 09:17:48.000000000","message":"Consider returning False here rather than raising an exception, only to catch it immediately and then return False.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def _get_client(self, key):"},{"line_number":190,"context_line":"        ip_port \u003d RedisDbDriver.redis_mgt.get_ip_by_key(key)"},{"line_number":191,"context_line":"        if ip_port in self.clients:"},{"line_number":192,"context_line":"            return self.clients[ip_port]"},{"line_number":193,"context_line":"        else:"},{"line_number":194,"context_line":"            raise Exception(\u0027get client failed ip_port \u003d %(ip_port)s\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_eb29f98a","line":191,"updated":"2016-03-02 09:17:48.000000000","message":"Consider changing test to client \u003d self.clients.get(ip_port, None), and then verifying client is not None.\n\nThis way, ip_port is searched in self.clients only once.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        if ip_port in self.clients:"},{"line_number":192,"context_line":"            return self.clients[ip_port]"},{"line_number":193,"context_line":"        else:"},{"line_number":194,"context_line":"            raise Exception(\u0027get client failed ip_port \u003d %(ip_port)s\u0027)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def register_topic_for_notification(self, topic):"},{"line_number":197,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_f0660828","line":194,"updated":"2016-03-02 09:17:48.000000000","message":"Do not use general python exceptions. Create a custom exception.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"597a44d4a414b9062b4cedd59d5dc415d52eb964","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class RedisDbDriver(db_api.DbApi):"},{"line_number":24,"context_line":"    redis_mgt \u003d RedisMgt()"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self):"},{"line_number":27,"context_line":"        super(RedisDbDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_9cb8a1e7","line":24,"updated":"2016-03-06 08:32:45.000000000","message":"Why is this member static?","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":20298,"name":"feipeng","email":"feipeng1@huawei.com","username":"feipeng"},"change_message_id":"e37154035bfea3564bb06bff7d79cb8b385950a8","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class RedisDbDriver(db_api.DbApi):"},{"line_number":24,"context_line":"    redis_mgt \u003d RedisMgt()"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self):"},{"line_number":27,"context_line":"        super(RedisDbDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_3c86c8b9","line":24,"in_reply_to":"7af24918_9cb8a1e7","updated":"2016-03-08 01:25:32.000000000","message":"Done","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"6d61fd8f00f291247fca7a89dcae1423583ff741","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            local_key \u003d self.uuid_to_key(table, key, \u0027*\u0027)"},{"line_number":48,"context_line":"            try:"},{"line_number":49,"context_line":"                for client in self.clients.itervalues():"},{"line_number":50,"context_line":"                    local_keys \u003d client.keys(local_key)"},{"line_number":51,"context_line":"                    if len(local_keys) \u003d\u003d 1:"},{"line_number":52,"context_line":"                        return client.get(local_keys[0])"},{"line_number":53,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_3cf22d9b","line":50,"updated":"2016-03-06 09:00:47.000000000","message":"Consider using scan and not keys. keys locks the database, which may cause delays. See http://redis.io/commands/keys.","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":20298,"name":"feipeng","email":"feipeng1@huawei.com","username":"feipeng"},"change_message_id":"e37154035bfea3564bb06bff7d79cb8b385950a8","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            local_key \u003d self.uuid_to_key(table, key, \u0027*\u0027)"},{"line_number":48,"context_line":"            try:"},{"line_number":49,"context_line":"                for client in self.clients.itervalues():"},{"line_number":50,"context_line":"                    local_keys \u003d client.keys(local_key)"},{"line_number":51,"context_line":"                    if len(local_keys) \u003d\u003d 1:"},{"line_number":52,"context_line":"                        return client.get(local_keys[0])"},{"line_number":53,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_bf03ea0c","line":50,"in_reply_to":"7af24918_3cf22d9b","updated":"2016-03-08 01:25:32.000000000","message":"considering mutual exclusion，and not so much data we need store in redis db，I think may keep it","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"597a44d4a414b9062b4cedd59d5dc415d52eb964","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                    local_keys \u003d client.keys(local_key)"},{"line_number":51,"context_line":"                    if len(local_keys) \u003d\u003d 1:"},{"line_number":52,"context_line":"                        return client.get(local_keys[0])"},{"line_number":53,"context_line":"            except Exception as e:"},{"line_number":54,"context_line":"                LOG.exception(_LE(\"exception %(key)s: %(e)s\")"},{"line_number":55,"context_line":"                              % {\u0027key\u0027: local_key, \u0027e\u0027: e})"},{"line_number":56,"context_line":"                raise df_exceptions.DBKeyNotFound(key\u003dlocal_key)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_3cf18dce","line":53,"updated":"2016-03-06 08:32:45.000000000","message":"Consider treading MOVED and ASK errors - the slot-\u003eclient mapping would have to be updated.","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":20298,"name":"feipeng","email":"feipeng1@huawei.com","username":"feipeng"},"change_message_id":"e37154035bfea3564bb06bff7d79cb8b385950a8","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                    local_keys \u003d client.keys(local_key)"},{"line_number":51,"context_line":"                    if len(local_keys) \u003d\u003d 1:"},{"line_number":52,"context_line":"                        return client.get(local_keys[0])"},{"line_number":53,"context_line":"            except Exception as e:"},{"line_number":54,"context_line":"                LOG.exception(_LE(\"exception %(key)s: %(e)s\")"},{"line_number":55,"context_line":"                              % {\u0027key\u0027: local_key, \u0027e\u0027: e})"},{"line_number":56,"context_line":"                raise df_exceptions.DBKeyNotFound(key\u003dlocal_key)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_ff2452b0","line":53,"in_reply_to":"7af24918_3cf18dce","updated":"2016-03-08 01:25:32.000000000","message":"it will done in next phase for redis ha","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"597a44d4a414b9062b4cedd59d5dc415d52eb964","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            if not res:"},{"line_number":74,"context_line":"                client.delete(local_key)"},{"line_number":75,"context_line":"            return res"},{"line_number":76,"context_line":"        except Exception as e:"},{"line_number":77,"context_line":"            LOG.exception(_LE(\"exception %(key)s: %(e)s\")"},{"line_number":78,"context_line":"                          % {\u0027key\u0027: local_key, \u0027e\u0027: e})"},{"line_number":79,"context_line":"            raise df_exceptions.DBKeyNotFound(key\u003dlocal_key)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_dce34904","line":76,"updated":"2016-03-06 08:32:45.000000000","message":"Consider treading MOVED and ASK errors - the slot-\u003eclient mapping would have to be updated.","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":20298,"name":"feipeng","email":"feipeng1@huawei.com","username":"feipeng"},"change_message_id":"e37154035bfea3564bb06bff7d79cb8b385950a8","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            if not res:"},{"line_number":74,"context_line":"                client.delete(local_key)"},{"line_number":75,"context_line":"            return res"},{"line_number":76,"context_line":"        except Exception as e:"},{"line_number":77,"context_line":"            LOG.exception(_LE(\"exception %(key)s: %(e)s\")"},{"line_number":78,"context_line":"                          % {\u0027key\u0027: local_key, \u0027e\u0027: e})"},{"line_number":79,"context_line":"            raise df_exceptions.DBKeyNotFound(key\u003dlocal_key)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_df4cf678","line":76,"in_reply_to":"7af24918_dce34904","updated":"2016-03-08 01:25:32.000000000","message":"it will done in next phase for redis ha","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"597a44d4a414b9062b4cedd59d5dc415d52eb964","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        local_key \u003d self.uuid_to_key(table, key, local_topic)"},{"line_number":87,"context_line":"        try:"},{"line_number":88,"context_line":"            client \u003d self._get_client(local_key)"},{"line_number":89,"context_line":"            return client.delete(local_key)"},{"line_number":90,"context_line":"        except Exception as e:"},{"line_number":91,"context_line":"            LOG.exception(_LE(\"exception %(key)s: %(e)s\")"},{"line_number":92,"context_line":"                          % {\u0027key\u0027: local_key, \u0027e\u0027: e})"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_1cee51ec","line":89,"updated":"2016-03-06 08:32:45.000000000","message":"Consider treading MOVED and ASK errors - the slot-\u003eclient mapping would have to be updated.","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":20298,"name":"feipeng","email":"feipeng1@huawei.com","username":"feipeng"},"change_message_id":"e37154035bfea3564bb06bff7d79cb8b385950a8","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        local_key \u003d self.uuid_to_key(table, key, local_topic)"},{"line_number":87,"context_line":"        try:"},{"line_number":88,"context_line":"            client \u003d self._get_client(local_key)"},{"line_number":89,"context_line":"            return client.delete(local_key)"},{"line_number":90,"context_line":"        except Exception as e:"},{"line_number":91,"context_line":"            LOG.exception(_LE(\"exception %(key)s: %(e)s\")"},{"line_number":92,"context_line":"                          % {\u0027key\u0027: local_key, \u0027e\u0027: e})"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_9f4b8e59","line":89,"in_reply_to":"7af24918_1cee51ec","updated":"2016-03-08 01:25:32.000000000","message":"it will done in next phase for redis ha","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"88946fbd051297e2727f15945adb2d81bdbe20f6","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.redismgt \u003d RedisMgt.get_instance(db_ip, db_port)"},{"line_number":35,"context_line":"        self.remote_server_lists \u003d self.redis_mgt.get_master_list()"},{"line_number":36,"context_line":"        for remote in self.remote_server_lists:"},{"line_number":37,"context_line":"            remote_local \u003d remote[\u0027ip_port\u0027]"},{"line_number":38,"context_line":"            ip_port \u003d remote_local.split(\u0027:\u0027)"},{"line_number":39,"context_line":"            self.clients[remote_local] \u003d \\"},{"line_number":40,"context_line":"                redis.client.StrictRedis(host\u003dip_port[0], port\u003dip_port[1])"}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_86f86b4b","line":37,"range":{"start_line":37,"start_character":12,"end_line":37,"end_character":24},"updated":"2016-03-11 10:02:57.000000000","message":"The name is not clear in meaning. Think about a better one.","commit_id":"789c2a0836830ffdb74725ea207600567aaaa2c7"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"88946fbd051297e2727f15945adb2d81bdbe20f6","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                raise df_exceptions.DBKeyNotFound(key\u003dlocal_key)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def set_key(self, table, key, value, topic\u003dNone):"},{"line_number":69,"context_line":"        local_key \u003d self.uuid_to_key(table, key, topic)"},{"line_number":70,"context_line":"        try:"},{"line_number":71,"context_line":"            client \u003d self._get_client(local_key)"},{"line_number":72,"context_line":"            res \u003d client.set(local_key, value)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_6939b0d8","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":17},"updated":"2016-03-11 10:02:57.000000000","message":"if the topic is none, raise a exception here.","commit_id":"789c2a0836830ffdb74725ea207600567aaaa2c7"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"88946fbd051297e2727f15945adb2d81bdbe20f6","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                client \u003d self._get_client(local_key)"},{"line_number":113,"context_line":"                local_keys \u003d client.keys(local_key)"},{"line_number":114,"context_line":"                for tmp_key in local_keys:"},{"line_number":115,"context_line":"                    res.append(client.get(tmp_key))"},{"line_number":116,"context_line":"                return res"},{"line_number":117,"context_line":"            except Exception as e:"},{"line_number":118,"context_line":"                LOG.exception(_LE(\"exception %(key)s: %(e)s\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_69e6d017","line":115,"range":{"start_line":115,"start_character":38,"end_line":115,"end_character":41},"updated":"2016-03-11 10:02:57.000000000","message":"please use mget instead.","commit_id":"789c2a0836830ffdb74725ea207600567aaaa2c7"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"88946fbd051297e2727f15945adb2d81bdbe20f6","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        except Exception as e:"},{"line_number":150,"context_line":"            raise e"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def allocate_unique_key(self):"},{"line_number":153,"context_line":"        try:"},{"line_number":154,"context_line":"            return self._allocate_unique_key()"},{"line_number":155,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_c9a444bb","line":152,"range":{"start_line":152,"start_character":8,"end_line":152,"end_character":27},"updated":"2016-03-11 10:02:57.000000000","message":"why define two similar functions?","commit_id":"789c2a0836830ffdb74725ea207600567aaaa2c7"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"eaefdcc412d30eebd5878f404dbd03becb1b0535","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class RedisDbDriver(db_api.DbApi):"},{"line_number":24,"context_line":"    redis_mgt \u003d RedisMgt()"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self):"},{"line_number":27,"context_line":"        super(RedisDbDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afc51ec_61219efb","line":24,"updated":"2016-03-13 07:22:18.000000000","message":"Consider removing this (unused) static variable.","commit_id":"547d3e46f2f780bf5fd03b94b4844b0e4acefa4e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"eaefdcc412d30eebd5878f404dbd03becb1b0535","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def initialize(self, db_ip, db_port, **args):"},{"line_number":33,"context_line":"        # get remote ip port list"},{"line_number":34,"context_line":"        self.redismgt \u003d RedisMgt.get_instance(db_ip, db_port)"},{"line_number":35,"context_line":"        self.remote_server_lists \u003d self.redis_mgt.get_master_list()"},{"line_number":36,"context_line":"        for remote in self.remote_server_lists:"},{"line_number":37,"context_line":"            remote_ip_port \u003d remote[\u0027ip_port\u0027]"},{"line_number":38,"context_line":"            ip_port \u003d remote_ip_port.split(\u0027:\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afc51ec_a179e6fe","line":35,"range":{"start_line":35,"start_character":40,"end_line":35,"end_character":49},"updated":"2016-03-13 07:22:18.000000000","message":"This member was renamed to redismgt. (This appears several times in this file)","commit_id":"547d3e46f2f780bf5fd03b94b4844b0e4acefa4e"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"130e691b5dce7fc10a60f24a2f96f5556845b4d0","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def uuid_to_key(self, table, key, topic):"},{"line_number":163,"context_line":"        if topic is None:"},{"line_number":164,"context_line":"            local_key \u003d (\u0027{\u0027 + table + \u0027.\u0027 + \u0027}\u0027 + \u0027.\u0027 + key)"},{"line_number":165,"context_line":"        else:"},{"line_number":166,"context_line":"            local_key \u003d (\u0027{\u0027 + table + \u0027.\u0027 + topic + \u0027}\u0027 + \u0027.\u0027 + key)"},{"line_number":167,"context_line":"        return local_key"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_47a51da0","line":164,"range":{"start_line":164,"start_character":39,"end_line":164,"end_character":42},"updated":"2016-03-18 04:24:20.000000000","message":"{table.}.key or {table}.key?","commit_id":"064f13e994f7d2bd4b1ed4e20ef0bc20035fb0c0"},{"author":{"_account_id":11364,"name":"Fei Rao","email":"milo.frao@gmail.com","username":"milo.frao"},"change_message_id":"c7170c070d41a7d434ef10fe8e6759a2d0eb3f28","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def get_key(self, table, key, topic\u003dNone):"},{"line_number":45,"context_line":"        if topic is None:"},{"line_number":46,"context_line":"            local_key \u003d self.uuid_to_key(table, key, \u0027*\u0027)"},{"line_number":47,"context_line":"            try:"},{"line_number":48,"context_line":"                for client in self.clients.itervalues():"},{"line_number":49,"context_line":"                    local_keys \u003d client.keys(local_key)"}],"source_content_type":"text/x-python","patch_set":36,"id":"da0c15f0_a60c8143","line":46,"range":{"start_line":46,"start_character":52,"end_line":46,"end_character":56},"updated":"2016-03-25 07:40:13.000000000","message":"the assigning topic is \u0027*\u0027, is it means wildcard?","commit_id":"73117bf7b0ea28359c4d104ab7326a06845fcec4"},{"author":{"_account_id":11364,"name":"Fei Rao","email":"milo.frao@gmail.com","username":"milo.frao"},"change_message_id":"c7170c070d41a7d434ef10fe8e6759a2d0eb3f28","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            local_key \u003d self.uuid_to_key(table, key, \u0027*\u0027)"},{"line_number":47,"context_line":"            try:"},{"line_number":48,"context_line":"                for client in self.clients.itervalues():"},{"line_number":49,"context_line":"                    local_keys \u003d client.keys(local_key)"},{"line_number":50,"context_line":"                    if len(local_keys) \u003d\u003d 1:"},{"line_number":51,"context_line":"                        return client.get(local_keys[0])"},{"line_number":52,"context_line":"            except Exception as e:"},{"line_number":53,"context_line":"                LOG.exception(_LE(\"exception %(key)s: %(e)s\")"}],"source_content_type":"text/x-python","patch_set":36,"id":"da0c15f0_294de272","line":50,"range":{"start_line":49,"start_character":20,"end_line":50,"end_character":44},"updated":"2016-03-25 07:40:13.000000000","message":"is it possible for client return multiple local_keys? why is only the first correct?","commit_id":"73117bf7b0ea28359c4d104ab7326a06845fcec4"},{"author":{"_account_id":20188,"name":"zhuweiqiong","email":"zhuweiqiong@huawei.com","username":"zhuweiqiong"},"change_message_id":"ed59a93710a305384ee9f0476113d8dee1df3d47","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                for client in self.clients.itervalues():"},{"line_number":100,"context_line":"                    local_keys \u003d client.keys(local_key)"},{"line_number":101,"context_line":"                    if len(local_keys) \u003e 0:"},{"line_number":102,"context_line":"                        res.extend(client.mget(local_keys))"},{"line_number":103,"context_line":"                return res"},{"line_number":104,"context_line":"            except Exception as e:"},{"line_number":105,"context_line":"                LOG.exception(_LE(\"exception %(key)s: %(e)s\")"}],"source_content_type":"text/x-python","patch_set":36,"id":"da0c15f0_5cac5bed","line":102,"range":{"start_line":102,"start_character":24,"end_line":102,"end_character":59},"updated":"2016-03-25 03:34:26.000000000","message":"If topic is none, this call will cause exception because \"mget\" command doesn\u0027t support different keys in hash tag in Redis.","commit_id":"73117bf7b0ea28359c4d104ab7326a06845fcec4"},{"author":{"_account_id":11364,"name":"Fei Rao","email":"milo.frao@gmail.com","username":"milo.frao"},"change_message_id":"c7170c070d41a7d434ef10fe8e6759a2d0eb3f28","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def uuid_to_key(self, table, key, topic):"},{"line_number":163,"context_line":"        if topic is None:"},{"line_number":164,"context_line":"            local_key \u003d (\u0027{\u0027 + table + \u0027.\u0027 + \u0027}\u0027 + \u0027.\u0027 + key)"},{"line_number":165,"context_line":"        else:"},{"line_number":166,"context_line":"            local_key \u003d (\u0027{\u0027 + table + \u0027.\u0027 + topic + \u0027}\u0027 + \u0027.\u0027 + key)"},{"line_number":167,"context_line":"        return local_key"}],"source_content_type":"text/x-python","patch_set":36,"id":"da0c15f0_a67761d3","line":164,"range":{"start_line":164,"start_character":38,"end_line":164,"end_character":42},"updated":"2016-03-25 07:40:13.000000000","message":"if no topic, is the dot necessary?","commit_id":"73117bf7b0ea28359c4d104ab7326a06845fcec4"}],"dragonflow/db/drivers/redis_mgt.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            RedisMgt.check_connection(self.default_node)"},{"line_number":47,"context_line":"        except Exception as e:"},{"line_number":48,"context_line":"            LOG.exception(_LE(\"exception happened \""},{"line_number":49,"context_line":"                              \"when connect to default node, %s\"), e)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_cluster_topology(self):"},{"line_number":52,"context_line":"        self.cluster_nodes \u003d self._get_cluster_nodes()"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_20d49b1e","line":49,"updated":"2016-03-02 09:17:48.000000000","message":"I think the exception is passed automatically.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            LOG.exception(_LE(\"exception happened \""},{"line_number":49,"context_line":"                              \"when connect to default node, %s\"), e)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_cluster_topology(self):"},{"line_number":52,"context_line":"        self.cluster_nodes \u003d self._get_cluster_nodes()"},{"line_number":53,"context_line":"        self.master_list \u003d self._parse_to_masterlist()"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_40b8c7e5","line":51,"updated":"2016-03-02 09:17:48.000000000","message":"This method doesn\u0027t actually return the topology. Consider renaming to read_cluster_topology or populate_cluster_topology.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        return ret"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _make_host(self, host, port):"},{"line_number":95,"context_line":"        return \u0027%s:%s\u0027 % (host, port)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def _key_to_slot(self, key):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_90cfc47e","line":94,"updated":"2016-03-02 09:17:48.000000000","message":"This private method appears unused.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        slot \u003d self._key_to_slot(key)"},{"line_number":102,"context_line":"        ip_port \u003d None"},{"line_number":103,"context_line":"        for node in self.master_list:"},{"line_number":104,"context_line":"            if node[\u0027slot\u0027][0] \u003c\u003d slot \u003c\u003d node[\u0027slot\u0027][1]:"},{"line_number":105,"context_line":"                ip_port \u003d node[\u0027ip_port\u0027]"},{"line_number":106,"context_line":"                break"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_80cdaf5f","line":104,"updated":"2016-03-02 09:17:48.000000000","message":"Is it possible that there is more than one slot/slot-range? Is it possible that the slots aren\u0027t contiguous? (i.e. there is a \u0027hole\u0027, and the slots are \u00271 10\u0027 and not \u00271-10\u0027)? Is it possible that there is exactly 1 slot (and node[\u0027slot\u0027][1] would cause an error)?\n\nConsider using intervaltree for more accurate search algorithm - https://pypi.python.org/pypi/intervaltree/","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            if \u0027master\u0027 \u003d\u003d info[\u0027role\u0027]:"},{"line_number":114,"context_line":"                tmp \u003d {"},{"line_number":115,"context_line":"                    \u0027ip_port\u0027: host,"},{"line_number":116,"context_line":"                    \u0027slot\u0027: map(int, info[\u0027slots\u0027][0])"},{"line_number":117,"context_line":"                }"},{"line_number":118,"context_line":"                master_list.append(tmp)"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_a0038b41","line":116,"updated":"2016-03-02 09:17:48.000000000","message":"info[\u0027slots\u0027][0] is a string, not a list. Did you mean map(int, info[\u0027slots\u0027])?","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    def get_master_nodes_num(self):"},{"line_number":126,"context_line":"        return len(self.master_list)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def pubsub_select_node(self):"},{"line_number":129,"context_line":"        num \u003d hash(self.random_str) % self.get_master_nodes_num()"},{"line_number":130,"context_line":"        ip_port \u003d self.master_list[num][\u0027ip_port\u0027]"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_139c5bbf","line":128,"updated":"2016-03-02 09:17:48.000000000","message":"This method will always return the same ip_port, until the service is taken down and brought up again.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"88946fbd051297e2727f15945adb2d81bdbe20f6","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                            ip_port \u003d node[\u0027ip_port\u0027]"},{"line_number":125,"context_line":"                            break"},{"line_number":126,"context_line":"                    else:"},{"line_number":127,"context_line":"                        if each[0] \u003c\u003d slot \u003c each[1]:"},{"line_number":128,"context_line":"                            ip_port \u003d node[\u0027ip_port\u0027]"},{"line_number":129,"context_line":"                            break"},{"line_number":130,"context_line":"                if ip_port is not None:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5aef4532_267b577d","line":127,"range":{"start_line":127,"start_character":43,"end_line":127,"end_character":44},"updated":"2016-03-11 10:02:57.000000000","message":"should be \u003c\u003d","commit_id":"789c2a0836830ffdb74725ea207600567aaaa2c7"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"eaefdcc412d30eebd5878f404dbd03becb1b0535","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @staticmethod"},{"line_number":38,"context_line":"    def get_instance(ip, port):"},{"line_number":39,"context_line":"        ip_port \u003d RedisMgt._make_host(ip, port)"},{"line_number":40,"context_line":"        if ip_port not in RedisMgt.redisMgt:"},{"line_number":41,"context_line":"            RedisMgt.redisMgt[ip_port] \u003d RedisMgt()"},{"line_number":42,"context_line":"            r \u003d RedisMgt.redisMgt[ip_port]"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afc51ec_216e762f","line":39,"updated":"2016-03-13 07:22:18.000000000","message":"In general, tuples can also be keysm e.g.:\nRedisMgt.redisMgr[(ip, port)] \u003d ..., and:\ninstance \u003d RedisMgt.redisMgr[(ip, port)].\n\nBut it can be left as is for now.","commit_id":"547d3e46f2f780bf5fd03b94b4844b0e4acefa4e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"eaefdcc412d30eebd5878f404dbd03becb1b0535","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        return len(self.master_list)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def caculate_pubsub_node_idx(self):"},{"line_number":158,"context_line":"        num \u003d hash(self.random_str) % self.get_master_nodes_num()"},{"line_number":159,"context_line":"        return self.master_list[num][\u0027ip_port\u0027]"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def pubsub_select_node_idx(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afc51ec_2155d64f","line":158,"updated":"2016-03-13 07:22:18.000000000","message":"Note, this method will return the same IP until the controller is restarted. Is this intentional?","commit_id":"547d3e46f2f780bf5fd03b94b4844b0e4acefa4e"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"130e691b5dce7fc10a60f24a2f96f5556845b4d0","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self.cluster_slots \u003d None"},{"line_number":32,"context_line":"        self.calc_key \u003d redis_calckey.key2slot"},{"line_number":33,"context_line":"        self.master_list \u003d []"},{"line_number":34,"context_line":"        self.random_str \u003d RedisMgt._gen_random_str()"},{"line_number":35,"context_line":"        self.pubsub_node_idx \u003d None"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_476fdd2a","line":34,"range":{"start_line":34,"start_character":13,"end_line":34,"end_character":23},"updated":"2016-03-18 04:24:20.000000000","message":"it seems a unique id for hashing. The variable name is not that easy to understand.\nSuggest to change it to \u0027db_instance_id\u0027 or something else.","commit_id":"064f13e994f7d2bd4b1ed4e20ef0bc20035fb0c0"}],"dragonflow/db/pubsub_drivers/redis_db_pubsub_driver.py":[{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"7852974262da4bfec5ff058e1f813cf20e1e0131","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                                               port\u003dip_port[1])"},{"line_number":61,"context_line":"        self.inproc_client \u003d None"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if self.config:"},{"line_number":64,"context_line":"            self.inproc_port \u003d self.config.publisher_port + 1"},{"line_number":65,"context_line":"        else:"},{"line_number":66,"context_line":"            self.inproc_port \u003d 8867"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def send_event(self, update, topic\u003dNone):"},{"line_number":69,"context_line":"        if self.is_daemonize:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_0b8049f6","line":66,"range":{"start_line":63,"start_character":8,"end_line":66,"end_character":35},"updated":"2016-02-29 15:00:56.000000000","message":"You do not need this for plugin that is not bind based like TCP","commit_id":"40f78e4a309d432a020bbcc1a4ee0785cde5c826"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"7852974262da4bfec5ff058e1f813cf20e1e0131","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def send_event(self, update, topic\u003dNone):"},{"line_number":69,"context_line":"        if self.is_daemonize:"},{"line_number":70,"context_line":"            if not self.inproc_client:"},{"line_number":71,"context_line":"                context \u003d zmq.Context()"},{"line_number":72,"context_line":"                self.inproc_client \u003d context.socket(zmq.PUSH)"},{"line_number":73,"context_line":"                self.inproc_client.connect(\u0027tcp://127.0.0.1:%d\u0027"},{"line_number":74,"context_line":"                                           % self.inproc_port)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"            if topic:"},{"line_number":77,"context_line":"                update.topic \u003d topic"},{"line_number":78,"context_line":"            event_json \u003d jsonutils.dumps(update.to_array())"},{"line_number":79,"context_line":"            self.inproc_client.send(event_json)"},{"line_number":80,"context_line":"            eventlet.sleep(0)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def run(self):"},{"line_number":83,"context_line":"        context \u003d zmq.Context()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_0bdb2950","line":80,"range":{"start_line":70,"start_character":11,"end_line":80,"end_character":29},"updated":"2016-02-29 15:00:56.000000000","message":"If redis is connect base and not bind \n\nYou do not need the inetr process mechanism Just add it to a local the queue","commit_id":"40f78e4a309d432a020bbcc1a4ee0785cde5c826"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"7852974262da4bfec5ff058e1f813cf20e1e0131","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        inproc_server.bind(\u0027tcp://127.0.0.1:%d\u0027 % self.inproc_port)"},{"line_number":86,"context_line":"        eventlet.sleep(0.2)"},{"line_number":87,"context_line":"        while True:"},{"line_number":88,"context_line":"            event \u003d inproc_server.recv()"},{"line_number":89,"context_line":"            event_json \u003d jsonutils.loads(event)"},{"line_number":90,"context_line":"            topic \u003d event_json[\u0027topic\u0027]"},{"line_number":91,"context_line":"            self.client.publish(topic, event_json)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_8bc61966","line":88,"range":{"start_line":88,"start_character":11,"end_line":88,"end_character":40},"updated":"2016-02-29 15:00:56.000000000","message":"Same if as we discussed redis is connect base use get from The queue","commit_id":"40f78e4a309d432a020bbcc1a4ee0785cde5c826"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"7852974262da4bfec5ff058e1f813cf20e1e0131","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        self.remote \u003d []"},{"line_number":101,"context_line":"        self.client \u003d None"},{"line_number":102,"context_line":"        self.ip \u003d \"\""},{"line_number":103,"context_line":"        self.plugin_updates_port \u003d \"\""},{"line_number":104,"context_line":"        self.pub_sub \u003d None"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def initialize(self, callback, config\u003dNone, **args):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_2b71cd76","line":103,"range":{"start_line":103,"start_character":13,"end_line":103,"end_character":32},"updated":"2016-02-29 15:00:56.000000000","message":"I am not sure why you need this you use it only for logging","commit_id":"40f78e4a309d432a020bbcc1a4ee0785cde5c826"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"357e7c03408d7ad168ac10c016e1ff47e7459ce4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"7af24918_93d22bff","updated":"2016-03-02 09:17:48.000000000","message":"The API has changed.","commit_id":"91465fc08da3ef7f6bb6af4f2cf7e22833b264b4"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"597a44d4a414b9062b4cedd59d5dc415d52eb964","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        if topic:"},{"line_number":59,"context_line":"            update.topic \u003d topic"},{"line_number":60,"context_line":"        local_topic \u003d update.topic"},{"line_number":61,"context_line":"        event_json \u003d jsonutils.dumps(update.to_array())"},{"line_number":62,"context_line":"        local_topic \u003d local_topic.encode(\u0027utf8\u0027)"},{"line_number":63,"context_line":"        data \u003d pub_sub_api.pack_message(event_json)"},{"line_number":64,"context_line":"        self.client.publish(local_topic, data)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_3c9fcd60","line":61,"updated":"2016-03-06 08:32:45.000000000","message":"This method was changed to \u0027to_dict()\u0027.","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":20298,"name":"feipeng","email":"feipeng1@huawei.com","username":"feipeng"},"change_message_id":"e37154035bfea3564bb06bff7d79cb8b385950a8","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        if topic:"},{"line_number":59,"context_line":"            update.topic \u003d topic"},{"line_number":60,"context_line":"        local_topic \u003d update.topic"},{"line_number":61,"context_line":"        event_json \u003d jsonutils.dumps(update.to_array())"},{"line_number":62,"context_line":"        local_topic \u003d local_topic.encode(\u0027utf8\u0027)"},{"line_number":63,"context_line":"        data \u003d pub_sub_api.pack_message(event_json)"},{"line_number":64,"context_line":"        self.client.publish(local_topic, data)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_f581134f","line":61,"in_reply_to":"7af24918_3c9fcd60","updated":"2016-03-08 01:25:32.000000000","message":"Done","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"e0c32493597ca30441db48decebe17ecad5fd158","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            redis.client.StrictRedis(host\u003dip_port[0], port\u003dip_port[1])"},{"line_number":86,"context_line":"        self.ip \u003d ip_port[0]"},{"line_number":87,"context_line":"        self.plugin_updates_port \u003d ip_port[1]"},{"line_number":88,"context_line":"        self.pub_sub \u003d self.client.pubsub()"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def register_topic(self, topic):"},{"line_number":91,"context_line":"        self.pub_sub.subscribe(topic)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_9b2b6b94","line":88,"range":{"start_line":88,"start_character":8,"end_line":88,"end_character":12},"updated":"2016-03-08 08:07:04.000000000","message":"You need to make sure that you register all the topic in for topic in self.topic_list:","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"e0c32493597ca30441db48decebe17ecad5fd158","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        while True:"},{"line_number":98,"context_line":"            eventlet.sleep(0)"},{"line_number":99,"context_line":"            try:"},{"line_number":100,"context_line":"                for data in self.sub.listen():"},{"line_number":101,"context_line":"                    if \u0027subscribe\u0027 \u003d\u003d data[\u0027type\u0027]:"},{"line_number":102,"context_line":"                        continue"},{"line_number":103,"context_line":"                    if \u0027unsubscribe\u0027 \u003d\u003d data[\u0027type\u0027]:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_1bebdbb1","line":100,"range":{"start_line":100,"start_character":33,"end_line":100,"end_character":36},"updated":"2016-03-08 08:07:04.000000000","message":"I am not sure i understand: this should be pubsub.listen()","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"e0c32493597ca30441db48decebe17ecad5fd158","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"            except Exception as e:"},{"line_number":115,"context_line":"                LOG.warning(e)"},{"line_number":116,"context_line":"                self.pub_sub.channels \u003d {}"},{"line_number":117,"context_line":"                try:"},{"line_number":118,"context_line":"                    connection \u003d self.pub_sub.connection"},{"line_number":119,"context_line":"                    connection.connect()"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_7eb00d44","line":116,"range":{"start_line":116,"start_character":16,"end_line":116,"end_character":42},"updated":"2016-03-08 08:07:04.000000000","message":"You need to re resgiter all the topics using the self.topic_list","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"e0c32493597ca30441db48decebe17ecad5fd158","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                try:"},{"line_number":118,"context_line":"                    connection \u003d self.pub_sub.connection"},{"line_number":119,"context_line":"                    connection.connect()"},{"line_number":120,"context_line":"                    self.db_changes_callback(None, None, \u0027sync\u0027, None)"},{"line_number":121,"context_line":"                except Exception as e:"},{"line_number":122,"context_line":"                    LOG.erro(\"fix connection failed %s ip %s port %s\""},{"line_number":123,"context_line":"                             % e, self.ip, self.plugin_updates_port)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_b8946de2","line":120,"range":{"start_line":120,"start_character":65,"end_line":120,"end_character":69},"updated":"2016-03-08 08:07:04.000000000","message":"Please add another parameter to the db_changes_callback for the topic \n\n connection.connect()\n                    self.db_changes_callback(None, None, \u0027sync\u0027, None, None)","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"597a44d4a414b9062b4cedd59d5dc415d52eb964","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                    connection.connect()"},{"line_number":120,"context_line":"                    self.db_changes_callback(None, None, \u0027sync\u0027, None)"},{"line_number":121,"context_line":"                except Exception as e:"},{"line_number":122,"context_line":"                    LOG.erro(\"fix connection failed %s ip %s port %s\""},{"line_number":123,"context_line":"                             % e, self.ip, self.plugin_updates_port)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_dc918954","line":122,"updated":"2016-03-06 08:32:45.000000000","message":"Typo erro-\u003eerror. Also consider using LOG.exception to log exceptions.","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":20298,"name":"feipeng","email":"feipeng1@huawei.com","username":"feipeng"},"change_message_id":"e37154035bfea3564bb06bff7d79cb8b385950a8","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                    connection.connect()"},{"line_number":120,"context_line":"                    self.db_changes_callback(None, None, \u0027sync\u0027, None)"},{"line_number":121,"context_line":"                except Exception as e:"},{"line_number":122,"context_line":"                    LOG.erro(\"fix connection failed %s ip %s port %s\""},{"line_number":123,"context_line":"                             % e, self.ip, self.plugin_updates_port)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_fae8e018","line":122,"in_reply_to":"7af24918_dc918954","updated":"2016-03-08 01:25:32.000000000","message":"Done","commit_id":"fdd296d532073885cabf6cf74be8ef7a18f8d8db"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"dfb85f2e927b580fe0313e7f830bd8d7c64bafef","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                LOG.warning(e)"},{"line_number":129,"context_line":"                self.pub_sub.channels \u003d {}"},{"line_number":130,"context_line":"                try:"},{"line_number":131,"context_line":"                    connection \u003d self.pub_sub.connection"},{"line_number":132,"context_line":"                    connection.connect()"},{"line_number":133,"context_line":"                    self.db_changes_callback(None, None, \u0027sync\u0027, None)"},{"line_number":134,"context_line":"                except Exception as e:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_3c7bedf6","line":131,"range":{"start_line":131,"start_character":19,"end_line":131,"end_character":56},"updated":"2016-03-09 10:50:45.000000000","message":"You need to regisert the topics again \n\nfor topic in self.topic_list:\n    self.register_topic(topic )","commit_id":"0fdbc34f3526f9b26a4dbfeee21517d7824e91d8"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"db65867fad5fa650df6b3d4e397493192cf6ddb1","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"            except Exception as e:"},{"line_number":130,"context_line":"                LOG.warning(e)"},{"line_number":131,"context_line":"                self.pub_sub.channels \u003d {}"},{"line_number":132,"context_line":"                try:"},{"line_number":133,"context_line":"                    connection \u003d self.pub_sub.connection"},{"line_number":134,"context_line":"                    connection.connect()"}],"source_content_type":"text/x-python","patch_set":17,"id":"1af94dfe_68ab2fd7","line":131,"range":{"start_line":131,"start_character":29,"end_line":131,"end_character":40},"updated":"2016-03-16 13:18:44.000000000","message":"I think if you delete the channel list and do not call register topic in a loop you will loose all your topic registration on exception \n\nAs much as I know the sync process does not re register the topics","commit_id":"e36e846f4be832239ee55bc0d74b8e6b0ce76640"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"8d1c077408fc1bf6701a219b95af4cf1610b0db4","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                try:"},{"line_number":132,"context_line":"                    connection \u003d self.pub_sub.connection"},{"line_number":133,"context_line":"                    connection.connect()"},{"line_number":134,"context_line":"                    self.db_changes_callback(None, None, \u0027sync\u0027, None)"},{"line_number":135,"context_line":"                except Exception as e:"},{"line_number":136,"context_line":"                    LOG.exception(_LE(\"reconnect error %(ip)s:%(port)s\")"},{"line_number":137,"context_line":"                                  % {\u0027ip\u0027: self.ip,"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa0719c6_46d80ff0","line":134,"range":{"start_line":134,"start_character":20,"end_line":134,"end_character":70},"updated":"2016-03-21 08:28:58.000000000","message":"It should be \nself.db_changes_callback(None, None, \u0027sync\u0027, None, None)","commit_id":"5787c33b4391779e1d56036009def9477969bdc8"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"4fb7c11518c93f650a95b9c37afcb60f6b502b4d","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        super(RedisPublisherAgent, self).initialize()"},{"line_number":57,"context_line":"        self.redismgt \u003d RedisMgt.get_instance(cfg.CONF.df.remote_db_ip,"},{"line_number":58,"context_line":"                                              cfg.CONF.df.remote_db_port)"},{"line_number":59,"context_line":"        self.remote \u003d self.redis_mgt.pubsub_select_node_idx()"},{"line_number":60,"context_line":"        ip_port \u003d self.remote.split(\u0027:\u0027)"},{"line_number":61,"context_line":"        self.client \u003d redis.client.StrictRedis(host\u003dip_port[0],"},{"line_number":62,"context_line":"                                               port\u003dip_port[1])"}],"source_content_type":"text/x-python","patch_set":33,"id":"fa0719c6_093552f6","line":59,"range":{"start_line":59,"start_character":22,"end_line":59,"end_character":36},"updated":"2016-03-22 08:29:13.000000000","message":"is it self.redismgt?\n\nI run this agent in my local machine, but it throws the exception saying AttributeError: \u0027RedisSubscriberAgent\u0027 object has no attribute \u0027redis_mgt\u0027.\n\nPlease test and verify it, thanks.","commit_id":"f551dec5e0d9f009c5fdeaad8afb2d7ec5b0a9bf"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"6545d6be416307fe1db6b6369d5be2ec936e04cf","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        super(RedisSubscriberAgent, self).initialize(callback)"},{"line_number":88,"context_line":"        self.redismgt \u003d RedisMgt.get_instance(cfg.CONF.df.remote_db_ip,"},{"line_number":89,"context_line":"                                              cfg.CONF.df.remote_db_port)"},{"line_number":90,"context_line":"        self.remote \u003d self.redis_mgt.pubsub_select_node_idx()"},{"line_number":91,"context_line":"        ip_port \u003d self.remote.split(\u0027:\u0027)"},{"line_number":92,"context_line":"        self.client \u003d \\"},{"line_number":93,"context_line":"            redis.client.StrictRedis(host\u003dip_port[0], port\u003dip_port[1])"}],"source_content_type":"text/x-python","patch_set":33,"id":"fa0719c6_8cfe9036","line":90,"range":{"start_line":90,"start_character":22,"end_line":90,"end_character":36},"updated":"2016-03-22 08:51:04.000000000","message":"And also the SubscriberAgent.","commit_id":"f551dec5e0d9f009c5fdeaad8afb2d7ec5b0a9bf"},{"author":{"_account_id":11364,"name":"Fei Rao","email":"milo.frao@gmail.com","username":"milo.frao"},"change_message_id":"c7170c070d41a7d434ef10fe8e6759a2d0eb3f28","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.pub_sub \u003d None"},{"line_number":83,"context_line":"        self.redis_mgt \u003d None"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def initialize(self, callback):"},{"line_number":86,"context_line":"        # find a subscriber server node and run daemon"},{"line_number":87,"context_line":"        super(RedisSubscriberAgent, self).initialize(callback)"},{"line_number":88,"context_line":"        self.redis_mgt \u003d RedisMgt.get_instance(cfg.CONF.df.remote_db_ip,"},{"line_number":89,"context_line":"                                              cfg.CONF.df.remote_db_port)"},{"line_number":90,"context_line":"        self.remote \u003d self.redis_mgt.pubsub_select_node_idx()"},{"line_number":91,"context_line":"        ip_port \u003d self.remote.split(\u0027:\u0027)"},{"line_number":92,"context_line":"        self.client \u003d \\"},{"line_number":93,"context_line":"            redis.client.StrictRedis(host\u003dip_port[0], port\u003dip_port[1])"},{"line_number":94,"context_line":"        self.ip \u003d ip_port[0]"},{"line_number":95,"context_line":"        self.plugin_updates_port \u003d ip_port[1]"},{"line_number":96,"context_line":"        self.pub_sub \u003d self.client.pubsub()"}],"source_content_type":"text/x-python","patch_set":36,"id":"da0c15f0_c6c5355c","line":93,"range":{"start_line":85,"start_character":0,"end_line":93,"end_character":70},"updated":"2016-03-25 07:40:13.000000000","message":"This process is quite similar with PublicAgent initialize routine, please considering abstract it in to a common function.","commit_id":"73117bf7b0ea28359c4d104ab7326a06845fcec4"},{"author":{"_account_id":11364,"name":"Fei Rao","email":"milo.frao@gmail.com","username":"milo.frao"},"change_message_id":"c7170c070d41a7d434ef10fe8e6759a2d0eb3f28","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            except Exception as e:"},{"line_number":130,"context_line":"                LOG.warning(e)"},{"line_number":131,"context_line":"                try:"},{"line_number":132,"context_line":"                    connection \u003d self.pub_sub.connection"},{"line_number":133,"context_line":"                    connection.connect()"},{"line_number":134,"context_line":"                    self.db_changes_callback(None, None, \u0027sync\u0027, None, None)"},{"line_number":135,"context_line":"                except Exception as e:"},{"line_number":136,"context_line":"                    LOG.exception(_LE(\"reconnect error %(ip)s:%(port)s\")"}],"source_content_type":"text/x-python","patch_set":36,"id":"da0c15f0_66e709e5","line":133,"range":{"start_line":132,"start_character":0,"end_line":133,"end_character":40},"updated":"2016-03-25 07:40:13.000000000","message":"Is it persistent connection or non-persistent connection? Once there is a exception, you will create new connection. when to close the old connection?","commit_id":"73117bf7b0ea28359c4d104ab7326a06845fcec4"}],"dragonflow/tests/unit/test_redis_db.py":[{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"58eb7f0c0b3819a21c30c54ce44d390e51fd2c54","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from dragonflow.db.drivers.redis_db_driver import RedisDbDriver"},{"line_number":2,"context_line":"from neutron.tests import base as tests_base"},{"line_number":3,"context_line":"import mock"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"class TestRedisDB(tests_base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1af94dfe_3dda4279","line":3,"range":{"start_line":2,"start_character":1,"end_line":3,"end_character":11},"updated":"2016-03-15 14:29:54.000000000","message":"You need to fix the include order in order to pass pep8\n\nPlease run tox  locally","commit_id":"68778bda1bcc7bc80e50530fd316fd055c6aace1"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"e68d6dab0fed92b585ba69b91748596662496fa6","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from dragonflow.db.drivers.redis_db_driver import RedisDbDriver"},{"line_number":17,"context_line":"import mock"},{"line_number":18,"context_line":"from neutron.tests import base as tests_base"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class TestRedisDB(tests_base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1af94dfe_42de1440","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":44},"updated":"2016-03-16 12:51:58.000000000","message":"from dragonflow.tests import base as tests_base","commit_id":"e36e846f4be832239ee55bc0d74b8e6b0ce76640"}],"dragonflow/tests/unit/test_redis_pubsub.py":[{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"06d9ec898fc00dc708637b65cbf3f97ef6699f3e","unresolved":false,"context_lines":[{"line_number":3,"context_line":"from dragonflow.db.db_common import DbUpdate"},{"line_number":4,"context_line":"from dragonflow.db import pub_sub_api"},{"line_number":5,"context_line":"import mock"},{"line_number":6,"context_line":"from neutron.tests import base as tests_base"},{"line_number":7,"context_line":"from oslo_serialization import jsonutils"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1af94dfe_5c78b92b","line":6,"range":{"start_line":6,"start_character":4,"end_line":6,"end_character":44},"updated":"2016-03-16 12:23:10.000000000","message":"Please use \t\nfrom dragonflow.tests import base as tests_base","commit_id":"e36e846f4be832239ee55bc0d74b8e6b0ce76640"}],"test-requirements.txt":[{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"130e691b5dce7fc10a60f24a2f96f5556845b4d0","unresolved":false,"context_lines":[{"line_number":15,"context_line":"testscenarios\u003e\u003d0.4 # Apache-2.0/BSD"},{"line_number":16,"context_line":"testtools\u003e\u003d1.4.0 # MIT"},{"line_number":17,"context_line":"reno\u003e\u003d0.1.1 # Apache2"},{"line_number":18,"context_line":"redis\u003e\u003d2.10.0  # MIT"}],"source_content_type":"text/plain","patch_set":24,"id":"1af94dfe_8701e5b1","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":20},"updated":"2016-03-18 04:24:20.000000000","message":"move to requirements.txt.","commit_id":"064f13e994f7d2bd4b1ed4e20ef0bc20035fb0c0"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"4cc3c5c85a1b3f43ba6abbfd112b2991f267c6fa","unresolved":false,"context_lines":[{"line_number":15,"context_line":"testscenarios\u003e\u003d0.4 # Apache-2.0/BSD"},{"line_number":16,"context_line":"testtools\u003e\u003d1.4.0 # MIT"},{"line_number":17,"context_line":"reno\u003e\u003d0.1.1 # Apache2"},{"line_number":18,"context_line":"redis\u003e\u003d2.10.0  # MIT"}],"source_content_type":"text/plain","patch_set":25,"id":"fa0719c6_80b97a31","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":6},"updated":"2016-03-20 07:44:31.000000000","message":"Please move to requirements.txt as Lima suggested sorry for the confusion","commit_id":"e706b065d4306290b18eb97dee8dd89ef331ecea"}]}
