)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"57de1342393bee8331590ae90248aa5ee2404221","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"b5e87140_d2749125","updated":"2023-02-17 01:20:11.000000000","message":"Looks sane. I\u0027d like it more if we could *also* encode metas with offsets, though: https://review.opendev.org/c/openstack/swift/+/874184 ","commit_id":"83d45cd16c6ebafd784e035aa2b7d078c78df44f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"845b242dc21cc93e02b8c3e04ff426a3129706cd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"30e6caa9_0cfbfd4d","updated":"2023-02-16 18:41:35.000000000","message":"WIP - I should write a launchpad bug, and ponder more how ts_ctype behaves","commit_id":"83d45cd16c6ebafd784e035aa2b7d078c78df44f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1d1eb74c98c7736de444b5933d68b5ccca826663","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8d9958cd_0b8a80ee","updated":"2023-02-18 00:40:28.000000000","message":"I\u0027d still be willing to carry this.","commit_id":"b5bc8d801d118c445141e0024b0cca048aa5a884"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"629e98fb840c33daf243b1f5061850492ce3ec3d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"13bae37c_521df0c9","updated":"2023-02-17 15:41:48.000000000","message":"This seems reasonable and complete.\n\nBut I think it would be better with a probetest that validates ssync replication in the face of versioned objects w/ metadata.","commit_id":"b5bc8d801d118c445141e0024b0cca048aa5a884"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6050705b1089e7db89c3664aed8bcfbeb5386363","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"09e59970_1c6decc5","updated":"2023-02-17 20:41:06.000000000","message":"when i tried to replicate the bug using an EC object (ssync) with versioned objects (offset) and user-metadata https://review.opendev.org/c/openstack/swift/+/874330 the reconstructor was able to ship the metadata fragments from the handoff back to the primary.\n\nso maybe I don\u0027t fully understand the failure mode requirements yet","commit_id":"b5bc8d801d118c445141e0024b0cca048aa5a884"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1d1eb74c98c7736de444b5933d68b5ccca826663","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"46f991d7_1af39e3c","in_reply_to":"09e59970_1c6decc5","updated":"2023-02-18 00:40:28.000000000","message":"The .meta gets there, but the handoff doesn\u0027t (necessarily?) clear. If the downed node gets data from another primary syncing, then the handoff never clears, and any other data in that... partition? suffix? won\u0027t sync off the handoff, either. I\u0027m still not *entirely* clear on the blast-radius.","commit_id":"b5bc8d801d118c445141e0024b0cca048aa5a884"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3f13e09048254d632ee800e7c459fdc543704a60","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"5e88cc91_b8e1ea73","updated":"2023-04-14 17:14:57.000000000","message":"We\u0027ve been shipping this for a while, and haven\u0027t seen the error again.","commit_id":"2fe18b24cd7e709c8712fcda7369b0715a21fb89"}],"swift/obj/ssync_receiver.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"629e98fb840c33daf243b1f5061850492ce3ec3d","unresolved":true,"context_lines":[{"line_number":45,"context_line":"    parts \u003d line.decode(\u0027ascii\u0027).split()"},{"line_number":46,"context_line":"    result[\u0027object_hash\u0027] \u003d urllib.parse.unquote(parts[0])"},{"line_number":47,"context_line":"    t_data \u003d urllib.parse.unquote(parts[1])"},{"line_number":48,"context_line":"    result[\u0027ts_data\u0027] \u003d Timestamp(t_data)"},{"line_number":49,"context_line":"    result[\u0027ts_meta\u0027] \u003d result[\u0027ts_ctype\u0027] \u003d result[\u0027ts_data\u0027]"},{"line_number":50,"context_line":"    result[\u0027durable\u0027] \u003d True  # default to True in case this key isn\u0027t sent"},{"line_number":51,"context_line":"    if len(parts) \u003e 2:"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfdeb0d0_a6ff8fd2","line":48,"updated":"2023-02-17 15:41:48.000000000","message":"? result[\u0027ts_data\u0027] \u003d ts_data \u003d Timestamp(t_data)\n? normal_ts_data \u003d result[\u0027ts_data\u0027].normal","commit_id":"b5bc8d801d118c445141e0024b0cca048aa5a884"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"23732191b76e2a503251dbfabe064a572cb723ed","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    parts \u003d line.decode(\u0027ascii\u0027).split()"},{"line_number":46,"context_line":"    result[\u0027object_hash\u0027] \u003d urllib.parse.unquote(parts[0])"},{"line_number":47,"context_line":"    t_data \u003d urllib.parse.unquote(parts[1])"},{"line_number":48,"context_line":"    result[\u0027ts_data\u0027] \u003d Timestamp(t_data)"},{"line_number":49,"context_line":"    result[\u0027ts_meta\u0027] \u003d result[\u0027ts_ctype\u0027] \u003d result[\u0027ts_data\u0027]"},{"line_number":50,"context_line":"    result[\u0027durable\u0027] \u003d True  # default to True in case this key isn\u0027t sent"},{"line_number":51,"context_line":"    if len(parts) \u003e 2:"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfb9c7bb_08fce9bf","line":48,"in_reply_to":"dfdeb0d0_a6ff8fd2","updated":"2023-02-24 10:20:32.000000000","message":"Done","commit_id":"b5bc8d801d118c445141e0024b0cca048aa5a884"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"629e98fb840c33daf243b1f5061850492ce3ec3d","unresolved":true,"context_lines":[{"line_number":55,"context_line":"            k, v \u003d item.split(\u0027:\u0027)"},{"line_number":56,"context_line":"            if k \u003d\u003d \u0027m\u0027:"},{"line_number":57,"context_line":"                # ignore ts_data offset when calculating ts_meta"},{"line_number":58,"context_line":"                result[\u0027ts_meta\u0027] \u003d Timestamp(Timestamp(t_data).normal,"},{"line_number":59,"context_line":"                                              delta\u003dint(v, 16))"},{"line_number":60,"context_line":"            elif k \u003d\u003d \u0027t\u0027:"},{"line_number":61,"context_line":"                # ignore ts_data offset when calculating ts_ctype"}],"source_content_type":"text/x-python","patch_set":2,"id":"1de87e4f_b0b3ee2e","line":58,"updated":"2023-02-17 15:41:48.000000000","message":"result[\u0027ts_data\u0027].normal?","commit_id":"b5bc8d801d118c445141e0024b0cca048aa5a884"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"23732191b76e2a503251dbfabe064a572cb723ed","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            k, v \u003d item.split(\u0027:\u0027)"},{"line_number":56,"context_line":"            if k \u003d\u003d \u0027m\u0027:"},{"line_number":57,"context_line":"                # ignore ts_data offset when calculating ts_meta"},{"line_number":58,"context_line":"                result[\u0027ts_meta\u0027] \u003d Timestamp(Timestamp(t_data).normal,"},{"line_number":59,"context_line":"                                              delta\u003dint(v, 16))"},{"line_number":60,"context_line":"            elif k \u003d\u003d \u0027t\u0027:"},{"line_number":61,"context_line":"                # ignore ts_data offset when calculating ts_ctype"}],"source_content_type":"text/x-python","patch_set":2,"id":"781065ef_101d0ef4","line":58,"in_reply_to":"1de87e4f_b0b3ee2e","updated":"2023-02-24 10:20:32.000000000","message":"Ack","commit_id":"b5bc8d801d118c445141e0024b0cca048aa5a884"}],"test/unit/obj/test_ssync_sender.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"629e98fb840c33daf243b1f5061850492ce3ec3d","unresolved":true,"context_lines":[{"line_number":2060,"context_line":"                    \u0027durable\u0027: False}"},{"line_number":2061,"context_line":"        msg \u003d ssync_sender.encode_missing(**expected)"},{"line_number":2062,"context_line":"        actual \u003d ssync_receiver.decode_missing(msg)"},{"line_number":2063,"context_line":"        self.assertEqual(expected, actual)"},{"line_number":2064,"context_line":""},{"line_number":2065,"context_line":"    def test_decode_wanted(self):"},{"line_number":2066,"context_line":"        parts \u003d [\u0027d\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"ac55a6e5_3b2d96e0","line":2063,"updated":"2023-02-17 15:41:48.000000000","message":"E       AssertionError: {\u0027obj[46 chars] \u0027ts_meta\u0027: 1676648372.00000_0000000000000000,[106 chars]alse} !\u003d {\u0027obj[46 chars] \u0027ts_data\u0027: 1676648370.00000_0000000000000001,[106 chars]alse}\nE         {\u0027durable\u0027: False,\nE          \u0027object_hash\u0027: \u00279d41d8cd98f00b204e9800998ecf0abc\u0027,\nE       -  \u0027ts_ctype\u0027: 1676648371.00000_0000000000000000,\nE       ?                                              ^\nE       \nE       +  \u0027ts_ctype\u0027: 1676648371.00000_0000000000000001,\nE       ?                                              ^\nE       \nE          \u0027ts_data\u0027: 1676648370.00000_0000000000000001,\nE       -  \u0027ts_meta\u0027: 1676648372.00000_0000000000000000}\nE       ?                                             ^\nE       \nE       +  \u0027ts_meta\u0027: 1676648372.00000_0000000000000001}\nE       ?                                             ^\n\nswift/test/unit/obj/test_ssync_sender.py:2063: AssertionError","commit_id":"b5bc8d801d118c445141e0024b0cca048aa5a884"}]}
