)]}'
{"swift/cli/ringbuilder.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6bfcd97bae72f7c1442d9f3618a03d248952b159","unresolved":false,"context_lines":[{"line_number":1070,"context_line":"            replica_range \u003d list(range(int(math.ceil(builder.replicas + 1))))"},{"line_number":1071,"context_line":"            part_count_width \u003d \u0027%%%ds\u0027 % max(len(str(builder.parts)), 5)"},{"line_number":1072,"context_line":"            replica_counts_tmpl \u003d \u0027 \u0027.join(part_count_width for i in"},{"line_number":1073,"context_line":"                                           replica_range)"},{"line_number":1074,"context_line":"            tiers \u003d (tier for tier, _junk in report[\u0027graph\u0027])"},{"line_number":1075,"context_line":"            tier_width \u003d max(max(map(len, tiers)), 30)"},{"line_number":1076,"context_line":"            header_line \u003d (\u0027%-\u0027 + str(tier_width) +"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa0c359_d0983076","line":1073,"updated":"2018-02-09 19:07:25.000000000","message":"Used once ...","commit_id":"364b664a7b9786f56428428737efbc560d8fbc89"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6bfcd97bae72f7c1442d9f3618a03d248952b159","unresolved":false,"context_lines":[{"line_number":1076,"context_line":"            header_line \u003d (\u0027%-\u0027 + str(tier_width) +"},{"line_number":1077,"context_line":"                           \u0027s \u0027 + part_count_width +"},{"line_number":1078,"context_line":"                           \u0027 %6s %6s \u0027 + replica_counts_tmpl) % tuple("},{"line_number":1079,"context_line":"                               [\u0027Tier\u0027, \u0027Parts\u0027, \u0027%\u0027, \u0027Max\u0027] + replica_range)"},{"line_number":1080,"context_line":"            underline \u003d \u0027-\u0027 * len(header_line)"},{"line_number":1081,"context_line":"            print(underline)"},{"line_number":1082,"context_line":"            print(header_line)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa0c359_f0952c41","line":1079,"updated":"2018-02-09 19:07:25.000000000","message":"... twice -- and here it really *needs* to be a list.","commit_id":"364b664a7b9786f56428428737efbc560d8fbc89"}],"swift/common/ring/builder.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"688a95b2e3582b87e219ced539a4a0ae91d9e4cd","unresolved":false,"context_lines":[{"line_number":458,"context_line":"                # most likely min part hours"},{"line_number":459,"context_line":"                finish_status \u003d \u0027Unable to finish\u0027"},{"line_number":460,"context_line":"                break"},{"line_number":461,"context_line":"            assign_parts_list \u003d list(assign_parts.items())"},{"line_number":462,"context_line":"            # shuffle the parts to be reassigned, we have no preference on the"},{"line_number":463,"context_line":"            # order in which the replica plan is fulfilled."},{"line_number":464,"context_line":"            random.shuffle(assign_parts_list)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_e7aecf2c","line":461,"range":{"start_line":461,"start_character":49,"end_line":461,"end_character":57},"updated":"2017-01-06 21:35:57.000000000","message":"This seems like a hash-ordering dependency, but changing PYTHONHASHSEED doesn\u0027t actually break tests :-/","commit_id":"73e06ed0217701b74bcee5126818d4887c1f5378"}],"swift/common/ring/ring.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cd2644699309fab8857619cb13eefec25d733e21","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        # Write out new-style serialization magic and version:"},{"line_number":121,"context_line":"        file_obj.write(struct.pack(\u0027!4sH\u0027, b\u0027R1NG\u0027, 1))"},{"line_number":122,"context_line":"        ring \u003d self.to_dict()"},{"line_number":123,"context_line":"        json_text \u003d json.dumps("},{"line_number":124,"context_line":"            {\u0027devs\u0027: ring[\u0027devs\u0027], \u0027part_shift\u0027: ring[\u0027part_shift\u0027],"},{"line_number":125,"context_line":"             \u0027replica_count\u0027: len(ring[\u0027replica2part2dev_id\u0027]),"},{"line_number":126,"context_line":"             \u0027byteorder\u0027: sys.byteorder},"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_997f2d14","line":123,"updated":"2017-01-06 18:27:25.000000000","message":"nit: in py3 the var name is perhaps misleading - it is not text_type","commit_id":"73e06ed0217701b74bcee5126818d4887c1f5378"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"688a95b2e3582b87e219ced539a4a0ae91d9e4cd","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        # Write out new-style serialization magic and version:"},{"line_number":121,"context_line":"        file_obj.write(struct.pack(\u0027!4sH\u0027, b\u0027R1NG\u0027, 1))"},{"line_number":122,"context_line":"        ring \u003d self.to_dict()"},{"line_number":123,"context_line":"        json_text \u003d json.dumps("},{"line_number":124,"context_line":"            {\u0027devs\u0027: ring[\u0027devs\u0027], \u0027part_shift\u0027: ring[\u0027part_shift\u0027],"},{"line_number":125,"context_line":"             \u0027replica_count\u0027: len(ring[\u0027replica2part2dev_id\u0027]),"},{"line_number":126,"context_line":"             \u0027byteorder\u0027: sys.byteorder},"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_6a7aa689","line":123,"in_reply_to":"ba5201f7_997f2d14","updated":"2017-01-06 21:35:57.000000000","message":"Done","commit_id":"73e06ed0217701b74bcee5126818d4887c1f5378"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cd2644699309fab8857619cb13eefec25d733e21","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        file_obj.write(struct.pack(\u0027!I\u0027, json_len))"},{"line_number":130,"context_line":"        file_obj.write(json_text)"},{"line_number":131,"context_line":"        for part2dev_id in ring[\u0027replica2part2dev_id\u0027]:"},{"line_number":132,"context_line":"            file_obj.write(part2dev_id.tostring())"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def save(self, filename, mtime\u003d1300507380.0):"},{"line_number":135,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_2415389b","line":132,"updated":"2017-01-06 18:27:25.000000000","message":"ok. I wondered why this \"string\" value did not need to be encoded before being written. Turns out it is not a string but bytes. In py3 tostring() is deprecated in favour of tobytes() but sadly no tobytes() available for py2.","commit_id":"73e06ed0217701b74bcee5126818d4887c1f5378"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"688a95b2e3582b87e219ced539a4a0ae91d9e4cd","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        file_obj.write(struct.pack(\u0027!I\u0027, json_len))"},{"line_number":130,"context_line":"        file_obj.write(json_text)"},{"line_number":131,"context_line":"        for part2dev_id in ring[\u0027replica2part2dev_id\u0027]:"},{"line_number":132,"context_line":"            file_obj.write(part2dev_id.tostring())"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def save(self, filename, mtime\u003d1300507380.0):"},{"line_number":135,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_0a6cba9a","line":132,"in_reply_to":"ba5201f7_2415389b","updated":"2017-01-06 21:35:57.000000000","message":"Yep, and tofile() requires a real built-in file object; a GzipFile won\u0027t do.","commit_id":"73e06ed0217701b74bcee5126818d4887c1f5378"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cd2644699309fab8857619cb13eefec25d733e21","unresolved":false,"context_lines":[{"line_number":386,"context_line":"            (d[\u0027region\u0027], d[\u0027zone\u0027], d[\u0027ip\u0027]) for d in primary_nodes)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        parts \u003d len(self._replica2part2dev_id[0])"},{"line_number":389,"context_line":"        part_hash \u003d md5(str(part).encode(\u0027ascii\u0027)).digest()"},{"line_number":390,"context_line":"        start \u003d struct.unpack_from(\u0027\u003eI\u0027, part_hash)[0] \u003e\u003e self._part_shift"},{"line_number":391,"context_line":"        inc \u003d int(parts / 65536) or 1"},{"line_number":392,"context_line":"        # Multiple loops for execution speed; the checks and bookkeeping get"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_e457b023","line":389,"updated":"2017-01-06 18:27:25.000000000","message":"see comment in test_ring. I could not get the test for this to pass/run so not verified this change.","commit_id":"73e06ed0217701b74bcee5126818d4887c1f5378"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bbaae6d3083de159f83a600d633414eddba15ebf","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        json_len, \u003d struct.unpack(\u0027!I\u0027, gz_file.read(4))"},{"line_number":68,"context_line":"        ring_dict \u003d json.loads(gz_file.read(json_len).decode(\u0027ascii\u0027))"},{"line_number":69,"context_line":"        ring_dict[\u0027replica2part2dev_id\u0027] \u003d []"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        if metadata_only:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a3905b3_a3a121fa","line":68,"updated":"2017-01-23 22:45:23.000000000","message":"idk, i feel like you can get utf-8 in device stuff ... somehow ...","commit_id":"d6b657971935cfdb4a1e6f85695e90bc38f9922d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dc5385b3f79c68138b10685f0c6adfcdd5abea45","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        json_len, \u003d struct.unpack(\u0027!I\u0027, gz_file.read(4))"},{"line_number":68,"context_line":"        ring_dict \u003d json.loads(gz_file.read(json_len).decode(\u0027ascii\u0027))"},{"line_number":69,"context_line":"        ring_dict[\u0027replica2part2dev_id\u0027] \u003d []"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        if metadata_only:"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_0e332763","line":68,"in_reply_to":"5a3905b3_a3a121fa","updated":"2017-02-07 19:45:06.000000000","message":"Nope; that ensure_ascii\u003dTrue below is the default behavior; we\u0027ve been using that since forever. I only changed it in serialize to be explicit.","commit_id":"d6b657971935cfdb4a1e6f85695e90bc38f9922d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bbaae6d3083de159f83a600d633414eddba15ebf","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            {\u0027devs\u0027: ring[\u0027devs\u0027], \u0027part_shift\u0027: ring[\u0027part_shift\u0027],"},{"line_number":125,"context_line":"             \u0027replica_count\u0027: len(ring[\u0027replica2part2dev_id\u0027]),"},{"line_number":126,"context_line":"             \u0027byteorder\u0027: sys.byteorder},"},{"line_number":127,"context_line":"            sort_keys\u003dTrue, ensure_ascii\u003dTrue).encode(\u0027ascii\u0027)"},{"line_number":128,"context_line":"        json_len \u003d len(json_body)"},{"line_number":129,"context_line":"        file_obj.write(struct.pack(\u0027!I\u0027, json_len))"},{"line_number":130,"context_line":"        file_obj.write(json_body)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a3905b3_8385055b","line":127,"updated":"2017-01-23 22:45:23.000000000","message":"or... i guess not?","commit_id":"d6b657971935cfdb4a1e6f85695e90bc38f9922d"}],"swift/common/swob.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cd2644699309fab8857619cb13eefec25d733e21","unresolved":false,"context_lines":[{"line_number":845,"context_line":"        if parsed_path.scheme and parsed_path.scheme not in [\u0027http\u0027, \u0027https\u0027]:"},{"line_number":846,"context_line":"            raise TypeError(\u0027Invalid scheme: %s\u0027 % parsed_path.scheme)"},{"line_number":847,"context_line":"        path_info \u003d urllib.parse.unquote("},{"line_number":848,"context_line":"            parsed_path.path.decode(\u0027utf8\u0027) if six.PY3 else parsed_path.path)"},{"line_number":849,"context_line":"        env \u003d {"},{"line_number":850,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":851,"context_line":"            \u0027SCRIPT_NAME\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_3f1e2170","line":848,"updated":"2017-01-06 18:27:25.000000000","message":"is this just tactical? looks like there\u0027s other stuff here that\u0027s broken in py3 e.g. the keys in the server_port dict\n\nok, so you\u0027re not claiming to have ported swob.py, I assume you\u0027ve made this fix to get other tests to pass.","commit_id":"73e06ed0217701b74bcee5126818d4887c1f5378"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"688a95b2e3582b87e219ced539a4a0ae91d9e4cd","unresolved":false,"context_lines":[{"line_number":845,"context_line":"        if parsed_path.scheme and parsed_path.scheme not in [\u0027http\u0027, \u0027https\u0027]:"},{"line_number":846,"context_line":"            raise TypeError(\u0027Invalid scheme: %s\u0027 % parsed_path.scheme)"},{"line_number":847,"context_line":"        path_info \u003d urllib.parse.unquote("},{"line_number":848,"context_line":"            parsed_path.path.decode(\u0027utf8\u0027) if six.PY3 else parsed_path.path)"},{"line_number":849,"context_line":"        env \u003d {"},{"line_number":850,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":851,"context_line":"            \u0027SCRIPT_NAME\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_aa59ee36","line":848,"in_reply_to":"ba5201f7_3f1e2170","updated":"2017-01-06 21:35:57.000000000","message":"Yup. There were a couple tests in test_utils.py that needed it (test_get_log_line and test_get_policy_index). They\u0027d fail when trying to unquote bytes (since we force everything to bytes at L834-835) with either\n\n TypeError: \u0027str\u0027 does not support the buffer interface\n\nor\n\n TypeError: a bytes-like object is required, not \u0027str\u0027\n\ndepending upon Python version. Porting swob will require more thinking about how to deal with the crazy utf-8-decoded-as-latin-1 mess. There are weird implications for things like SLO where we store paths as the desired unicode string like a sane person, but we\u0027ll have to intentionally mis-decode it under py3.\n\nThat actually may be what\u0027s called for here, the more I think about it :-/ I\u0027m just glad we\u0027ve already got all the *Utf8 func tests written for when the time comes.","commit_id":"73e06ed0217701b74bcee5126818d4887c1f5378"}],"swift/common/utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bbaae6d3083de159f83a600d633414eddba15ebf","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        if six.PY3:"},{"line_number":193,"context_line":"            # Use Latin1 to accept arbitrary bytes in the hash prefix/suffix"},{"line_number":194,"context_line":"            confs_read \u003d hash_conf.read(SWIFT_CONF_FILE, encoding\u003d\u0027latin1\u0027)"},{"line_number":195,"context_line":"        else:"},{"line_number":196,"context_line":"            confs_read \u003d hash_conf.read(SWIFT_CONF_FILE)"},{"line_number":197,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5a3905b3_034f5537","line":194,"updated":"2017-01-23 22:45:23.000000000","message":"why is the file\u0027s encoding latin1?\n\nShouldn\u0027t there be some way to say \"assume the bytes will be ascii; if someone is a jerk then *blow up* and have a documented way for the operator to explicitly provide *bytes* (e.g. swift_hash_path_suffix_base64)\"","commit_id":"d6b657971935cfdb4a1e6f85695e90bc38f9922d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dc5385b3f79c68138b10685f0c6adfcdd5abea45","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        if six.PY3:"},{"line_number":193,"context_line":"            # Use Latin1 to accept arbitrary bytes in the hash prefix/suffix"},{"line_number":194,"context_line":"            confs_read \u003d hash_conf.read(SWIFT_CONF_FILE, encoding\u003d\u0027latin1\u0027)"},{"line_number":195,"context_line":"        else:"},{"line_number":196,"context_line":"            confs_read \u003d hash_conf.read(SWIFT_CONF_FILE)"},{"line_number":197,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5a3905b3_264d3e9a","line":194,"in_reply_to":"5a3905b3_034f5537","updated":"2017-02-07 19:45:06.000000000","message":"Upgrades with no config changes. Having some base64 config value would probably still be an improvement, but Latin-1 lets us map 1:1 between raw bytes and unicode so we know we won\u0027t hit UnicodeDecodeErrors on read.","commit_id":"d6b657971935cfdb4a1e6f85695e90bc38f9922d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bbaae6d3083de159f83a600d633414eddba15ebf","unresolved":false,"context_lines":[{"line_number":711,"context_line":"                if float(free) \u003c\u003d float(FALLOCATE_RESERVE):"},{"line_number":712,"context_line":"                    raise OSError("},{"line_number":713,"context_line":"                        errno.ENOSPC,"},{"line_number":714,"context_line":"                        \u0027FALLOCATE_RESERVE fail %g \u003c\u003d %g\u0027 %"},{"line_number":715,"context_line":"                        (free, FALLOCATE_RESERVE))"},{"line_number":716,"context_line":"        args \u003d {"},{"line_number":717,"context_line":"            \u0027fallocate\u0027: (fd, mode, offset, length),"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a3905b3_0324b55b","line":714,"updated":"2017-01-23 22:45:23.000000000","message":"scientific notation?  is this just ascetic?","commit_id":"d6b657971935cfdb4a1e6f85695e90bc38f9922d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dc5385b3f79c68138b10685f0c6adfcdd5abea45","unresolved":false,"context_lines":[{"line_number":711,"context_line":"                if float(free) \u003c\u003d float(FALLOCATE_RESERVE):"},{"line_number":712,"context_line":"                    raise OSError("},{"line_number":713,"context_line":"                        errno.ENOSPC,"},{"line_number":714,"context_line":"                        \u0027FALLOCATE_RESERVE fail %g \u003c\u003d %g\u0027 %"},{"line_number":715,"context_line":"                        (free, FALLOCATE_RESERVE))"},{"line_number":716,"context_line":"        args \u003d {"},{"line_number":717,"context_line":"            \u0027fallocate\u0027: (fd, mode, offset, length),"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_4e7e0f1a","line":714,"in_reply_to":"5a3905b3_0324b55b","updated":"2017-02-07 19:45:06.000000000","message":"There was some particular float where %s produced different results between py2 and py3; you can revert it to see the failure. IIRC the really stupid thing was that it\u0027d come down to a difference between like 1 and 1.0 or something. Or maybe 1.000? I forget.","commit_id":"d6b657971935cfdb4a1e6f85695e90bc38f9922d"}],"test/unit/common/ring/test_ring.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4845485b5bc58084aebf04d8fc7f3101c8c4b024","unresolved":false,"context_lines":[{"line_number":496,"context_line":"        self.ring._rebuild_tier_data()"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"    @fix_py3_random"},{"line_number":499,"context_line":"    def test_get_more_nodes(self):"},{"line_number":500,"context_line":"        # Yes, these tests are deliberately very fragile. We want to make sure"},{"line_number":501,"context_line":"        # that if someone changes the results the ring produces, they know it."},{"line_number":502,"context_line":"        exp_part \u003d 6"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_a4312f5c","line":499,"updated":"2017-01-06 16:56:08.000000000","message":"AFAICT this test and get_more_nodes_with_zero_weight_region are not being run by the tox job. I don\u0027t know why.\n\nIn my IDE I saw this test fail:\n\n  /usr/bin/python3.4 /home/anc/tools/pycharm-community-5.0.4/helpers/pycharm/utrunner.py /home/anc/0dev/swift/test/unit/common/ring/test_ring.py::TestRing::test_get_more_nodes true\nTesting started at 2:30 PM ...\n\nFailure\nTraceback (most recent call last):\n  File \"/home/anc/0dev/swift/test/unit/common/ring/test_ring.py\", line 46, in wrapper\n    return func(*args, **kwargs)\n  File \"/home/anc/0dev/swift/test/unit/common/ring/test_ring.py\", line 664, in test_get_more_nodes\n    self.assertEqual(first_matches, 21)\nAssertionError: 41 !\u003d 21\n\nso I looked for why it passed in tox...(I see same behaviour in py27 env)\n\nswift@u130:~/swift$ source .tox/py35/bin/activate\n(py35) swift@u130:~/swift$ nosetests ./test/unit/common/ring/test_ring.py:TestRing.test_get_more_nodes\n/home/swift/swift/.tox/py35/lib/python3.5/site-packages/nose/plugins/manager.py:395: RuntimeWarning: Unable to load plugin html-output \u003d htmloutput.htmloutput:HtmlOutput: No module named \u0027version\u0027\n  RuntimeWarning)\nUnable to read test config /etc/swift/test.conf - file not found\nFailure: ValueError (no such test method in \u003cclass \u0027test.unit.common.ring.test_ring.TestRing\u0027\u003e: wrapper) ... ERROR\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nERROR: Failure: ValueError (no such test method in \u003cclass \u0027test.unit.common.ring.test_ring.TestRing\u0027\u003e: wrapper)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n  File \"/home/swift/swift/.tox/py35/lib/python3.5/site-packages/nose/failure.py\", line 39, in runTest\n    raise self.exc_val.with_traceback(self.tb)\n  File \"/home/swift/swift/.tox/py35/lib/python3.5/site-packages/nose/loader.py\", line 523, in makeTest\n    return self._makeTest(obj, parent)\n  File \"/home/swift/swift/.tox/py35/lib/python3.5/site-packages/nose/loader.py\", line 577, in _makeTest\n    return parent(obj.__name__)\n  File \"/usr/lib/python3.5/unittest/case.py\", line 398, in __init__\n    (self.__class__, methodName))\nValueError: no such test method in \u003cclass \u0027test.unit.common.ring.test_ring.TestRing\u0027\u003e: wrapper\n-------------------- \u003e\u003e begin captured logging \u003c\u003c --------------------\npyeclib: WARNING: DEPRECATED WARNING: your liberasurecode 1.0.9 will be deprecated in the near future because of the issue https://bugs.launchpad.net/swift/+bug/1639691; Please upgrade to \u003e\u003d1.3.1 and rebuild pyeclib to suppress this message\n--------------------- \u003e\u003e end captured logging \u003c\u003c ---------------------\n\n----------------------------------------------------------------------\nRan 1 test in 0.003s\n\nFAILED (errors\u003d1)\n\n\nand notice how those tests just aren\u0027t reported when the test class is run...\n\n(py35) swift@u130:~/swift$ nosetests ./test/unit/common/ring/test_ring.py:TestRing\n/home/swift/swift/.tox/py35/lib/python3.5/site-packages/nose/plugins/manager.py:395: RuntimeWarning: Unable to load plugin html-output \u003d htmloutput.htmloutput:HtmlOutput: No module named \u0027version\u0027\n  RuntimeWarning)\nUnable to read test config /etc/swift/test.conf - file not found\ntest_creation (test.unit.common.ring.test_ring.TestRing) ... ok\ntest_get_nodes (test.unit.common.ring.test_ring.TestRing) ... ok\ntest_get_part (test.unit.common.ring.test_ring.TestRing) ... ok\ntest_get_part_nodes (test.unit.common.ring.test_ring.TestRing) ... ok\ntest_has_changed (test.unit.common.ring.test_ring.TestRing) ... ok\ntest_reload (test.unit.common.ring.test_ring.TestRing) ... ok\ntest_reload_old_style_pickled_ring (test.unit.common.ring.test_ring.TestRing) ... ok\ntest_reload_without_replication (test.unit.common.ring.test_ring.TestRing) ... ok\n\n----------------------------------------------------------------------\nRan 8 tests in 0.510s\n\nOK","commit_id":"73e06ed0217701b74bcee5126818d4887c1f5378"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"688a95b2e3582b87e219ced539a4a0ae91d9e4cd","unresolved":false,"context_lines":[{"line_number":496,"context_line":"        self.ring._rebuild_tier_data()"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"    @fix_py3_random"},{"line_number":499,"context_line":"    def test_get_more_nodes(self):"},{"line_number":500,"context_line":"        # Yes, these tests are deliberately very fragile. We want to make sure"},{"line_number":501,"context_line":"        # that if someone changes the results the ring produces, they know it."},{"line_number":502,"context_line":"        exp_part \u003d 6"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_8743436b","line":499,"in_reply_to":"ba5201f7_5fb3e509","updated":"2017-01-06 21:35:57.000000000","message":"So test_get_more_nodes_with_zero_weight_region now passes, but not this one. I know this is \"deliberately very fragile\", but it\u0027s getting ridiculous. I should *not* need to mock out random._inst._randbelow and defaultdict.items to make tests pass :-(","commit_id":"73e06ed0217701b74bcee5126818d4887c1f5378"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"62495f408ccd41ad1e708c419a5a05c7aca8deb1","unresolved":false,"context_lines":[{"line_number":496,"context_line":"        self.ring._rebuild_tier_data()"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"    @fix_py3_random"},{"line_number":499,"context_line":"    def test_get_more_nodes(self):"},{"line_number":500,"context_line":"        # Yes, these tests are deliberately very fragile. We want to make sure"},{"line_number":501,"context_line":"        # that if someone changes the results the ring produces, they know it."},{"line_number":502,"context_line":"        exp_part \u003d 6"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_5fb3e509","line":499,"in_reply_to":"ba5201f7_a4312f5c","updated":"2017-01-06 17:40:39.000000000","message":"Forgot a\n\n @functools.wraps(func)\n\nin fix_py3_random. Unfortunately, it looks like the difference in random behavior wasn\u0027t the root cause :-(","commit_id":"73e06ed0217701b74bcee5126818d4887c1f5378"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"46c47df4f31caa17ae3baf15778e36a699d114e3","unresolved":false,"context_lines":[{"line_number":482,"context_line":"        self.ring.devs.append(new_dev)"},{"line_number":483,"context_line":"        self.ring._rebuild_tier_data()"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"    def test_get_more_nodes(self):"},{"line_number":486,"context_line":"        # Yes, these tests are deliberately very fragile. We want to make sure"},{"line_number":487,"context_line":"        # that if someone changes the results the ring produces, they know it."},{"line_number":488,"context_line":"        exp_part \u003d 6"}],"source_content_type":"text/x-python","patch_set":10,"id":"7f287b81_81aaa8cf","line":485,"updated":"2017-09-02 00:56:55.000000000","message":"I am increasing convinced that we\u0027re going to need to just skip this test under py3 :-(","commit_id":"894c7624e6d5da2ee6c045ec60f10703a5d01b75"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"31988e5a36028cf7d395761850935c6440c60470","unresolved":false,"context_lines":[{"line_number":474,"context_line":"        self.ring.devs.append(new_dev)"},{"line_number":475,"context_line":"        self.ring._rebuild_tier_data()"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    @unittest.skipIf(sys.version[0] \u003e \u00272\u0027,"},{"line_number":478,"context_line":"                     \"Seed-specific tests don\u0027t work well on py3\")"},{"line_number":479,"context_line":"    def test_get_more_nodes(self):"},{"line_number":480,"context_line":"        # Yes, these tests are deliberately very fragile. We want to make sure"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf8cb3f7_c62c849b","line":477,"updated":"2017-12-21 04:37:18.000000000","message":"I\u0027m sorry to dump this on you, since you\u0027re doing the actual work, but I must disagree, because we used to use the seed feature in our product, and it was essential to have rings reproducible. So, even if py3 generates a different ring, it still should be reproducible with rb.rebalance(seed\u003d2). Thus, it appears to me that this test should still run just fine, only with a different exp_handoff, exp_first_handoff. That can be selected by sys.py3. Does this make sense? BTW, we do not rely on an ability to reproduce rings anymore, but as long as Swift in general has this feature, it\u0027s okay to use, right?","commit_id":"68f6b8da2110003acf9fa9119a3aede91f1d2d21"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"af2fda65c1e81f9faddd6c9ffed5081afd55c7d4","unresolved":false,"context_lines":[{"line_number":474,"context_line":"        self.ring.devs.append(new_dev)"},{"line_number":475,"context_line":"        self.ring._rebuild_tier_data()"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    @unittest.skipIf(sys.version[0] \u003e \u00272\u0027,"},{"line_number":478,"context_line":"                     \"Seed-specific tests don\u0027t work well on py3\")"},{"line_number":479,"context_line":"    def test_get_more_nodes(self):"},{"line_number":480,"context_line":"        # Yes, these tests are deliberately very fragile. We want to make sure"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf8cb3f7_d6e98080","line":477,"in_reply_to":"bf8cb3f7_c62c849b","updated":"2017-12-21 21:55:42.000000000","message":"I\u0027ve heard various excuses for these problematic tests\n\n- they\u0027re meant to demonstrate a very specific failure case\n- they\u0027re meant to be a concrete example that\u0027s representative of an entire population\n\nand now I can add\n\n- they\u0027re meant to demonstrate that rings are reproducible\n\nAt this point, I\u0027m throwing up my hands. I\u0027ve tried converting tests to *actually* look at populations (like in https://github.com/openstack/swift/commit/0d4d940 which eventually dropped its \"do this test a thousand times\"). I\u0027ve tried patching py3\u0027s random to behave like py2 again (like in patchset 7) just to find that not only are we relying on random being consistent, but we\u0027re also relying on dictionary iteration ordering!\n\nAs far as I\u0027m concerned, these tests are pretty terrible, and if people want them on py3, they\u0027re free to write new versions of them. Since the py2 gate isn\u0027t going away any time soon, it\u0027s not like we\u0027re *losing* any coverage.","commit_id":"68f6b8da2110003acf9fa9119a3aede91f1d2d21"}]}
