)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9fc8f6f65ddbf77a9d069efa900c136581b567f3","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"direct_client.py: proxy app: assign timestamp in a single place"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It\u0027s not immediately obvious, but the direct client functions always"},{"line_number":10,"context_line":"set an x-timestamp header in request headers if the header does not"},{"line_number":11,"context_line":"already exist. This patch refactors the module so that the timestamp"},{"line_number":12,"context_line":"is set in one place."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Drive-by: fix missing call to do_test helper in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9a00addb_43d27a21","line":11,"range":{"start_line":9,"start_character":34,"end_line":11,"end_character":13},"updated":"2026-01-29 23:40:50.000000000","message":"Well, for writes, anyway. But I don\u0027t think there\u0027s any harm in ensuring HEADs (which also use `_make_req`) have timestamps.\n\nKind of odd that GETs *won\u0027t*... but OTOH, object-server will set it for them. \\*shrug\\*","commit_id":"7bf728b6198400aa2057bf42d34f434e6dc71407"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9cc9b40c9b8fa04389ba0949d0f2f122cbcfe262","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"direct_client.py: proxy app: assign timestamp in a single place"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It\u0027s not immediately obvious, but the direct client functions always"},{"line_number":10,"context_line":"set an x-timestamp header in request headers if the header does not"},{"line_number":11,"context_line":"already exist. This patch refactors the module so that the timestamp"},{"line_number":12,"context_line":"is set in one place."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Drive-by: fix missing call to do_test helper in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"e86e57f1_7162ada8","line":11,"range":{"start_line":9,"start_character":34,"end_line":11,"end_character":13},"in_reply_to":"9a00addb_43d27a21","updated":"2026-01-30 11:14:05.000000000","message":"HEADs got an x-timestamp before, because ``add_ts`` defaulted True\n```\ndef gen_headers(hdrs_in\u003dNone, add_ts\u003dTrue):\n```\n\nTBH I think the GET escaped my notice, but yes object server takes care of it.","commit_id":"7bf728b6198400aa2057bf42d34f434e6dc71407"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d77a155d91b55d05ff5e0068eebcdb0d79532e93","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"daa6925b_d94c0586","updated":"2026-01-19 18:37:15.000000000","message":"I\u0027m not yet sore whether direct client should be getting \u0027smarter\u0027,  later in the patch chain, about timestamps with and without jitter for different request types. Perhaps the user of direct client should be aware of jitter or no jitter.\n\nBut given that direct client does set x-timestamp, maybe it *should* set the request specific type of timestamp?\n\nEither way, some refactoring seems useful to make it more obvious that x-timestamp WILL be set on all requests.","commit_id":"c3f778dda203b38b5b6084bd550809f72fca2cdb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9fc8f6f65ddbf77a9d069efa900c136581b567f3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"fae6da20_0d79ec79","updated":"2026-01-29 23:40:50.000000000","message":"Looks like a solid refactor 👍","commit_id":"7bf728b6198400aa2057bf42d34f434e6dc71407"}],"swift/common/direct_client.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d77a155d91b55d05ff5e0068eebcdb0d79532e93","unresolved":true,"context_lines":[{"line_number":31,"context_line":"from swift.common.request_helpers import USE_REPLICATION_NETWORK_HEADER, \\"},{"line_number":32,"context_line":"    get_ip_port"},{"line_number":33,"context_line":"from swift.common.swob import normalize_etag"},{"line_number":34,"context_line":"from swift.common.utils import FileLikeIter, quote, Timestamp"},{"line_number":35,"context_line":"from swift.common.http import HTTP_NO_CONTENT, HTTP_INSUFFICIENT_STORAGE, \\"},{"line_number":36,"context_line":"    is_success, is_server_error"},{"line_number":37,"context_line":"from swift.common.header_key_dict import HeaderKeyDict"}],"source_content_type":"text/x-python","patch_set":1,"id":"8993da7e_9feba70c","line":34,"updated":"2026-01-19 18:37:15.000000000","message":"hmmm, something  due to me rebasing/re-ordering patches I think","commit_id":"c3f778dda203b38b5b6084bd550809f72fca2cdb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9cc9b40c9b8fa04389ba0949d0f2f122cbcfe262","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from swift.common.request_helpers import USE_REPLICATION_NETWORK_HEADER, \\"},{"line_number":32,"context_line":"    get_ip_port"},{"line_number":33,"context_line":"from swift.common.swob import normalize_etag"},{"line_number":34,"context_line":"from swift.common.utils import FileLikeIter, quote, Timestamp"},{"line_number":35,"context_line":"from swift.common.http import HTTP_NO_CONTENT, HTTP_INSUFFICIENT_STORAGE, \\"},{"line_number":36,"context_line":"    is_success, is_server_error"},{"line_number":37,"context_line":"from swift.common.header_key_dict import HeaderKeyDict"}],"source_content_type":"text/x-python","patch_set":1,"id":"c8e71bd9_1d1ffaf5","line":34,"in_reply_to":"8993da7e_9feba70c","updated":"2026-01-30 11:14:05.000000000","message":"Done","commit_id":"c3f778dda203b38b5b6084bd550809f72fca2cdb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d77a155d91b55d05ff5e0068eebcdb0d79532e93","unresolved":true,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    ip, port \u003d get_ip_port(node, headers)"},{"line_number":119,"context_line":"    headers.setdefault(\u0027X-Backend-Allow-Reserved-Names\u0027, \u0027true\u0027)"},{"line_number":120,"context_line":"    headers.setdefault(\u0027X-Timestamp\u0027, Timestamp.now().internal)"},{"line_number":121,"context_line":"    with Timeout(conn_timeout):"},{"line_number":122,"context_line":"        conn \u003d http_connect(ip, port, node[\u0027device\u0027], part,"},{"line_number":123,"context_line":"                            method, path, headers\u003dheaders)"}],"source_content_type":"text/x-python","patch_set":1,"id":"52038e1a_b3e1fcfa","line":120,"updated":"2026-01-19 18:37:15.000000000","message":"I\u0027m doing this here rather than in gen_headers (which is arguably more intuitive in *this* patch) because in a future patch we want to choose different timestamp types according to server type and method, which are available here in _make_req","commit_id":"c3f778dda203b38b5b6084bd550809f72fca2cdb"}],"test/unit/common/test_direct_client.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9cc9b40c9b8fa04389ba0949d0f2f122cbcfe262","unresolved":true,"context_lines":[{"line_number":768,"context_line":""},{"line_number":769,"context_line":"        self.assertEqual(conn.req_headers[\u0027user-agent\u0027], self.user_agent)"},{"line_number":770,"context_line":"        self.assertEqual(\u0027bar\u0027, conn.req_headers.get(\u0027x-foo\u0027))"},{"line_number":771,"context_line":"        self.assertIn(\u0027x-timestamp\u0027, conn.req_headers)"},{"line_number":772,"context_line":"        self.assertEqual(headers, resp)"},{"line_number":773,"context_line":""},{"line_number":774,"context_line":"    def test_direct_head_object_error(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"b91bb173_a622a743","side":"PARENT","line":771,"updated":"2026-01-30 11:14:05.000000000","message":"this assertion already existed...","commit_id":"8d9cfa98805b41ec6a46a6976e544e943fcc1314"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9cc9b40c9b8fa04389ba0949d0f2f122cbcfe262","unresolved":true,"context_lines":[{"line_number":813,"context_line":"            self.assertEqual(conn.port, self.node[\u0027port\u0027])"},{"line_number":814,"context_line":"            self.assertEqual(conn.method, \u0027GET\u0027)"},{"line_number":815,"context_line":"            self.assertEqual(conn.path, self.obj_path)"},{"line_number":816,"context_line":"        self.assertEqual(obj_body, contents.getvalue())"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":"    def test_direct_get_object_error(self):"},{"line_number":819,"context_line":"        with mocked_http_conn(500) as conn:"}],"source_content_type":"text/x-python","patch_set":3,"id":"84c79c94_4d484da8","side":"PARENT","line":816,"updated":"2026-01-30 11:14:05.000000000","message":"...but there was no existing x-timestamp assertion on object GET :/","commit_id":"8d9cfa98805b41ec6a46a6976e544e943fcc1314"}]}
