)]}'
{"swift/proxy/controllers/base.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c4296ea22011df4232972466ae9bf59a51a42504","unresolved":false,"context_lines":[{"line_number":1272,"context_line":"                    if not self.newest:  # one good source is enough"},{"line_number":1273,"context_line":"                        return True"},{"line_number":1274,"context_line":"        else:"},{"line_number":1275,"context_line":"            if self.server_type !\u003d \u0027Object\u0027 and \u0027handoff_index\u0027 in node and \\"},{"line_number":1276,"context_line":"                    possible_source.status \u003d\u003d HTTP_NOT_FOUND and \\"},{"line_number":1277,"context_line":"                    Timestamp(src_headers.get("},{"line_number":1278,"context_line":"                        \u0027x-backend-timestamp\u0027)) \u003c\u003d Timestamp(0):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_3805e311","line":1275,"range":{"start_line":1275,"start_character":15,"end_line":1275,"end_character":43},"updated":"2019-06-25 17:06:14.000000000","message":"Why do we exclude object?","commit_id":"8d44c23f1ede85dcc36028237bcce1a01cf04831"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a42682a4827a65650d8188271bc872695bbc1909","unresolved":false,"context_lines":[{"line_number":1272,"context_line":"                    if not self.newest:  # one good source is enough"},{"line_number":1273,"context_line":"                        return True"},{"line_number":1274,"context_line":"        else:"},{"line_number":1275,"context_line":"            if self.server_type !\u003d \u0027Object\u0027 and \u0027handoff_index\u0027 in node and \\"},{"line_number":1276,"context_line":"                    possible_source.status \u003d\u003d HTTP_NOT_FOUND and \\"},{"line_number":1277,"context_line":"                    Timestamp(src_headers.get("},{"line_number":1278,"context_line":"                        \u0027x-backend-timestamp\u0027)) \u003c\u003d Timestamp(0):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_d80b67d2","line":1275,"range":{"start_line":1275,"start_character":15,"end_line":1275,"end_character":43},"in_reply_to":"9fb8cfa7_3805e311","updated":"2019-06-25 17:22:50.000000000","message":"because when I don\u0027t a bunch of tests fail, be worth looking into down the road tho!","commit_id":"8d44c23f1ede85dcc36028237bcce1a01cf04831"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c4296ea22011df4232972466ae9bf59a51a42504","unresolved":false,"context_lines":[{"line_number":1274,"context_line":"        else:"},{"line_number":1275,"context_line":"            if self.server_type !\u003d \u0027Object\u0027 and \u0027handoff_index\u0027 in node and \\"},{"line_number":1276,"context_line":"                    possible_source.status \u003d\u003d HTTP_NOT_FOUND and \\"},{"line_number":1277,"context_line":"                    Timestamp(src_headers.get("},{"line_number":1278,"context_line":"                        \u0027x-backend-timestamp\u0027)) \u003c\u003d Timestamp(0):"},{"line_number":1279,"context_line":"                # throw out 404s from handoff nodes unless the db is really"},{"line_number":1280,"context_line":"                # on disk and had been DELETEd"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_f823cba5","line":1277,"range":{"start_line":1277,"start_character":42,"end_line":1277,"end_character":45},"updated":"2019-06-25 17:06:14.000000000","message":"Should we be providing a default value? Timestamp() can\u0027t eat None:\n\n\u003e\u003e\u003e Timestamp(None)\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  File \"swift/common/utils.py\", line 1256, in __init__\n    self.timestamp \u003d float(timestamp)\nTypeError: float() argument must be a string or a number","commit_id":"8d44c23f1ede85dcc36028237bcce1a01cf04831"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a42682a4827a65650d8188271bc872695bbc1909","unresolved":false,"context_lines":[{"line_number":1274,"context_line":"        else:"},{"line_number":1275,"context_line":"            if self.server_type !\u003d \u0027Object\u0027 and \u0027handoff_index\u0027 in node and \\"},{"line_number":1276,"context_line":"                    possible_source.status \u003d\u003d HTTP_NOT_FOUND and \\"},{"line_number":1277,"context_line":"                    Timestamp(src_headers.get("},{"line_number":1278,"context_line":"                        \u0027x-backend-timestamp\u0027)) \u003c\u003d Timestamp(0):"},{"line_number":1279,"context_line":"                # throw out 404s from handoff nodes unless the db is really"},{"line_number":1280,"context_line":"                # on disk and had been DELETEd"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_f810ab02","line":1277,"range":{"start_line":1277,"start_character":42,"end_line":1277,"end_character":45},"in_reply_to":"9fb8cfa7_f823cba5","updated":"2019-06-25 17:22:50.000000000","message":"oh yes, definitely, but i guess neither the fakes or the servers themselves return a resp without that header!?","commit_id":"8d44c23f1ede85dcc36028237bcce1a01cf04831"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c4296ea22011df4232972466ae9bf59a51a42504","unresolved":false,"context_lines":[{"line_number":1275,"context_line":"            if self.server_type !\u003d \u0027Object\u0027 and \u0027handoff_index\u0027 in node and \\"},{"line_number":1276,"context_line":"                    possible_source.status \u003d\u003d HTTP_NOT_FOUND and \\"},{"line_number":1277,"context_line":"                    Timestamp(src_headers.get("},{"line_number":1278,"context_line":"                        \u0027x-backend-timestamp\u0027)) \u003c\u003d Timestamp(0):"},{"line_number":1279,"context_line":"                # throw out 404s from handoff nodes unless the db is really"},{"line_number":1280,"context_line":"                # on disk and had been DELETEd"},{"line_number":1281,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_d8536715","line":1278,"range":{"start_line":1278,"start_character":48,"end_line":1278,"end_character":49},"updated":"2019-06-25 17:06:14.000000000","message":"All Timestamps are necessarily \u003e\u003d Timestamp(0), aren\u0027t they? So really we\u0027re just checking for equality. I\u0027d be tempted to rely on the false-iness of Timestamp(0) instead... *shrug*","commit_id":"8d44c23f1ede85dcc36028237bcce1a01cf04831"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a42682a4827a65650d8188271bc872695bbc1909","unresolved":false,"context_lines":[{"line_number":1275,"context_line":"            if self.server_type !\u003d \u0027Object\u0027 and \u0027handoff_index\u0027 in node and \\"},{"line_number":1276,"context_line":"                    possible_source.status \u003d\u003d HTTP_NOT_FOUND and \\"},{"line_number":1277,"context_line":"                    Timestamp(src_headers.get("},{"line_number":1278,"context_line":"                        \u0027x-backend-timestamp\u0027)) \u003c\u003d Timestamp(0):"},{"line_number":1279,"context_line":"                # throw out 404s from handoff nodes unless the db is really"},{"line_number":1280,"context_line":"                # on disk and had been DELETEd"},{"line_number":1281,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_58ff77aa","line":1278,"range":{"start_line":1278,"start_character":48,"end_line":1278,"end_character":49},"in_reply_to":"9fb8cfa7_d8536715","updated":"2019-06-25 17:22:50.000000000","message":"yes, that would be equivalent, but I like it better:\n\n\tdiff --git a/swift/proxy/controllers/base.py b/swift/proxy/controllers/base.py\n\tindex 06b83fcd0..3ddc8393e 100644\n\t--- a/swift/proxy/controllers/base.py\n\t+++ b/swift/proxy/controllers/base.py\n\t@@ -1274,8 +1274,7 @@ class ResumingGetter(object):\n\t\t else:\n\t\t     if self.server_type !\u003d \u0027Object\u0027 and \u0027handoff_index\u0027 in node and \\\n\t\t\t     possible_source.status \u003d\u003d HTTP_NOT_FOUND and \\\n\t-                    Timestamp(src_headers.get(\n\t-                        \u0027x-backend-timestamp\u0027)) \u003c\u003d Timestamp(0):\n\t+                    not Timestamp(src_headers.get(\u0027x-backend-timestamp\u0027, 0)):\n\t\t\t # throw out 404s from handoff nodes unless the db is really\n\t\t\t # on disk and had been DELETEd\n\t\t\t return False","commit_id":"8d44c23f1ede85dcc36028237bcce1a01cf04831"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1cdd08cd4f9ef9a15ddbc57b5a72b540b95abb34","unresolved":false,"context_lines":[{"line_number":1275,"context_line":"            if self.server_type !\u003d \u0027Object\u0027 and \u0027handoff_index\u0027 in node and \\"},{"line_number":1276,"context_line":"                    possible_source.status \u003d\u003d HTTP_NOT_FOUND and \\"},{"line_number":1277,"context_line":"                    not Timestamp(src_headers.get(\u0027x-backend-timestamp\u0027, 0)):"},{"line_number":1278,"context_line":"                # throw out 404s from handoff nodes unless the db is really"},{"line_number":1279,"context_line":"                # on disk and had been DELETEd"},{"line_number":1280,"context_line":"                return False"},{"line_number":1281,"context_line":"            self.statuses.append(possible_source.status)"},{"line_number":1282,"context_line":"            self.reasons.append(possible_source.reason)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_c395bc88","line":1279,"range":{"start_line":1278,"start_character":52,"end_line":1279,"end_character":46},"updated":"2019-06-25 18:08:23.000000000","message":"Do we have test coverage for this case?","commit_id":"563e1671cf0583767d652a72ebc4d73d7cc07435"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"50845366952462197bef12bd37b62e05cb9a8f62","unresolved":false,"context_lines":[{"line_number":1275,"context_line":"            if self.server_type !\u003d \u0027Object\u0027 and \u0027handoff_index\u0027 in node and \\"},{"line_number":1276,"context_line":"                    possible_source.status \u003d\u003d HTTP_NOT_FOUND and \\"},{"line_number":1277,"context_line":"                    not Timestamp(src_headers.get(\u0027x-backend-timestamp\u0027, 0)):"},{"line_number":1278,"context_line":"                # throw out 404s from handoff nodes unless the db is really"},{"line_number":1279,"context_line":"                # on disk and had been DELETEd"},{"line_number":1280,"context_line":"                return False"},{"line_number":1281,"context_line":"            self.statuses.append(possible_source.status)"},{"line_number":1282,"context_line":"            self.reasons.append(possible_source.reason)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_fea6530f","line":1279,"range":{"start_line":1278,"start_character":52,"end_line":1279,"end_character":46},"in_reply_to":"9fb8cfa7_c395bc88","updated":"2019-06-25 18:51:16.000000000","message":"Addressed in https://review.opendev.org/#/c/667438/","commit_id":"563e1671cf0583767d652a72ebc4d73d7cc07435"}],"test/unit/proxy/controllers/test_container.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1cdd08cd4f9ef9a15ddbc57b5a72b540b95abb34","unresolved":false,"context_lines":[{"line_number":344,"context_line":"            ([200], 200),"},{"line_number":345,"context_line":"            ([404, 200], 200),"},{"line_number":346,"context_line":"            ([404] * nodes + [200], 200),"},{"line_number":347,"context_line":"            ([Timeout()] * nodes + [404] * handoffs, 503),"},{"line_number":348,"context_line":"            ([Timeout()] * (nodes + handoffs), 503),"},{"line_number":349,"context_line":"            ([Timeout()] * (nodes + handoffs - 1) + [404], 503),"},{"line_number":350,"context_line":"            ([Timeout()] * (nodes - 1) + [404] * (handoffs + 1), 404),"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_781b5bc9","line":347,"range":{"start_line":347,"start_character":35,"end_line":347,"end_character":51},"updated":"2019-06-25 18:08:23.000000000","message":"Could we get another case like this where one of these *does* have a timestamp? Then we\u0027d expect a 404, right?","commit_id":"563e1671cf0583767d652a72ebc4d73d7cc07435"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1cdd08cd4f9ef9a15ddbc57b5a72b540b95abb34","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            ([Timeout()] * nodes + [404] * handoffs, 503),"},{"line_number":348,"context_line":"            ([Timeout()] * (nodes + handoffs), 503),"},{"line_number":349,"context_line":"            ([Timeout()] * (nodes + handoffs - 1) + [404], 503),"},{"line_number":350,"context_line":"            ([Timeout()] * (nodes - 1) + [404] * (handoffs + 1), 404),"},{"line_number":351,"context_line":"            ([503, 200], 200),"},{"line_number":352,"context_line":"            ([507, 200], 200),"},{"line_number":353,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_239cd8be","line":350,"range":{"start_line":350,"start_character":65,"end_line":350,"end_character":68},"updated":"2019-06-25 18:08:23.000000000","message":":-/\n\nI\u0027m still not entirely sure that I like this result. I guess it comes down to, why did we get the Timeouts? Were they tarpit disks, where we don\u0027t even know whether we have a db file, or is there a container there that\u0027s so busy that we can\u0027t get a word in edgewise?\n\nIn the former case, the 404 makes sense. In the later, a 503 seems better -- in all likelihood, the 404-with-no-timestamp was the result of a rebalance and replication will get a DB on that disk Real Soon Now.\n\nMaybe we should have a low-ish broker timeout in the container-server\u0027s GET path, so it\u0027s reasonably likely to pop *before* the proxy\u0027s node_timeout? Then we\u0027d get [500, 500, 404] \u003d\u003e 503.\n\nSpeaking of, we should probably add that case:\n\n    ([500] * (nodes - 1) + [404] * (handoffs + 1), 503),\n\nSee also: https://bugs.launchpad.net/swift/+bug/1834212","commit_id":"563e1671cf0583767d652a72ebc4d73d7cc07435"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"50845366952462197bef12bd37b62e05cb9a8f62","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            ([Timeout()] * nodes + [404] * handoffs, 503),"},{"line_number":348,"context_line":"            ([Timeout()] * (nodes + handoffs), 503),"},{"line_number":349,"context_line":"            ([Timeout()] * (nodes + handoffs - 1) + [404], 503),"},{"line_number":350,"context_line":"            ([Timeout()] * (nodes - 1) + [404] * (handoffs + 1), 404),"},{"line_number":351,"context_line":"            ([503, 200], 200),"},{"line_number":352,"context_line":"            ([507, 200], 200),"},{"line_number":353,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_beac5bed","line":350,"range":{"start_line":350,"start_character":65,"end_line":350,"end_character":68},"in_reply_to":"9fb8cfa7_239cd8be","updated":"2019-06-25 18:51:16.000000000","message":"(That particular case is getting added in https://review.opendev.org/#/c/667438/)","commit_id":"563e1671cf0583767d652a72ebc4d73d7cc07435"}]}
