)]}'
{"doc/source/deployment_guide.rst":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1f7881e010616b0fda534dcbe22543a5f80bde7c","unresolved":false,"context_lines":[{"line_number":119,"context_line":"\u003cmeta\u003e is a string of metadata for the device (optional), and \u003cweight\u003e is a"},{"line_number":120,"context_line":"float weight that determines how many partitions are put on the device relative"},{"line_number":121,"context_line":"to the rest of the devices in the cluster (a good starting point is 100.0 x TB"},{"line_number":122,"context_line":"on the drive). Add each device that will be initially in the cluster."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"Once all of the devices are added to the ring, run::"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5a890539_09924657","line":122,"updated":"2014-11-10 21:00:55.000000000","message":"If there\u0027s any change to the deployment docs that encourage the use of hostnames - IMHO, it must be noted along side that without local caching performance (and potentially dns infrastructure) will be a problem.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b7b8a6731a9e0f1fcf63320cffb2120831552dae","unresolved":false,"context_lines":[{"line_number":119,"context_line":"\u003cmeta\u003e is a string of metadata for the device (optional), and \u003cweight\u003e is a"},{"line_number":120,"context_line":"float weight that determines how many partitions are put on the device relative"},{"line_number":121,"context_line":"to the rest of the devices in the cluster (a good starting point is 100.0 x TB"},{"line_number":122,"context_line":"on the drive). Add each device that will be initially in the cluster."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"Once all of the devices are added to the ring, run::"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5a890539_24fc08b5","line":122,"in_reply_to":"5a890539_09924657","updated":"2014-12-03 15:01:51.000000000","message":"Thanks for the review. I removed the changes on the deployment docs. I think swift recommended ip rather than hostname so I removed them to avoid misleading.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"}],"requirements.txt":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3656f7a4092e1955442763f4aca3ced107a9a01d","unresolved":false,"context_lines":[{"line_number":5,"context_line":"dnspython\u003e\u003d1.9.4"},{"line_number":6,"context_line":"eventlet\u003e\u003d0.9.15"},{"line_number":7,"context_line":"greenlet\u003e\u003d0.3.1"},{"line_number":8,"context_line":"netaddr\u003e\u003d0.7.12"},{"line_number":9,"context_line":"netifaces\u003e\u003d0.5,!\u003d0.10.0,!\u003d0.10.1"},{"line_number":10,"context_line":"pastedeploy\u003e\u003d1.3.3"},{"line_number":11,"context_line":"simplejson\u003e\u003d2.0.9"}],"source_content_type":"text/plain","patch_set":3,"id":"3a961159_dbc05c4c","line":8,"updated":"2015-01-07 22:29:16.000000000","message":"new depends should be called out in the commit message","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":5,"context_line":"dnspython\u003e\u003d1.9.4"},{"line_number":6,"context_line":"eventlet\u003e\u003d0.9.15"},{"line_number":7,"context_line":"greenlet\u003e\u003d0.3.1"},{"line_number":8,"context_line":"netaddr\u003e\u003d0.7.12"},{"line_number":9,"context_line":"netifaces\u003e\u003d0.5,!\u003d0.10.0,!\u003d0.10.1"},{"line_number":10,"context_line":"pastedeploy\u003e\u003d1.3.3"},{"line_number":11,"context_line":"simplejson\u003e\u003d2.0.9"}],"source_content_type":"text/plain","patch_set":3,"id":"3a961159_835f3b0e","line":8,"in_reply_to":"3a961159_dbc05c4c","updated":"2015-01-14 07:01:14.000000000","message":"thanks for the comment. I will remove this dependency.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"}],"swift/account/reaper.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3656f7a4092e1955442763f4aca3ced107a9a01d","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                continue"},{"line_number":162,"context_line":"            nodes \u003d self.get_account_ring().get_part_nodes(int(partition))"},{"line_number":163,"context_line":"            if not is_local_device(self.myips, nodes[0][\u0027port\u0027],"},{"line_number":164,"context_line":"                                   nodes[0][\u0027ip\u0027], nodes[0][\u0027port\u0027]) or\\"},{"line_number":165,"context_line":"                    not os.path.isdir(partition_path):"},{"line_number":166,"context_line":"                continue"},{"line_number":167,"context_line":"            for suffix in os.listdir(partition_path):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_5e6ffac3","line":164,"updated":"2015-01-07 22:29:16.000000000","message":"isn\u0027t the signature of this method:\n\n    is_local_device(my_ips, my_port, remote_ip, remote_port)\n\nI mean I guess the the reaper doesn\u0027t really have a \"port\" - but neither does the replicator really - it\u0027s just looks at the port in the default section of the object-server.conf.  And I think on multi-node clusters the intent of this code originally was that the reaper only runs on the primary replica of the account [1].\n\nOddly this preserves existing behavior on a swift-all-in-one... in that all account reapers reap all their accounts because the ip\u0027s always match.\n\nIt looks like a bug the way it is, and I\u0027m not suggesting you have to fix it - but if we\u0027re going to carry the bug forward I think a comment explaining, \"this looks wrong, but it\u0027s done this way intentionally because this is how it worked before\" [2]\n\n1. I think we decided one time that behavior bad because the deleted flag doesn\u0027t get replicated, maybe that got fixed.  Or maybe it\u0027s related to this bug https://bugs.launchpad.net/swift/+bug/1332439\n\n2. I really hope we can come up with something more useful to say there... maybe we can discuss in channel and trick someone else into coming up with a good idea for us?","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                continue"},{"line_number":162,"context_line":"            nodes \u003d self.get_account_ring().get_part_nodes(int(partition))"},{"line_number":163,"context_line":"            if not is_local_device(self.myips, nodes[0][\u0027port\u0027],"},{"line_number":164,"context_line":"                                   nodes[0][\u0027ip\u0027], nodes[0][\u0027port\u0027]) or\\"},{"line_number":165,"context_line":"                    not os.path.isdir(partition_path):"},{"line_number":166,"context_line":"                continue"},{"line_number":167,"context_line":"            for suffix in os.listdir(partition_path):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_2ecc158a","line":164,"in_reply_to":"3a961159_5e6ffac3","updated":"2015-01-14 07:01:14.000000000","message":"thanks for the comment. \n\nI wrote my understanding in the followingbecause I think I couldn\u0027t get good understanding of your comment. Is it correct understanding?\n\nMulti-node clusters:\nthere is known bug #1332439. it is OK to *not* make a fix for the bug with this patch but needs some comment  \"this looks wrong, but it\u0027s done this way intentionally because this is how it worked before\" for it. And it\u0027s better to discuss it(come up with somithing more useful to say here).\n\nSwift-All-In-One:\nIp is always match. If I use bind_port in the default section of account-server.conf instead of my_port, there are confs for each account-servers in  swift-all-in-one, the ip and the bind_port are useful to distinguish a local device.\nI will use the bind_port in account-server.conf.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"}],"swift/cli/ringbuilder.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1f7881e010616b0fda534dcbe22543a5f80bde7c","unresolved":false,"context_lines":[{"line_number":391,"context_line":"swift-ring-builder \u003cbuilder_file\u003e add"},{"line_number":392,"context_line":"    [r\u003cregion\u003e]z\u003czone\u003e-\u003cip\u003e:\u003cport\u003e[|\u003cr_ip\u003e:\u003cr_port\u003e]/\u003cdevice_name\u003e_\u003cmeta\u003e"},{"line_number":393,"context_line":"     \u003cweight\u003e"},{"line_number":394,"context_line":"    [[r\u003cregion\u003e]z\u003czone\u003e-\u003cip\u003e:\u003cport\u003e[|\u003cr_ip\u003e:\u003cr_port\u003e]/\u003cdevice_name\u003e_\u003cmeta\u003e"},{"line_number":395,"context_line":"     \u003cweight\u003e] ..."},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"    Where \u003cr_ip\u003e and \u003cr_port\u003e are replication ip and port."}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_294b825a","line":394,"updated":"2014-11-10 21:00:55.000000000","message":"looks like a breaking syntax change","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b7b8a6731a9e0f1fcf63320cffb2120831552dae","unresolved":false,"context_lines":[{"line_number":391,"context_line":"swift-ring-builder \u003cbuilder_file\u003e add"},{"line_number":392,"context_line":"    [r\u003cregion\u003e]z\u003czone\u003e-\u003cip\u003e:\u003cport\u003e[|\u003cr_ip\u003e:\u003cr_port\u003e]/\u003cdevice_name\u003e_\u003cmeta\u003e"},{"line_number":393,"context_line":"     \u003cweight\u003e"},{"line_number":394,"context_line":"    [[r\u003cregion\u003e]z\u003czone\u003e-\u003cip\u003e:\u003cport\u003e[|\u003cr_ip\u003e:\u003cr_port\u003e]/\u003cdevice_name\u003e_\u003cmeta\u003e"},{"line_number":395,"context_line":"     \u003cweight\u003e] ..."},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"    Where \u003cr_ip\u003e and \u003cr_port\u003e are replication ip and port."}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_e41cc015","line":394,"in_reply_to":"5a890539_294b825a","updated":"2014-12-03 15:01:51.000000000","message":"Thanks for the review. I keep the current syntax in the next patch.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1f7881e010616b0fda534dcbe22543a5f80bde7c","unresolved":false,"context_lines":[{"line_number":506,"context_line":"                    and change_value[0] !\u003d \u0027:\u0027\\"},{"line_number":507,"context_line":"                    and change_value[0] !\u003d \u0027|\u0027\\"},{"line_number":508,"context_line":"                    and change_value[0] !\u003d \u0027/\u0027\\"},{"line_number":509,"context_line":"                    and change_value[0] !\u003d \u0027_\u0027:"},{"line_number":510,"context_line":"                i \u003d 1"},{"line_number":511,"context_line":"                # this loop only parses ipv4"},{"line_number":512,"context_line":"                # ipv6 must be enclosed in []"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_a941320d","line":509,"updated":"2014-11-10 21:00:55.000000000","message":"yuk.  can this parsing be simplified if extracted to a library method?","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b7b8a6731a9e0f1fcf63320cffb2120831552dae","unresolved":false,"context_lines":[{"line_number":506,"context_line":"                    and change_value[0] !\u003d \u0027:\u0027\\"},{"line_number":507,"context_line":"                    and change_value[0] !\u003d \u0027|\u0027\\"},{"line_number":508,"context_line":"                    and change_value[0] !\u003d \u0027/\u0027\\"},{"line_number":509,"context_line":"                    and change_value[0] !\u003d \u0027_\u0027:"},{"line_number":510,"context_line":"                i \u003d 1"},{"line_number":511,"context_line":"                # this loop only parses ipv4"},{"line_number":512,"context_line":"                # ipv6 must be enclosed in []"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_64d8d053","line":509,"in_reply_to":"5a890539_a941320d","updated":"2014-12-03 15:01:51.000000000","message":"Thanks!. I updated the code with the point of this review in the next patch.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a10135ad4d61036012ff5a27c3022bc47843f471","unresolved":false,"context_lines":[{"line_number":637,"context_line":"or"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"swift-ring-builder \u003cbuilder_file\u003e add"},{"line_number":640,"context_line":"    [--region \u003cregion\u003e] --zone \u003czone\u003e --ip \u003cip or hostname\u003e --port \u003cport\u003e"},{"line_number":641,"context_line":"    [--replication-ip \u003cr_ip or r_hostname\u003e] [--replication-port \u003cr_port\u003e]"},{"line_number":642,"context_line":"    --device \u003cdevice_name\u003e --meta \u003cmeta\u003e --weight \u003cweight\u003e"},{"line_number":643,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa81d914_8cb015df","line":640,"updated":"2015-01-28 05:26:07.000000000","message":"Aww, you\u0027ve undone my fixlet:\n https://review.openstack.org/#/c/146266/2/swift/cli/ringbuilder.py\n\nPlease don\u0027t do that.","commit_id":"68084ecffdc5467279c044d7f137c7c879b3dc83"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"cdfcb58aac78cdd9223d89434c8d7e392486f9da","unresolved":false,"context_lines":[{"line_number":637,"context_line":"or"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"swift-ring-builder \u003cbuilder_file\u003e add"},{"line_number":640,"context_line":"    [--region \u003cregion\u003e] --zone \u003czone\u003e --ip \u003cip or hostname\u003e --port \u003cport\u003e"},{"line_number":641,"context_line":"    [--replication-ip \u003cr_ip or r_hostname\u003e] [--replication-port \u003cr_port\u003e]"},{"line_number":642,"context_line":"    --device \u003cdevice_name\u003e --meta \u003cmeta\u003e --weight \u003cweight\u003e"},{"line_number":643,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa81d914_86d8e61e","line":640,"in_reply_to":"fa81d914_8cb015df","updated":"2015-01-28 10:27:08.000000000","message":"thanks for the review. I think it is my fault to merge the code. I will fix this.","commit_id":"68084ecffdc5467279c044d7f137c7c879b3dc83"}],"swift/common/ring/builder.py":[{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":1111,"context_line":"            builder \u003d RingBuilder(1, 1, 1)"},{"line_number":1112,"context_line":"            builder.copy_from(builder_dict)"},{"line_number":1113,"context_line":"        for dev in builder.devs:"},{"line_number":1114,"context_line":"            # really old rings didn\u0027t have meta keys"},{"line_number":1115,"context_line":"            if dev and \u0027meta\u0027 not in dev:"},{"line_number":1116,"context_line":"                dev[\u0027meta\u0027] \u003d \u0027\u0027"},{"line_number":1117,"context_line":"            # NOTE(akscram): An old ring builder file don\u0027t contain"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_27bd9368","line":1114,"updated":"2015-01-14 07:01:14.000000000","message":"I removed this change.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a10135ad4d61036012ff5a27c3022bc47843f471","unresolved":false,"context_lines":[{"line_number":1308,"context_line":"                                matched \u003d False"},{"line_number":1309,"context_line":"                        elif key \u003d\u003d \u0027ip\u0027 or key \u003d\u003d \u0027replication_ip\u0027:"},{"line_number":1310,"context_line":"                            try:"},{"line_number":1311,"context_line":"                                dev[key] \u003d validate_and_normalize_address("},{"line_number":1312,"context_line":"                                    dev.get(key, \u0027\u0027))"},{"line_number":1313,"context_line":"                            except ValueError:"},{"line_number":1314,"context_line":"                                dev[key] \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa81d914_8d200f9d","line":1311,"updated":"2015-01-28 05:26:07.000000000","message":"Sorry, I don\u0027t like these sudden side effects, however well-intentioned. Either validate and normalize when devs are added to self.devs{}, or clone dicts and normalize what you put into matched_devs.","commit_id":"68084ecffdc5467279c044d7f137c7c879b3dc83"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"cdfcb58aac78cdd9223d89434c8d7e392486f9da","unresolved":false,"context_lines":[{"line_number":1308,"context_line":"                                matched \u003d False"},{"line_number":1309,"context_line":"                        elif key \u003d\u003d \u0027ip\u0027 or key \u003d\u003d \u0027replication_ip\u0027:"},{"line_number":1310,"context_line":"                            try:"},{"line_number":1311,"context_line":"                                dev[key] \u003d validate_and_normalize_address("},{"line_number":1312,"context_line":"                                    dev.get(key, \u0027\u0027))"},{"line_number":1313,"context_line":"                            except ValueError:"},{"line_number":1314,"context_line":"                                dev[key] \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa81d914_b3353148","line":1311,"in_reply_to":"fa81d914_8d200f9d","updated":"2015-01-28 10:27:08.000000000","message":"Thanks for the review. With this patch validate and normalize are done when devs are added but I think this logic is necessary for keeping backward compatibility. The situation is if devs were added before this patch (means without no validation and normalization) then apply this, the comparison will fail. What do you think?","commit_id":"68084ecffdc5467279c044d7f137c7c879b3dc83"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"97a0f934cc2145238b94b247981298799cedd5e3","unresolved":false,"context_lines":[{"line_number":1308,"context_line":"                                matched \u003d False"},{"line_number":1309,"context_line":"                        elif key \u003d\u003d \u0027ip\u0027 or key \u003d\u003d \u0027replication_ip\u0027:"},{"line_number":1310,"context_line":"                            try:"},{"line_number":1311,"context_line":"                                dev[key] \u003d validate_and_normalize_address("},{"line_number":1312,"context_line":"                                    dev.get(key, \u0027\u0027))"},{"line_number":1313,"context_line":"                            except ValueError:"},{"line_number":1314,"context_line":"                                dev[key] \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa81d914_e36242d7","line":1311,"in_reply_to":"fa81d914_9aacabef","updated":"2015-02-01 11:17:02.000000000","message":"Thanks for the review.\nSorry, now I understand your first comment. you mentioned that put a validate \u0026 normalize value in dev[key] should be avoided. I will fix it.\n\nFYI: I think they \"can\" be invalid because there is no check for ip addresses when they are registered. \nhttp://paste.openstack.org/show/163500/\nOnly check whether characters of an ip address are digits or \u0027.\u0027 so it is possible to register invalid ip addresses with current logic.","commit_id":"68084ecffdc5467279c044d7f137c7c879b3dc83"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"86ef917c15535aa1a2bd83c351d10b289e5eeb6d","unresolved":false,"context_lines":[{"line_number":1308,"context_line":"                                matched \u003d False"},{"line_number":1309,"context_line":"                        elif key \u003d\u003d \u0027ip\u0027 or key \u003d\u003d \u0027replication_ip\u0027:"},{"line_number":1310,"context_line":"                            try:"},{"line_number":1311,"context_line":"                                dev[key] \u003d validate_and_normalize_address("},{"line_number":1312,"context_line":"                                    dev.get(key, \u0027\u0027))"},{"line_number":1313,"context_line":"                            except ValueError:"},{"line_number":1314,"context_line":"                                dev[key] \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa81d914_9aacabef","line":1311,"in_reply_to":"fa81d914_b3353148","updated":"2015-01-28 16:48:02.000000000","message":"I do not buy the argument about pre-existing devices. They were all using the quad-decimal notation. Surely they can\u0027t be invalid?","commit_id":"68084ecffdc5467279c044d7f137c7c879b3dc83"}],"swift/common/ring/utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1f7881e010616b0fda534dcbe22543a5f80bde7c","unresolved":false,"context_lines":[{"line_number":283,"context_line":"            and search_value[0] !\u003d \u0027:\u0027\\"},{"line_number":284,"context_line":"            and search_value[0] !\u003d \u0027|\u0027\\"},{"line_number":285,"context_line":"            and search_value[0] !\u003d \u0027/\u0027\\"},{"line_number":286,"context_line":"            and search_value[0] !\u003d \u0027_\u0027:"},{"line_number":287,"context_line":"        i \u003d 1"},{"line_number":288,"context_line":"        # this loop only parses ipv4"},{"line_number":289,"context_line":"        # ipv6 must be enclosed in []"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_49bb6e0e","line":286,"updated":"2014-11-10 21:00:55.000000000","message":"this seems very similar to the change made in the cli code - can they be consolidated?","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b7b8a6731a9e0f1fcf63320cffb2120831552dae","unresolved":false,"context_lines":[{"line_number":283,"context_line":"            and search_value[0] !\u003d \u0027:\u0027\\"},{"line_number":284,"context_line":"            and search_value[0] !\u003d \u0027|\u0027\\"},{"line_number":285,"context_line":"            and search_value[0] !\u003d \u0027/\u0027\\"},{"line_number":286,"context_line":"            and search_value[0] !\u003d \u0027_\u0027:"},{"line_number":287,"context_line":"        i \u003d 1"},{"line_number":288,"context_line":"        # this loop only parses ipv4"},{"line_number":289,"context_line":"        # ipv6 must be enclosed in []"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_84b05cfe","line":286,"in_reply_to":"5a890539_49bb6e0e","updated":"2014-12-03 15:01:51.000000000","message":"Thanks for the review. I updated the code with the point of this review in the next patch.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3656f7a4092e1955442763f4aca3ced107a9a01d","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    try:"},{"line_number":205,"context_line":"        return netaddr.valid_ipv4(ip)"},{"line_number":206,"context_line":"    except Exception:"},{"line_number":207,"context_line":"        return False"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"def is_valid_ipv6(ip):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_7ee836e2","line":207,"updated":"2015-01-07 22:29:16.000000000","message":"what kind of exception is getting raised here?\n\nAre these methods really worth a new dependency?","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    try:"},{"line_number":205,"context_line":"        return netaddr.valid_ipv4(ip)"},{"line_number":206,"context_line":"    except Exception:"},{"line_number":207,"context_line":"        return False"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"def is_valid_ipv6(ip):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_036b4bf1","line":207,"in_reply_to":"3a961159_7ee836e2","updated":"2015-01-14 07:01:14.000000000","message":"thanks for the comment. there is no expectation for the exception here but i put \u0027except Exception\u0027 for safety. i will remove it.\n\ni think it\u0027s not preferable to develop own ip check because we can use proven logic. but I recognized your concern I use the module for just two steps so I will use socket module(i found a good example).","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":371,"context_line":"                i +\u003d 1"},{"line_number":372,"context_line":"            match[\u0027replication_port\u0027] \u003d int(search_value[1:i])"},{"line_number":373,"context_line":"            search_value \u003d search_value[i:]"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"    if search_value.startswith(\u0027/\u0027):"},{"line_number":376,"context_line":"        i \u003d 1"},{"line_number":377,"context_line":"        while i \u003c len(search_value) and search_value[i] !\u003d \u0027_\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_676a3bee","line":374,"updated":"2015-01-14 07:01:14.000000000","message":"I removed this line.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"}],"swift/common/utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1f7881e010616b0fda534dcbe22543a5f80bde7c","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        fallocate is preferred because we need the on-disk size to match"},{"line_number":491,"context_line":"        the allocated size. Older versions of sqlite require that the"},{"line_number":492,"context_line":"        two sizes match. However, fallocate is Linux only."},{"line_number":493,"context_line":"        \"\"\""},{"line_number":494,"context_line":"        for func in (\u0027fallocate\u0027, \u0027posix_fallocate\u0027):"},{"line_number":495,"context_line":"            self.func_name \u003d func"},{"line_number":496,"context_line":"            self.fallocate \u003d load_libc_function(func, log_error\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_099326a4","line":493,"updated":"2014-11-10 21:00:55.000000000","message":"this sort of unrelated clean up can cause a lot of pain in patch review - in my case at least I don\u0027t see it appropriate to change a multi-line comment inline to from lines obviously prefixed with a comment marker to an inline multi-line string.\n\nPlease remove these types of drive-by cleanups from this patch so reviewers can focus on what is important.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b7b8a6731a9e0f1fcf63320cffb2120831552dae","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        fallocate is preferred because we need the on-disk size to match"},{"line_number":491,"context_line":"        the allocated size. Older versions of sqlite require that the"},{"line_number":492,"context_line":"        two sizes match. However, fallocate is Linux only."},{"line_number":493,"context_line":"        \"\"\""},{"line_number":494,"context_line":"        for func in (\u0027fallocate\u0027, \u0027posix_fallocate\u0027):"},{"line_number":495,"context_line":"            self.func_name \u003d func"},{"line_number":496,"context_line":"            self.fallocate \u003d load_libc_function(func, log_error\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_2a63ea1a","line":493,"in_reply_to":"5a890539_099326a4","updated":"2014-12-03 15:01:51.000000000","message":"Thanks for the review. I understand your point. This comment hits pep8(E266) so I changed it. I removed the change.\n\nE266 too many leading \"#\" for block comment [pep8]","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1f7881e010616b0fda534dcbe22543a5f80bde7c","unresolved":false,"context_lines":[{"line_number":884,"context_line":""},{"line_number":885,"context_line":""},{"line_number":886,"context_line":"class GreenthreadSafeIterator(object):"},{"line_number":887,"context_line":""},{"line_number":888,"context_line":"    \"\"\""},{"line_number":889,"context_line":"    Wrap an iterator to ensure that only one greenthread is inside its next()"},{"line_number":890,"context_line":"    method at a time."}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_2962a2d8","line":887,"updated":"2014-11-10 21:00:55.000000000","message":"unnecessary whitespace.  pep 257 seems to recommend (in my reading) that you should start the string on the first line following the definition.  If you have a style guide where this sort of deferntiation in style between functions and classes is recommend it may be worth referencing it for my own edification, but as I\u0027m sure you\u0027ve noticed it\u0027s not something that is followed in Swift.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b7b8a6731a9e0f1fcf63320cffb2120831552dae","unresolved":false,"context_lines":[{"line_number":884,"context_line":""},{"line_number":885,"context_line":""},{"line_number":886,"context_line":"class GreenthreadSafeIterator(object):"},{"line_number":887,"context_line":""},{"line_number":888,"context_line":"    \"\"\""},{"line_number":889,"context_line":"    Wrap an iterator to ensure that only one greenthread is inside its next()"},{"line_number":890,"context_line":"    method at a time."}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_44a114a8","line":887,"in_reply_to":"5a890539_2962a2d8","updated":"2014-12-03 15:01:51.000000000","message":"Thanks for the review. I removed them.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1f7881e010616b0fda534dcbe22543a5f80bde7c","unresolved":false,"context_lines":[{"line_number":1556,"context_line":"def expand_ipv6(address):"},{"line_number":1557,"context_line":"    \"\"\""},{"line_number":1558,"context_line":"    Return fully expanded ipv6 address (assumes input is valid ipv6 address)"},{"line_number":1559,"context_line":"    \"\"\""},{"line_number":1560,"context_line":"    ipv6_address \u003d address.lower()"},{"line_number":1561,"context_line":"    full_address \u003d \"\""},{"line_number":1562,"context_line":"    expanded_address \u003d \"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_49e44e3b","line":1559,"updated":"2014-11-10 21:00:55.000000000","message":"as a pure function is seems like this would be a great candidate for a bunch of test validation.  As it stands I can\u0027t really see what the expected input and output of this function is.  I gather both input and output are expected to be strings.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b7b8a6731a9e0f1fcf63320cffb2120831552dae","unresolved":false,"context_lines":[{"line_number":1556,"context_line":"def expand_ipv6(address):"},{"line_number":1557,"context_line":"    \"\"\""},{"line_number":1558,"context_line":"    Return fully expanded ipv6 address (assumes input is valid ipv6 address)"},{"line_number":1559,"context_line":"    \"\"\""},{"line_number":1560,"context_line":"    ipv6_address \u003d address.lower()"},{"line_number":1561,"context_line":"    full_address \u003d \"\""},{"line_number":1562,"context_line":"    expanded_address \u003d \"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_0719ce79","line":1559,"in_reply_to":"5a890539_49e44e3b","updated":"2014-12-03 15:01:51.000000000","message":"Thanks for the review. I wrote doc-string for this func.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1f7881e010616b0fda534dcbe22543a5f80bde7c","unresolved":false,"context_lines":[{"line_number":1610,"context_line":"                    # If we have an ipv6 address remove the"},{"line_number":1611,"context_line":"                    # %ether_interface at the end"},{"line_number":1612,"context_line":"                    if family \u003d\u003d netifaces.AF_INET6:"},{"line_number":1613,"context_line":"                        addr \u003d expand_ipv6(addr.split(\u0027%\u0027)[0])"},{"line_number":1614,"context_line":"                    addresses.append(addr)"},{"line_number":1615,"context_line":"        except ValueError:"},{"line_number":1616,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_29f1c2cd","line":1613,"updated":"2014-11-10 21:00:55.000000000","message":"this behavior change is probably worth an update to the docstring for this function.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b7b8a6731a9e0f1fcf63320cffb2120831552dae","unresolved":false,"context_lines":[{"line_number":1610,"context_line":"                    # If we have an ipv6 address remove the"},{"line_number":1611,"context_line":"                    # %ether_interface at the end"},{"line_number":1612,"context_line":"                    if family \u003d\u003d netifaces.AF_INET6:"},{"line_number":1613,"context_line":"                        addr \u003d expand_ipv6(addr.split(\u0027%\u0027)[0])"},{"line_number":1614,"context_line":"                    addresses.append(addr)"},{"line_number":1615,"context_line":"        except ValueError:"},{"line_number":1616,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_2a44cf45","line":1613,"in_reply_to":"5a890539_29f1c2cd","updated":"2014-12-03 15:01:51.000000000","message":"Thanks for the review. I wrote a doc-string for expand_ipv6 func.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":864,"context_line":"                        this many elements; default is 0 (rate limit"},{"line_number":865,"context_line":"                        immediately)"},{"line_number":866,"context_line":"    \"\"\""},{"line_number":867,"context_line":""},{"line_number":868,"context_line":"    def __init__(self, iterable, elements_per_second, limit_after\u003d0):"},{"line_number":869,"context_line":"        self.iterator \u003d iter(iterable)"},{"line_number":870,"context_line":"        self.elements_per_second \u003d elements_per_second"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_a7a3439c","line":867,"updated":"2015-01-14 07:01:14.000000000","message":"I removed this line.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":894,"context_line":"    an error like \"ValueError: generator already executing\". By wrapping calls"},{"line_number":895,"context_line":"    to next() with a mutex, we avoid that error."},{"line_number":896,"context_line":"    \"\"\""},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"    def __init__(self, unsafe_iterable):"},{"line_number":899,"context_line":"        self.unsafe_iter \u003d iter(unsafe_iterable)"},{"line_number":900,"context_line":"        self.semaphore \u003d eventlet.semaphore.Semaphore(value\u003d1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_e7a9cb7c","line":897,"updated":"2015-01-14 07:01:14.000000000","message":"I removed this line.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":957,"context_line":""},{"line_number":958,"context_line":""},{"line_number":959,"context_line":"class StatsdClient(object):"},{"line_number":960,"context_line":""},{"line_number":961,"context_line":"    def __init__(self, host, port, base_prefix\u003d\u0027\u0027, tail_prefix\u003d\u0027\u0027,"},{"line_number":962,"context_line":"                 default_sample_rate\u003d1, sample_rate_factor\u003d1, logger\u003dNone):"},{"line_number":963,"context_line":"        self._host \u003d host"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_e7c0eb2c","line":960,"updated":"2015-01-14 07:01:14.000000000","message":"I removed this line.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"    Like a weak reference, but passes through a couple methods that logging"},{"line_number":1075,"context_line":"    handlers need."},{"line_number":1076,"context_line":"    \"\"\""},{"line_number":1077,"context_line":""},{"line_number":1078,"context_line":"    def close(self):"},{"line_number":1079,"context_line":"        referent \u003d self()"},{"line_number":1080,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_27de7311","line":1077,"updated":"2015-01-14 07:01:14.000000000","message":"I removed this line.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3656f7a4092e1955442763f4aca3ced107a9a01d","unresolved":false,"context_lines":[{"line_number":1586,"context_line":"    # remove trailing colon"},{"line_number":1587,"context_line":"    if expanded_address[-1] \u003d\u003d \":\":"},{"line_number":1588,"context_line":"        expanded_address \u003d expanded_address[:-1]"},{"line_number":1589,"context_line":"    return expanded_address"},{"line_number":1590,"context_line":""},{"line_number":1591,"context_line":""},{"line_number":1592,"context_line":"def whataremyips():"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_fedee60f","line":1589,"updated":"2015-01-07 22:29:16.000000000","message":"so does neither netaddr or netifaces have this code for us?  I have no idea if there\u0027s edge cases in here - I\u0027d probably have to go read some rfc.  Did you have a full grammer for the ipv6 addresses handy when you wrote this - can you reference some sort of official web group somewhere that says exactly what an expanded ipv6 address is supposed to look like?","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":1586,"context_line":"    # remove trailing colon"},{"line_number":1587,"context_line":"    if expanded_address[-1] \u003d\u003d \":\":"},{"line_number":1588,"context_line":"        expanded_address \u003d expanded_address[:-1]"},{"line_number":1589,"context_line":"    return expanded_address"},{"line_number":1590,"context_line":""},{"line_number":1591,"context_line":""},{"line_number":1592,"context_line":"def whataremyips():"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_12846fd1","line":1589,"in_reply_to":"3a961159_fedee60f","updated":"2015-01-14 07:01:14.000000000","message":"thanks for the comment.\nI wrote some code using socket module which I\u0027m using for checking ip validation instead of netaddr module. Here is sample code and it\u0027s result. \nhttp://paste.openstack.org/show/155971/\n\nIt looks normalized but not fully expanded. I think fully expanded is important in the case if operators Ring files a node then copy it to other nodes because this normalization is dependent on library implementation (most libraries support RFC5952). \nBut when it uses for comparison, I executed normalization with same library so I will rewrite with above logic. \n\nSecond url summarizes the point of ipv6 address. and above url is a good example.\nRFCs:\nhttps://tools.ietf.org/html/rfc4291#section-2.2\nhttps://tools.ietf.org/html/rfc5952#section-2","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":2120,"context_line":""},{"line_number":2121,"context_line":"    Correlating results with jobs (if necessary) is left to the caller."},{"line_number":2122,"context_line":"    \"\"\""},{"line_number":2123,"context_line":""},{"line_number":2124,"context_line":"    def __init__(self, size):"},{"line_number":2125,"context_line":"        \"\"\""},{"line_number":2126,"context_line":"        :param size: size pool of green threads to use"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_67e4fbdf","line":2123,"updated":"2015-01-14 07:01:14.000000000","message":"I removed this line.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":2595,"context_line":"    Like itertools.chain, but with a close method that will attempt to invoke"},{"line_number":2596,"context_line":"    its sub-iterators\u0027 close methods, if any."},{"line_number":2597,"context_line":"    \"\"\""},{"line_number":2598,"context_line":""},{"line_number":2599,"context_line":"    def __init__(self, *iterables):"},{"line_number":2600,"context_line":"        self.iterables \u003d iterables"},{"line_number":2601,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_e7d70bec","line":2598,"updated":"2015-01-14 07:01:14.000000000","message":"I removed this line.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":2635,"context_line":"    File-like object that counts bytes read."},{"line_number":2636,"context_line":"    To be swapped in for wsgi.input for accounting purposes."},{"line_number":2637,"context_line":"    \"\"\""},{"line_number":2638,"context_line":""},{"line_number":2639,"context_line":"    def __init__(self, wsgi_input):"},{"line_number":2640,"context_line":"        \"\"\""},{"line_number":2641,"context_line":"        :param wsgi_input: file-like object to wrap the functionality of"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_67fb1b7b","line":2638,"updated":"2015-01-14 07:01:14.000000000","message":"I remove this line.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":2782,"context_line":"    \"\"\""},{"line_number":2783,"context_line":""},{"line_number":2784,"context_line":"    BYTE \u003d \u0027a\u0027.encode(\u0027utf-8\u0027)"},{"line_number":2785,"context_line":""},{"line_number":2786,"context_line":"    def __init__(self, nthreads\u003d2):"},{"line_number":2787,"context_line":"        self.nthreads \u003d nthreads"},{"line_number":2788,"context_line":"        self._run_queue \u003d Queue()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_277af3f0","line":2785,"updated":"2015-01-14 07:01:14.000000000","message":"I kept this change because doc string doesn\u0027t work with previous.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":3189,"context_line":""},{"line_number":3190,"context_line":""},{"line_number":3191,"context_line":"class sockaddr_alg(ctypes.Structure):"},{"line_number":3192,"context_line":""},{"line_number":3193,"context_line":"    _fields_ \u003d [(\"salg_family\", ctypes.c_ushort),"},{"line_number":3194,"context_line":"                (\"salg_type\", ctypes.c_ubyte * 14),"},{"line_number":3195,"context_line":"                (\"salg_feat\", ctypes.c_uint),"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_2713d3b8","line":3192,"updated":"2015-01-14 07:01:14.000000000","message":"I removed this line.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"}],"test/unit/account/test_reaper.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a10135ad4d61036012ff5a27c3022bc47843f471","unresolved":false,"context_lines":[{"line_number":463,"context_line":"                     self.fake_reap_account)]"},{"line_number":464,"context_line":"        with nested(*ctx):"},{"line_number":465,"context_line":"            r.reap_device(\u0027sda1\u0027)"},{"line_number":466,"context_line":"        self.assertEqual(self.called_amount, 0)"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"    def test_reap_device_with_ts(self):"},{"line_number":469,"context_line":"        devices \u003d self.prepare_data_dir(ts\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa81d914_8df3af09","line":466,"updated":"2015-01-28 05:26:07.000000000","message":"I do not understand why this is valid.","commit_id":"68084ecffdc5467279c044d7f137c7c879b3dc83"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"cdfcb58aac78cdd9223d89434c8d7e392486f9da","unresolved":false,"context_lines":[{"line_number":463,"context_line":"                     self.fake_reap_account)]"},{"line_number":464,"context_line":"        with nested(*ctx):"},{"line_number":465,"context_line":"            r.reap_device(\u0027sda1\u0027)"},{"line_number":466,"context_line":"        self.assertEqual(self.called_amount, 0)"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"    def test_reap_device_with_ts(self):"},{"line_number":469,"context_line":"        devices \u003d self.prepare_data_dir(ts\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa81d914_c6173ea2","line":466,"in_reply_to":"fa81d914_8df3af09","updated":"2015-01-28 10:27:08.000000000","message":"thanks for the review. you are right. I should fix the info in FakeRing. I will fix it.","commit_id":"68084ecffdc5467279c044d7f137c7c879b3dc83"}],"test/unit/cli/test_ringbuilder.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1f7881e010616b0fda534dcbe22543a5f80bde7c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        # (see below) but not the second device"},{"line_number":35,"context_line":"        self.search_values \u003d [\"d0\", \"/sda1\", \"r0\", \"z0\", \"z0-127.0.0.1\","},{"line_number":36,"context_line":"                              \"127.0.0.1\", \"z0:6000\", \":6000\", \"|127.0.0.1\","},{"line_number":37,"context_line":"                              \"127.0.0.1|127.0.0.1\", \"|:6000\","},{"line_number":38,"context_line":"                              \"_some meta data\"]"},{"line_number":39,"context_line":"        tmpf \u003d tempfile.NamedTemporaryFile()"},{"line_number":40,"context_line":"        self.tmpfile \u003d tmpf.name"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_296c629c","line":37,"updated":"2014-11-10 21:00:55.000000000","message":"seems somewhat obvious this syntax change will break existing scripts - a backwards incompatible change will require *very* strong justification.  Normally something like \"this bug is impossible to fix without a a backwards incompatible change\" - in this case I don\u0027t see that argument would apply to a new feature.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b7b8a6731a9e0f1fcf63320cffb2120831552dae","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        # (see below) but not the second device"},{"line_number":35,"context_line":"        self.search_values \u003d [\"d0\", \"/sda1\", \"r0\", \"z0\", \"z0-127.0.0.1\","},{"line_number":36,"context_line":"                              \"127.0.0.1\", \"z0:6000\", \":6000\", \"|127.0.0.1\","},{"line_number":37,"context_line":"                              \"127.0.0.1|127.0.0.1\", \"|:6000\","},{"line_number":38,"context_line":"                              \"_some meta data\"]"},{"line_number":39,"context_line":"        tmpf \u003d tempfile.NamedTemporaryFile()"},{"line_number":40,"context_line":"        self.tmpfile \u003d tmpf.name"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_8753fe14","line":37,"in_reply_to":"5a890539_296c629c","updated":"2014-12-03 15:01:51.000000000","message":"Thanks for the review. I keep the current syntax in the next patch.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"}],"test/unit/common/test_utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1f7881e010616b0fda534dcbe22543a5f80bde7c","unresolved":false,"context_lines":[{"line_number":1457,"context_line":"            self.assertEquals(utils.whataremyips(), [])"},{"line_number":1458,"context_line":""},{"line_number":1459,"context_line":"    def test_whataremyips_ipv6(self):"},{"line_number":1460,"context_line":"        test_ipv6_address \u003d utils.expand_ipv6(\u00272001:6b0:dead:beef:2::32\u0027)"},{"line_number":1461,"context_line":"        test_interface \u003d \u0027eth0\u0027"},{"line_number":1462,"context_line":""},{"line_number":1463,"context_line":"        def my_ipv6_interfaces():"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_e9e6da15","line":1460,"updated":"2014-11-10 21:00:55.000000000","message":"it seems like the netifaces module returns the un-normalized form.  Since you\u0027ve added the normalization/expansion to the whataremyips method behavior I think it would be more appropriate to this test if you changed the assertion instead of the mocked return value from the library.  It would also be a better mock.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b7b8a6731a9e0f1fcf63320cffb2120831552dae","unresolved":false,"context_lines":[{"line_number":1457,"context_line":"            self.assertEquals(utils.whataremyips(), [])"},{"line_number":1458,"context_line":""},{"line_number":1459,"context_line":"    def test_whataremyips_ipv6(self):"},{"line_number":1460,"context_line":"        test_ipv6_address \u003d utils.expand_ipv6(\u00272001:6b0:dead:beef:2::32\u0027)"},{"line_number":1461,"context_line":"        test_interface \u003d \u0027eth0\u0027"},{"line_number":1462,"context_line":""},{"line_number":1463,"context_line":"        def my_ipv6_interfaces():"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_55e9c018","line":1460,"in_reply_to":"5a890539_e9e6da15","updated":"2014-12-03 15:01:51.000000000","message":"Thanks for the review. I add unit tests for test_expand_ipv6(), so expansion of ipv6 will be covered there.","commit_id":"d598dff7b2889b7c593173a2338b51b7223a024e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3656f7a4092e1955442763f4aca3ced107a9a01d","unresolved":false,"context_lines":[{"line_number":1492,"context_line":"                    [{\u0027netmask\u0027: \u0027ffff:ffff:ffff:ffff::\u0027,"},{"line_number":1493,"context_line":"                      \u0027addr\u0027: \u0027%s%%%s\u0027 % (test_ipv6_address, test_interface)}]}"},{"line_number":1494,"context_line":"        with nested("},{"line_number":1495,"context_line":"                patch(\u0027netifaces.interfaces\u0027, my_ipv6_interfaces),"},{"line_number":1496,"context_line":"                patch(\u0027netifaces.ifaddresses\u0027, my_ipv6_ifaddresses)):"},{"line_number":1497,"context_line":"            myips \u003d utils.whataremyips()"},{"line_number":1498,"context_line":"            self.assertEquals(len(myips), 1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_9e1c0215","line":1495,"updated":"2015-01-07 22:29:16.000000000","message":"Do you see how you\u0027re changing the return value of the mock?  But the UUT changed - not the return value from netifaces?  This is a *bad* test change.\n\nBefore we returned whatever came out of netifaces unmolested, now we expand it.  Before the test was \"given this mock of un-expanded output from netifaces we return it\u0027s un-exapanded form.\"  The test should *now* be \"given this mock of un-expanded output from netifaces we should return it\u0027s expanded form\"\n\nYou need to leave the mock input the same, and change the expectation.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"42cc4d74fab638bb46ab6bec2bc1681582e70e94","unresolved":false,"context_lines":[{"line_number":1492,"context_line":"                    [{\u0027netmask\u0027: \u0027ffff:ffff:ffff:ffff::\u0027,"},{"line_number":1493,"context_line":"                      \u0027addr\u0027: \u0027%s%%%s\u0027 % (test_ipv6_address, test_interface)}]}"},{"line_number":1494,"context_line":"        with nested("},{"line_number":1495,"context_line":"                patch(\u0027netifaces.interfaces\u0027, my_ipv6_interfaces),"},{"line_number":1496,"context_line":"                patch(\u0027netifaces.ifaddresses\u0027, my_ipv6_ifaddresses)):"},{"line_number":1497,"context_line":"            myips \u003d utils.whataremyips()"},{"line_number":1498,"context_line":"            self.assertEquals(len(myips), 1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_540ad527","line":1495,"in_reply_to":"3a961159_9e1c0215","updated":"2015-01-14 07:01:14.000000000","message":"thanks for the comment. you are right. I just removed my change for the mock.","commit_id":"ee2760d453b414e250fcdb4817a23c2674c8e6ed"}]}
