)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b91f0ae8cce3cbb100689f55d6020c80442f393f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"5ffb09c0_2472e626","updated":"2026-03-25 22:18:30.000000000","message":"I think **this** is the really confusing/bad thing:\n```\n\u003e\u003e\u003e Timestamp(123, offset\u003dMAX_OFFSET)\n0000000123.00000_ffffffffffffffff\n\u003e\u003e\u003e ~Timestamp(123, offset\u003dMAX_OFFSET)\n9999999876.99999_0000000000000000\n\u003e\u003e\u003e ~~Timestamp(123, offset\u003dMAX_OFFSET)\n0000000123.00000_0000000000000000\n```\nhttps://review.opendev.org/c/openstack/swift/+/982177","commit_id":"1001569ddc8dadf011398511e732c6286ef1e6ba"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c63aec91bbc2322e07c5dce9fe86839f8a3ac522","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"58d531d7_24ef1483","updated":"2026-03-25 21:48:59.000000000","message":"I think i\u0027m still trying to understand the relationship of versioning and jitter.","commit_id":"1001569ddc8dadf011398511e732c6286ef1e6ba"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3a2b538735ceeaa81c239463febd8002da6af979","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"916d8e78_4bb808ff","in_reply_to":"5ffb09c0_2472e626","updated":"2026-03-26 02:24:05.000000000","message":"Or, alternatively, https://review.opendev.org/c/openstack/swift/+/982183","commit_id":"1001569ddc8dadf011398511e732c6286ef1e6ba"}],"test/unit/common/utils/test_timestamp.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b91f0ae8cce3cbb100689f55d6020c80442f393f","unresolved":true,"context_lines":[{"line_number":826,"context_line":"            \u00270000123456.78900_0000000000000003\u0027,"},{"line_number":827,"context_line":"            \u00270000123456.78900_000000000000002a\u0027,"},{"line_number":828,"context_line":"        ], sorted([repr(ts) for ts in mixed_timestamps]))"},{"line_number":829,"context_line":"        # because shorter strings sort first"},{"line_number":830,"context_line":"        self.assertEqual(["},{"line_number":831,"context_line":"            \u00270000123456.78900\u0027,"},{"line_number":832,"context_line":"            \u00270000123456.78900_0000000000000003\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"217e03e3_fad86bac","line":829,"range":{"start_line":829,"start_character":18,"end_line":829,"end_character":33},"updated":"2026-03-25 22:18:30.000000000","message":"[Technically true](https://github.com/openstack/swift/blob/2.37.1/swift/common/utils/timestamp.py#L257), I suppose -- but in my mind, anyway, it\u0027s more to do with `(123456.789, 0) \u003c (123456.789, 3) \u003c (123456.789, 42)` -- then we chose a string encoding that ensures we get that same order when we sort filesystem paths (so it\u0027s handy that `_` sorts *after* `.`...)","commit_id":"1001569ddc8dadf011398511e732c6286ef1e6ba"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b91f0ae8cce3cbb100689f55d6020c80442f393f","unresolved":true,"context_lines":[{"line_number":879,"context_line":"            \u00279999876543.21099_fffffffffffffffc\u0027)).offset)"},{"line_number":880,"context_line":"        self.assertEqual(42, (~timestamp.Timestamp("},{"line_number":881,"context_line":"            \u00279999876543.21099_ffffffffffffffd5\u0027)).offset)"},{"line_number":882,"context_line":"        # expected"},{"line_number":883,"context_line":"        self.assertEqual(["},{"line_number":884,"context_line":"            \u00279999876543.21099_fffffffffffffffc\u0027,  # ~3"},{"line_number":885,"context_line":"            \u00279999876543.21099_ffffffffffffffd5\u0027,  # ~42"},{"line_number":886,"context_line":"        ], sorted(["},{"line_number":887,"context_line":"            \u00279999876543.21099_ffffffffffffffd5\u0027,"},{"line_number":888,"context_line":"            \u00279999876543.21099_fffffffffffffffc\u0027,"},{"line_number":889,"context_line":"        ], reverse\u003dTrue))"},{"line_number":890,"context_line":"        # potentially surprising"},{"line_number":891,"context_line":"        self.assertEqual(["},{"line_number":892,"context_line":"            \u00279999876543.21099_fffffffffffffffc\u0027,  # ~3"},{"line_number":893,"context_line":"            \u00279999876543.21099_ffffffffffffffd5\u0027,  # ~42"},{"line_number":894,"context_line":"            \u00279999876543.21099\u0027,                   # ~0"},{"line_number":895,"context_line":"        ], sorted(["},{"line_number":896,"context_line":"            \u00279999876543.21099\u0027,"},{"line_number":897,"context_line":"            \u00279999876543.21099_ffffffffffffffd5\u0027,"},{"line_number":898,"context_line":"            \u00279999876543.21099_fffffffffffffffc\u0027,"},{"line_number":899,"context_line":"        ], reverse\u003dTrue))"},{"line_number":900,"context_line":"        # even if this might seem counter intuative; before you go thinking you"},{"line_number":901,"context_line":"        # can make this \"better\" by having inverted offset-less timestamps sort"},{"line_number":902,"context_line":"        # to the end remember that object_versioning has been inverting legacy"}],"source_content_type":"text/x-python","patch_set":1,"id":"07f62653_15007d6d","line":899,"range":{"start_line":882,"start_character":8,"end_line":899,"end_character":25},"updated":"2026-03-25 22:18:30.000000000","message":"You\u0027re losing me here -- why are we testing string sorting? I kinda trust stdlib to do that right for me. Where\u0027s the `Timestamp`?","commit_id":"1001569ddc8dadf011398511e732c6286ef1e6ba"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c63aec91bbc2322e07c5dce9fe86839f8a3ac522","unresolved":true,"context_lines":[{"line_number":904,"context_line":"        # making their inverse suddenly tack on a _ffffffffffffffff after them"},{"line_number":905,"context_line":"        # w/o thinking about this sorting and translation"},{"line_number":906,"context_line":"        self.assertEqual(0, (~timestamp.Timestamp(0)).offset)"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"    def test_inversion_reversibility(self):"},{"line_number":909,"context_line":"        def do_test(ts):"},{"line_number":910,"context_line":"            inv \u003d ~ts"}],"source_content_type":"text/x-python","patch_set":1,"id":"393f2b4c_c8abfe75","line":907,"updated":"2026-03-25 21:48:59.000000000","message":"this would be better if it used `Timestamp.now()` or however we\u0027re going to spell \"get a v2 timestamp\" so that we continue to say \"inverted offset-less still has no offset\" even if they do have a hexpart.\n\nIt\u0027s possible I don\u0027t fully understand the implications of \"timestamp collision during rolling upgrade sorts v1 inverse \u003c v2 jitter\"","commit_id":"1001569ddc8dadf011398511e732c6286ef1e6ba"}]}
