)]}'
{"etc/nova/nova.conf.sample":[{"author":{"_account_id":659,"name":"Akira Yoshiyama","email":"akirayoshiyama@gmail.com","username":"yosshy"},"change_message_id":"ed1aa336f7f04b3749225bed8e495e2592dfce54","unresolved":false,"context_lines":[{"line_number":1690,"context_line":"#"},{"line_number":1691,"context_line":""},{"line_number":1692,"context_line":"# The driver for servicegroup service (valid options are: db,"},{"line_number":1693,"context_line":"# memcached) (string value)"},{"line_number":1694,"context_line":"#servicegroup_driver\u003ddb"},{"line_number":1695,"context_line":""},{"line_number":1696,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAM3%2F%2B8%2FU%3D","line":1693,"updated":"2013-02-13 12:46:52.000000000","message":"zk should be added. hmm...","commit_id":"37f028d9dd379f42a7e79034ec8cb9455be7adb9"}],"nova/servicegroup/api.py":[{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"ac1fa08e82eb6bf6d3720bf4c45bd2ec68355967","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    _driver_name_class_mapping \u003d {"},{"line_number":44,"context_line":"        \u0027db\u0027: \u0027nova.servicegroup.drivers.db.DbDriver\u0027,"},{"line_number":45,"context_line":"        \u0027zk\u0027: \u0027nova.servicegroup.drivers.zk.ZooKeeperDriver\u0027,"},{"line_number":46,"context_line":"        \u0027mc\u0027: \u0027nova.servicegroup.drivers.mc.MemcachedDriver\u0027"},{"line_number":47,"context_line":"    }"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __new__(cls, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2BwTM%3D","line":46,"updated":"2013-02-19 22:24:12.000000000","message":"I feel a bit like these two character names are unnecessarily terse, but perhaps that\u0027s just me.","commit_id":"625e074033bc4d4b42f2ef641a69dd425965ac8f"}],"nova/servicegroup/drivers/mc.py":[{"author":{"_account_id":659,"name":"Akira Yoshiyama","email":"akirayoshiyama@gmail.com","username":"yosshy"},"change_message_id":"ed76440ff741fe2c835dcde1ea6bf06e385e32c2","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":42,"context_line":"        test \u003d kwargs.get(\u0027test\u0027)"},{"line_number":43,"context_line":"        if not CONF.memcached_servers and not test:"},{"line_number":44,"context_line":"            raise RuntimeError(_(\u0027memcached_servers not defined\u0027))"},{"line_number":45,"context_line":"        self.mc \u003d memorycache.get_client()"},{"line_number":46,"context_line":"        self.db_allowed \u003d kwargs.get(\u0027db_allowed\u0027, True)"},{"line_number":47,"context_line":"        self.conductor_api \u003d conductor.API(use_local\u003dself.db_allowed)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2B2Dk%3D","line":44,"updated":"2013-02-17 14:52:28.000000000","message":"uncoverd line by unit tests","commit_id":"625e074033bc4d4b42f2ef641a69dd425965ac8f"},{"author":{"_account_id":659,"name":"Akira Yoshiyama","email":"akirayoshiyama@gmail.com","username":"yosshy"},"change_message_id":"ed76440ff741fe2c835dcde1ea6bf06e385e32c2","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        LOG.debug(msg, locals())"},{"line_number":56,"context_line":"        if service is None:"},{"line_number":57,"context_line":"            raise RuntimeError(_(\u0027service is a mandatory argument for \u0027"},{"line_number":58,"context_line":"                                 \u0027Memcached based ServiceGroup driver\u0027))"},{"line_number":59,"context_line":"        report_interval \u003d service.report_interval"},{"line_number":60,"context_line":"        if report_interval:"},{"line_number":61,"context_line":"            pulse \u003d utils.FixedIntervalLoopingCall(self._report_state, service)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2B2Dg%3D","line":58,"updated":"2013-02-17 14:52:28.000000000","message":"uncovered line by unit tests","commit_id":"625e074033bc4d4b42f2ef641a69dd425965ac8f"},{"author":{"_account_id":659,"name":"Akira Yoshiyama","email":"akirayoshiyama@gmail.com","username":"yosshy"},"change_message_id":"ed76440ff741fe2c835dcde1ea6bf06e385e32c2","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            raise RuntimeError(_(\u0027service is a mandatory argument for \u0027"},{"line_number":58,"context_line":"                                 \u0027Memcached based ServiceGroup driver\u0027))"},{"line_number":59,"context_line":"        report_interval \u003d service.report_interval"},{"line_number":60,"context_line":"        if report_interval:"},{"line_number":61,"context_line":"            pulse \u003d utils.FixedIntervalLoopingCall(self._report_state, service)"},{"line_number":62,"context_line":"            pulse.start(interval\u003dreport_interval,"},{"line_number":63,"context_line":"                        initial_delay\u003dreport_interval)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2B2DU%3D","line":60,"updated":"2013-02-17 14:52:28.000000000","message":"an uncovered condition (false) by unit tests","commit_id":"625e074033bc4d4b42f2ef641a69dd425965ac8f"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"ac1fa08e82eb6bf6d3720bf4c45bd2ec68355967","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            return pulse"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def is_up(self, service_ref):"},{"line_number":67,"context_line":"        \"\"\"Moved from nova.utils"},{"line_number":68,"context_line":"        Check whether a service is up based on last heartbeat."},{"line_number":69,"context_line":"        \"\"\""},{"line_number":70,"context_line":"        key \u003d \"%(topic)s:%(host)s\" % service_ref"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2BwSs%3D","line":67,"updated":"2013-02-19 22:24:12.000000000","message":"I think you can remove the \"moved from\" bit.","commit_id":"625e074033bc4d4b42f2ef641a69dd425965ac8f"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"ac1fa08e82eb6bf6d3720bf4c45bd2ec68355967","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def get_all(self, group_id):"},{"line_number":74,"context_line":"        \"\"\""},{"line_number":75,"context_line":"        Returns ALL members of the given group"},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        LOG.debug(_(\u0027Memcached_Driver: get_all members of the %s group\u0027) %"},{"line_number":78,"context_line":"                  group_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2BwSo%3D","line":75,"updated":"2013-02-19 22:24:12.000000000","message":"Doc comment should be single line and end with a period.","commit_id":"625e074033bc4d4b42f2ef641a69dd425965ac8f"}],"nova/servicegroup/drivers/memcached.py":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"f37a8d826d6ea3239c77d0460498f06fbd5e32b0","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.conductor_api \u003d conductor.API(use_local\u003dself.db_allowed)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def join(self, member_id, group_id, service\u003dNone):"},{"line_number":50,"context_line":"        \"\"\"Join the given service with it\u0027s group.\"\"\""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        msg \u003d _(\u0027Memcached_Driver: join new ServiceGroup member \u0027"},{"line_number":53,"context_line":"                \u0027%(member_id)s to the %(group_id)s group, \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FCuo%3D","line":50,"updated":"2013-02-09 16:18:25.000000000","message":"Should be \"its\" rather than \"it\u0027s\"","commit_id":"c70614a0a22ec5e067e03725b80e6cab7fabe9db"},{"author":{"_account_id":659,"name":"Akira Yoshiyama","email":"akirayoshiyama@gmail.com","username":"yosshy"},"change_message_id":"778ea8939e17ed47250b03704c1ebe27dfcd4547","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.conductor_api \u003d conductor.API(use_local\u003dself.db_allowed)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def join(self, member_id, group_id, service\u003dNone):"},{"line_number":50,"context_line":"        \"\"\"Join the given service with it\u0027s group.\"\"\""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        msg \u003d _(\u0027Memcached_Driver: join new ServiceGroup member \u0027"},{"line_number":53,"context_line":"                \u0027%(member_id)s to the %(group_id)s group, \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FCto%3D","line":50,"in_reply_to":"AAAAM3%2F%2FCuo%3D","updated":"2013-02-09 16:31:12.000000000","message":"Right. It\u0027s from db.py. Fixed.","commit_id":"c70614a0a22ec5e067e03725b80e6cab7fabe9db"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"f37a8d826d6ea3239c77d0460498f06fbd5e32b0","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        \"\"\""},{"line_number":75,"context_line":"        Returns ALL members of the given group"},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        LOG.debug(_(\u0027Memcached_Driver: get_all members of the %s group\u0027) % \\"},{"line_number":78,"context_line":"                  group_id)"},{"line_number":79,"context_line":"        rs \u003d []"},{"line_number":80,"context_line":"        ctxt \u003d context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FCuk%3D","line":77,"updated":"2013-02-09 16:18:25.000000000","message":"\\ isn\u0027t needed since we\u0027re inside parentheses","commit_id":"c70614a0a22ec5e067e03725b80e6cab7fabe9db"},{"author":{"_account_id":659,"name":"Akira Yoshiyama","email":"akirayoshiyama@gmail.com","username":"yosshy"},"change_message_id":"778ea8939e17ed47250b03704c1ebe27dfcd4547","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        \"\"\""},{"line_number":75,"context_line":"        Returns ALL members of the given group"},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        LOG.debug(_(\u0027Memcached_Driver: get_all members of the %s group\u0027) % \\"},{"line_number":78,"context_line":"                  group_id)"},{"line_number":79,"context_line":"        rs \u003d []"},{"line_number":80,"context_line":"        ctxt \u003d context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FCtk%3D","line":77,"in_reply_to":"AAAAM3%2F%2FCuk%3D","updated":"2013-02-09 16:31:12.000000000","message":"Sure. From db.py too. Fixed.","commit_id":"c70614a0a22ec5e067e03725b80e6cab7fabe9db"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"8441b44d30cf962aa21fe8bf6a77f40e442116a3","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                        initial_delay\u003dreport_interval)"},{"line_number":65,"context_line":"            return pulse"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def is_up(self, service_ref):"},{"line_number":68,"context_line":"        \"\"\"Moved from nova.utils"},{"line_number":69,"context_line":"        Check whether a service is up based on last heartbeat."},{"line_number":70,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2FBUs%3D","line":67,"updated":"2013-02-11 13:41:46.000000000","message":"Pardon my ignorance, when exactly is a keys are deleted from memcached? looks like code in line 72 just checks if the key is present. I am trying to compare it to the DbDriver which checks the elapsed time against service_down_time.","commit_id":"34aabfc92ac953b5686111a243b30b45d242fc47"},{"author":{"_account_id":659,"name":"Akira Yoshiyama","email":"akirayoshiyama@gmail.com","username":"yosshy"},"change_message_id":"85348ef5c91f00d0a290e924bdf51f069f774bcb","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                        initial_delay\u003dreport_interval)"},{"line_number":65,"context_line":"            return pulse"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def is_up(self, service_ref):"},{"line_number":68,"context_line":"        \"\"\"Moved from nova.utils"},{"line_number":69,"context_line":"        Check whether a service is up based on last heartbeat."},{"line_number":70,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2FAPY%3D","line":67,"in_reply_to":"AAAAM3%2F%2FBQs%3D","updated":"2013-02-11 21:55:34.000000000","message":"Done","commit_id":"34aabfc92ac953b5686111a243b30b45d242fc47"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"6c97700ebb355c901990ffbec3e6ee26de161922","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                        initial_delay\u003dreport_interval)"},{"line_number":65,"context_line":"            return pulse"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def is_up(self, service_ref):"},{"line_number":68,"context_line":"        \"\"\"Moved from nova.utils"},{"line_number":69,"context_line":"        Check whether a service is up based on last heartbeat."},{"line_number":70,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2FBQs%3D","line":67,"in_reply_to":"AAAAM3%2F%2FBSY%3D","updated":"2013-02-11 14:17:57.000000000","message":"Thanks, can you please add a comment about the expiry before the mc.set in line 93?","commit_id":"34aabfc92ac953b5686111a243b30b45d242fc47"},{"author":{"_account_id":659,"name":"Akira Yoshiyama","email":"akirayoshiyama@gmail.com","username":"yosshy"},"change_message_id":"c5e9289b4ea7cebd533c3b2b6f617a70509c4c3d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                        initial_delay\u003dreport_interval)"},{"line_number":65,"context_line":"            return pulse"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def is_up(self, service_ref):"},{"line_number":68,"context_line":"        \"\"\"Moved from nova.utils"},{"line_number":69,"context_line":"        Check whether a service is up based on last heartbeat."},{"line_number":70,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2FBSY%3D","line":67,"in_reply_to":"AAAAM3%2F%2FBUs%3D","updated":"2013-02-11 14:10:53.000000000","message":"It doesn\u0027t have to delete keys because of using expiration time of memcached.\nSee below:\nhttp://python-memcache.sourcearchive.com/documentation/1.47-2/classmemcache_1_1Client_ae4c300154dabde702b8de1351bfe6ada.html\nSo, value\u003dtimeutils.utcnow() has no meaning.","commit_id":"34aabfc92ac953b5686111a243b30b45d242fc47"},{"author":{"_account_id":1711,"name":"Yun Mao","email":"yunmao@gmail.com","username":"yunmao"},"change_message_id":"740880a411e24f6bb15c0b2c2734fad5fe2e6134","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                  group_id)"},{"line_number":79,"context_line":"        rs \u003d []"},{"line_number":80,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":81,"context_line":"        services \u003d self.conductor_api.service_get_all_by_topic(ctxt, group_id)"},{"line_number":82,"context_line":"        for service in services:"},{"line_number":83,"context_line":"            if self.is_up(service):"},{"line_number":84,"context_line":"                rs.append(service[\u0027host\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAM3%2F%2B9BA%3D","line":81,"updated":"2013-02-13 12:32:49.000000000","message":"Do you need a database query via the conductor here? Does memcached provide a list method?","commit_id":"37f028d9dd379f42a7e79034ec8cb9455be7adb9"},{"author":{"_account_id":659,"name":"Akira Yoshiyama","email":"akirayoshiyama@gmail.com","username":"yosshy"},"change_message_id":"67ec2a9f5b676301c57a55b323208f5d669f26a3","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                  group_id)"},{"line_number":79,"context_line":"        rs \u003d []"},{"line_number":80,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":81,"context_line":"        services \u003d self.conductor_api.service_get_all_by_topic(ctxt, group_id)"},{"line_number":82,"context_line":"        for service in services:"},{"line_number":83,"context_line":"            if self.is_up(service):"},{"line_number":84,"context_line":"                rs.append(service[\u0027host\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAM3%2F%2B8%2F4%3D","line":81,"in_reply_to":"AAAAM3%2F%2B9BA%3D","updated":"2013-02-13 12:43:53.000000000","message":"Memcached protocol specification is below:\nhttps://github.com/memcached/memcached/blob/master/doc/protocol.txt\nIt looks no key-listing command.","commit_id":"37f028d9dd379f42a7e79034ec8cb9455be7adb9"}],"nova/tests/servicegroup/test_memcache_servicegroup.py":[{"author":{"_account_id":659,"name":"Akira Yoshiyama","email":"akirayoshiyama@gmail.com","username":"yosshy"},"change_message_id":"85348ef5c91f00d0a290e924bdf51f069f774bcb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) IBM 2012 Alexey Roytman \u003croytman at il dot ibm dot com\u003e"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2FBL4%3D","line":1,"updated":"2013-02-11 21:55:34.000000000","message":"Oh, I forgot to update copyright. Sorry.","commit_id":"34aabfc92ac953b5686111a243b30b45d242fc47"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"1833926aef48294acf7de83cd78e8cade9c32f54","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import datetime"},{"line_number":16,"context_line":"import eventlet"},{"line_number":17,"context_line":"import fixtures"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2FBRc%3D","line":15,"updated":"2013-02-11 14:15:21.000000000","message":"There should be a newline here to separate stdlib imports from third-party imports.","commit_id":"34aabfc92ac953b5686111a243b30b45d242fc47"},{"author":{"_account_id":659,"name":"Akira Yoshiyama","email":"akirayoshiyama@gmail.com","username":"yosshy"},"change_message_id":"85348ef5c91f00d0a290e924bdf51f069f774bcb","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import datetime"},{"line_number":16,"context_line":"import eventlet"},{"line_number":17,"context_line":"import fixtures"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2FAO0%3D","line":15,"in_reply_to":"AAAAM3%2F%2FBRc%3D","updated":"2013-02-11 21:55:34.000000000","message":"Done","commit_id":"34aabfc92ac953b5686111a243b30b45d242fc47"}]}
