)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e9df20eac966c497c92a74d1ede7de6a02ace782","unresolved":true,"context_lines":[{"line_number":13,"context_line":"Object variants that are copied from the user container to the"},{"line_number":14,"context_line":"versions container may have Timestamps with offsets if the object has"},{"line_number":15,"context_line":"been moved by the reconciler. The offset should be ignored when"},{"line_number":16,"context_line":"creating version strings for these versions."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Client requests that create object versions are not expected to have"},{"line_number":19,"context_line":"Timestamps with non-zero offset, but nevertheless the offset is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5b58df22_b12a1661","line":16,"updated":"2026-07-02 23:46:15.000000000","message":"it\u0027s perhaps a notable distinction between:\n\na timestamp string (includes offset)\na *version* string (does not include offset)\n\n... although perhaps moot if x-timestamp/last-modified of the copied object is not related to the timestamp that\u0027s used in the version-string.","commit_id":"b365ba5bb865350c61dd32fe7c7f976595fa09d1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4c723e3d58fea5812c8a6e3b18cd9991a12ba1f9","unresolved":true,"context_lines":[{"line_number":13,"context_line":"Object variants that are copied from the user container to the"},{"line_number":14,"context_line":"versions container may have Timestamps with offsets if the object has"},{"line_number":15,"context_line":"been moved by the reconciler. The offset should be ignored when"},{"line_number":16,"context_line":"creating version strings for these versions."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Client requests that create object versions are not expected to have"},{"line_number":19,"context_line":"Timestamps with non-zero offset, but nevertheless the offset is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"f08a564c_3ad67b58","line":16,"in_reply_to":"5b58df22_b12a1661","updated":"2026-07-06 13:20:37.000000000","message":"\u003eit\u0027s perhaps a notable distinction between:\n\n\u003ea timestamp string (includes offset)\n\u003ea version string (does not include offset)\n\nYes. I\u0027ve wondered whether that distinction might be worth reflecting as distinct classes (in a later patch, not here), with a VersionId class being the only thing that needs the ability to invert itself.","commit_id":"b365ba5bb865350c61dd32fe7c7f976595fa09d1"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e9df20eac966c497c92a74d1ede7de6a02ace782","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"a13e5575_a4e0e051","updated":"2026-07-02 23:46:15.000000000","message":"LGTM, maybe moar tests never hurt anybody?\n\n995911: sq? Add DELETE marker offset regression | https://review.opendev.org/c/openstack/swift/+/995911","commit_id":"b365ba5bb865350c61dd32fe7c7f976595fa09d1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ff9d2519e5304897d6c166ce3f7ea0023876923f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"3f3ad41c_ce75f099","updated":"2026-07-02 20:17:04.000000000","message":"OK, I think I get it and am on board with it, though I definitely want another set of eyes on it. Then we should also backport to `stable.2026.1`, yeah?","commit_id":"b365ba5bb865350c61dd32fe7c7f976595fa09d1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"451391d22d3e131b5965356b8b5a988b25346370","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"346d842d_95599cbb","updated":"2026-07-02 18:27:25.000000000","message":"ok, maybe it\u0027s not as bad as I feared...\n\nWith this patch (and previous commits):\n- newly minted versions will not include the offset i.e. equivalent to inverting ts.normal\n- `Timestamp.__invert__` will invert versions minted by a future release with v2 timestamps that *do* include a hex part\n\nOnce we have versions that have been minted by a future release i.e. including inverted hex_parts-sans-offset:\n\n- an older proxy will invert versions including the hex parts, so translation between inverted internal version names and externally exposed version-ids will work without loss (e.g. version listing and client ?version-id\u003d requests)\n\n- an *older* proxy handling a versioned overwrite will copy an existing null version that has a v2 timestamp to the versions container, but will erase the offset from the x-backend-timestamp when minting a version, and in erasing the offset will actually erase the jitter too...so we could potentially have two inconsistent source objects with different-jitter-but-same-deca-microsecond x-backend-timestamps that get assigned the same version. But the two copies use their respective client request timestamps when they PUT those similarly-named but different source objects to the versions container, so one of them will win (subject to older proxies suffering timestamp collisions!)","commit_id":"b365ba5bb865350c61dd32fe7c7f976595fa09d1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5449cbdfb710fdbfb31f9c471cd0d0748d022023","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"0481f76c_ea9f600e","updated":"2026-07-02 17:13:19.000000000","message":"wait! I\u0027m not sure we want to do this...\n\nwe have a conflict of requirements:\n1. don\u0027t include offset in versions\n2. do have older swift versions include jitter parts when inverting timestamps generated by newer versions\n\nProblem is older versions consider offset to be the whole 16 hex digits, so ignoring offset (requirement 1) conflicts with requirement 2.\n\nImmediate thoughts as to how to workaround: pre-emptively introduce v2 timestamp *support* (so that ts.offset does the right thing for v1 vs v2 timestamps in *older* releases), and then subsequently enable jitter. 😢","commit_id":"b365ba5bb865350c61dd32fe7c7f976595fa09d1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"540330c10f0acd666b99e93fcdb71c196f7f4f23","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"4a1b5985_e3816a59","updated":"2026-07-07 01:28:21.000000000","message":"recheck\n\nZuul seems to have lost track of this?","commit_id":"cdae92c47cca4cc152a80e32ea7c70f39ccf6f7f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a4484109970162c9a16f7235b13ed8b8e03d32f8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"7e03185d_68433abf","updated":"2026-07-07 03:41:42.000000000","message":"recheck\n\n`Timeout (32s) waiting for privilege escalation prompt`","commit_id":"cdae92c47cca4cc152a80e32ea7c70f39ccf6f7f"}],"swift/common/middleware/versioned_writes/object_versioning.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ff9d2519e5304897d6c166ce3f7ea0023876923f","unresolved":true,"context_lines":[{"line_number":474,"context_line":"                                 str(parse_date_header("},{"line_number":475,"context_line":"                                     get_resp.headers[\u0027last-modified\u0027]))))"},{"line_number":476,"context_line":"        vers_obj_name \u003d self._build_versions_object_name("},{"line_number":477,"context_line":"            object_name, timestamp_to_version(ts_source))"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        put_path_info \u003d \"/%s/%s/%s/%s\" % ("},{"line_number":480,"context_line":"            api_version, account_name, versions_cont, vers_obj_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"14d8ce4b_c470ed36","line":477,"updated":"2026-07-02 20:17:04.000000000","message":"With stock Swift, this is the only one that *might* have an offset, right? Even once we get v2 timestamps?","commit_id":"b365ba5bb865350c61dd32fe7c7f976595fa09d1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4c723e3d58fea5812c8a6e3b18cd9991a12ba1f9","unresolved":true,"context_lines":[{"line_number":474,"context_line":"                                 str(parse_date_header("},{"line_number":475,"context_line":"                                     get_resp.headers[\u0027last-modified\u0027]))))"},{"line_number":476,"context_line":"        vers_obj_name \u003d self._build_versions_object_name("},{"line_number":477,"context_line":"            object_name, timestamp_to_version(ts_source))"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        put_path_info \u003d \"/%s/%s/%s/%s\" % ("},{"line_number":480,"context_line":"            api_version, account_name, versions_cont, vers_obj_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"b09a7ed5_cf004fb5","line":477,"in_reply_to":"14d8ce4b_c470ed36","updated":"2026-07-06 13:20:37.000000000","message":"correct. The only middleware that increments offsets is ... object_versioning, when PUTting the symlink (for undocumented reasons), and that symlink would never be the subject of a _copy_current","commit_id":"b365ba5bb865350c61dd32fe7c7f976595fa09d1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ff9d2519e5304897d6c166ce3f7ea0023876923f","unresolved":true,"context_lines":[{"line_number":1156,"context_line":"                except ValueError:"},{"line_number":1157,"context_line":"                    raise HTTPBadRequest(\u0027invalid version_marker param\u0027)"},{"line_number":1158,"context_line":"                # note: use timestamp.internal here i.e. exactly what the"},{"line_number":1159,"context_line":"                # request query string specified"},{"line_number":1160,"context_line":"                params[\u0027marker\u0027] \u003d self._build_versions_object_name("},{"line_number":1161,"context_line":"                    params[\u0027marker\u0027], ts.internal)"},{"line_number":1162,"context_line":"        elif \u0027version_marker\u0027 in params:"}],"source_content_type":"text/x-python","patch_set":3,"id":"66a9a1e6_3908c3c7","line":1159,"updated":"2026-07-02 20:17:04.000000000","message":"Right, just in case an offset-ful version id got created previously.","commit_id":"b365ba5bb865350c61dd32fe7c7f976595fa09d1"}]}
