)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01782e7f70e1fd0d57593741ff3e5d62ba2214b3","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Tim Burke \u003ctim.burke@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-03-26 19:55:10 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Alternate Timestamp.__invert__ idea"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: If0b5f11f38405e69ae1b54d73b667abf0abfb89b"},{"line_number":10,"context_line":"Signed-off-by: Tim Burke \u003ctim.burke@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"c5bed75d_affaac47","line":7,"updated":"2026-03-31 14:35:34.000000000","message":"once merged it is no longer merely an idea 😊","commit_id":"0bc0308cf5c0dd750498ebd07e6888d4f65490d7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25d43253cc5c2721986159e391adcd4e5a4afd95","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Tim Burke \u003ctim.burke@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-03-26 19:55:10 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Alternate Timestamp.__invert__ idea"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: If0b5f11f38405e69ae1b54d73b667abf0abfb89b"},{"line_number":10,"context_line":"Signed-off-by: Tim Burke \u003ctim.burke@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"95637184_1f881d84","line":7,"in_reply_to":"c5bed75d_affaac47","updated":"2026-04-01 10:27:37.000000000","message":"Done","commit_id":"0bc0308cf5c0dd750498ebd07e6888d4f65490d7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01782e7f70e1fd0d57593741ff3e5d62ba2214b3","unresolved":true,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2026-03-26 19:55:10 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Alternate Timestamp.__invert__ idea"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: If0b5f11f38405e69ae1b54d73b667abf0abfb89b"},{"line_number":10,"context_line":"Signed-off-by: Tim Burke \u003ctim.burke@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"f9132563_a990e0a8","line":8,"updated":"2026-03-31 14:35:34.000000000","message":"should reference the previously merged implementation of ``__invert__``\n\n```\nRelated-Change: I4898c8250fe85dbbf66d0ab3d24b0ae9802820f5\n```","commit_id":"0bc0308cf5c0dd750498ebd07e6888d4f65490d7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"25d43253cc5c2721986159e391adcd4e5a4afd95","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2026-03-26 19:55:10 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Alternate Timestamp.__invert__ idea"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: If0b5f11f38405e69ae1b54d73b667abf0abfb89b"},{"line_number":10,"context_line":"Signed-off-by: Tim Burke \u003ctim.burke@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"81ecf038_5d65e8da","line":8,"in_reply_to":"f9132563_a990e0a8","updated":"2026-04-01 10:27:37.000000000","message":"Done","commit_id":"0bc0308cf5c0dd750498ebd07e6888d4f65490d7"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"79e4089b21da4fa958fe79659010b851671a6f3f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6f13942b_578f70de","updated":"2026-03-30 21:08:06.000000000","message":"I think this would be better than master:\n\n```\nvagrant@saio:~$ python3 -c \u0027from swift.common.utils import Timestamp; print(Timestamp(123) \u003c Timestamp(123, offset\u003d1), ~Timestamp(123) \u003e ~Timestamp(123, offset\u003d1))\u0027\nTrue True\n```\n\nthe nice thing about pushing the inverted offset into the previous decamicrosecond is we\u0027ve never defined what an inverted offset timestamp it\u0027s supposed to look like:\n\n```\n\u003e\u003e\u003e ~Timestamp(123, offset\u003d1)\n9999999876.99998_ffffffffffffffff\n```\n\n^ so there\u0027s no real basis to call it weird\n\nAnd since we\u0027re not changing the rendering of offset\u003d0 master is still happy:\n\n```\n\u003e\u003e\u003e ~Timestamp(9999999876.99999_0000000000000000)\n0000000123.00000_0000000000000000\n```\n\nHOWEVER, we have to act QUICK b/c after 981908: timestamps: support offsets with Timestamp.__invert__ | https://review.opendev.org/c/openstack/swift/+/981908\n\n... we\u0027re going to invert decoded timestamps \"wrong\"\n\n```\n\u003e\u003e\u003e ~Timestamp(\u00279999999876.99998_ffffffffffffffff\u0027)\n0000000123.00001_0000000000000000\n```\n\n... where as if you go back BEFORE that \"fix\" we would have just blown up:\n\n```\n\u003e\u003e\u003e ~Timestamp(\u00279999999876.99998_ffffffffffffffff\u0027)\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  File \"/vagrant/swift/swift/common/utils/timestamp.py\", line 264, in __invert__\n    raise ValueError(\u0027Cannot invert timestamps with offsets\u0027)\nValueError: Cannot invert timestamps with offsets\n```\n\nI think we need to merge this AND we should try to backport some kind of squashed/combined solution for \"how do we define inverted Timestamps w/ offset\"","commit_id":"0bc0308cf5c0dd750498ebd07e6888d4f65490d7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01782e7f70e1fd0d57593741ff3e5d62ba2214b3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7a3fbd73_1b73b218","updated":"2026-03-31 14:35:34.000000000","message":"it\u0027s worth referencing the previous implementation in the commit message","commit_id":"0bc0308cf5c0dd750498ebd07e6888d4f65490d7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54a6d3f8f29a468861f7b893c3377210ccd8fab4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"4b77fd4e_9f3dbf45","updated":"2026-03-27 04:29:10.000000000","message":"recheck","commit_id":"0bc0308cf5c0dd750498ebd07e6888d4f65490d7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445336c59d885530b133d6ea17101687ae94b2b5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"ee7c2aa0_5fd36fab","updated":"2026-03-31 19:17:48.000000000","message":"I think we dodged a bullet here - nice save Tim!","commit_id":"694d25bb1a87f9426ac7ad1f3817c51f5bf13a34"}],"swift/common/utils/timestamp.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01782e7f70e1fd0d57593741ff3e5d62ba2214b3","unresolved":true,"context_lines":[{"line_number":268,"context_line":"        else:"},{"line_number":269,"context_line":"            inv_float \u003d (MAX_RAW_TIME - self.raw - 1) * PRECISION"},{"line_number":270,"context_line":"            inv_hex_part \u003d MAX_OFFSET + 1 - self.offset"},{"line_number":271,"context_line":"        return Timestamp(inv_float, offset\u003dinv_hex_part)"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"def encode_timestamps(t1, t2\u003dNone, t3\u003dNone, explicit\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":2,"id":"eea81bbb_6c436881","line":271,"updated":"2026-03-31 14:35:34.000000000","message":"ok, this is smart. \n\nThe maximum \"value space\" is defined as ``999999999999999_0000000000000000`` rather than ````999999999999999_ffffffffffffffff`` as per the recently merged change to master.\n\nThat means that, when inverted, any non-zero offset \"subtracts\" from the inverted float part. The result therefore has a float part that must be less than the inverted float when offset\u003d0. Consequently, the inverted sort order is correct even when we have an offset-less inverted timestamp.\n\n```\n|  0123456789.01234_0000000000000000 -\u003e 9876543210.98765_0000000000000000  ^\n|  0123456789.01234_0000000000000001 -\u003e 9876543210.98764_ffffffffffffffff  |\nv  0123456789.01234_0000000000000002 -\u003e 9876543210.98764_fffffffffffffffe  |\n\n```\n\n```\n(~Timestamp.zero()).internal\n\u00279999999999.99999\u0027\n(~(Timestamp(Timestamp.zero(), offset\u003d1))).internal\n\u00279999999999.99998_ffffffffffffffff\u0027\n\n```\n\nWorth noting that the following is NO longer true:\n```\nts \u003d Timestamp(123, offset\u003d1)\n(~Timestamp(ts.normal)).normal \u003d\u003d (~ts).normal\n```\n\n```\n~Timestamp(ts.normal)\n9999999876.99999_0000000000000000\n(~ts).normal\n\u00279999999876.99998\u0027\n(~Timestamp(ts.normal)).normal\n\u00279999999876.99999\u0027\n(~Timestamp(ts)).normal\n\u00279999999876.99998\u0027\n```\n\nbut that\u0027s reasonable for an inversion of a \"rounded\" value, in the same way that these results differ:\n\n```\nmath.floor(max - 123.4)\n876\nmath.floor(max - math.floor(123.4))\n877\n```\n\n...but it may catch us out in some versioning tests where we\u0027ve written \n\n```\nts \u003d Timestamp.now(version\u003d2)\nx-timestamp\u003dts.normal\nexpected_version_id \u003d (~ts).normal\n```\n\nbut in fact\n\n```\nactual_version_id \u003d (~Timestamp(ts.normal)).normal\n```","commit_id":"0bc0308cf5c0dd750498ebd07e6888d4f65490d7"}],"test/unit/common/middleware/test_object_versioning.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445336c59d885530b133d6ea17101687ae94b2b5","unresolved":true,"context_lines":[{"line_number":2075,"context_line":"        self.app.register("},{"line_number":2076,"context_line":"            \u0027GET\u0027,"},{"line_number":2077,"context_line":"            self.build_versions_path("},{"line_number":2078,"context_line":"                obj\u003d\u0027o\u0027, version\u003d\u00279999999939.99998_d123456789edcbaa\u0027),"},{"line_number":2079,"context_line":"            swob.HTTPOk, {}, \u0027foobar\u0027)"},{"line_number":2080,"context_line":"        req \u003d Request.blank("},{"line_number":2081,"context_line":"            \u0027/v1/a/c/o\u0027, method\u003d\u0027GET\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"10799912_24f3a557","line":2078,"updated":"2026-03-31 19:17:48.000000000","message":"N.B. this is a brand new test as of the related change; because we\u0027re merging this quickly there\u0027s no upgrade concern for backwards compatibility with redefining what an inverted timestamp converts to:\n\nhttps://review.opendev.org/c/openstack/swift/+/981908/2/test/unit/common/middleware/test_object_versioning.py#2074","commit_id":"694d25bb1a87f9426ac7ad1f3817c51f5bf13a34"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445336c59d885530b133d6ea17101687ae94b2b5","unresolved":true,"context_lines":[{"line_number":2370,"context_line":"            (\u0027DELETE\u0027,"},{"line_number":2371,"context_line":"             \u0027%s?version-id\u003d0000000060.00000_2edcba9876123456\u0027"},{"line_number":2372,"context_line":"             % self.build_versions_path("},{"line_number":2373,"context_line":"                 obj\u003d\u0027o\u0027, version\u003d\u00279999999939.99998_d123456789edcbaa\u0027)),"},{"line_number":2374,"context_line":"        ])"},{"line_number":2375,"context_line":""},{"line_number":2376,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bf7ac8aa_4d51a90d","line":2373,"updated":"2026-03-31 19:17:48.000000000","message":"same deal, new test literal based on old/incorrect definition of inverting w/ hexpart\n\nhttps://review.opendev.org/c/openstack/swift/+/981908/2/test/unit/common/middleware/test_object_versioning.py#2355","commit_id":"694d25bb1a87f9426ac7ad1f3817c51f5bf13a34"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445336c59d885530b133d6ea17101687ae94b2b5","unresolved":true,"context_lines":[{"line_number":2609,"context_line":"        }, {"},{"line_number":2610,"context_line":"            \u0027bytes\u0027: 8,"},{"line_number":2611,"context_line":"            \u0027name\u0027: self.build_object_name("},{"line_number":2612,"context_line":"                \u0027obj\u0027, \u00279999999989.99998_d123456789edcbaa\u0027),"},{"line_number":2613,"context_line":"            \u0027hash\u0027: \u0027ebdd8d46ecb4a07f6c433d67eb35d5f2\u0027,"},{"line_number":2614,"context_line":"            \u0027last_modified\u0027: \u00271970-01-01T00:00:10.000000\u0027,"},{"line_number":2615,"context_line":"            \u0027content_type\u0027: \u0027text/plain\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"a03515ce_fd315253","line":2612,"updated":"2026-03-31 19:17:48.000000000","message":"similar situation, this was an existing test that was just buffed up to include an inversion w/ hexpart example:\n\nhttps://review.opendev.org/c/openstack/swift/+/981908/2/test/unit/common/middleware/test_object_versioning.py#2612","commit_id":"694d25bb1a87f9426ac7ad1f3817c51f5bf13a34"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445336c59d885530b133d6ea17101687ae94b2b5","unresolved":true,"context_lines":[{"line_number":2930,"context_line":"            \u0027%s?marker\u003d%s\u0027 % ("},{"line_number":2931,"context_line":"                self.build_versions_path(),"},{"line_number":2932,"context_line":"                self.build_object_name("},{"line_number":2933,"context_line":"                    \u0027obj\u0027, \u00279999999989.99998_d123456789edcbaa\u0027)),"},{"line_number":2934,"context_line":"            swob.HTTPOk, {},"},{"line_number":2935,"context_line":"            json.dumps(versions_listing_body[2:]).encode(\u0027utf8\u0027))"},{"line_number":2936,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":3,"id":"29429796_5d42eb1d","line":2933,"updated":"2026-03-31 19:17:48.000000000","message":"this block is also new assertion added to existing test:\n\nhttps://review.opendev.org/c/openstack/swift/+/981908/2/test/unit/common/middleware/test_object_versioning.py#2870","commit_id":"694d25bb1a87f9426ac7ad1f3817c51f5bf13a34"}],"test/unit/common/utils/test_timestamp.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445336c59d885530b133d6ea17101687ae94b2b5","unresolved":true,"context_lines":[{"line_number":818,"context_line":"            timestamp.Timestamp(123.456, offset\u003d42),"},{"line_number":819,"context_line":"            timestamp.Timestamp(123.4567, offset\u003d0),"},{"line_number":820,"context_line":"        ]"},{"line_number":821,"context_line":"        self.assertEqual(timestamps, sorted(timestamps))"},{"line_number":822,"context_line":"        self.assertEqual("},{"line_number":823,"context_line":"            [~x for x in timestamps],"},{"line_number":824,"context_line":"            sorted((~x for x in timestamps), reverse\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":3,"id":"5cb1ed13_811edb97","line":821,"updated":"2026-03-31 19:17:48.000000000","message":"read-as: \"the literal is in the sorted order\"","commit_id":"694d25bb1a87f9426ac7ad1f3817c51f5bf13a34"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445336c59d885530b133d6ea17101687ae94b2b5","unresolved":true,"context_lines":[{"line_number":821,"context_line":"        self.assertEqual(timestamps, sorted(timestamps))"},{"line_number":822,"context_line":"        self.assertEqual("},{"line_number":823,"context_line":"            [~x for x in timestamps],"},{"line_number":824,"context_line":"            sorted((~x for x in timestamps), reverse\u003dTrue))"},{"line_number":825,"context_line":""},{"line_number":826,"context_line":"        ts \u003d timestamp.Timestamp.now()"},{"line_number":827,"context_line":"        self.assertGreater(~ts, ts)  # NB: will break around 2128"}],"source_content_type":"text/x-python","patch_set":3,"id":"65fa6551_879814db","line":824,"updated":"2026-03-31 19:17:48.000000000","message":"read-as: \"the inversion of the literal is EQUAL to descending sorting\"\n\nI think this test would be slightly stronger if it said something about the sort order of the .internal string format as well.\n\n982911: test: more inversion sanity checks | https://review.opendev.org/c/openstack/swift/+/982911","commit_id":"694d25bb1a87f9426ac7ad1f3817c51f5bf13a34"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445336c59d885530b133d6ea17101687ae94b2b5","unresolved":true,"context_lines":[{"line_number":843,"context_line":"        do_test(timestamp.Timestamp(1755077566.123456))"},{"line_number":844,"context_line":"        do_test(timestamp.Timestamp(1755077566.123456, offset\u003d1))"},{"line_number":845,"context_line":"        do_test(timestamp.Timestamp(1755077566.123456,"},{"line_number":846,"context_line":"                                    offset\u003dtimestamp.MAX_OFFSET))"},{"line_number":847,"context_line":"        do_test(timestamp.Timestamp.now())"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5cbced73_4296f430","line":846,"updated":"2026-03-31 19:17:48.000000000","message":"I think this is really telling about what\u0027s wrong with master, with this change reverted inverting an invert with max_offset doesn\u0027t \"blow up\" - it just gives you the wrong answer:\n\n```\n    self.assertEqual(ts, inv_inv)\nE   AssertionError: 1755077566.12346_ffffffffffffffff !\u003d 1755077566.12346_0000000000000000\n```","commit_id":"694d25bb1a87f9426ac7ad1f3817c51f5bf13a34"}]}
