)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"e028eb426fb5738081c9cdb297f30b36b613de64","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Prashanth Raghu \u003cp.isprashanth@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-09-15 14:16:16 +0530"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":" Redis driver does not failover to slave when master fails"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":" Add the ability to configure Sentinel support in zaqar.conf"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa98f980_1528b984","line":7,"updated":"2014-09-16 08:26:06.000000000","message":"nit: a better commit title would be:\n\n`Add support for redis-sentinel` or `Add support for redis failover`\n\nthen you can explain the issue and solution in the summary. :D","commit_id":"464cd59285f3818bb49baf5dbfa73364af0d3c44"}],"zaqar/queues/storage/redis/driver.py":[{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"e028eb426fb5738081c9cdb297f30b36b613de64","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    # TODO(prashanthr_): Add SSL support"},{"line_number":30,"context_line":"    conf \u003d driver.redis_conf"},{"line_number":31,"context_line":"    parsed_url \u003d urllib.parse.urlparse(conf.uri)"},{"line_number":32,"context_line":"    parsed_params \u003d {}"},{"line_number":33,"context_line":"    query \u003d parsed_url.query"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    if not query and \u0027?\u0027 in parsed_url.path:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa98f980_7542e50f","line":32,"updated":"2014-09-16 08:26:06.000000000","message":"no need to define this here, it\u0027s already in L38","commit_id":"464cd59285f3818bb49baf5dbfa73364af0d3c44"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"e028eb426fb5738081c9cdb297f30b36b613de64","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    parsed_params \u003d {}"},{"line_number":33,"context_line":"    query \u003d parsed_url.query"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    if not query and \u0027?\u0027 in parsed_url.path:"},{"line_number":36,"context_line":"        query \u003d parsed_url.path.split(\u0027?\u0027, 1)[-1]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    parsed_params \u003d dict(urllib.parse.parse_qsl(query))"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa98f980_f54df53b","line":35,"updated":"2014-09-16 08:26:06.000000000","message":"mmmh, why is this needed? When would urllib fail to parse the query section?","commit_id":"464cd59285f3818bb49baf5dbfa73364af0d3c44"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"e028eb426fb5738081c9cdb297f30b36b613de64","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        sentinel \u003d redis.sentinel.Sentinel([(parsed_url.hostname, port)],"},{"line_number":46,"context_line":"                                           socket_timeout\u003dsocket_timeout)"},{"line_number":47,"context_line":"        driver.replica_name \u003d replica_name"},{"line_number":48,"context_line":"        driver.sentinel \u003d sentinel"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        return sentinel.master_for(replica_name)"},{"line_number":51,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa98f980_15919946","line":48,"updated":"2014-09-16 08:26:06.000000000","message":"I guess this is the driver\u0027s API fault but It\u0027s kind of weird that you have to set this 2 arguments, then call `sentinel.master_for` and then never return the actual driver. I guess it\u0027s used under-the-hood","commit_id":"464cd59285f3818bb49baf5dbfa73364af0d3c44"},{"author":{"_account_id":6427,"name":"Kurt Griffiths","email":"kurt.griffiths@rackspace.com","username":"kgriffs"},"change_message_id":"592a27f2b49d4202be10519eeb8360bace1bcb76","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    parsed_url \u003d urllib.parse.urlparse(conf.uri)"},{"line_number":32,"context_line":"    query \u003d parsed_url.query"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    if not query and \u0027?\u0027 in parsed_url.path:"},{"line_number":35,"context_line":"        query \u003d parsed_url.path.split(\u0027?\u0027, 1)[-1]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    parsed_params \u003d dict(urllib.parse.parse_qsl(query))"}],"source_content_type":"text/x-python","patch_set":2,"id":"da9df570_45d8a1ef","line":34,"updated":"2014-09-22 21:41:10.000000000","message":"Q. Did you see flaper87\u0027s comment? It doesn\u0027t seem like L34-L35 are needed.","commit_id":"f3471e63771d83e8d119b608a619a3ef044dc378"},{"author":{"_account_id":6427,"name":"Kurt Griffiths","email":"kurt.griffiths@rackspace.com","username":"kgriffs"},"change_message_id":"592a27f2b49d4202be10519eeb8360bace1bcb76","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        replica_name \u003d parsed_params[\u0027sentinel\u0027]"},{"line_number":44,"context_line":"        sentinel \u003d redis.sentinel.Sentinel([(parsed_url.hostname, port)],"},{"line_number":45,"context_line":"                                           socket_timeout\u003dsocket_timeout)"},{"line_number":46,"context_line":"        return sentinel.master_for(replica_name)"},{"line_number":47,"context_line":"    else:"},{"line_number":48,"context_line":"        if parsed_url.hostname:"},{"line_number":49,"context_line":"            return redis.StrictRedis(host\u003dparsed_url.hostname, port\u003dport,"}],"source_content_type":"text/x-python","patch_set":2,"id":"da9df570_85a7e94e","line":46,"updated":"2014-09-22 21:41:10.000000000","message":"IMO: Perhaps add a NOTE comment here that mentions how socket_timeout will be inherited from the Sentinel kwargs?","commit_id":"f3471e63771d83e8d119b608a619a3ef044dc378"},{"author":{"_account_id":6427,"name":"Kurt Griffiths","email":"kurt.griffiths@rackspace.com","username":"kgriffs"},"change_message_id":"2b6d06eebfff00f85f849aadc4138a663d2e3aba","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    parsed_url \u003d urllib.parse.urlparse(conf.uri)"},{"line_number":32,"context_line":"    query \u003d parsed_url.query"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    if not query and \u0027?\u0027 in parsed_url.path:"},{"line_number":35,"context_line":"        query \u003d parsed_url.path.split(\u0027?\u0027, 1)[-1]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    parsed_params \u003d dict(urllib.parse.parse_qsl(query))"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_064963d0","line":34,"updated":"2014-09-29 14:11:19.000000000","message":"DSQ: When will urlparse() fail to get the query string?","commit_id":"cef340c16864281589b12851a208530d8e765b91"},{"author":{"_account_id":6427,"name":"Kurt Griffiths","email":"kurt.griffiths@rackspace.com","username":"kgriffs"},"change_message_id":"2b6d06eebfff00f85f849aadc4138a663d2e3aba","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        sentinel \u003d redis.sentinel.Sentinel([(parsed_url.hostname, port)],"},{"line_number":45,"context_line":"                                           socket_timeout\u003dsocket_timeout)"},{"line_number":46,"context_line":"        return sentinel.master_for(replica_name)"},{"line_number":47,"context_line":"    # NOTE(prashanthr_): The socket_timeout parameter being generic"},{"line_number":48,"context_line":"    # to all redis connections is inherited from the parameters for"},{"line_number":49,"context_line":"    # sentinel."},{"line_number":50,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_a69ed754","line":47,"updated":"2014-09-29 14:11:19.000000000","message":"NIT: I think this comment belongs above L46 instead?","commit_id":"cef340c16864281589b12851a208530d8e765b91"},{"author":{"_account_id":6427,"name":"Kurt Griffiths","email":"kurt.griffiths@rackspace.com","username":"kgriffs"},"change_message_id":"2b6d06eebfff00f85f849aadc4138a663d2e3aba","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.message_controller.gc()"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    @decorators.lazy_property(write\u003dFalse)"},{"line_number":97,"context_line":"    def connection(self):"},{"line_number":98,"context_line":"        \"\"\"Redis client connection instance.\"\"\""},{"line_number":99,"context_line":"        return _get_redis_client(self)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baa201ad_66ccef36","line":97,"updated":"2014-09-29 14:11:19.000000000","message":"BUG/Question: If the master fails over, is it necessary to call sentinel.master_for(replica_name) again before retrying? I took a look at the retries_on_connection_error decorator and it isn\u0027t asking for a new client instance as far as I can tell.","commit_id":"cef340c16864281589b12851a208530d8e765b91"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"44e99e769d4c2766fb2e0cfd6e164cb3351fd667","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self.master \u003d None"},{"line_number":72,"context_line":"        self.sentinels \u003d []"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        if \u0027master\u0027 in query_params:"},{"line_number":75,"context_line":"            # NOTE(prashanthr_): Configure redis driver in sentinel mode"},{"line_number":76,"context_line":"            self.strategy \u003d STRATEGY_SENTINEL"},{"line_number":77,"context_line":"            self.master \u003d query_params[\u0027master\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_c81f9359","line":74,"updated":"2014-10-08 13:45:17.000000000","message":"Q: What happens if there are several hosts but `master` is not specified? Should this `if` check if there\u0027s a comma in the `netloc` instead? We can then raise an error if master is not specified.\n\nBased on the `uri` docstring, it seems like `master` *must* be specified for sentinel to work correctly.","commit_id":"6fbaa534147dbb85bc52a0b3b4a5812f4dd0e3a7"},{"author":{"_account_id":6427,"name":"Kurt Griffiths","email":"kurt.griffiths@rackspace.com","username":"kgriffs"},"change_message_id":"348f7f58b62cb409dcb630118be88ce5b2ceb410","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self.master \u003d None"},{"line_number":72,"context_line":"        self.sentinels \u003d []"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        if \u0027master\u0027 in query_params:"},{"line_number":75,"context_line":"            # NOTE(prashanthr_): Configure redis driver in sentinel mode"},{"line_number":76,"context_line":"            self.strategy \u003d STRATEGY_SENTINEL"},{"line_number":77,"context_line":"            self.master \u003d query_params[\u0027master\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_4880038b","line":74,"in_reply_to":"baa201ad_c81f9359","updated":"2014-10-08 14:10:15.000000000","message":"Done","commit_id":"6fbaa534147dbb85bc52a0b3b4a5812f4dd0e3a7"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"f3fab2db6d642bc07c97514fad4c53187db907d7","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                # a list of sentinel hostnames, but forgot to"},{"line_number":106,"context_line":"                # add \u0027master\u0027 to the query string."},{"line_number":107,"context_line":"                msg \u003d _(\u0027The Redis URI includes multiple sentinel \u0027"},{"line_number":108,"context_line":"                        \u0027hostnames but the master server name was \u0027"},{"line_number":109,"context_line":"                        \u0027not included in the query string.\u0027)"},{"line_number":110,"context_line":"                raise errors.ConfigurationError(msg)"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"baa201ad_433384f5","line":108,"updated":"2014-10-08 14:16:01.000000000","message":"NIT: Should we add a: \"Please, add the `master` query param to your uri\"?\n\nJust to be explicit and help users understand what\u0027s going on.","commit_id":"a4b86c69e84115c809e7507fd4c8716e162461ad"}]}
