)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"0d7738fb11b4fcdf703d724f1bf8ebd938946116","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The sheepdog driver of cinder should use a policy to make full"},{"line_number":10,"context_line":"use of all sheepdog nodes of a cluster instead of single node."},{"line_number":11,"context_line":"It can solve single-point invalid problem and hot-point problem."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch use random method. When it need to run a dog command"},{"line_number":14,"context_line":"or provide a location path to qemu, it get a random node from all"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa0719c6_6c057f0f","line":11,"range":{"start_line":11,"start_character":13,"end_line":11,"end_character":41},"updated":"2016-03-24 06:04:03.000000000","message":"I guess you mean single point of failure and hot spot?","commit_id":"1d1362791024d711115ea9de2537afcbf0b3c1bf"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"0d7738fb11b4fcdf703d724f1bf8ebd938946116","unresolved":false,"context_lines":[{"line_number":10,"context_line":"use of all sheepdog nodes of a cluster instead of single node."},{"line_number":11,"context_line":"It can solve single-point invalid problem and hot-point problem."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch use random method. When it need to run a dog command"},{"line_number":14,"context_line":"or provide a location path to qemu, it get a random node from all"},{"line_number":15,"context_line":"sheepdog nodes of a cluster."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa0719c6_619bc818","line":13,"range":{"start_line":13,"start_character":38,"end_line":13,"end_character":42},"updated":"2016-03-24 06:04:03.000000000","message":"s/need/needs/","commit_id":"1d1362791024d711115ea9de2537afcbf0b3c1bf"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"0d7738fb11b4fcdf703d724f1bf8ebd938946116","unresolved":false,"context_lines":[{"line_number":10,"context_line":"use of all sheepdog nodes of a cluster instead of single node."},{"line_number":11,"context_line":"It can solve single-point invalid problem and hot-point problem."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch use random method. When it need to run a dog command"},{"line_number":14,"context_line":"or provide a location path to qemu, it get a random node from all"},{"line_number":15,"context_line":"sheepdog nodes of a cluster."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa0719c6_c1d0d4cb","line":13,"range":{"start_line":13,"start_character":11,"end_line":13,"end_character":14},"updated":"2016-03-24 06:04:03.000000000","message":"s/use/uses/","commit_id":"1d1362791024d711115ea9de2537afcbf0b3c1bf"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"0d7738fb11b4fcdf703d724f1bf8ebd938946116","unresolved":false,"context_lines":[{"line_number":11,"context_line":"It can solve single-point invalid problem and hot-point problem."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch use random method. When it need to run a dog command"},{"line_number":14,"context_line":"or provide a location path to qemu, it get a random node from all"},{"line_number":15,"context_line":"sheepdog nodes of a cluster."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I0280b71203d99829796244afbd9a8f308b7e910a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa0719c6_41068420","line":14,"range":{"start_line":14,"start_character":39,"end_line":14,"end_character":42},"updated":"2016-03-24 06:04:03.000000000","message":"s/get/gets","commit_id":"1d1362791024d711115ea9de2537afcbf0b3c1bf"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"0d7738fb11b4fcdf703d724f1bf8ebd938946116","unresolved":false,"context_lines":[{"line_number":11,"context_line":"It can solve single-point invalid problem and hot-point problem."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch use random method. When it need to run a dog command"},{"line_number":14,"context_line":"or provide a location path to qemu, it get a random node from all"},{"line_number":15,"context_line":"sheepdog nodes of a cluster."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I0280b71203d99829796244afbd9a8f308b7e910a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa0719c6_01100c56","line":14,"range":{"start_line":14,"start_character":3,"end_line":14,"end_character":10},"updated":"2016-03-24 06:04:03.000000000","message":"s/provide/provides/","commit_id":"1d1362791024d711115ea9de2537afcbf0b3c1bf"}],"cinder/volume/drivers/sheepdog.py":[{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"0d7738fb11b4fcdf703d724f1bf8ebd938946116","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.node_list \u003d node_list"},{"line_number":83,"context_line":"        self.port \u003d port"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _get_addr(self):"},{"line_number":86,"context_line":"        \"\"\"Get a random node in sheepdog cluster.\"\"\""},{"line_number":87,"context_line":"        return self.node_list[random.randint(0, len(self.node_list) - 1)]"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa0719c6_c18294c7","line":85,"range":{"start_line":85,"start_character":8,"end_line":85,"end_character":17},"updated":"2016-03-24 06:04:03.000000000","message":"\u0027_\u0027 prefixed function is usually private function for a class, bug _get_addr() is called multiple times from SheepdogDriver.","commit_id":"1d1362791024d711115ea9de2537afcbf0b3c1bf"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"0d7738fb11b4fcdf703d724f1bf8ebd938946116","unresolved":false,"context_lines":[{"line_number":443,"context_line":"class SheepdogDriver(driver.VolumeDriver):"},{"line_number":444,"context_line":"    \"\"\"Executes commands relating to Sheepdog Volumes.\"\"\""},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    VERSION \u003d \"1.0.0\""},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":449,"context_line":"        super(SheepdogDriver, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa0719c6_8107fc80","line":446,"range":{"start_line":446,"start_character":15,"end_line":446,"end_character":20},"updated":"2016-03-24 06:04:03.000000000","message":"Driver version should be bumped to sth bigger than 1.0.0?","commit_id":"1d1362791024d711115ea9de2537afcbf0b3c1bf"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"cbee33bf4d33edf8a18f9bc17205eff76621f339","unresolved":false,"context_lines":[{"line_number":318,"context_line":"        except exception.SheepdogCmdError as e:"},{"line_number":319,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":320,"context_line":"                LOG.error(_LE(\u0027Failed to get node list. %s\u0027), e)"},{"line_number":321,"context_line":"        node_list \u003d []"},{"line_number":322,"context_line":"        stdout \u003d _stdout.strip(\u0027\\n\u0027)"},{"line_number":323,"context_line":"        for line in stdout.split(\u0027\\n\u0027):"},{"line_number":324,"context_line":"            node_list.append(line.split()[1].split(\u0027:\u0027)[0])"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_fc02810a","line":321,"updated":"2016-04-08 16:59:32.000000000","message":"Should some error get raised in the case that there\u0027s no nodes returned? Otherwise we\u0027ll get an ugly error in addr() when trying to grab a random node like \"ValueError: empty range for randrange() (0,0, 0)\"","commit_id":"bac0d4e550c0a1a9cef6befc9171c9d85cb0ac39"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"ca69a80aadc30f97ec7f35352f3730cbc8a4cad4","unresolved":false,"context_lines":[{"line_number":318,"context_line":"        except exception.SheepdogCmdError as e:"},{"line_number":319,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":320,"context_line":"                LOG.error(_LE(\u0027Failed to get node list. %s\u0027), e)"},{"line_number":321,"context_line":"        node_list \u003d []"},{"line_number":322,"context_line":"        stdout \u003d _stdout.strip(\u0027\\n\u0027)"},{"line_number":323,"context_line":"        for line in stdout.split(\u0027\\n\u0027):"},{"line_number":324,"context_line":"            node_list.append(line.split()[1].split(\u0027:\u0027)[0])"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a1b2928_8f1189af","line":321,"in_reply_to":"9a061dce_6e586957","updated":"2016-04-11 15:24:51.000000000","message":"Great - as long as there\u0027s no case that there\u0027s no node list returned AND no error returned, then this all looks good.","commit_id":"bac0d4e550c0a1a9cef6befc9171c9d85cb0ac39"},{"author":{"_account_id":18967,"name":"zhangsong","email":"zhangsong@cmss.chinamobile.com","username":"zhangsong"},"change_message_id":"690e8a39e8ab2e5d707435932487d7ce6878cdb1","unresolved":false,"context_lines":[{"line_number":318,"context_line":"        except exception.SheepdogCmdError as e:"},{"line_number":319,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":320,"context_line":"                LOG.error(_LE(\u0027Failed to get node list. %s\u0027), e)"},{"line_number":321,"context_line":"        node_list \u003d []"},{"line_number":322,"context_line":"        stdout \u003d _stdout.strip(\u0027\\n\u0027)"},{"line_number":323,"context_line":"        for line in stdout.split(\u0027\\n\u0027):"},{"line_number":324,"context_line":"            node_list.append(line.split()[1].split(\u0027:\u0027)[0])"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_6e586957","line":321,"in_reply_to":"9a061dce_fc02810a","updated":"2016-04-09 02:28:05.000000000","message":"Hi, Ryan McNair. Thanks for your advice.\n\nBut I don\u0027t think we need this. If the dog command get an error, an SheepdogError or SheepdogCmdError will be raised in _run_dog method. Otherwise, the stdout may like this:\n\n0 10.133.17.61:7000 128 1\n\n1 10.133.17.62:7000 128 2\n\n2 10.133.17.63:7000 128 3\n\nAnd the node_list is always exists.\n\nThere is no case that dog command don\u0027t return an error but without node list in stdout.","commit_id":"bac0d4e550c0a1a9cef6befc9171c9d85cb0ac39"}]}
