)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9892680adaa0617e777cb52c33c403d9501b12d9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"44393a9c_30c43a0c","updated":"2026-03-25 03:06:13.000000000","message":"Add this before the others isn\u0027t a bad idea. And helps with any migration or even rollbacks because versioning will still be able to read version_ids with offsets.","commit_id":"7814c0cb5620527724695ac6b1f48d27572a3767"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e355a7d0a50e5c11647d04ef0d1081555e3e189e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4f0f58fe_17ed0acd","updated":"2026-03-24 16:31:34.000000000","message":"WIP - this may not be the way we want to go","commit_id":"7814c0cb5620527724695ac6b1f48d27572a3767"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"70eb55fa3e18251ab0ac8ef91755e708c7a50d1c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"cc0b7a8e_520d2fd0","updated":"2026-03-25 03:06:26.000000000","message":"so this is my vote","commit_id":"7814c0cb5620527724695ac6b1f48d27572a3767"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b2b52f45c8955d546cbded4802fbdc878e39c2ff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"abe2be48_dd138d20","in_reply_to":"44393a9c_30c43a0c","updated":"2026-03-25 03:39:42.000000000","message":"For a bit of context: we\u0027re thinking of also backporting this to the open stable branches and advising operators to upgrade to one of these many checkpoint releases before upgrading to 2.38.0+ (at least, if they care to avoid some transient 500s during upgrade).\n\nSeems no worse than our attitude toward enabling SLO or other new features, and in many ways better. (Insofar as we 500 if you read data through not-yet-upgraded proxies that was written by upgraded proxies, rather than returning incorrect data.)","commit_id":"7814c0cb5620527724695ac6b1f48d27572a3767"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"03fb067bd7c7a1eeba9a235d49f3456474737fda","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"9b180ace_60fe444f","updated":"2026-03-25 19:07:21.000000000","message":"N.B. TONS of `test.unit.common.middleware.test_object_versioning` tests fail if you try to change `~Timestamp(0)` into `9999999999.99999_ffffffffffffffff`\n\n... but the ordering of inverted timestamps w/ and w/o offset is counter intuitive (IMHO) and probably worth a test:\n\ngiven:\n\n```\n\u003e\u003e\u003e timestamps \u003d [Timestamp(now, offset\u003d1), Timestamp(now)]\n\u003e\u003e\u003e sorted(timestamps)\n[1774464696.78910_0000000000000000, 1774464696.78910_0000000000000001]\n```\n\nthis is good:\n\n```\n\u003e\u003e\u003e sorted([~t for t in timestamps])\n[8225535236.53760_0000000000000000, 8225535236.53760_fffffffffffffffe]\n\u003e\u003e\u003e [~t for t in sorted([~t for t in timestamps])]\n[1774464763.46239_0000000000000000, 1774464763.46239_0000000000000001]\n```\n\nand this would be bad\n\n```\n\u003e\u003e\u003e sorted([~t for t in timestamps])\n[8225534837.07420_fffffffffffffffe, 8225534837.07420_ffffffffffffffff]\n\u003e\u003e\u003e [~t for t in sorted([~t for t in timestamps])]\n[1774465162.92579_0000000000000001, 1774465162.92579_0000000000000000]\n```\n\n... but I think it\u0027s counter intuitive?  if offset\u003d0 sorts before offset\u003d1 you wouldn\u0027t expect it to also sort before when reversed!?  So a test saying \"it\u0027s like this on purpose; e.g. think about legacy version_ids\" IN the timestamp test module might be helpful as a follow-on.","commit_id":"92ca1b8df7cc6521206a72b73d457254d9517725"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"04341ac68a346a9e8305fcbecb7b572d31dee2a0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"5d9b194c_a6291388","updated":"2026-03-25 19:00:59.000000000","message":"recheck\n\nSeems like an eventual consistency problem -- but it\u0027s weird that the retry with `--failed` didn\u0027t help that much :-/","commit_id":"92ca1b8df7cc6521206a72b73d457254d9517725"}],"swift/common/utils/timestamp.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2ca370d31b45c8517ea555218bba990da82e3d4d","unresolved":true,"context_lines":[{"line_number":265,"context_line":"        inv_float \u003d (MAX_RAW_TIME - self.raw) * PRECISION"},{"line_number":266,"context_line":"        if not self.offset:"},{"line_number":267,"context_line":"            # legacy Timestamps did not allow inversion of hex_parts"},{"line_number":268,"context_line":"            inv_hex_part \u003d 0"},{"line_number":269,"context_line":"        else:"},{"line_number":270,"context_line":"            inv_hex_part \u003d MAX_OFFSET - self.offset"},{"line_number":271,"context_line":"        return Timestamp(inv_float, offset\u003dinv_hex_part)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5958bdfc_f82354c9","line":268,"updated":"2026-03-24 19:31:54.000000000","message":"OK, right -- we want this so we don\u0027t go changing the (ideally, immutable) `X-Object-Version-Id` we return to clients.","commit_id":"7814c0cb5620527724695ac6b1f48d27572a3767"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"03fb067bd7c7a1eeba9a235d49f3456474737fda","unresolved":true,"context_lines":[{"line_number":265,"context_line":"        inv_float \u003d (MAX_RAW_TIME - self.raw) * PRECISION"},{"line_number":266,"context_line":"        if not self.offset:"},{"line_number":267,"context_line":"            # legacy Timestamps did not allow inversion of hex_parts"},{"line_number":268,"context_line":"            inv_hex_part \u003d 0"},{"line_number":269,"context_line":"        else:"},{"line_number":270,"context_line":"            inv_hex_part \u003d MAX_OFFSET - self.offset"},{"line_number":271,"context_line":"        return Timestamp(inv_float, offset\u003dinv_hex_part)"}],"source_content_type":"text/x-python","patch_set":1,"id":"161d0923_91c8d166","line":268,"in_reply_to":"5958bdfc_f82354c9","updated":"2026-03-25 19:07:21.000000000","message":"\u003e we want this so we don\u0027t go changing the (ideally, immutable) X-Object-Version-Id we return to clients.\n\nthis sounds pretty important, and AFAIK this is the only targeted test in test_timestamp we have for maintaining this behavior is:\n\n```\n    def test_inversion(self):\n        ts \u003d timestamp.Timestamp(\u00270\u0027)\n        inv_ts \u003d ~ts\n        self.assertIsInstance(inv_ts, timestamp.Timestamp)\n\u003e       self.assertEqual((inv_ts).internal, \u00279999999999.99999\u0027)\nE       AssertionError: \u00279999999999.99999_ffffffffffffffff\u0027 !\u003d \u00279999999999.99999\u0027\nE       - 9999999999.99999_ffffffffffffffff\nE       + 9999999999.99999\n\nswift/test/unit/common/utils/test_timestamp.py:799: AssertionError\n```","commit_id":"7814c0cb5620527724695ac6b1f48d27572a3767"}],"test/unit/common/utils/test_timestamp.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2ca370d31b45c8517ea555218bba990da82e3d4d","unresolved":true,"context_lines":[{"line_number":824,"context_line":""},{"line_number":825,"context_line":"            inv_inv_inv \u003d ~inv_inv"},{"line_number":826,"context_line":"            self.assertEqual(inv, inv_inv_inv)"},{"line_number":827,"context_line":"            self.assertEqual(inv.normal, inv_inv_inv.normal)"},{"line_number":828,"context_line":""},{"line_number":829,"context_line":"        do_test(timestamp.Timestamp(\u00271755077566.123456\u0027))"},{"line_number":830,"context_line":"        do_test(timestamp.Timestamp(1755077566.123456))"}],"source_content_type":"text/x-python","patch_set":1,"id":"592e06c0_30545a0d","line":827,"range":{"start_line":827,"start_character":53,"end_line":827,"end_character":59},"updated":"2026-03-24 19:31:54.000000000","message":"Not checking `.internal` here? Why?","commit_id":"7814c0cb5620527724695ac6b1f48d27572a3767"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"aa06e21071a08b625deb39c99f22413af6f986bd","unresolved":false,"context_lines":[{"line_number":824,"context_line":""},{"line_number":825,"context_line":"            inv_inv_inv \u003d ~inv_inv"},{"line_number":826,"context_line":"            self.assertEqual(inv, inv_inv_inv)"},{"line_number":827,"context_line":"            self.assertEqual(inv.normal, inv_inv_inv.normal)"},{"line_number":828,"context_line":""},{"line_number":829,"context_line":"        do_test(timestamp.Timestamp(\u00271755077566.123456\u0027))"},{"line_number":830,"context_line":"        do_test(timestamp.Timestamp(1755077566.123456))"}],"source_content_type":"text/x-python","patch_set":1,"id":"cfb8c4e1_7e11e27d","line":827,"range":{"start_line":827,"start_character":53,"end_line":827,"end_character":59},"in_reply_to":"592e06c0_30545a0d","updated":"2026-03-25 11:08:16.000000000","message":"Done","commit_id":"7814c0cb5620527724695ac6b1f48d27572a3767"}]}
