)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b4ae47bad458a1c63517a8bbc400c29059d4587","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"sq WIP ts FIX: autocreate db\u0027s with NormalTimestamps"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"TODO: needs a test for the reconciler change"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I1cd441b3d3cf5eda641691df2a2e81c685697b41"},{"line_number":12,"context_line":"Signed-off-by: Alistair Coles \u003calistairncoles@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"0bbc4ca9_a1342341","line":9,"updated":"2026-03-02 20:50:23.000000000","message":"replicator?","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"84c62d1c4b1e8ea18386acd23f9015edb1185c6f","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"sq WIP ts FIX: autocreate db\u0027s with NormalTimestamps"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"TODO: needs a test for the reconciler change"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I1cd441b3d3cf5eda641691df2a2e81c685697b41"},{"line_number":12,"context_line":"Signed-off-by: Alistair Coles \u003calistairncoles@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"dce72188_1ee804df","line":9,"in_reply_to":"0bbc4ca9_a1342341","updated":"2026-03-03 06:42:11.000000000","message":"The replicator in this patch uses NormalTimestamp for status_changed_at when then policy is different. So I asusme that\u0027s what he means.\n\nI wonder if we should also just allow jitter in container and account paths, because I don\u0027t think we do weird encoding there do we? Tho it\u0027s 6pm and I\u0027m tired, so maybe I\u0027m just not thinking straight.","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"sq WIP ts FIX: autocreate db\u0027s with NormalTimestamps"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"TODO: needs a test for the reconciler change"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I1cd441b3d3cf5eda641691df2a2e81c685697b41"},{"line_number":12,"context_line":"Signed-off-by: Alistair Coles \u003calistairncoles@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"fb5066ae_d63f1df4","line":9,"in_reply_to":"bfb3a9ef_334f07dd","updated":"2026-03-03 20:36:40.000000000","message":"Done","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e513c054e1cde1ecdee3ef7fc000afe64be52992","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"sq WIP ts FIX: autocreate db\u0027s with NormalTimestamps"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"TODO: needs a test for the reconciler change"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I1cd441b3d3cf5eda641691df2a2e81c685697b41"},{"line_number":12,"context_line":"Signed-off-by: Alistair Coles \u003calistairncoles@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"bfb3a9ef_334f07dd","line":9,"in_reply_to":"dce72188_1ee804df","updated":"2026-03-03 17:08:54.000000000","message":"sorry! it was very late and I muddled up my repliconcilers","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b4ae47bad458a1c63517a8bbc400c29059d4587","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"df1168f2_e9dc2248","updated":"2026-03-02 20:50:23.000000000","message":"created with parent\n\n```\nvagrant@saio:~$ sqlite3 -line /srv/node2/sdb2/containers/450/afd/7089ab48d955ab0851fc51cc17a34afd/7089ab48d955ab0851fc51cc17a34afd.db \"select * from container_info\"\n                  account \u003d AUTH_test\n                container \u003d test\n               created_at \u003d 1772481880.56753_267167a411000000\n            put_timestamp \u003d 1772481880.55729\n         delete_timestamp \u003d 0\n   reported_put_timestamp \u003d 0\nreported_delete_timestamp \u003d 0\n    reported_object_count \u003d 0\n      reported_bytes_used \u003d 0\n                     hash \u003d 00000000000000000000000000000000\n                       id \u003d 455e6c67-8c7a-4ce3-a1e5-da21eb3a5f87-\n                   status \u003d \n        status_changed_at \u003d 1772481880.55729\n                 metadata \u003d \n  x_container_sync_point1 \u003d -1\n  x_container_sync_point2 \u003d -1\n     storage_policy_index \u003d 0\n    reconciler_sync_point \u003d -1\n```\n\ncreated with this change:\n\n```\nvagrant@saio:~$ sqlite3 -line /srv/node3/sdb3/containers/121/796/1e6258de57eb068e238003602944e796/1e6258de57eb068e238003602944e796.db \"select * from container_info\"\n                  account \u003d AUTH_test\n                container \u003d test2\n               created_at \u003d 1772482021.05999\n            put_timestamp \u003d 1772482021.04906\n         delete_timestamp \u003d 0\n   reported_put_timestamp \u003d 0\nreported_delete_timestamp \u003d 0\n    reported_object_count \u003d 0\n      reported_bytes_used \u003d 0\n                     hash \u003d 00000000000000000000000000000000\n                       id \u003d d223cc78-0e4f-4556-bab4-a5ec8ca312dd-sdb3\n                   status \u003d \n        status_changed_at \u003d 1772482021.04906\n                 metadata \u003d \n  x_container_sync_point1 \u003d -1\n  x_container_sync_point2 \u003d -1\n     storage_policy_index \u003d 0\n    reconciler_sync_point \u003d -1\n```","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"14b5a951_261f8580","updated":"2026-03-03 20:36:40.000000000","message":"the plan is to squash this all into the \"introduce NormalTimestamp\" change yeah?\n\nsorry for the bum test 😭\n\n978816: sq: fixups for db auto create tests | https://review.opendev.org/c/openstack/swift/+/978816","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ba2542a45ee8cfc7ab9cda4cf5d94b7a0af87c3f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b2b93ddb_4d1f17c3","updated":"2026-03-06 18:13:48.000000000","message":"seems necessary and sufficient\n\nswift-dsvm-functional seems like an unrelated tox issues!?\n\n```\nAttributeError: \u0027Parsed\u0027 object has no attribute \u0027config_format\u0027\n```","commit_id":"c56ad1a8fff89b93c750c0105011e2af2b0a498a"}],"swift/account/backend.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            UPDATE account_stat SET account \u003d ?, created_at \u003d ?, id \u003d ?,"},{"line_number":153,"context_line":"                   put_timestamp \u003d ?, status_changed_at \u003d ?"},{"line_number":154,"context_line":"            \u0027\u0027\u0027, (self.account, NormalTimestamp.now().internal,"},{"line_number":155,"context_line":"                  self._new_db_id(), put_timestamp, put_timestamp))"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def create_policy_stat_table(self, conn):"},{"line_number":158,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"d5665e42_4dce03d3","line":155,"updated":"2026-03-03 20:36:40.000000000","message":"```\nE           AssertionError: \u00271772562887.25579_228abf024f000000\u0027 !\u003d \u00271772562887.25414\u0027\nE           - 1772562887.25579_228abf024f000000\nE           + 1772562887.25414\nE            : mismatch for created_at, 1772562887.25579_228abf024f000000 !\u003d 1772562887.25414\n\nswift/test/unit/common/test_db.py:565: AssertionError\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d warnings summary \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n```","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"}],"swift/common/db.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":false,"context_lines":[{"line_number":672,"context_line":"                                   delete_timestamp\u003dMAX(?, delete_timestamp)"},{"line_number":673,"context_line":"            \u0027\u0027\u0027 % self.db_type, (created_at, put_timestamp, delete_timestamp))"},{"line_number":674,"context_line":"            if old_status !\u003d self._is_deleted(conn):"},{"line_number":675,"context_line":"                timestamp \u003d NormalTimestamp.now()"},{"line_number":676,"context_line":"                self._update_status_changed_at(conn, timestamp.internal)"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"            conn.commit()"}],"source_content_type":"text/x-python","patch_set":3,"id":"ddbf9266_04e43614","line":675,"updated":"2026-03-03 20:36:40.000000000","message":"```\nE       AssertionError: \u00271772562958.59777\u0027 !\u003d \u00271772562958.59803_2d7c1948b1000000\u0027\nE       - 1772562958.59777\nE       + 1772562958.59803_2d7c1948b1000000\n\nswift/test/unit/common/test_db.py:469: AssertionError\n```","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"}],"swift/container/backend.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":false,"context_lines":[{"line_number":611,"context_line":"            INSERT INTO container_info (account, container, created_at, id,"},{"line_number":612,"context_line":"                put_timestamp, status_changed_at, storage_policy_index)"},{"line_number":613,"context_line":"            VALUES (?, ?, ?, ?, ?, ?, ?);"},{"line_number":614,"context_line":"        \"\"\", (self.account, self.container, NormalTimestamp.now().internal,"},{"line_number":615,"context_line":"              self._new_db_id(), put_timestamp, put_timestamp,"},{"line_number":616,"context_line":"              storage_policy_index))"},{"line_number":617,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"18a296fe_44cae902","line":614,"updated":"2026-03-03 20:36:40.000000000","message":"```\nE       AssertionError: \u00271772562998.65565_2ea60f0bc6000000\u0027 !\u003d \u00271772562998.65394\u0027\nE       - 1772562998.65565_2ea60f0bc6000000\nE       + 1772562998.65394\n\nswift/test/unit/common/test_db.py:363: AssertionError\n```","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":true,"context_lines":[{"line_number":1047,"context_line":"        \"\"\""},{"line_number":1048,"context_line":"        if timestamp is None:"},{"line_number":1049,"context_line":"            timestamp \u003d NormalTimestamp.now().internal"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"        def _setit(conn):"},{"line_number":1052,"context_line":"            conn.execute(\u0027\u0027\u0027"},{"line_number":1053,"context_line":"                INSERT OR IGNORE INTO policy_stat (storage_policy_index)"}],"source_content_type":"text/x-python","patch_set":3,"id":"217732e0_e867bb19","line":1050,"updated":"2026-03-03 20:36:40.000000000","message":"this method is tested in `container.test_backend` - but I don\u0027t think we assert on the value.\n\nDespite being pretty obvious I think something like this would be ok to add:\n\n```\ndiff --git a/test/unit/container/test_backend.py b/test/unit/container/test_backend.py\nindex 9b6a99065..76658ffe7 100644\n--- a/test/unit/container/test_backend.py\n+++ b/test/unit/container/test_backend.py\n@@ -3775,6 +3775,8 @@ class TestContainerBroker(test_db.TestDbBase):\n         self.assertEqual(0, info[\u0027object_count\u0027])\n         self.assertEqual(0, info[\u0027bytes_used\u0027])\n         self.assertEqual(timestamp.internal, info[\u0027status_changed_at\u0027])\n+        # for now we use NormalTimestamp in databases\n+        self.assertEqual(timestamp.normalized(), timestamp)\n         expected[111] \u003d {\u0027object_count\u0027: 0, \u0027bytes_used\u0027: 0}\n         self.assertEqual(expected, broker.get_policy_stats())\n```\n\nfails pretty obvious with this change reverted:\n\n```\n        # for now we use NormalTimestamp in databases\n\u003e       self.assertEqual(timestamp.normalized(), timestamp)\nE       AssertionError: 1772563589.00000 !\u003d 1772563589.00000_21f2edce1e000000\n\nswift/test/unit/container/test_backend.py:3779: AssertionError\n```\n\n... and will be easy to rip out when we realize that it\u0027d be good if `status_changed_at` didn\u0027t ever match unless it was replciated via rsync.","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a9ce6f9edd1c9c774ce26a61f4507d907040ccd3","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"        \"\"\""},{"line_number":1048,"context_line":"        if timestamp is None:"},{"line_number":1049,"context_line":"            timestamp \u003d NormalTimestamp.now().internal"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"        def _setit(conn):"},{"line_number":1052,"context_line":"            conn.execute(\u0027\u0027\u0027"},{"line_number":1053,"context_line":"                INSERT OR IGNORE INTO policy_stat (storage_policy_index)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fba83e0e_9332938a","line":1050,"in_reply_to":"217732e0_e867bb19","updated":"2026-03-06 15:46:59.000000000","message":"Done\n\nThis is annoying because I don\u0027t think the method is ever called without a timestamp except in tests","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"}],"swift/container/replicator.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b4ae47bad458a1c63517a8bbc400c29059d4587","unresolved":true,"context_lines":[{"line_number":409,"context_line":"        :returns: local broker replication info"},{"line_number":410,"context_line":"        \"\"\""},{"line_number":411,"context_line":"        info \u003d broker.get_replication_info()"},{"line_number":412,"context_line":"        if incorrect_policy_index(info, remote_info):"},{"line_number":413,"context_line":"            status_changed_at \u003d NormalTimestamp.now().internal"},{"line_number":414,"context_line":"            broker.set_storage_policy_index("},{"line_number":415,"context_line":"                remote_info[\u0027storage_policy_index\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"8b17e806_cf52919d","line":412,"updated":"2026-03-02 20:50:23.000000000","message":"whoa so this status_changed_at only happens during storage policy change?","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e513c054e1cde1ecdee3ef7fc000afe64be52992","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        :returns: local broker replication info"},{"line_number":410,"context_line":"        \"\"\""},{"line_number":411,"context_line":"        info \u003d broker.get_replication_info()"},{"line_number":412,"context_line":"        if incorrect_policy_index(info, remote_info):"},{"line_number":413,"context_line":"            status_changed_at \u003d NormalTimestamp.now().internal"},{"line_number":414,"context_line":"            broker.set_storage_policy_index("},{"line_number":415,"context_line":"                remote_info[\u0027storage_policy_index\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"d9f74d17_542bde34","line":412,"in_reply_to":"8b17e806_cf52919d","updated":"2026-03-03 17:08:54.000000000","message":"Acknowledged","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        if is_success(response.status):"},{"line_number":101,"context_line":"            remote_info \u003d json.loads(response.data.decode(\u0027ascii\u0027))"},{"line_number":102,"context_line":"            if incorrect_policy_index(info, remote_info):"},{"line_number":103,"context_line":"                status_changed_at \u003d NormalTimestamp.now()"},{"line_number":104,"context_line":"                broker.set_storage_policy_index("},{"line_number":105,"context_line":"                    remote_info[\u0027storage_policy_index\u0027],"},{"line_number":106,"context_line":"                    timestamp\u003dstatus_changed_at.internal)"}],"source_content_type":"text/x-python","patch_set":3,"id":"f262a995_324962cb","line":103,"updated":"2026-03-03 20:36:40.000000000","message":"I think this one is tested\n\n```\n    def test_sync_remote_recreate_policy_over_older_local_create(self):\n\u003e       for setup in self._replication_scenarios(remote_wins\u003dTrue):\n\nswift/test/unit/container/test_replicator.py:853: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nswift/test/unit/container/test_replicator.py:674: in _replication_scenarios\n    self.assertEqual(ts_remote, ts_remote.normalized())\nE   AssertionError: 1772564921.21083_239bdfa3d6000000 !\u003d 1772564921.21083\n\n```","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":true,"context_lines":[{"line_number":410,"context_line":"        \"\"\""},{"line_number":411,"context_line":"        info \u003d broker.get_replication_info()"},{"line_number":412,"context_line":"        if incorrect_policy_index(info, remote_info):"},{"line_number":413,"context_line":"            status_changed_at \u003d NormalTimestamp.now().internal"},{"line_number":414,"context_line":"            broker.set_storage_policy_index("},{"line_number":415,"context_line":"                remote_info[\u0027storage_policy_index\u0027],"},{"line_number":416,"context_line":"                timestamp\u003dstatus_changed_at)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3593e30d_273cedfb","line":413,"updated":"2026-03-03 20:36:40.000000000","message":"UDPATE: it was plenty well tested - there is a test bug 😭\n\nI think this one is un-tested\n\n```\ndiff --git a/swift/container/replicator.py b/swift/container/replicator.py\nindex b60cc428b..d9a1c38e5 100644\n--- a/swift/container/replicator.py\n+++ b/swift/container/replicator.py\n@@ -32,7 +32,7 @@ from swift.common.storage_policy import POLICIES\n from swift.common.swob import HTTPOk, HTTPAccepted\n from swift.common.http import is_success\n from swift.common.utils import majority_size, get_db_files, parse_options, \\\n-    node_to_string, NormalTimestamp\n+    node_to_string, NormalTimestamp, Timestamp\n \n \n def check_merge_own_shard_range(shards, broker, logger, source):\n@@ -410,7 +410,7 @@ class ContainerReplicatorRpc(db_replicator.ReplicatorRpc):\n         \"\"\"\n         info \u003d broker.get_replication_info()\n         if incorrect_policy_index(info, remote_info):\n-            status_changed_at \u003d NormalTimestamp.now().internal\n+            status_changed_at \u003d Timestamp.now().internal\n             broker.set_storage_policy_index(\n                 remote_info[\u0027storage_policy_index\u0027],\n                 timestamp\u003dstatus_changed_at)\n```\n\n^ that still passes `container.test_replicator`","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a9ce6f9edd1c9c774ce26a61f4507d907040ccd3","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        \"\"\""},{"line_number":411,"context_line":"        info \u003d broker.get_replication_info()"},{"line_number":412,"context_line":"        if incorrect_policy_index(info, remote_info):"},{"line_number":413,"context_line":"            status_changed_at \u003d NormalTimestamp.now().internal"},{"line_number":414,"context_line":"            broker.set_storage_policy_index("},{"line_number":415,"context_line":"                remote_info[\u0027storage_policy_index\u0027],"},{"line_number":416,"context_line":"                timestamp\u003dstatus_changed_at)"}],"source_content_type":"text/x-python","patch_set":3,"id":"02008044_9575d1d7","line":413,"in_reply_to":"3593e30d_273cedfb","updated":"2026-03-06 15:46:59.000000000","message":"Acknowledged","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"}],"swift/container/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":false,"context_lines":[{"line_number":462,"context_line":"                # the original request may have been an object update with"},{"line_number":463,"context_line":"                # jitter in the timestamp which we want to remove for the"},{"line_number":464,"context_line":"                # container timestamp"},{"line_number":465,"context_line":"                req_timestamp \u003d req_timestamp.normalized()"},{"line_number":466,"context_line":"                broker.initialize(req_timestamp.internal, policy_index)"},{"line_number":467,"context_line":"            except DatabaseAlreadyExists:"},{"line_number":468,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"e5b3befd_4174cb80","line":465,"updated":"2026-03-03 20:36:40.000000000","message":"this gets verified in delete/put auto_create_true\n\n```\nswift/test/unit/container/test_server.py:5835: in do_test\n    self.assertEqual(ts_put.normal,\nE   AssertionError: \u00271772566103.00000\u0027 !\u003d \u00271772566103.00000_2ee0043d13000000\u0027\nE   - 1772566103.00000\nE   + 1772566103.00000_2ee0043d13000000\n```","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"}],"test/unit/account/test_backend.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"afb5fe9d3e5433cde18d570cd79c440776575de8","unresolved":true,"context_lines":[{"line_number":257,"context_line":"        with mock_normal_timestamp_now(self.normal_ts()) as exp_created_at:"},{"line_number":258,"context_line":"            # we have to mock Timestamp.now() as well because the copies of"},{"line_number":259,"context_line":"            # historical code tested in subclasses use Timestamp assuming it"},{"line_number":260,"context_line":"            # has the legacy behaviour pre-jitter"},{"line_number":261,"context_line":"            with mock_timestamp_now(exp_created_at):"},{"line_number":262,"context_line":"                broker.initialize(start.internal)"},{"line_number":263,"context_line":"        info \u003d broker.get_info()"}],"source_content_type":"text/x-python","patch_set":2,"id":"0fdce141_79e269a7","line":260,"updated":"2026-03-03 10:50:02.000000000","message":"hmmm, so we actually need *in-repo* backwards compatibility","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"00bf497fa7185c9c2104e9d1045660800870f84a","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        with mock_normal_timestamp_now(self.normal_ts()) as exp_created_at:"},{"line_number":258,"context_line":"            # we have to mock Timestamp.now() as well because the copies of"},{"line_number":259,"context_line":"            # historical code tested in subclasses use Timestamp assuming it"},{"line_number":260,"context_line":"            # has the legacy behaviour pre-jitter"},{"line_number":261,"context_line":"            with mock_timestamp_now(exp_created_at):"},{"line_number":262,"context_line":"                broker.initialize(start.internal)"},{"line_number":263,"context_line":"        info \u003d broker.get_info()"}],"source_content_type":"text/x-python","patch_set":2,"id":"27023905_f92d2153","line":260,"in_reply_to":"0fdce141_79e269a7","updated":"2026-03-06 15:52:54.000000000","message":"Acknowledged","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ba2542a45ee8cfc7ab9cda4cf5d94b7a0af87c3f","unresolved":true,"context_lines":[{"line_number":1217,"context_line":"    Create account_stat table which is specific to the account DB."},{"line_number":1218,"context_line":""},{"line_number":1219,"context_line":"    Update 2026: Timestamp has evolved, so use NormalTimestamp in legacy tests"},{"line_number":1220,"context_line":"    because it better represents the behaviour of Timestamp c. 2013."},{"line_number":1221,"context_line":""},{"line_number":1222,"context_line":"    :param conn: DB connection object"},{"line_number":1223,"context_line":"    :param put_timestamp: put timestamp"}],"source_content_type":"text/x-python","patch_set":5,"id":"4d48d120_dbbebac7","line":1220,"updated":"2026-03-06 18:13:48.000000000","message":"great comment","commit_id":"c56ad1a8fff89b93c750c0105011e2af2b0a498a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"77b69db077fbd79ab49ae8c42a69706400f084fc","unresolved":false,"context_lines":[{"line_number":1217,"context_line":"    Create account_stat table which is specific to the account DB."},{"line_number":1218,"context_line":""},{"line_number":1219,"context_line":"    Update 2026: Timestamp has evolved, so use NormalTimestamp in legacy tests"},{"line_number":1220,"context_line":"    because it better represents the behaviour of Timestamp c. 2013."},{"line_number":1221,"context_line":""},{"line_number":1222,"context_line":"    :param conn: DB connection object"},{"line_number":1223,"context_line":"    :param put_timestamp: put timestamp"}],"source_content_type":"text/x-python","patch_set":5,"id":"0f0edc8e_fd96337b","line":1220,"in_reply_to":"4d48d120_dbbebac7","updated":"2026-03-09 12:28:59.000000000","message":"Acknowledged","commit_id":"c56ad1a8fff89b93c750c0105011e2af2b0a498a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ba2542a45ee8cfc7ab9cda4cf5d94b7a0af87c3f","unresolved":true,"context_lines":[{"line_number":1243,"context_line":"    conn.execute(\u0027\u0027\u0027"},{"line_number":1244,"context_line":"        UPDATE account_stat SET account \u003d ?, created_at \u003d ?, id \u003d ?,"},{"line_number":1245,"context_line":"               put_timestamp \u003d ?"},{"line_number":1246,"context_line":"        \u0027\u0027\u0027, (self.account, LegacyTimestamp.now().internal, str(uuid4()),"},{"line_number":1247,"context_line":"              put_timestamp))"},{"line_number":1248,"context_line":""},{"line_number":1249,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"74b3c061_8210c9ee","line":1246,"updated":"2026-03-06 18:13:48.000000000","message":"makes sense to me!","commit_id":"c56ad1a8fff89b93c750c0105011e2af2b0a498a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"77b69db077fbd79ab49ae8c42a69706400f084fc","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"    conn.execute(\u0027\u0027\u0027"},{"line_number":1244,"context_line":"        UPDATE account_stat SET account \u003d ?, created_at \u003d ?, id \u003d ?,"},{"line_number":1245,"context_line":"               put_timestamp \u003d ?"},{"line_number":1246,"context_line":"        \u0027\u0027\u0027, (self.account, LegacyTimestamp.now().internal, str(uuid4()),"},{"line_number":1247,"context_line":"              put_timestamp))"},{"line_number":1248,"context_line":""},{"line_number":1249,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f9ff06a_af497162","line":1246,"in_reply_to":"74b3c061_8210c9ee","updated":"2026-03-09 12:28:59.000000000","message":"Acknowledged","commit_id":"c56ad1a8fff89b93c750c0105011e2af2b0a498a"}],"test/unit/common/test_db.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":true,"context_lines":[{"line_number":278,"context_line":"        INSERT INTO test_stat ("},{"line_number":279,"context_line":"            account, created_at, id, put_timestamp, status_changed_at, status)"},{"line_number":280,"context_line":"        VALUES (?, ?, ?, ?, ?, ?);"},{"line_number":281,"context_line":"        \"\"\", (self.account, NormalTimestamp.now().internal, str(uuid4()),"},{"line_number":282,"context_line":"              put_timestamp, put_timestamp, \u0027\u0027))"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def merge_items(self, item_list):"}],"source_content_type":"text/x-python","patch_set":3,"id":"c25d6869_89120621","line":281,"updated":"2026-03-03 20:36:40.000000000","message":"this is basically how I want to fix the legacy create methods","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"00bf497fa7185c9c2104e9d1045660800870f84a","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        INSERT INTO test_stat ("},{"line_number":279,"context_line":"            account, created_at, id, put_timestamp, status_changed_at, status)"},{"line_number":280,"context_line":"        VALUES (?, ?, ?, ?, ?, ?);"},{"line_number":281,"context_line":"        \"\"\", (self.account, NormalTimestamp.now().internal, str(uuid4()),"},{"line_number":282,"context_line":"              put_timestamp, put_timestamp, \u0027\u0027))"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def merge_items(self, item_list):"}],"source_content_type":"text/x-python","patch_set":3,"id":"4ca382e8_9dfcba46","line":281,"in_reply_to":"c25d6869_89120621","updated":"2026-03-06 15:52:54.000000000","message":"Acknowledged","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"}],"test/unit/container/test_backend.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ba2542a45ee8cfc7ab9cda4cf5d94b7a0af87c3f","unresolved":true,"context_lines":[{"line_number":3793,"context_line":"        self.assertEqual(333, info[\u0027storage_policy_index\u0027])"},{"line_number":3794,"context_line":"        self.assertEqual(0, info[\u0027object_count\u0027])"},{"line_number":3795,"context_line":"        self.assertEqual(0, info[\u0027bytes_used\u0027])"},{"line_number":3796,"context_line":"        self.assertEqual(timestamp.normal, info[\u0027status_changed_at\u0027])"},{"line_number":3797,"context_line":"        expected[333] \u003d {\u0027object_count\u0027: 0, \u0027bytes_used\u0027: 0}"},{"line_number":3798,"context_line":"        self.assertEqual(expected, broker.get_policy_stats())"},{"line_number":3799,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"082c7222_ae67eae3","line":3796,"updated":"2026-03-06 18:13:48.000000000","message":"I think I\u0027d prefer:\n\n```\ndiff --git a/test/unit/container/test_backend.py b/test/unit/container/test_backend.py\nindex 659b5afb4..1ef225c93 100644\n--- a/test/unit/container/test_backend.py\n+++ b/test/unit/container/test_backend.py\n@@ -3793,7 +3793,9 @@ class TestContainerBroker(test_db.TestDbBase):\n         self.assertEqual(333, info[\u0027storage_policy_index\u0027])\n         self.assertEqual(0, info[\u0027object_count\u0027])\n         self.assertEqual(0, info[\u0027bytes_used\u0027])\n-        self.assertEqual(timestamp.normal, info[\u0027status_changed_at\u0027])\n+        self.assertEqual(timestamp, Timestamp(info[\u0027status_changed_at\u0027]))\n+        # for now we require NormalTimestamp\n+        self.assertEqual(timestamp.normal, timestamp.internal)\n         expected[333] \u003d {\u0027object_count\u0027: 0, \u0027bytes_used\u0027: 0}\n         self.assertEqual(expected, broker.get_policy_stats())\n \n```","commit_id":"c56ad1a8fff89b93c750c0105011e2af2b0a498a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"77b69db077fbd79ab49ae8c42a69706400f084fc","unresolved":true,"context_lines":[{"line_number":3793,"context_line":"        self.assertEqual(333, info[\u0027storage_policy_index\u0027])"},{"line_number":3794,"context_line":"        self.assertEqual(0, info[\u0027object_count\u0027])"},{"line_number":3795,"context_line":"        self.assertEqual(0, info[\u0027bytes_used\u0027])"},{"line_number":3796,"context_line":"        self.assertEqual(timestamp.normal, info[\u0027status_changed_at\u0027])"},{"line_number":3797,"context_line":"        expected[333] \u003d {\u0027object_count\u0027: 0, \u0027bytes_used\u0027: 0}"},{"line_number":3798,"context_line":"        self.assertEqual(expected, broker.get_policy_stats())"},{"line_number":3799,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"6118add7_1e7029f8","line":3796,"in_reply_to":"082c7222_ae67eae3","updated":"2026-03-09 12:28:59.000000000","message":"that would fail with the next patch (jitter):\n\n```\nAssertionError: 1773058565.00000_2a1bec4d3b000000 !\u003d 1773058565.00000_0000000000000000\n```\n\nI think I get what you\u0027re thinking though: make it easy to track down and update when we migrate components from NormalTimestamp to Timestamp.\n\n``mock_normal_timestamp_now`` is a big clue, and I can write it this way:\n\n```\ndiff --git a/test/unit/container/test_backend.py b/test/unit/container/test_backend.py\nindex 1ed759309..6184fd396 100644\n--- a/test/unit/container/test_backend.py\n+++ b/test/unit/container/test_backend.py\n@@ -3800,13 +3800,13 @@ class TestContainerBroker(test_db.TestDbBase):\n         self.assertEqual(expected, broker.get_policy_stats())\n\n         # by default a NormalTimestamp is used\n-        with mock_normal_timestamp_now(timestamp.normalized()):\n+        with mock_normal_timestamp_now(timestamp.normalized()) as exp_ts:\n             broker.set_storage_policy_index(333)\n         info \u003d broker.get_info()\n         self.assertEqual(333, info[\u0027storage_policy_index\u0027])\n         self.assertEqual(0, info[\u0027object_count\u0027])\n         self.assertEqual(0, info[\u0027bytes_used\u0027])\n-        self.assertEqual(timestamp.normal, info[\u0027status_changed_at\u0027])\n+        self.assertEqual(exp_ts, Timestamp(info[\u0027status_changed_at\u0027]))\n         expected[333] \u003d {\u0027object_count\u0027: 0, \u0027bytes_used\u0027: 0}\n         self.assertEqual(expected, broker.get_policy_stats())\n```","commit_id":"c56ad1a8fff89b93c750c0105011e2af2b0a498a"}],"test/unit/container/test_replicator.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":true,"context_lines":[{"line_number":668,"context_line":"            for key in (\u0027created_at\u0027, \u0027put_timestamp\u0027, \u0027delete_timestamp\u0027,"},{"line_number":669,"context_line":"                        \u0027status_changed_at\u0027):"},{"line_number":670,"context_line":"                ts_local \u003d Timestamp(local_info[key])"},{"line_number":671,"context_line":"                ts_remote \u003d Timestamp(local_info[key])"},{"line_number":672,"context_line":"                self.assertEqual(ts_local, ts_remote)"},{"line_number":673,"context_line":"                # for now databases timestamp fields are normal timestamps"},{"line_number":674,"context_line":"                self.assertEqual(ts_remote, ts_remote.normalized())"}],"source_content_type":"text/x-python","patch_set":3,"id":"6b115d54_be27627b","line":671,"updated":"2026-03-03 20:36:40.000000000","message":"what a trixy bug\n\n```\n-                ts_remote \u003d Timestamp(local_info[key])\n+                ts_remote \u003d Timestamp(remote_info[key])\n```","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a9ce6f9edd1c9c774ce26a61f4507d907040ccd3","unresolved":false,"context_lines":[{"line_number":668,"context_line":"            for key in (\u0027created_at\u0027, \u0027put_timestamp\u0027, \u0027delete_timestamp\u0027,"},{"line_number":669,"context_line":"                        \u0027status_changed_at\u0027):"},{"line_number":670,"context_line":"                ts_local \u003d Timestamp(local_info[key])"},{"line_number":671,"context_line":"                ts_remote \u003d Timestamp(local_info[key])"},{"line_number":672,"context_line":"                self.assertEqual(ts_local, ts_remote)"},{"line_number":673,"context_line":"                # for now databases timestamp fields are normal timestamps"},{"line_number":674,"context_line":"                self.assertEqual(ts_remote, ts_remote.normalized())"}],"source_content_type":"text/x-python","patch_set":3,"id":"aac6f548_9fabe4cd","line":671,"in_reply_to":"6b115d54_be27627b","updated":"2026-03-06 15:46:59.000000000","message":"Done","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"77b69db077fbd79ab49ae8c42a69706400f084fc","unresolved":true,"context_lines":[{"line_number":669,"context_line":"                        \u0027status_changed_at\u0027):"},{"line_number":670,"context_line":"                # for now databases timestamp fields are normal timestamps"},{"line_number":671,"context_line":"                ts_local \u003d Timestamp(local_info[key])"},{"line_number":672,"context_line":"                self.assertEqual(ts_local, ts_local.normalized())"},{"line_number":673,"context_line":"                ts_remote \u003d Timestamp(remote_info[key])"},{"line_number":674,"context_line":"                self.assertEqual(ts_remote, ts_remote.normalized())"},{"line_number":675,"context_line":"            for key in (\u0027created_at\u0027, \u0027put_timestamp\u0027, \u0027delete_timestamp\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ae921984_b955c754","line":672,"range":{"start_line":672,"start_character":16,"end_line":672,"end_character":65},"updated":"2026-03-09 12:28:59.000000000","message":"this will be easier to track down in future  by using the helper assertion from that is added in the next patch:\n``self.assert_valid_normal_timestamp(ts_local)``\n\nI\u0027ll pull it forward to use here","commit_id":"c56ad1a8fff89b93c750c0105011e2af2b0a498a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ba2542a45ee8cfc7ab9cda4cf5d94b7a0af87c3f","unresolved":true,"context_lines":[{"line_number":671,"context_line":"                ts_local \u003d Timestamp(local_info[key])"},{"line_number":672,"context_line":"                self.assertEqual(ts_local, ts_local.normalized())"},{"line_number":673,"context_line":"                ts_remote \u003d Timestamp(remote_info[key])"},{"line_number":674,"context_line":"                self.assertEqual(ts_remote, ts_remote.normalized())"},{"line_number":675,"context_line":"            for key in (\u0027created_at\u0027, \u0027put_timestamp\u0027, \u0027delete_timestamp\u0027):"},{"line_number":676,"context_line":"                ts_local \u003d Timestamp(local_info[key])"},{"line_number":677,"context_line":"                ts_remote \u003d Timestamp(remote_info[key])"}],"source_content_type":"text/x-python","patch_set":5,"id":"4140e8c4_a8940ba1","line":674,"updated":"2026-03-06 18:13:48.000000000","message":"k, this just says \"all ts in replication info should be normal timestamp\"","commit_id":"c56ad1a8fff89b93c750c0105011e2af2b0a498a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"77b69db077fbd79ab49ae8c42a69706400f084fc","unresolved":false,"context_lines":[{"line_number":671,"context_line":"                ts_local \u003d Timestamp(local_info[key])"},{"line_number":672,"context_line":"                self.assertEqual(ts_local, ts_local.normalized())"},{"line_number":673,"context_line":"                ts_remote \u003d Timestamp(remote_info[key])"},{"line_number":674,"context_line":"                self.assertEqual(ts_remote, ts_remote.normalized())"},{"line_number":675,"context_line":"            for key in (\u0027created_at\u0027, \u0027put_timestamp\u0027, \u0027delete_timestamp\u0027):"},{"line_number":676,"context_line":"                ts_local \u003d Timestamp(local_info[key])"},{"line_number":677,"context_line":"                ts_remote \u003d Timestamp(remote_info[key])"}],"source_content_type":"text/x-python","patch_set":5,"id":"87052eaf_f7cf672e","line":674,"in_reply_to":"4140e8c4_a8940ba1","updated":"2026-03-09 12:28:59.000000000","message":"Acknowledged","commit_id":"c56ad1a8fff89b93c750c0105011e2af2b0a498a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ba2542a45ee8cfc7ab9cda4cf5d94b7a0af87c3f","unresolved":true,"context_lines":[{"line_number":675,"context_line":"            for key in (\u0027created_at\u0027, \u0027put_timestamp\u0027, \u0027delete_timestamp\u0027):"},{"line_number":676,"context_line":"                ts_local \u003d Timestamp(local_info[key])"},{"line_number":677,"context_line":"                ts_remote \u003d Timestamp(remote_info[key])"},{"line_number":678,"context_line":"                self.assertEqual(ts_local, ts_remote)"},{"line_number":679,"context_line":"            test_db_replicator.TestReplicatorSync.tearDown(self)"},{"line_number":680,"context_line":"            test_db_replicator.TestReplicatorSync.setUp(self)"},{"line_number":681,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"2ced6482_8aaf6473","line":678,"updated":"2026-03-06 18:13:48.000000000","message":"oh oh oh, I see - so for these subset of keys we expect replication to make them *the same*","commit_id":"c56ad1a8fff89b93c750c0105011e2af2b0a498a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"77b69db077fbd79ab49ae8c42a69706400f084fc","unresolved":false,"context_lines":[{"line_number":675,"context_line":"            for key in (\u0027created_at\u0027, \u0027put_timestamp\u0027, \u0027delete_timestamp\u0027):"},{"line_number":676,"context_line":"                ts_local \u003d Timestamp(local_info[key])"},{"line_number":677,"context_line":"                ts_remote \u003d Timestamp(remote_info[key])"},{"line_number":678,"context_line":"                self.assertEqual(ts_local, ts_remote)"},{"line_number":679,"context_line":"            test_db_replicator.TestReplicatorSync.tearDown(self)"},{"line_number":680,"context_line":"            test_db_replicator.TestReplicatorSync.setUp(self)"},{"line_number":681,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"98777445_46deef69","line":678,"in_reply_to":"2ced6482_8aaf6473","updated":"2026-03-09 12:28:59.000000000","message":"Acknowledged","commit_id":"c56ad1a8fff89b93c750c0105011e2af2b0a498a"}],"test/unit/container/test_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b4ae47bad458a1c63517a8bbc400c29059d4587","unresolved":true,"context_lines":[{"line_number":5825,"context_line":"                resp \u003d req.get_response(self.controller)"},{"line_number":5826,"context_line":"            self.assertEqual(resp.status_int, expected_status)"},{"line_number":5827,"context_line":""},{"line_number":5828,"context_line":"            if expected_status \u003d\u003d 201:"},{"line_number":5829,"context_line":"                req \u003d Request.blank(\u0027/sda1/p/\u0027 + path,"},{"line_number":5830,"context_line":"                                    environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"},{"line_number":5831,"context_line":"                resp \u003d req.get_response(self.controller)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5c7d3c73_0e410864","line":5828,"updated":"2026-03-02 20:50:23.000000000","message":"FWIW the other \"expected_status\" seems to 404\n\n```\ndiff --git a/test/unit/container/test_server.py b/test/unit/container/test_server.py\nindex 7d1c283c6..c74614647 100644\n--- a/test/unit/container/test_server.py\n+++ b/test/unit/container/test_server.py\n@@ -5841,6 +5841,8 @@ class TestContainerController(BaseUnitTestCase):\n                 self.assertEqual(\n                     ts_put.normal,\n                     resp.headers.get(\u0027X-Backend-Status-Changed-At\u0027))\n+            else:\n+                self.assertEqual(404, expected_status)\n \n         do_test(404, \u0027a/c/o\u0027)\n         do_test(404, \u0027.a/c/o\u0027, {\u0027X-Backend-Auto-Create\u0027: \u0027no\u0027})\n```\n\nI personally find \"conditional asserts\" tricky; it\u0027s not obvious in this closure that the helper ever gets called with expected_status \u003d\u003d 201 and never 200/202/204 or what other values\n\n... but it\u0027s sort of a pre-existing problem with the test, I mostly find any test with a \"do_test\" helper is \"doing to much in one test\".","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e513c054e1cde1ecdee3ef7fc000afe64be52992","unresolved":true,"context_lines":[{"line_number":5825,"context_line":"                resp \u003d req.get_response(self.controller)"},{"line_number":5826,"context_line":"            self.assertEqual(resp.status_int, expected_status)"},{"line_number":5827,"context_line":""},{"line_number":5828,"context_line":"            if expected_status \u003d\u003d 201:"},{"line_number":5829,"context_line":"                req \u003d Request.blank(\u0027/sda1/p/\u0027 + path,"},{"line_number":5830,"context_line":"                                    environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"},{"line_number":5831,"context_line":"                resp \u003d req.get_response(self.controller)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dbc9fb3e_66ae9cbc","line":5828,"in_reply_to":"5c7d3c73_0e410864","updated":"2026-03-03 17:08:54.000000000","message":"+1 I didn\u0027t really like having the ``if`` inside the helper. I have more energy today, I\u0027ll split the 201 vs 404 into separate tests","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":false,"context_lines":[{"line_number":5825,"context_line":"                resp \u003d req.get_response(self.controller)"},{"line_number":5826,"context_line":"            self.assertEqual(resp.status_int, expected_status)"},{"line_number":5827,"context_line":""},{"line_number":5828,"context_line":"            if expected_status \u003d\u003d 201:"},{"line_number":5829,"context_line":"                req \u003d Request.blank(\u0027/sda1/p/\u0027 + path,"},{"line_number":5830,"context_line":"                                    environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"},{"line_number":5831,"context_line":"                resp \u003d req.get_response(self.controller)"}],"source_content_type":"text/x-python","patch_set":2,"id":"867de086_00ae21a8","line":5828,"in_reply_to":"dbc9fb3e_66ae9cbc","updated":"2026-03-03 20:36:40.000000000","message":"Done","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b4ae47bad458a1c63517a8bbc400c29059d4587","unresolved":true,"context_lines":[{"line_number":5837,"context_line":"                    resp.headers.get(\u0027X-Backend-Delete-Timestamp\u0027))"},{"line_number":5838,"context_line":"                self.assertEqual("},{"line_number":5839,"context_line":"                    ts_put.normal,"},{"line_number":5840,"context_line":"                    resp.headers.get(\u0027X-Backend-Put-Timestamp\u0027))"},{"line_number":5841,"context_line":"                self.assertEqual("},{"line_number":5842,"context_line":"                    ts_put.normal,"},{"line_number":5843,"context_line":"                    resp.headers.get(\u0027X-Backend-Status-Changed-At\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"d1eb7fd8_8136e041","line":5840,"updated":"2026-03-02 20:50:23.000000000","message":"seems legit\n\n```\nswift/test/unit/container/test_server.py:5838: in do_test\n    self.assertEqual(\nE   AssertionError: \u00271772482171.00000\u0027 !\u003d \u00271772482171.00000_29e02a8f4c000000\u0027\nE   - 1772482171.00000\nE   + 1772482171.00000_29e02a8f4c000000\n```","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":false,"context_lines":[{"line_number":5837,"context_line":"                    resp.headers.get(\u0027X-Backend-Delete-Timestamp\u0027))"},{"line_number":5838,"context_line":"                self.assertEqual("},{"line_number":5839,"context_line":"                    ts_put.normal,"},{"line_number":5840,"context_line":"                    resp.headers.get(\u0027X-Backend-Put-Timestamp\u0027))"},{"line_number":5841,"context_line":"                self.assertEqual("},{"line_number":5842,"context_line":"                    ts_put.normal,"},{"line_number":5843,"context_line":"                    resp.headers.get(\u0027X-Backend-Status-Changed-At\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"b1822af6_fd192391","line":5840,"in_reply_to":"d1eb7fd8_8136e041","updated":"2026-03-03 20:36:40.000000000","message":"Done","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b4ae47bad458a1c63517a8bbc400c29059d4587","unresolved":true,"context_lines":[{"line_number":5892,"context_line":"        do_test(404, \u0027a/.c/.o\u0027)"},{"line_number":5893,"context_line":"        do_test(404, \u0027.shards_a/c/o\u0027)"},{"line_number":5894,"context_line":"        do_test(204, \u0027a/c/o\u0027, {\u0027X-Backend-Auto-Create\u0027: \u0027true\u0027})"},{"line_number":5895,"context_line":"        do_test(204, \u0027.shards_a/c/o\u0027, {\u0027X-Backend-Auto-Create\u0027: \u0027true\u0027})"},{"line_number":5896,"context_line":""},{"line_number":5897,"context_line":"    def test_content_type_on_HEAD(self):"},{"line_number":5898,"context_line":"        Request.blank(\u0027/sda1/p/a/o\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"123dff10_5b9e64ae","line":5895,"updated":"2026-03-02 20:50:23.000000000","message":"I\u0027m not sure how I\u0027d re-group all these; maybe\n\n```\ntest_account_requires_explicit_backend_auto_create\ntest_dot_account_auto_create\ntest_dot_account_disable_auto_create\n```\n\nI\u0027m actually not sure why:\n\n```\ndo_test(204, \u0027.a/c/o\u0027)\ndo_test(404, \u0027.shards_a/c/o\u0027)\n```\n\nis `.shards_a` a *special* dot account!?\n\n```\n    def _should_autocreate(self, account, req):\n        auto_create_header \u003d req.headers.get(\u0027X-Backend-Auto-Create\u0027)\n        if auto_create_header:\n            # If the caller included an explicit X-Backend-Auto-Create header,\n            # assume they know the behavior they want\n            return config_true_value(auto_create_header)\n        if account.startswith(self.shards_account_prefix):\n            # we have to specical case this subset of the\n            # auto_create_account_prefix because we don\u0027t want the updater\n            # accidently auto-creating shards; only the sharder creates\n            # shards and it will explicitly tell the server to do so\n            return False\n        return account.startswith(self.auto_create_account_prefix)\n```\n\nTIL?","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":false,"context_lines":[{"line_number":5892,"context_line":"        do_test(404, \u0027a/.c/.o\u0027)"},{"line_number":5893,"context_line":"        do_test(404, \u0027.shards_a/c/o\u0027)"},{"line_number":5894,"context_line":"        do_test(204, \u0027a/c/o\u0027, {\u0027X-Backend-Auto-Create\u0027: \u0027true\u0027})"},{"line_number":5895,"context_line":"        do_test(204, \u0027.shards_a/c/o\u0027, {\u0027X-Backend-Auto-Create\u0027: \u0027true\u0027})"},{"line_number":5896,"context_line":""},{"line_number":5897,"context_line":"    def test_content_type_on_HEAD(self):"},{"line_number":5898,"context_line":"        Request.blank(\u0027/sda1/p/a/o\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"e7e08ed2_6ad21f9c","line":5895,"in_reply_to":"123dff10_5b9e64ae","updated":"2026-03-03 20:36:40.000000000","message":"Done","commit_id":"335c91d2b0dad3955fd4f2c0e62a3482680fac5c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":true,"context_lines":[{"line_number":5815,"context_line":"            headers \u003d {\u0027x-timestamp\u0027: ts_put.internal,"},{"line_number":5816,"context_line":"                       \u0027x-size\u0027: \u00270\u0027,"},{"line_number":5817,"context_line":"                       \u0027x-content-type\u0027: \u0027text/plain\u0027,"},{"line_number":5818,"context_line":"                       \u0027x-etag\u0027: \u0027d41d8cd98f00b204e9800998ecf8427e\u0027}"},{"line_number":5819,"context_line":"            if extra_headers:"},{"line_number":5820,"context_line":"                headers.update(extra_headers)"},{"line_number":5821,"context_line":"            req \u003d Request.blank(\u0027/sda1/p/\u0027 + path,"}],"source_content_type":"text/x-python","patch_set":3,"id":"a627bfd4_5c300488","line":5818,"updated":"2026-03-03 20:36:40.000000000","message":"none of these headers make sense with a PUT record-type shard request","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"00bf497fa7185c9c2104e9d1045660800870f84a","unresolved":false,"context_lines":[{"line_number":5815,"context_line":"            headers \u003d {\u0027x-timestamp\u0027: ts_put.internal,"},{"line_number":5816,"context_line":"                       \u0027x-size\u0027: \u00270\u0027,"},{"line_number":5817,"context_line":"                       \u0027x-content-type\u0027: \u0027text/plain\u0027,"},{"line_number":5818,"context_line":"                       \u0027x-etag\u0027: \u0027d41d8cd98f00b204e9800998ecf8427e\u0027}"},{"line_number":5819,"context_line":"            if extra_headers:"},{"line_number":5820,"context_line":"                headers.update(extra_headers)"},{"line_number":5821,"context_line":"            req \u003d Request.blank(\u0027/sda1/p/\u0027 + path,"}],"source_content_type":"text/x-python","patch_set":3,"id":"77dc49c3_822185fc","line":5818,"in_reply_to":"a627bfd4_5c300488","updated":"2026-03-06 15:52:54.000000000","message":"Acknowledged","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":true,"context_lines":[{"line_number":5837,"context_line":"            self.assertEqual(ts_put.normal,"},{"line_number":5838,"context_line":"                             resp.headers.get(\u0027X-Backend-Status-Changed-At\u0027))"},{"line_number":5839,"context_line":""},{"line_number":5840,"context_line":"        do_test(\u0027.a/c/o\u0027)"},{"line_number":5841,"context_line":"        do_test(\u0027a/c/o\u0027, {\u0027X-Backend-Auto-Create\u0027: \u0027yes\u0027})"},{"line_number":5842,"context_line":"        create_shard_headers \u003d {"},{"line_number":5843,"context_line":"            \u0027X-Backend-Record-Type\u0027: \u0027shard\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"857ca0b7_8b488859","line":5840,"updated":"2026-03-03 20:36:40.000000000","message":"this iteration specifically does NOT send `auto_create_true` - I think this test as a whole is more like \"test_put_auto_create_success\"","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"00bf497fa7185c9c2104e9d1045660800870f84a","unresolved":false,"context_lines":[{"line_number":5837,"context_line":"            self.assertEqual(ts_put.normal,"},{"line_number":5838,"context_line":"                             resp.headers.get(\u0027X-Backend-Status-Changed-At\u0027))"},{"line_number":5839,"context_line":""},{"line_number":5840,"context_line":"        do_test(\u0027.a/c/o\u0027)"},{"line_number":5841,"context_line":"        do_test(\u0027a/c/o\u0027, {\u0027X-Backend-Auto-Create\u0027: \u0027yes\u0027})"},{"line_number":5842,"context_line":"        create_shard_headers \u003d {"},{"line_number":5843,"context_line":"            \u0027X-Backend-Record-Type\u0027: \u0027shard\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"08cf6df1_ee56f724","line":5840,"in_reply_to":"4ce9bff5_5dd22d9c","updated":"2026-03-06 15:52:54.000000000","message":"Done","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a9ce6f9edd1c9c774ce26a61f4507d907040ccd3","unresolved":true,"context_lines":[{"line_number":5837,"context_line":"            self.assertEqual(ts_put.normal,"},{"line_number":5838,"context_line":"                             resp.headers.get(\u0027X-Backend-Status-Changed-At\u0027))"},{"line_number":5839,"context_line":""},{"line_number":5840,"context_line":"        do_test(\u0027.a/c/o\u0027)"},{"line_number":5841,"context_line":"        do_test(\u0027a/c/o\u0027, {\u0027X-Backend-Auto-Create\u0027: \u0027yes\u0027})"},{"line_number":5842,"context_line":"        create_shard_headers \u003d {"},{"line_number":5843,"context_line":"            \u0027X-Backend-Record-Type\u0027: \u0027shard\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"4ce9bff5_5dd22d9c","line":5840,"in_reply_to":"857ca0b7_8b488859","updated":"2026-03-06 15:46:59.000000000","message":"yeah, I was trying to avoid success vs failure to avoid the implication that not-auto-creating is a failure/error, but agree we could do better than true vs false","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":true,"context_lines":[{"line_number":5843,"context_line":"            \u0027X-Backend-Record-Type\u0027: \u0027shard\u0027,"},{"line_number":5844,"context_line":"            \u0027X-Backend-Storage-Policy-Index\u0027: \u00270\u0027,"},{"line_number":5845,"context_line":"            \u0027X-Backend-Auto-Create\u0027: \u0027t\u0027}"},{"line_number":5846,"context_line":"        do_test(\u0027.shards_a/c\u0027, create_shard_headers, \u0027[]\u0027)"},{"line_number":5847,"context_line":""},{"line_number":5848,"context_line":"    def test_put_auto_create_false(self):"},{"line_number":5849,"context_line":"        def do_test(path, extra_headers\u003dNone, body\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ed6d578_1f3e30b9","line":5846,"updated":"2026-03-03 20:36:40.000000000","message":"this is a \"create shards\" request - very different from the other `a/c/o` paths which are \"put object \u0026 auto create container\"","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"00bf497fa7185c9c2104e9d1045660800870f84a","unresolved":false,"context_lines":[{"line_number":5843,"context_line":"            \u0027X-Backend-Record-Type\u0027: \u0027shard\u0027,"},{"line_number":5844,"context_line":"            \u0027X-Backend-Storage-Policy-Index\u0027: \u00270\u0027,"},{"line_number":5845,"context_line":"            \u0027X-Backend-Auto-Create\u0027: \u0027t\u0027}"},{"line_number":5846,"context_line":"        do_test(\u0027.shards_a/c\u0027, create_shard_headers, \u0027[]\u0027)"},{"line_number":5847,"context_line":""},{"line_number":5848,"context_line":"    def test_put_auto_create_false(self):"},{"line_number":5849,"context_line":"        def do_test(path, extra_headers\u003dNone, body\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"37ca8600_997161ec","line":5846,"in_reply_to":"9ed6d578_1f3e30b9","updated":"2026-03-06 15:52:54.000000000","message":"Acknowledged","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"02ac4e346b28af28dd3a1dd2f87104d21a753c24","unresolved":true,"context_lines":[{"line_number":5896,"context_line":""},{"line_number":5897,"context_line":"        do_test(\u0027.a/c/o\u0027)"},{"line_number":5898,"context_line":"        do_test(\u0027a/c/o\u0027, {\u0027X-Backend-Auto-Create\u0027: \u0027true\u0027})"},{"line_number":5899,"context_line":"        do_test(\u0027.shards_a/c/o\u0027, {\u0027X-Backend-Auto-Create\u0027: \u0027true\u0027})"},{"line_number":5900,"context_line":""},{"line_number":5901,"context_line":"    def test_delete_auto_create_false(self):"},{"line_number":5902,"context_line":"        def do_test(path, extra_headers\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"b962ff84_6c7edc1e","line":5899,"updated":"2026-03-03 20:36:40.000000000","message":"this is a delete object request to a shard container - AFAIK we don\u0027t test \"object put to shard container can create shard container\"","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"00bf497fa7185c9c2104e9d1045660800870f84a","unresolved":false,"context_lines":[{"line_number":5896,"context_line":""},{"line_number":5897,"context_line":"        do_test(\u0027.a/c/o\u0027)"},{"line_number":5898,"context_line":"        do_test(\u0027a/c/o\u0027, {\u0027X-Backend-Auto-Create\u0027: \u0027true\u0027})"},{"line_number":5899,"context_line":"        do_test(\u0027.shards_a/c/o\u0027, {\u0027X-Backend-Auto-Create\u0027: \u0027true\u0027})"},{"line_number":5900,"context_line":""},{"line_number":5901,"context_line":"    def test_delete_auto_create_false(self):"},{"line_number":5902,"context_line":"        def do_test(path, extra_headers\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"6f3f939e_7b382c3f","line":5899,"in_reply_to":"b962ff84_6c7edc1e","updated":"2026-03-06 15:52:54.000000000","message":"Acknowledged","commit_id":"9ab5474684f71ce8bf9683f6cef738d5865474ed"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ba2542a45ee8cfc7ab9cda4cf5d94b7a0af87c3f","unresolved":true,"context_lines":[{"line_number":5943,"context_line":"    def test_auto_create_not_found_with_obj_delete_shards_account(self):"},{"line_number":5944,"context_line":"        # despite being dot accounts, shard db requires explict opt-in"},{"line_number":5945,"context_line":"        self._do_test_auto_create_not_found_with_obj_req("},{"line_number":5946,"context_line":"            \u0027DELETE\u0027, \u0027.shards_a/c/o\u0027)"},{"line_number":5947,"context_line":""},{"line_number":5948,"context_line":"    def test_content_type_on_HEAD(self):"},{"line_number":5949,"context_line":"        Request.blank(\u0027/sda1/p/a/o\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"a94729c5_9aa07e7a","line":5946,"updated":"2026-03-06 18:13:48.000000000","message":"very DAMP - seems quite polished - KUDOS","commit_id":"c56ad1a8fff89b93c750c0105011e2af2b0a498a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"77b69db077fbd79ab49ae8c42a69706400f084fc","unresolved":false,"context_lines":[{"line_number":5943,"context_line":"    def test_auto_create_not_found_with_obj_delete_shards_account(self):"},{"line_number":5944,"context_line":"        # despite being dot accounts, shard db requires explict opt-in"},{"line_number":5945,"context_line":"        self._do_test_auto_create_not_found_with_obj_req("},{"line_number":5946,"context_line":"            \u0027DELETE\u0027, \u0027.shards_a/c/o\u0027)"},{"line_number":5947,"context_line":""},{"line_number":5948,"context_line":"    def test_content_type_on_HEAD(self):"},{"line_number":5949,"context_line":"        Request.blank(\u0027/sda1/p/a/o\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"224dbe81_0d349bcc","line":5946,"in_reply_to":"a94729c5_9aa07e7a","updated":"2026-03-09 12:28:59.000000000","message":"Acknowledged","commit_id":"c56ad1a8fff89b93c750c0105011e2af2b0a498a"}]}
