)]}'
{"swift/cli/manage_shard_ranges.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbced0127223549fd7d0fdc5f26d7e1260ece38d","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def _load_and_validate_shard_data(args):"},{"line_number":27,"context_line":"    try:"},{"line_number":28,"context_line":"        with open(args.input, \u0027rb\u0027) as fd:"},{"line_number":29,"context_line":"            try:"},{"line_number":30,"context_line":"                data \u003d json.load(fd)"},{"line_number":31,"context_line":"                if not isinstance(data, list):"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_b675c69a","line":28,"range":{"start_line":28,"start_character":18,"end_line":28,"end_character":28},"updated":"2018-03-20 17:23:40.000000000","message":"Worth special-casing \"-\" to read from stdin?","commit_id":"aaa9cab961761c65b34985adcdf32fe62f0bfd20"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"26fd46e750bc800bf7b8c3c9215ea8374b052620","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def _load_and_validate_shard_data(args):"},{"line_number":27,"context_line":"    try:"},{"line_number":28,"context_line":"        with open(args.input, \u0027rb\u0027) as fd:"},{"line_number":29,"context_line":"            try:"},{"line_number":30,"context_line":"                data \u003d json.load(fd)"},{"line_number":31,"context_line":"                if not isinstance(data, list):"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_6a45fe14","line":28,"range":{"start_line":28,"start_character":18,"end_line":28,"end_character":28},"in_reply_to":"df7087c5_b675c69a","updated":"2018-03-20 17:31:07.000000000","message":"went down that rabbit-hole! it\u0027s tricky reading form stdin for the delete command where we also want to allow user interaction. But this works:\n\n  replace db_file\u003c(find db_file N)","commit_id":"aaa9cab961761c65b34985adcdf32fe62f0bfd20"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbced0127223549fd7d0fdc5f26d7e1260ece38d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                data \u003d json.load(fd)"},{"line_number":31,"context_line":"                if not isinstance(data, list):"},{"line_number":32,"context_line":"                    raise ValueError(\u0027Shard data must be a list of dicts\u0027)"},{"line_number":33,"context_line":"                for k in (\u0027lower\u0027, \u0027upper\u0027, \u0027index\u0027, \u0027object_count\u0027):"},{"line_number":34,"context_line":"                    for shard in data:"},{"line_number":35,"context_line":"                        shard[k]"},{"line_number":36,"context_line":"                return data"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_d6307aa1","line":33,"range":{"start_line":33,"start_character":45,"end_line":33,"end_character":50},"updated":"2018-03-20 17:23:40.000000000","message":":-/\n\nWe can\u0027t just assume this from the order given?","commit_id":"aaa9cab961761c65b34985adcdf32fe62f0bfd20"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbced0127223549fd7d0fdc5f26d7e1260ece38d","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                    for shard in data:"},{"line_number":35,"context_line":"                        shard[k]"},{"line_number":36,"context_line":"                return data"},{"line_number":37,"context_line":"            except (ValueError, KeyError) as err:"},{"line_number":38,"context_line":"                print(\u0027Failed to load valid shard range data: %r\u0027 % err,"},{"line_number":39,"context_line":"                      file\u003dsys.stderr)"},{"line_number":40,"context_line":"                exit(2)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_d6eb9a0f","line":37,"updated":"2018-03-20 17:23:40.000000000","message":"Probably also worth catching TypeError:\n\n TypeError: \u0027NoneType\u0027 object has no attribute \u0027__getitem__\u0027","commit_id":"aaa9cab961761c65b34985adcdf32fe62f0bfd20"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"0462aad8fddb90a4750f55130067d0b310d40e19","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    delta_t \u003d time.time() - start"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    print(json.dumps([dict(r) for r in ranges], sort_keys\u003dTrue, indent\u003d2))"},{"line_number":53,"context_line":"    print(\u0027Found %d ranges in %gs\u0027 % (len(ranges), delta_t), file\u003dsys.stderr)"},{"line_number":54,"context_line":"    return 0"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_6f2747b8","line":53,"range":{"start_line":53,"start_character":4,"end_line":53,"end_character":77},"updated":"2018-03-20 22:55:27.000000000","message":"Ahhh, printing this to stderr so you can simply do a normal redirct to get the shard range dicts into a file, nice.","commit_id":"aaa9cab961761c65b34985adcdf32fe62f0bfd20"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbced0127223549fd7d0fdc5f26d7e1260ece38d","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    if not shard_data:"},{"line_number":64,"context_line":"        print(\"No shard data found.\", file\u003dsys.stderr)"},{"line_number":65,"context_line":"    else:"},{"line_number":66,"context_line":"        print(\"Existing shard ranges:\", file\u003dsys.stderr)"},{"line_number":67,"context_line":"        print(json.dumps(shard_data, sort_keys\u003dTrue, indent\u003d2))"},{"line_number":68,"context_line":"    return 0"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_763acee7","line":66,"range":{"start_line":66,"start_character":45,"end_line":66,"end_character":55},"updated":"2018-03-20 17:23:40.000000000","message":"+1, love that I can just redirect stdout to get valid input for `replace`","commit_id":"aaa9cab961761c65b34985adcdf32fe62f0bfd20"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbced0127223549fd7d0fdc5f26d7e1260ece38d","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                       \u0027or quit without deleting [q]? \u0027)"},{"line_number":97,"context_line":"        if choice \u003d\u003d \u0027s\u0027:"},{"line_number":98,"context_line":"            show_shard_ranges(broker, args)"},{"line_number":99,"context_line":"            return delete_shard_ranges(broker, args)"},{"line_number":100,"context_line":"        elif choice \u003d\u003d \u0027q\u0027:"},{"line_number":101,"context_line":"            exit(1)"},{"line_number":102,"context_line":"        elif choice \u003d\u003d \u0027yes\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_96df6239","line":99,"updated":"2018-03-20 17:23:40.000000000","message":"Couldn\u0027t we just continue rather than recurse?","commit_id":"aaa9cab961761c65b34985adcdf32fe62f0bfd20"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbced0127223549fd7d0fdc5f26d7e1260ece38d","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        print (\u0027WARNING: failed to move broker to sharding state.\u0027)"},{"line_number":152,"context_line":"        return 2"},{"line_number":153,"context_line":"    print(\u0027Enabled sharding with epoch %s.\u0027 % epoch.internal)"},{"line_number":154,"context_line":"    print(\u0027Run container-sharder to shard the container.\u0027)"},{"line_number":155,"context_line":"    return 0"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_560d4a33","line":154,"updated":"2018-03-20 17:23:40.000000000","message":"...assuming auto_shard is enabled.","commit_id":"aaa9cab961761c65b34985adcdf32fe62f0bfd20"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbced0127223549fd7d0fdc5f26d7e1260ece38d","unresolved":false,"context_lines":[{"line_number":156,"context_line":""},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"def _add_find_args(parser):"},{"line_number":159,"context_line":"    parser.add_argument(\u0027rows_per_shard\u0027, nargs\u003d\u0027?\u0027, type\u003dint, default\u003d500000)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"def _add_replace_args(parser):"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_db65031f","line":159,"updated":"2018-03-20 17:23:40.000000000","message":"FWIW, I don\u0027t really care whether it\u0027s positional or a flag -- positional just made more sense when it was the *only* other option.","commit_id":"aaa9cab961761c65b34985adcdf32fe62f0bfd20"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbced0127223549fd7d0fdc5f26d7e1260ece38d","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        help\u003d\u0027Include deleted shard ranges in output.\u0027)"},{"line_number":199,"context_line":"    show_parser.set_defaults(func\u003dshow_shard_ranges)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    # show"},{"line_number":202,"context_line":"    info_parser \u003d subparsers.add_parser("},{"line_number":203,"context_line":"        \u0027info\u0027, help\u003d\u0027Print container db info\u0027)"},{"line_number":204,"context_line":"    info_parser.set_defaults(func\u003ddb_info)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_bb9a8fc2","line":201,"range":{"start_line":201,"start_character":6,"end_line":201,"end_character":10},"updated":"2018-03-20 17:23:40.000000000","message":"info","commit_id":"aaa9cab961761c65b34985adcdf32fe62f0bfd20"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbced0127223549fd7d0fdc5f26d7e1260ece38d","unresolved":false,"context_lines":[{"line_number":223,"context_line":"    _add_replace_args(find_replace_parser)"},{"line_number":224,"context_line":"    find_replace_parser.set_defaults(func\u003dfind_replace_shard_ranges)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    # show"},{"line_number":227,"context_line":"    info_parser \u003d subparsers.add_parser("},{"line_number":228,"context_line":"        \u0027enable\u0027, help\u003d\u0027Enable sharding and move db to sharding state.\u0027)"},{"line_number":229,"context_line":"    info_parser.set_defaults(func\u003denable_sharding)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_4a3b5ad0","line":226,"range":{"start_line":226,"start_character":6,"end_line":226,"end_character":10},"updated":"2018-03-20 17:23:40.000000000","message":"enable","commit_id":"aaa9cab961761c65b34985adcdf32fe62f0bfd20"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"0462aad8fddb90a4750f55130067d0b310d40e19","unresolved":false,"context_lines":[{"line_number":224,"context_line":"    find_replace_parser.set_defaults(func\u003dfind_replace_shard_ranges)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    # show"},{"line_number":227,"context_line":"    info_parser \u003d subparsers.add_parser("},{"line_number":228,"context_line":"        \u0027enable\u0027, help\u003d\u0027Enable sharding and move db to sharding state.\u0027)"},{"line_number":229,"context_line":"    info_parser.set_defaults(func\u003denable_sharding)"},{"line_number":230,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_4f0da43c","line":227,"range":{"start_line":227,"start_character":4,"end_line":227,"end_character":15},"updated":"2018-03-20 22:55:27.000000000","message":"enable_parser","commit_id":"aaa9cab961761c65b34985adcdf32fe62f0bfd20"}],"swift/container/sharder.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dbced0127223549fd7d0fdc5f26d7e1260ece38d","unresolved":false,"context_lines":[{"line_number":887,"context_line":"        # we should confirm we\u0027re still the scanner"},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"        shard_ranges \u003d make_shard_ranges("},{"line_number":890,"context_line":"            broker, shard_data, self.shards_account_prefix, )"},{"line_number":891,"context_line":"        broker.merge_shard_ranges(shard_ranges)"},{"line_number":892,"context_line":"        if not broker.is_root_container():"},{"line_number":893,"context_line":"            # TODO: check for success and do not proceed otherwise"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_10d59ae5","line":890,"range":{"start_line":890,"start_character":58,"end_line":890,"end_character":61},"updated":"2018-03-20 17:23:40.000000000","message":"nit: trailing comma","commit_id":"aaa9cab961761c65b34985adcdf32fe62f0bfd20"}]}
