)]}'
{"swift/obj/diskfile.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e619683b7e66fe4fcb722da59bfe3d619b2a68b3","unresolved":true,"context_lines":[{"line_number":468,"context_line":"            linked \u003d False"},{"line_number":469,"context_line":"            if err.errno \u003d\u003d errno.EEXIST:"},{"line_number":470,"context_line":"                new_stat \u003d os.stat(new_target_path)"},{"line_number":471,"context_line":"                orig_stat \u003d os.stat(target_path)"},{"line_number":472,"context_line":"                linked \u003d new_stat.st_ino \u003d\u003d orig_stat.st_ino"},{"line_number":473,"context_line":"            if not linked:"},{"line_number":474,"context_line":"                raise"}],"source_content_type":"text/x-python","patch_set":1,"id":"0a183d5f_a1af0807","line":471,"updated":"2021-03-03 19:20:31.000000000","message":"Should we wrap these with a\n\n try:\n     ...\n except OSError:\n     pass\n\nlike before? I\u0027m not sure which error (if any) would be more useful if we hit something like\n\n* object-server creates old diskfile\n* object-relinker links new diskfile\n* object-server gets EEXIST exception trying to link new diskfile\n* concurrent write creates a new .data and cleans up either (or both) of old and new diskfiles\n* object-server gets ENOENT trying to stat to figure out if the EEXIST should be raised or not","commit_id":"cdfa5b73ad64692e77a54839cff99a3c566d5717"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"270dc13c6f9dd9b78d58304731fdbea5ec72f01f","unresolved":true,"context_lines":[{"line_number":476,"context_line":"                # this is ok *if* the intended link has already been made"},{"line_number":477,"context_line":"                try:"},{"line_number":478,"context_line":"                    orig_stat \u003d os.stat(target_path)"},{"line_number":479,"context_line":"                except OSError as sub_err:"},{"line_number":480,"context_line":"                    # this is ok: the *target* path doesn\u0027t exist anymore"},{"line_number":481,"context_line":"                    ok \u003d sub_err.errno \u003d\u003d errno.ENOENT"},{"line_number":482,"context_line":"                else:"},{"line_number":483,"context_line":"                    try:"},{"line_number":484,"context_line":"                        new_stat \u003d os.stat(new_target_path)"}],"source_content_type":"text/x-python","patch_set":2,"id":"69a531fa_8da7fa9a","line":481,"range":{"start_line":479,"start_character":16,"end_line":481,"end_character":54},"updated":"2021-03-04 17:41:43.000000000","message":"I\u0027m anticipating some debate around this clause!\n\nMy reasoning is that we only care if this method fails to make a link that *should have and could have been made*. If the target path has been deleted then we don\u0027t care that the link wasn\u0027t made, for whatever reason.","commit_id":"29b02eb722fd94f50403e03230f470b22dc7925d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"408b082d7c724c1572517928465a5fcecd77f8df","unresolved":true,"context_lines":[{"line_number":476,"context_line":"                # this is ok *if* the intended link has already been made"},{"line_number":477,"context_line":"                try:"},{"line_number":478,"context_line":"                    orig_stat \u003d os.stat(target_path)"},{"line_number":479,"context_line":"                except OSError as sub_err:"},{"line_number":480,"context_line":"                    # this is ok: the *target* path doesn\u0027t exist anymore"},{"line_number":481,"context_line":"                    ok \u003d sub_err.errno \u003d\u003d errno.ENOENT"},{"line_number":482,"context_line":"                else:"},{"line_number":483,"context_line":"                    try:"},{"line_number":484,"context_line":"                        new_stat \u003d os.stat(new_target_path)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1d156917_89ba30cd","line":481,"range":{"start_line":479,"start_character":16,"end_line":481,"end_character":54},"in_reply_to":"69a531fa_8da7fa9a","updated":"2021-03-11 18:25:40.000000000","message":"i found the commit message pretty convincing on this scenario","commit_id":"29b02eb722fd94f50403e03230f470b22dc7925d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b14014a72a9272462a3ae2372f7c3afbe7c4236e","unresolved":true,"context_lines":[{"line_number":472,"context_line":"            if err.errno \u003d\u003d errno.ENOENT:"},{"line_number":473,"context_line":"                # this is ok if the *target* path doesn\u0027t exist anymore"},{"line_number":474,"context_line":"                ok \u003d not os.path.exists(target_path)"},{"line_number":475,"context_line":"            if err.errno \u003d\u003d errno.EEXIST:"},{"line_number":476,"context_line":"                # this is ok *if* the intended link has already been made"},{"line_number":477,"context_line":"                try:"},{"line_number":478,"context_line":"                    orig_stat \u003d os.stat(target_path)"}],"source_content_type":"text/x-python","patch_set":3,"id":"40335e90_7c62abab","line":475,"updated":"2021-03-11 17:04:23.000000000","message":"elif seems to also work here","commit_id":"456fa833745bf833a7cc26a6f5bb3be6ec611227"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b14014a72a9272462a3ae2372f7c3afbe7c4236e","unresolved":true,"context_lines":[{"line_number":484,"context_line":"                        new_stat \u003d os.stat(new_target_path)"},{"line_number":485,"context_line":"                        ok \u003d new_stat.st_ino \u003d\u003d orig_stat.st_ino"},{"line_number":486,"context_line":"                    except OSError:"},{"line_number":487,"context_line":"                        # squash this exception; the original will be raised"},{"line_number":488,"context_line":"                        pass"},{"line_number":489,"context_line":"            if not ok:"},{"line_number":490,"context_line":"                raise err"}],"source_content_type":"text/x-python","patch_set":3,"id":"594d4a6b_92042366","line":487,"updated":"2021-03-11 17:04:23.000000000","message":"i found this comment mis-leading; there\u0027s not really any \"squashing\" - the original is raised below because it\u0027s an explicit raise (not a bare \"re-raise\" or a py3 raise from)","commit_id":"456fa833745bf833a7cc26a6f5bb3be6ec611227"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"138d28241c68fc99ba54027d7c886629d1d36b45","unresolved":true,"context_lines":[{"line_number":484,"context_line":"                        new_stat \u003d os.stat(new_target_path)"},{"line_number":485,"context_line":"                        ok \u003d new_stat.st_ino \u003d\u003d orig_stat.st_ino"},{"line_number":486,"context_line":"                    except OSError:"},{"line_number":487,"context_line":"                        # squash this exception; the original will be raised"},{"line_number":488,"context_line":"                        pass"},{"line_number":489,"context_line":"            if not ok:"},{"line_number":490,"context_line":"                raise err"}],"source_content_type":"text/x-python","patch_set":3,"id":"c0bbc8a8_80d65521","line":487,"in_reply_to":"594d4a6b_92042366","updated":"2021-03-11 19:44:50.000000000","message":"But this error *is* getting silenced -- as will sub_err above. *shrug* The comment about \"original\" had it making sense to me.","commit_id":"456fa833745bf833a7cc26a6f5bb3be6ec611227"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"408b082d7c724c1572517928465a5fcecd77f8df","unresolved":true,"context_lines":[{"line_number":453,"context_line":"    :raises: OSError if the hard link could not be created, unless the intended"},{"line_number":454,"context_line":"        hard link already exists or the target_path does not exist."},{"line_number":455,"context_line":"    :returns: True if the link was created by the call to this method, False"},{"line_number":456,"context_line":"        otherwise."},{"line_number":457,"context_line":"    \"\"\""},{"line_number":458,"context_line":"    link_created \u003d False"},{"line_number":459,"context_line":"    if target_path !\u003d new_target_path:"}],"source_content_type":"text/x-python","patch_set":4,"id":"a3719b2d_3f5b742f","line":456,"updated":"2021-03-11 18:25:40.000000000","message":"this is new here, but seems reasonable","commit_id":"0819951e3a24fcecf9dfc80c52a754f506ec40d4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"138d28241c68fc99ba54027d7c886629d1d36b45","unresolved":true,"context_lines":[{"line_number":479,"context_line":"                try:"},{"line_number":480,"context_line":"                    orig_stat \u003d os.stat(target_path)"},{"line_number":481,"context_line":"                except OSError as sub_err:"},{"line_number":482,"context_line":"                    # this is ok: the *target* path doesn\u0027t exist anymore"},{"line_number":483,"context_line":"                    ok \u003d sub_err.errno \u003d\u003d errno.ENOENT"},{"line_number":484,"context_line":"                else:"},{"line_number":485,"context_line":"                    try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"2f93f6b7_b982d752","line":482,"range":{"start_line":482,"start_character":22,"end_line":482,"end_character":51},"updated":"2021-03-11 19:44:50.000000000","message":"s/:/ if/","commit_id":"0819951e3a24fcecf9dfc80c52a754f506ec40d4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"138d28241c68fc99ba54027d7c886629d1d36b45","unresolved":true,"context_lines":[{"line_number":489,"context_line":"                        # squash this exception; the original will be raised"},{"line_number":490,"context_line":"                        pass"},{"line_number":491,"context_line":"            if not ok:"},{"line_number":492,"context_line":"                raise err"},{"line_number":493,"context_line":"    return link_created"},{"line_number":494,"context_line":""},{"line_number":495,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1e45e0c5_d4168382","line":492,"updated":"2021-03-11 19:44:50.000000000","message":"Why `raise err` instead of just `raise`?","commit_id":"0819951e3a24fcecf9dfc80c52a754f506ec40d4"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"69c9c586d4d57913caf54d25d5bb879a3a8fa2cc","unresolved":true,"context_lines":[{"line_number":2955,"context_line":"        calls \u003d []"},{"line_number":2956,"context_line":"        orig_makedirs \u003d os.makedirs"},{"line_number":2957,"context_line":""},{"line_number":2958,"context_line":"        def mock_makedirs(path, *args):"},{"line_number":2959,"context_line":"            # let another request race ahead just as the first is about to"},{"line_number":2960,"context_line":"            # create the next part power object dir"},{"line_number":2961,"context_line":"            if path \u003d\u003d os.path.dirname(data_file(new_part, ts_1)):"}],"source_content_type":"text/x-python","patch_set":2,"id":"85cf6f8e_2d2891b3","line":2958,"updated":"2021-03-05 05:33:21.000000000","message":"Need a kwargs here too for the same reason as on the previous patch in the chain. Without it it\u0027s failing on py3.","commit_id":"29b02eb722fd94f50403e03230f470b22dc7925d"}]}
