)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58e58de8c57255f50c2bc3c343d796604465cf86","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The size in bytes of objects are stored in expirey queue entries"},{"line_number":10,"context_line":"under the content_type field. The x-content-type-timestamp is"},{"line_number":11,"context_line":"updated every time the byte size is updated so that the latest"},{"line_number":12,"context_line":"x-content-type (with the latest bytes) is used when the content"},{"line_number":13,"context_line":"replicator runs to ensure eventual consistency."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"4622f597_97c0538d","line":11,"updated":"2024-03-13 18:32:29.000000000","message":"maybe better as \"The x-content-type-timestamp is provided along with the content-type update so that ...\"","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"2278cdab961e6cbb73fd549a3a562b74976fa7bd","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The size in bytes of objects are stored in expirey queue entries"},{"line_number":10,"context_line":"under the content_type field. The x-content-type-timestamp is"},{"line_number":11,"context_line":"updated every time the byte size is updated so that the latest"},{"line_number":12,"context_line":"x-content-type (with the latest bytes) is used when the content"},{"line_number":13,"context_line":"replicator runs to ensure eventual consistency."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"f8e68525_d39f5ed3","line":11,"in_reply_to":"4622f597_97c0538d","updated":"2024-03-14 00:30:32.000000000","message":"Done","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58e58de8c57255f50c2bc3c343d796604465cf86","unresolved":true,"context_lines":[{"line_number":9,"context_line":"The size in bytes of objects are stored in expirey queue entries"},{"line_number":10,"context_line":"under the content_type field. The x-content-type-timestamp is"},{"line_number":11,"context_line":"updated every time the byte size is updated so that the latest"},{"line_number":12,"context_line":"x-content-type (with the latest bytes) is used when the content"},{"line_number":13,"context_line":"replicator runs to ensure eventual consistency."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: Ie4b25f1bd16def4069878983049b83de06f68e54"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"bbea56c6_48c0d843","line":12,"updated":"2024-03-13 18:32:29.000000000","message":"s/used/resolved/\ns/content/container/","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"2278cdab961e6cbb73fd549a3a562b74976fa7bd","unresolved":false,"context_lines":[{"line_number":9,"context_line":"The size in bytes of objects are stored in expirey queue entries"},{"line_number":10,"context_line":"under the content_type field. The x-content-type-timestamp is"},{"line_number":11,"context_line":"updated every time the byte size is updated so that the latest"},{"line_number":12,"context_line":"x-content-type (with the latest bytes) is used when the content"},{"line_number":13,"context_line":"replicator runs to ensure eventual consistency."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: Ie4b25f1bd16def4069878983049b83de06f68e54"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"8b3fd427_2b999056","line":12,"in_reply_to":"bbea56c6_48c0d843","updated":"2024-03-14 00:30:32.000000000","message":"Done","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":10,"context_line":"under the content_type field. The x-content-type-timestamp is"},{"line_number":11,"context_line":"provided along with the x-content-type update so the container"},{"line_number":12,"context_line":"replicator resolves the latest content-type and ensures eventual"},{"line_number":13,"context_line":"consistency."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: Ie4b25f1bd16def4069878983049b83de06f68e54"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"6a3ba568_9ac06e40","line":13,"updated":"2024-04-18 23:00:22.000000000","message":"that all sounds fine","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8ae85199200a2f9a6034796439a354acf11d4dba","unresolved":false,"context_lines":[{"line_number":10,"context_line":"under the content_type field. The x-content-type-timestamp is"},{"line_number":11,"context_line":"provided along with the x-content-type update so the container"},{"line_number":12,"context_line":"replicator resolves the latest content-type and ensures eventual"},{"line_number":13,"context_line":"consistency."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: Ie4b25f1bd16def4069878983049b83de06f68e54"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"e3b2a82e_126d3e55","line":13,"in_reply_to":"6a3ba568_9ac06e40","updated":"2024-04-19 20:47:03.000000000","message":"Acknowledged","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7a6f6fa2e2eb29bb082a7fb2cbe97f898ce92512","unresolved":true,"context_lines":[{"line_number":7,"context_line":"add bytes of expiring objects to queue entry"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The size in bytes of expiring objects are stored in expirey queue"},{"line_number":10,"context_line":"entries under the content_type field. The x-content-type-timestamp is"},{"line_number":11,"context_line":"provided along with the x-content-type update so the container"},{"line_number":12,"context_line":"replicator resolves the latest content-type and ensures eventual"},{"line_number":13,"context_line":"consistency."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"99814737_c354f6d4","line":11,"range":{"start_line":10,"start_character":38,"end_line":11,"end_character":8},"updated":"2024-06-07 17:40:21.000000000","message":"We might want to clarify *where* this comes from in the commit message.","commit_id":"4e1c0e16a925bfaeb78cea9a34cf88feb7145caa"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f6a38f71a18b4cb52bbdac84f7f512ab1b231e34","unresolved":false,"context_lines":[{"line_number":7,"context_line":"add bytes of expiring objects to queue entry"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The size in bytes of expiring objects are stored in expirey queue"},{"line_number":10,"context_line":"entries under the content_type field. The x-content-type-timestamp is"},{"line_number":11,"context_line":"provided along with the x-content-type update so the container"},{"line_number":12,"context_line":"replicator resolves the latest content-type and ensures eventual"},{"line_number":13,"context_line":"consistency."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"61d4f0a0_d998ee59","line":11,"range":{"start_line":10,"start_character":38,"end_line":11,"end_character":8},"in_reply_to":"99814737_c354f6d4","updated":"2024-06-14 01:19:48.000000000","message":"good suggestoin, it wasn\u0027t originally my commit message.","commit_id":"4e1c0e16a925bfaeb78cea9a34cf88feb7145caa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7a6f6fa2e2eb29bb082a7fb2cbe97f898ce92512","unresolved":true,"context_lines":[{"line_number":13,"context_line":"consistency."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"UpgradeImpact: During rolling upgrades you should expect expirer queue"},{"line_number":16,"context_line":"entries to continue lack swift_expirer_bytes\u003d annotations until ALL"},{"line_number":17,"context_line":"object servers replicas have been upgraded to new code."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Co-Authored-By: Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"fa7a25e9_164df384","line":16,"range":{"start_line":16,"start_character":11,"end_line":16,"end_character":24},"updated":"2024-06-07 17:40:21.000000000","message":"\"continue to lack\"","commit_id":"4e1c0e16a925bfaeb78cea9a34cf88feb7145caa"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f6a38f71a18b4cb52bbdac84f7f512ab1b231e34","unresolved":false,"context_lines":[{"line_number":13,"context_line":"consistency."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"UpgradeImpact: During rolling upgrades you should expect expirer queue"},{"line_number":16,"context_line":"entries to continue lack swift_expirer_bytes\u003d annotations until ALL"},{"line_number":17,"context_line":"object servers replicas have been upgraded to new code."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Co-Authored-By: Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"82aa7631_37c6ffb7","line":16,"range":{"start_line":16,"start_character":11,"end_line":16,"end_character":24},"in_reply_to":"fa7a25e9_164df384","updated":"2024-06-14 01:19:48.000000000","message":"i went with \"continue lacking\"","commit_id":"4e1c0e16a925bfaeb78cea9a34cf88feb7145caa"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58e58de8c57255f50c2bc3c343d796604465cf86","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"8405f48b_c8b2c9a7","updated":"2024-03-13 18:32:29.000000000","message":"this change looks good; the probe test is really nice - but it should have some unittests for the changes in swift.obj.server as well.\n\nI inserted a NameError into your changes and ran:\n\npytest swift/test/unit/obj/test_server.py\n\n... to see what fails; I think this code path is well tested.  Looking around the existing tests the one I like the most was actually \"test_object_delete_at_async_update\"\n\nhttps://github.com/NVIDIA/swift/blob/master/test/unit/obj/test_server.py#L5814\n\nThis test stubs the object server request to include both the client-container-update headers AND the x-delete-at-queue-update headers.  Then it uses mocked_http_conn to make both updates fail with a 500.  It also captures the http request args so it can asserts the updates when to the right hosts and had the right headers.\n\nYou should be able to setup a PUT request that will send a delete-at update and verify the container-server request has the expected headers.  You can also do another test that stages an existing .datafile with a PUT and then on a POST assert the x-content-type in the delete-at update has the expected value and content-type-timestamp.  Reverting you changes in obj.server should cause tests.obj.test_server tests to fail.","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"2278cdab961e6cbb73fd549a3a562b74976fa7bd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ac136caf_2b5086d5","updated":"2024-03-14 00:30:32.000000000","message":"I\u0027m pushing up another change addressing these comments and adding a unit test as well as updating existing unit tests.","commit_id":"f8c8ee7f15cdbc00fdc46675d34c89182cd27541"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"ea4ae692cd44cbde8e1092e98ffca8673c16f816","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"1bd5a546_b1aebebf","updated":"2024-03-18 22:58:33.000000000","message":"Updated for comments!","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f7b7d3e6972644b39157afefac52d5e03e4c98fb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f6af4a2b_96266c01","updated":"2024-03-14 13:27:00.000000000","message":"looks like you\u0027re still working on the tests - thank you!  I see some nice improvements already!","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4d537431c7c3400425619bd580b370640958e96f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"42cc3b01_5a265e15","updated":"2024-04-09 18:48:57.000000000","message":"recheck","commit_id":"0e8fef54cc78f5ecadafc845e708f5f94727fda8"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"69277fbf_27ca1c35","updated":"2024-04-18 23:00:22.000000000","message":"I think there\u0027s divergent logic WRT orig_delete_at between POST/PUT that may have some bugs... we could try to write more probe tests!\n\n916347: sq? more tests for delete_at_update race | https://review.opendev.org/c/openstack/swift/+/916347","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8ae85199200a2f9a6034796439a354acf11d4dba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"9a21bb74_e7acf93f","updated":"2024-04-19 20:47:03.000000000","message":"Made some small fixes and changes to the orig vs new delete-at inspection, but will look at your new patches with the tests to look at coverage","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"53240261_8583b0f3","updated":"2024-04-22 16:47:38.000000000","message":"I think both of Matt\u0027s comments need to be addressed before we merge.\n\nI\u0027m not 100% if we NEED to make the PUT/POST orig_delete_at !\u003d new_delete_at behavior consistent before we carry but if we COULD I think that\u0027s probably a good idea.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a02602be18b5a5219f3a573df606d0b9e96227e8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"3fb4886d_0ef043fb","updated":"2024-04-22 20:50:26.000000000","message":"Made some updates, particularly with making POST consistent with PUTs. Might still need to resolve some comments.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"38139a8262fad2b3db73bcc18e8968435edbad89","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"fcdf5d66_307b28bb","updated":"2024-04-22 09:32:15.000000000","message":"Some comments inline. But looking great Anish!","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"edf29926_17809cd6","updated":"2024-04-23 00:05:29.000000000","message":"flake8 was happy OMM, method extraction looks solid and logic checks out in tests.\n\nI suggest we squash in a follow-up to tighten up the unittest before we merge:\n\n916694: sq: stronger test faking to avoid container request leak | https://review.opendev.org/c/openstack/swift/+/916694","commit_id":"2f4e6bc410e93e7911d994f72af5a53139de3fe7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1d8d82602cf3bf620b77927a99d7b9315973cfc6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"e289ddc1_cf0edfd8","updated":"2024-04-24 23:03:32.000000000","message":"I think it would still be good to squash some of these test updates:\n\n916694: sq: stronger test faking to avoid container request leak | https://review.opendev.org/c/openstack/swift/+/916694\n\n... maybe write some more tests for the new helper function(s)","commit_id":"7cd3efdc5c4a5ea28d7a7e88e67d4920590fa9c4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"43578a5cfb95b9310569459dadb84cf4c8f645a2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"3b7da21a_a249a0c5","updated":"2024-04-26 15:04:31.000000000","message":"perhaps need to think about upgrade case more carefully","commit_id":"d01b968373a0f18bc4144b1e094e9511329bab50"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b0baf111647ab333638b280790ffc670a5d36bec","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"4c4236d2_f342a515","updated":"2024-05-02 15:52:43.000000000","message":"lots of test failures like:\n\n```\nTraceback (most recent call last):\n  File \"/home/zuul/src/opendev.org/openstack/swift/swift/obj/server.py\", line 1349, in __call__\n    res \u003d getattr(self, req.method)(req)\n  File \"/home/zuul/src/opendev.org/openstack/swift/swift/common/utils/__init__.py\", line 868, in _timing_stats\n    resp \u003d func(ctrl, *args, **kwargs)\n  File \"/home/zuul/src/opendev.org/openstack/swift/swift/obj/server.py\", line 700, in POST\n    self._conditional_delete_at_update(\n  File \"/home/zuul/src/opendev.org/openstack/swift/swift/obj/server.py\", line 631, in _conditional_delete_at_update\n    \u0027x-content-type\u0027: embed_expirer_bytes_in_ctype(\n  File \"/home/zuul/src/opendev.org/openstack/swift/swift/obj/expirer.py\", line 93, in embed_expirer_bytes_in_ctype\n    return \"%s;swift_expirer_bytes\u003d%d\" % (content_type, bytes_size)\nTypeError: %d format: a number is required, not str\n```","commit_id":"07dcab6a8c3f6e08fb811f1361d7d1442ada8263"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"2c9f74f7ed179695ddb7baae7d86aa9d5c7cd22d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"8aa0374d_fb558bd3","updated":"2024-05-03 06:51:29.000000000","message":"Looking really good, just got a question in line. probably really just a nit, if so happy to change my vote 😊","commit_id":"cb776885bc74111941e2cfad78cf6bb3d43db850"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c8055e26ebb3cbf075a3b9ccdd51eea1bb6a1eb3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"73460832_db9f70e1","updated":"2024-05-20 16:46:08.000000000","message":"recheck \n\npost-failure rsyncing results?\n\n```\nssh: connect to host 23.253.56.19 port 22: Connection timed out\nrsync: connection unexpectedly closed (0 bytes received so far) [Receiver]\nrsync error: unexplained error (code 255) at io.c(231) [Receiver\u003d3.2.7]\n```","commit_id":"8381a309952be9d2da9861069f6744dcab228c13"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b999ff10f95436c2c3ebaaa396b4ec766c1a487b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"2aba0bc0_63919ce9","updated":"2024-05-29 20:00:13.000000000","message":"recheck\n\nLooks like some transient mirror errors:\n```\nErrors during downloading metadata for repository \u0027appstream\u0027:\n  - Status code: 404 for https://mirror.iad3.inmotion.opendev.org/centos/8-stream/AppStream/x86_64/os/repodata/4e8110e4d34bb51e0f0d8385843743b7d205b54e3d1ddcf57bcfd519079d8717-primary.xml.gz (IP: 173.231.253.126)\n  - Status code: 404 for https://mirror.iad3.inmotion.opendev.org/centos/8-stream/AppStream/x86_64/os/repodata/2923969ff39c1d7bcff5af499fffdc1c24b256b3eb7ee00ab120421f98e7cf19-filelists.xml.gz (IP: 173.231.253.126)\nError: Failed to download metadata for repo \u0027appstream\u0027: Yum repo downloading error: Downloading error(s):\n```","commit_id":"ad2ed9602607d5efe4fd34b0fcef5d23fc440c23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90ffcdb2299c6402bfc30708fa034e24c3e67451","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"0c5f0f76_76981464","updated":"2024-05-31 21:26:26.000000000","message":"I think the slo-size-in-the-expirer bits should move over to https://review.opendev.org/c/openstack/swift/+/800701\n\nTraceback when trying to manually manage MPU segments should get fixed.","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2315c8e57dce047e4a1d5d8e8d9f93fd369b7e36","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"8481e67b_814c1ab2","updated":"2024-06-04 18:14:05.000000000","message":"I pulled out a drive by to 921318: Lazy import is not needed | https://review.opendev.org/c/openstack/swift/+/921318 - I\u0027m not sure it\u0027s strictly needed to carry and it no longer makes sense in the context of this patch anyway since the s3api/boto stuff all got moved into 800701: Delete s3api MPU segments when expiring the manifest | https://review.opendev.org/c/openstack/swift/+/800701\n\nI clicked through to the func test retry-limit errors and it looks like provisioning gate issue with dnf/centos8?\n\nAFAIK this change could potentially be merged, but as a co-author I\u0027ve lately just mostly been responding to comments.","commit_id":"28441819065b59e4c89c62f10310f0679058282f"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58e58de8c57255f50c2bc3c343d796604465cf86","unresolved":true,"context_lines":[{"line_number":4161,"context_line":"    for k, v in params:"},{"line_number":4162,"context_line":"        if k \u003d\u003d \u0027bytes\u0027:"},{"line_number":4163,"context_line":"            bytes_size \u003d int(v)"},{"line_number":4164,"context_line":"    return bytes_size"},{"line_number":4165,"context_line":""},{"line_number":4166,"context_line":""},{"line_number":4167,"context_line":"def override_bytes_from_content_type(listing_dict, logger\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ddfab2c9_11f5f1eb","line":4164,"updated":"2024-03-13 18:32:29.000000000","message":"probably a good idea to prefix our extra content-type metadata with \"swift_\" - maybe just re-use extract_swift_bytes","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f7b7d3e6972644b39157afefac52d5e03e4c98fb","unresolved":true,"context_lines":[{"line_number":4161,"context_line":"    for k, v in params:"},{"line_number":4162,"context_line":"        if k \u003d\u003d \u0027bytes\u0027:"},{"line_number":4163,"context_line":"            bytes_size \u003d int(v)"},{"line_number":4164,"context_line":"    return bytes_size"},{"line_number":4165,"context_line":""},{"line_number":4166,"context_line":""},{"line_number":4167,"context_line":"def override_bytes_from_content_type(listing_dict, logger\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"8a518a1a_ce06977b","line":4164,"in_reply_to":"0c03f031_99b4f021","updated":"2024-03-14 13:27:00.000000000","message":"haha, thank you for that reminder - I forgot the container server had that special handling for swift_bytes in the content type for SLO; quite unexpected.\n\nSo re-using extract_swift_bytes is a non-starter.  But namespacing is probably still a good idea - swift_expirer_bytes or something may be the best compromise; possibly with a note about swift_bytes special handling in the container-server.","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"ea4ae692cd44cbde8e1092e98ffca8673c16f816","unresolved":false,"context_lines":[{"line_number":4161,"context_line":"    for k, v in params:"},{"line_number":4162,"context_line":"        if k \u003d\u003d \u0027bytes\u0027:"},{"line_number":4163,"context_line":"            bytes_size \u003d int(v)"},{"line_number":4164,"context_line":"    return bytes_size"},{"line_number":4165,"context_line":""},{"line_number":4166,"context_line":""},{"line_number":4167,"context_line":"def override_bytes_from_content_type(listing_dict, logger\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"eec0232f_396433ee","line":4164,"in_reply_to":"8a518a1a_ce06977b","updated":"2024-03-18 22:58:33.000000000","message":"Got it, that makes sense - updating with namespaced version!","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"2278cdab961e6cbb73fd549a3a562b74976fa7bd","unresolved":true,"context_lines":[{"line_number":4161,"context_line":"    for k, v in params:"},{"line_number":4162,"context_line":"        if k \u003d\u003d \u0027bytes\u0027:"},{"line_number":4163,"context_line":"            bytes_size \u003d int(v)"},{"line_number":4164,"context_line":"    return bytes_size"},{"line_number":4165,"context_line":""},{"line_number":4166,"context_line":""},{"line_number":4167,"context_line":"def override_bytes_from_content_type(listing_dict, logger\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"0c03f031_99b4f021","line":4164,"in_reply_to":"ddfab2c9_11f5f1eb","updated":"2024-03-14 00:30:32.000000000","message":"I tried doing this but ran into a situation—if I pass in the number of bytes with swift_bytes, it is moved to x-size and removed from the content-type header. This means that the container listings metadata will contain accurate \u0027bytes\u0027, but content-type will not contain any bytes information and we will still have an inconsistency because the container replicator only updates x-content-type based on x-content-type-timestamp.","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":4159,"context_line":"    content_type, params \u003d parse_content_type(content_type)"},{"line_number":4160,"context_line":"    bytes_size \u003d None"},{"line_number":4161,"context_line":"    for k, v in params:"},{"line_number":4162,"context_line":"        if k \u003d\u003d \u0027swift_expirer_bytes\u0027:"},{"line_number":4163,"context_line":"            bytes_size \u003d int(v)"},{"line_number":4164,"context_line":"    return bytes_size"},{"line_number":4165,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"433c2788_d94b5e1e","line":4162,"updated":"2024-04-18 23:00:22.000000000","message":"this string is really the only clue that this helper is expirer specific... it might be more reasonable for it to live in obj.expirer since it\u0027s not *that* re-usable generally.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8ae85199200a2f9a6034796439a354acf11d4dba","unresolved":true,"context_lines":[{"line_number":4159,"context_line":"    content_type, params \u003d parse_content_type(content_type)"},{"line_number":4160,"context_line":"    bytes_size \u003d None"},{"line_number":4161,"context_line":"    for k, v in params:"},{"line_number":4162,"context_line":"        if k \u003d\u003d \u0027swift_expirer_bytes\u0027:"},{"line_number":4163,"context_line":"            bytes_size \u003d int(v)"},{"line_number":4164,"context_line":"    return bytes_size"},{"line_number":4165,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9004442d_1568c447","line":4162,"in_reply_to":"433c2788_d94b5e1e","updated":"2024-04-19 20:47:03.000000000","message":"Got it, I\u0027ve moved it over to object expirer and renamed it since that might make more sense.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":false,"context_lines":[{"line_number":4159,"context_line":"    content_type, params \u003d parse_content_type(content_type)"},{"line_number":4160,"context_line":"    bytes_size \u003d None"},{"line_number":4161,"context_line":"    for k, v in params:"},{"line_number":4162,"context_line":"        if k \u003d\u003d \u0027swift_expirer_bytes\u0027:"},{"line_number":4163,"context_line":"            bytes_size \u003d int(v)"},{"line_number":4164,"context_line":"    return bytes_size"},{"line_number":4165,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"65fadc81_ca318e33","line":4162,"in_reply_to":"9004442d_1568c447","updated":"2024-04-23 00:05:29.000000000","message":"Done","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"}],"swift/obj/expirer.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1d8d82602cf3bf620b77927a99d7b9315973cfc6","unresolved":true,"context_lines":[{"line_number":78,"context_line":"    for k, v in params:"},{"line_number":79,"context_line":"        if k \u003d\u003d \u0027swift_expirer_bytes\u0027:"},{"line_number":80,"context_line":"            bytes_size \u003d int(v)"},{"line_number":81,"context_line":"    return bytes_size"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"def embed_expirer_bytes_in_ctype(content_type, bytes_size):"}],"source_content_type":"text/x-python","patch_set":12,"id":"f6da8652_f1ba499d","line":81,"updated":"2024-04-24 23:03:32.000000000","message":"is this *only* used in probetests and our gizmo?","commit_id":"7cd3efdc5c4a5ea28d7a7e88e67d4920590fa9c4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"09582a38009ef84935eb32f17d14c36a4a5bae7d","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    for k, v in params:"},{"line_number":79,"context_line":"        if k \u003d\u003d \u0027swift_expirer_bytes\u0027:"},{"line_number":80,"context_line":"            bytes_size \u003d int(v)"},{"line_number":81,"context_line":"    return bytes_size"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"def embed_expirer_bytes_in_ctype(content_type, bytes_size):"}],"source_content_type":"text/x-python","patch_set":12,"id":"0b7fc5e8_f03909bc","line":81,"in_reply_to":"f6da8652_f1ba499d","updated":"2024-04-26 14:53:16.000000000","message":"it seems like yes, but now also in tests.\n\nI think it makes sense to include the inverse implementation; but it is kind of a smell that there\u0027s no consumers in-tree.\n\nWe should probably push harder on 893861: swift-expired-status: tool to inspect the expiry queue | https://review.opendev.org/c/openstack/swift/+/893861","commit_id":"7cd3efdc5c4a5ea28d7a7e88e67d4920590fa9c4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1d8d82602cf3bf620b77927a99d7b9315973cfc6","unresolved":true,"context_lines":[{"line_number":89,"context_line":"    :param bytes: an int representing number of bytes"},{"line_number":90,"context_line":"    :return: str"},{"line_number":91,"context_line":"    \"\"\""},{"line_number":92,"context_line":"    return \"%s;swift_expirer_bytes\u003d%s\" % (content_type, bytes_size)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def read_conf_for_delay_reaping_times(conf):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7d6a9fcc_838456fa","line":92,"updated":"2024-04-24 23:03:32.000000000","message":"these new functions would probably benifit from some targeted unittests","commit_id":"7cd3efdc5c4a5ea28d7a7e88e67d4920590fa9c4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"09582a38009ef84935eb32f17d14c36a4a5bae7d","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    :param bytes: an int representing number of bytes"},{"line_number":90,"context_line":"    :return: str"},{"line_number":91,"context_line":"    \"\"\""},{"line_number":92,"context_line":"    return \"%s;swift_expirer_bytes\u003d%s\" % (content_type, bytes_size)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def read_conf_for_delay_reaping_times(conf):"}],"source_content_type":"text/x-python","patch_set":12,"id":"6c857e0d_6134dfe4","line":92,"in_reply_to":"7d6a9fcc_838456fa","updated":"2024-04-26 14:53:16.000000000","message":"Done","commit_id":"7cd3efdc5c4a5ea28d7a7e88e67d4920590fa9c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"14e48bab15652895b1fa741b4464751799742980","unresolved":true,"context_lines":[{"line_number":357,"context_line":"                                 divisor) !\u003d my_index:"},{"line_number":358,"context_line":"                    continue"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"                is_async \u003d o.get(\u0027content_type\u0027) \u003d\u003d ASYNC_DELETE_TYPE"},{"line_number":361,"context_line":"                yield {\u0027task_account\u0027: task_account,"},{"line_number":362,"context_line":"                       \u0027task_container\u0027: task_container,"},{"line_number":363,"context_line":"                       \u0027task_object\u0027: task_object,"}],"source_content_type":"text/x-python","patch_set":12,"id":"e2526321_9a09443f","line":360,"updated":"2024-04-24 22:32:25.000000000","message":"This needs updating, doesn\u0027t it? We need to parse the `content_type` now.","commit_id":"7cd3efdc5c4a5ea28d7a7e88e67d4920590fa9c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fd55a0887a7699aa14a0fc0167b29e759997708b","unresolved":false,"context_lines":[{"line_number":357,"context_line":"                                 divisor) !\u003d my_index:"},{"line_number":358,"context_line":"                    continue"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"                is_async \u003d o.get(\u0027content_type\u0027) \u003d\u003d ASYNC_DELETE_TYPE"},{"line_number":361,"context_line":"                yield {\u0027task_account\u0027: task_account,"},{"line_number":362,"context_line":"                       \u0027task_container\u0027: task_container,"},{"line_number":363,"context_line":"                       \u0027task_object\u0027: task_object,"}],"source_content_type":"text/x-python","patch_set":12,"id":"5db5992e_2dca40f3","line":360,"in_reply_to":"e2526321_9a09443f","updated":"2024-04-24 22:51:43.000000000","message":"Nope, never mind! This only impacts x-delete-at handling... ignore me.","commit_id":"7cd3efdc5c4a5ea28d7a7e88e67d4920590fa9c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90ffcdb2299c6402bfc30708fa034e24c3e67451","unresolved":true,"context_lines":[{"line_number":94,"context_line":"    :return: str"},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    # all new SLO will have this key"},{"line_number":97,"context_line":"    slo_size \u003d metadata.get(\u0027X-Object-Sysmeta-Slo-Size\u0027)"},{"line_number":98,"context_line":"    if slo_size is not None:"},{"line_number":99,"context_line":"        report_bytes \u003d slo_size"},{"line_number":100,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":20,"id":"e74a6369_6083d14a","line":97,"updated":"2024-05-31 21:26:26.000000000","message":"Two things:\n\n1. I don\u0027t love how SLO details are bleeding way over to the expirer\n2. This only makes any sense at all because we\u0027re already carrying https://review.opendev.org/c/openstack/swift/+/800701","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2315c8e57dce047e4a1d5d8e8d9f93fd369b7e36","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    :return: str"},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    # all new SLO will have this key"},{"line_number":97,"context_line":"    slo_size \u003d metadata.get(\u0027X-Object-Sysmeta-Slo-Size\u0027)"},{"line_number":98,"context_line":"    if slo_size is not None:"},{"line_number":99,"context_line":"        report_bytes \u003d slo_size"},{"line_number":100,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":20,"id":"48211f14_37aa52a5","line":97,"in_reply_to":"e74a6369_6083d14a","updated":"2024-06-04 18:14:05.000000000","message":"good point!  I really like the idea of moving the SLO specific stuff over there.","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90ffcdb2299c6402bfc30708fa034e24c3e67451","unresolved":true,"context_lines":[{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    # all new SLO will have this key"},{"line_number":97,"context_line":"    slo_size \u003d metadata.get(\u0027X-Object-Sysmeta-Slo-Size\u0027)"},{"line_number":98,"context_line":"    if slo_size is not None:"},{"line_number":99,"context_line":"        report_bytes \u003d slo_size"},{"line_number":100,"context_line":"    else:"},{"line_number":101,"context_line":"        # as best I can tell this key is required by df.open"}],"source_content_type":"text/x-python","patch_set":20,"id":"3aaaf89e_239320cd","line":98,"updated":"2024-05-31 21:26:26.000000000","message":"In light of https://github.com/openstack/swift/blob/2.33.0/swift/common/middleware/s3api/controllers/multi_upload.py#L251 I\u0027m pretty sure we want `if slo_size:` (ie, fall back to content-length if it\u0027s explicitly blank)","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2315c8e57dce047e4a1d5d8e8d9f93fd369b7e36","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    # all new SLO will have this key"},{"line_number":97,"context_line":"    slo_size \u003d metadata.get(\u0027X-Object-Sysmeta-Slo-Size\u0027)"},{"line_number":98,"context_line":"    if slo_size is not None:"},{"line_number":99,"context_line":"        report_bytes \u003d slo_size"},{"line_number":100,"context_line":"    else:"},{"line_number":101,"context_line":"        # as best I can tell this key is required by df.open"}],"source_content_type":"text/x-python","patch_set":20,"id":"9ee31c43_5aab6e9f","line":98,"in_reply_to":"3aaaf89e_239320cd","updated":"2024-06-04 18:14:05.000000000","message":"ok, this got moved/fixed over in:\n\nhttps://review.opendev.org/c/openstack/swift/+/800701/38/swift/obj/expirer.py#104","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90ffcdb2299c6402bfc30708fa034e24c3e67451","unresolved":true,"context_lines":[{"line_number":100,"context_line":"    else:"},{"line_number":101,"context_line":"        # as best I can tell this key is required by df.open"},{"line_number":102,"context_line":"        report_bytes \u003d metadata[\u0027Content-Length\u0027]"},{"line_number":103,"context_line":"    return \"%s;swift_expirer_bytes\u003d%d\" % (content_type, int(report_bytes))"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"def read_conf_for_delay_reaping_times(conf):"}],"source_content_type":"text/x-python","patch_set":20,"id":"d57e4dc7_ac1bea69","line":103,"range":{"start_line":103,"start_character":56,"end_line":103,"end_character":59},"updated":"2024-05-31 21:26:26.000000000","message":"I\u0027m trying to think through what the failure looks like if this raises a `ValueError`...\n\nApparently like this:\n```\nvagrant@saio:~/swift$ aws s3 cp 100M s3://bucket\nupload: ./100M to s3://bucket/100M\nvagrant@saio:~/swift$ aws s3 cp s3://bucket/100M s3://bucket/100M-2\ncopy: s3://bucket/100M to s3://bucket/100M-2\nvagrant@saio:~/swift$ swift post bucket+segments 100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1 -H x-delete-after:3600 --retries 0\nObject POST failed: https://saio/v1/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1 503 Service Unavailable  [first 60 chars of response] b\u0027\u003chtml\u003e\u003ch1\u003eService Unavailable\u003c/h1\u003e\u003cp\u003eThe server is currently\u0027\nFailed Transaction ID: txa19c51af065848909961d-00665a33be\nvagrant@saio:~/swift$ \u003c /var/log/syslog sed -e \u0027/txa19c51af065848909961d-00665a33be/!d; s/#012/\\n/g\u0027\n2024-05-31T20:31:58.558634+00:00 saio container-server-6031: 127.0.0.1 - - [31/May/2024:20:31:58 +0000] \"HEAD /sdb3/548/AUTH_test/bucket%2Bsegments\" 204 - \"HEAD http://saio/v1/AUTH_test/bucket%2Bsegments\" \"txa19c51af065848909961d-00665a33be\" \"proxy-server 22349\" 0.0010 \"-\" 22343 0\n2024-05-31T20:31:58.559385+00:00 saio container-server-6031: STDERR: 127.0.0.1 - - [31/May/2024 20:31:58] \"HEAD /sdb3/548/AUTH_test/bucket%2Bsegments HTTP/1.1\" 204 567 0.001815 (txn: txa19c51af065848909961d-00665a33be)\n2024-05-31T20:31:58.560649+00:00 saio proxy-server: - - 31/May/2024/20/31/58 HEAD /v1/AUTH_test/bucket%252Bsegments HTTP/1.0 204 - Swift - - - - txa19c51af065848909961d-00665a33be - 0.0043 EQ - 1717187518.556128740 1717187518.560475588 0\n2024-05-31T20:31:58.561023+00:00 saio proxy-server: User: test:tester uses token AUTH_tk2a99693ee3b742f8b9596594def5d759 (trans_id txa19c51af065848909961d-00665a33be)\n2024-05-31T20:31:58.561525+00:00 saio proxy-server: User test:tester has admin authorizing. (txn: txa19c51af065848909961d-00665a33be) (client_ip: 127.0.0.1)\n2024-05-31T20:31:58.566918+00:00 saio object-server-6020: ERROR __call__ error with POST /sdb2/503/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1 : \nTraceback (most recent call last):\n  File \"/vagrant/swift/swift/obj/server.py\", line 1349, in __call__\n    res \u003d getattr(self, req.method)(req)\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/vagrant/swift/swift/common/utils/__init__.py\", line 868, in _timing_stats\n    resp \u003d func(ctrl, *args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/vagrant/swift/swift/obj/server.py\", line 700, in POST\n    self._conditional_delete_at_update(\n  File \"/vagrant/swift/swift/obj/server.py\", line 631, in _conditional_delete_at_update\n    \u0027x-content-type\u0027: embed_expirer_bytes_in_ctype(\n                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/vagrant/swift/swift/obj/expirer.py\", line 103, in embed_expirer_bytes_in_ctype\n    return \"%s;swift_expirer_bytes\u003d%d\" % (content_type, int(report_bytes))\n                                                        ^^^^^^^^^^^^^^^^^\nValueError: invalid literal for int() with base 10: \u0027\u0027 (txn: txa19c51af065848909961d-00665a33be)\n2024-05-31T20:31:58.567245+00:00 saio object-server-6030: ERROR __call__ error with POST /sdb3/503/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1 : \nTraceback (most recent call last):\n  File \"/vagrant/swift/swift/obj/server.py\", line 1349, in __call__\n    res \u003d getattr(self, req.method)(req)\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/vagrant/swift/swift/common/utils/__init__.py\", line 868, in _timing_stats\n    resp \u003d func(ctrl, *args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/vagrant/swift/swift/obj/server.py\", line 700, in POST\n    self._conditional_delete_at_update(\n  File \"/vagrant/swift/swift/obj/server.py\", line 631, in _conditional_delete_at_update\n    \u0027x-content-type\u0027: embed_expirer_bytes_in_ctype(\n                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/vagrant/swift/swift/obj/expirer.py\", line 103, in embed_expirer_bytes_in_ctype\n    return \"%s;swift_expirer_bytes\u003d%d\" % (content_type, int(report_bytes))\n                                                        ^^^^^^^^^^^^^^^^^\nValueError: invalid literal for int() with base 10: \u0027\u0027 (txn: txa19c51af065848909961d-00665a33be)\n2024-05-31T20:31:58.567530+00:00 saio object-server-6010: ERROR __call__ error with POST /sdb1/503/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1 : \nTraceback (most recent call last):\n  File \"/vagrant/swift/swift/obj/server.py\", line 1349, in __call__\n    res \u003d getattr(self, req.method)(req)\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/vagrant/swift/swift/common/utils/__init__.py\", line 868, in _timing_stats\n    resp \u003d func(ctrl, *args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/vagrant/swift/swift/obj/server.py\", line 700, in POST\n    self._conditional_delete_at_update(\n  File \"/vagrant/swift/swift/obj/server.py\", line 631, in _conditional_delete_at_update\n    \u0027x-content-type\u0027: embed_expirer_bytes_in_ctype(\n                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/vagrant/swift/swift/obj/expirer.py\", line 103, in embed_expirer_bytes_in_ctype\n    return \"%s;swift_expirer_bytes\u003d%d\" % (content_type, int(report_bytes))\n                                                        ^^^^^^^^^^^^^^^^^\nValueError: invalid literal for int() with base 10: \u0027\u0027 (txn: txa19c51af065848909961d-00665a33be)\n2024-05-31T20:31:58.568078+00:00 saio object-server-6020: 127.0.0.1 - - [31/May/2024:20:31:58 +0000] \"POST /sdb2/503/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1\" 500 933 \"POST https://saio/v1/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1\" \"txa19c51af065848909961d-00665a33be\" \"proxy-server 22349\" 0.0031 \"-\" 22345 0\n2024-05-31T20:31:58.568570+00:00 saio object-server-6030: 127.0.0.1 - - [31/May/2024:20:31:58 +0000] \"POST /sdb3/503/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1\" 500 933 \"POST https://saio/v1/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1\" \"txa19c51af065848909961d-00665a33be\" \"proxy-server 22349\" 0.0024 \"-\" 22347 0\n2024-05-31T20:31:58.569091+00:00 saio object-server-6010: 127.0.0.1 - - [31/May/2024:20:31:58 +0000] \"POST /sdb1/503/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1\" 500 933 \"POST https://saio/v1/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1\" \"txa19c51af065848909961d-00665a33be\" \"proxy-server 22349\" 0.0055 \"-\" 22342 0\n2024-05-31T20:31:58.569376+00:00 saio proxy-server: ERROR 500 Trying to POST /AUTH_test/bucket+segments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1 From Object Server 127.0.0.2:6020/sdb2 (txn: txa19c51af065848909961d-00665a33be) (client_ip: 127.0.0.1)\n2024-05-31T20:31:58.569905+00:00 saio proxy-server: ERROR 500 Trying to POST /AUTH_test/bucket+segments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1 From Object Server 127.0.0.3:6030/sdb3 (txn: txa19c51af065848909961d-00665a33be) (client_ip: 127.0.0.1)\n2024-05-31T20:31:58.570477+00:00 saio object-server-6020: STDERR: 127.0.0.1 - - [31/May/2024 20:31:58] \"POST /sdb2/503/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1 HTTP/1.1\" 500 1081 0.005708 (txn: txa19c51af065848909961d-00665a33be)\n2024-05-31T20:31:58.570601+00:00 saio object-server-6030: STDERR: 127.0.0.1 - - [31/May/2024 20:31:58] \"POST /sdb3/503/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1 HTTP/1.1\" 500 1081 0.004558 (txn: txa19c51af065848909961d-00665a33be)\n2024-05-31T20:31:58.570845+00:00 saio proxy-server: ERROR 500 Trying to POST /AUTH_test/bucket+segments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1 From Object Server 127.0.0.1:6010/sdb1 (txn: txa19c51af065848909961d-00665a33be)\n2024-05-31T20:31:58.571719+00:00 saio object-server-6040: 127.0.0.1 - - [31/May/2024:20:31:58 +0000] \"POST /sdb4/503/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1\" 404 70 \"POST https://saio/v1/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1\" \"txa19c51af065848909961d-00665a33be\" \"proxy-server 22349\" 0.0002 \"-\" 22346 0\n2024-05-31T20:31:58.572047+00:00 saio object-server-6010: STDERR: 127.0.0.1 - - [31/May/2024 20:31:58] \"POST /sdb1/503/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1 HTTP/1.1\" 500 1081 0.008643 (txn: txa19c51af065848909961d-00665a33be)\n2024-05-31T20:31:58.572494+00:00 saio proxy-server: Object POST returning 503 for (404, 503, 503) (txn: txa19c51af065848909961d-00665a33be) (client_ip: 127.0.0.1)\n2024-05-31T20:31:58.572781+00:00 saio proxy-server: 127.0.0.1 127.0.0.1 31/May/2024/20/31/58 POST /v1/AUTH_test/bucket%252Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1 HTTP/1.0 503 - python-swiftclient-3.13.1 AUTH_tk2a99693ee... - 118 - txa19c51af065848909961d-00665a33be - 0.0167 - x-delete-at:1717191118 1717187518.555895805 1717187518.572598219 0\n2024-05-31T20:31:58.573161+00:00 saio proxy-server: STDERR: 127.0.0.1 - - [31/May/2024 20:31:58] \"POST /v1/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1 HTTP/1.1\" 503 360 0.017201 (txn: txa19c51af065848909961d-00665a33be)\n2024-05-31T20:31:58.574137+00:00 saio object-server-6040: STDERR: 127.0.0.1 - - [31/May/2024 20:31:58] \"POST /sdb4/503/AUTH_test/bucket%2Bsegments/100M-2/YjI0MGY4NTMtZmM3YS00MzI2LTg2YzctNDAzN2Q5Yzk2Zjli/1 HTTP/1.1\" 404 212 0.002692 (txn: txa19c51af065848909961d-00665a33be)\n```","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2315c8e57dce047e4a1d5d8e8d9f93fd369b7e36","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    else:"},{"line_number":101,"context_line":"        # as best I can tell this key is required by df.open"},{"line_number":102,"context_line":"        report_bytes \u003d metadata[\u0027Content-Length\u0027]"},{"line_number":103,"context_line":"    return \"%s;swift_expirer_bytes\u003d%d\" % (content_type, int(report_bytes))"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"def read_conf_for_delay_reaping_times(conf):"}],"source_content_type":"text/x-python","patch_set":20,"id":"10b1e32b_f4f52a16","line":103,"range":{"start_line":103,"start_character":56,"end_line":103,"end_character":59},"in_reply_to":"d57e4dc7_ac1bea69","updated":"2024-06-04 18:14:05.000000000","message":"ok, I no longer get a 503 when I post an x-delete-at to a copied slo segment; presumably it\u0027s just getting the bytes from the segments content-length:\n\n```\nvagrant@saio:~$ curl -s \"http://localhost:8090/v1/.expiring_objects/1717459147?format\u003djson\" | jq\n[\n  {\n    \"bytes\": 0,\n    \"hash\": \"d41d8cd98f00b204e9800998ecf8427e\",\n    \"name\": \"1717522539-AUTH_test/s3test+segments/test.big-2/ZjVlODIxZTItMjNmNS00ZjlkLWFhNjgtODFjMGFlNmUzNzA4/2\",\n    \"content_type\": \"text/plain;swift_expirer_bytes\u003d1611392\",\n    \"last_modified\": \"2024-06-04T16:34:37.481450\"\n  }\n]\n```\n\nI\u0027m make sure there\u0027s an explicit test for the empty slo sysmeta value for `embed_expirer_bytes_in_ctype`","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"}],"swift/obj/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58e58de8c57255f50c2bc3c343d796604465cf86","unresolved":true,"context_lines":[{"line_number":436,"context_line":"                self.container_update_timeout, updates)"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"    def delete_at_update(self, op, delete_at, account, container, obj,"},{"line_number":439,"context_line":"                         request, objdevice, policy, headers_update\u003d{}):"},{"line_number":440,"context_line":"        \"\"\""},{"line_number":441,"context_line":"        Update the expiring objects container when objects are updated."},{"line_number":442,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"2e5171f2_60708fde","line":439,"updated":"2024-03-13 18:32:29.000000000","message":"maybe \"update_headers\" or \"extra_headers\"?  Most of the prior art I could find in swift.common was direct_client \u0026 internal_client who seemed to have just opted to call the arg \"headers\" even tho they\u0027ll annotate an copy of the passed in dict if any with additional headers themselves.\n\nAlso it\u0027s considered bad practice to use mutable objects as kwarg defaults in python: https://docs.python-guide.org/writing/gotchas/#mutable-default-arguments","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"2278cdab961e6cbb73fd549a3a562b74976fa7bd","unresolved":true,"context_lines":[{"line_number":436,"context_line":"                self.container_update_timeout, updates)"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"    def delete_at_update(self, op, delete_at, account, container, obj,"},{"line_number":439,"context_line":"                         request, objdevice, policy, headers_update\u003d{}):"},{"line_number":440,"context_line":"        \"\"\""},{"line_number":441,"context_line":"        Update the expiring objects container when objects are updated."},{"line_number":442,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"75890416_894ec44a","line":439,"in_reply_to":"2e5171f2_60708fde","updated":"2024-03-14 00:30:32.000000000","message":"I think extra_headers makes sense. I see update_headers is used shortly after in this method and would like to distinguish from that.","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f7b7d3e6972644b39157afefac52d5e03e4c98fb","unresolved":true,"context_lines":[{"line_number":436,"context_line":"                self.container_update_timeout, updates)"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"    def delete_at_update(self, op, delete_at, account, container, obj,"},{"line_number":439,"context_line":"                         request, objdevice, policy, headers_update\u003d{}):"},{"line_number":440,"context_line":"        \"\"\""},{"line_number":441,"context_line":"        Update the expiring objects container when objects are updated."},{"line_number":442,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"c3ec0739_a944b60c","line":439,"in_reply_to":"75890416_894ec44a","updated":"2024-03-14 13:27:00.000000000","message":"ah right the \"container_update-headers\" - extra_expirer_update_headers might be bit verbose 😊  extra_headers wfm.","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"ea4ae692cd44cbde8e1092e98ffca8673c16f816","unresolved":false,"context_lines":[{"line_number":436,"context_line":"                self.container_update_timeout, updates)"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"    def delete_at_update(self, op, delete_at, account, container, obj,"},{"line_number":439,"context_line":"                         request, objdevice, policy, headers_update\u003d{}):"},{"line_number":440,"context_line":"        \"\"\""},{"line_number":441,"context_line":"        Update the expiring objects container when objects are updated."},{"line_number":442,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7dce0a5a_14d6f839","line":439,"in_reply_to":"c3ec0739_a944b60c","updated":"2024-03-18 22:58:33.000000000","message":"Acknowledged","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58e58de8c57255f50c2bc3c343d796604465cf86","unresolved":true,"context_lines":[{"line_number":458,"context_line":"        partition \u003d None"},{"line_number":459,"context_line":"        hosts \u003d contdevices \u003d [None]"},{"line_number":460,"context_line":"        headers_in \u003d request.headers"},{"line_number":461,"context_line":"        headers_out \u003d HeaderKeyDict({"},{"line_number":462,"context_line":"            # system accounts are always Policy-0"},{"line_number":463,"context_line":"            \u0027X-Backend-Storage-Policy-Index\u0027: 0,"},{"line_number":464,"context_line":"            \u0027x-timestamp\u0027: request.timestamp.internal,"}],"source_content_type":"text/x-python","patch_set":1,"id":"e1bf4614_1f842ec2","line":461,"updated":"2024-03-13 18:32:29.000000000","message":"maybe\n\n    HeaderKeyDict({\u0027x-default\u0027: \u0027foo\u0027}, **(headers or {}))\n\n    \u003e\u003e\u003e headers \u003d None\n    \u003e\u003e\u003e HeaderKeyDict({\u0027x-default\u0027: \u0027foo\u0027}, **(headers or {}))\n    {\u0027X-Default\u0027: \u0027foo\u0027}\n    \u003e\u003e\u003e headers \u003d {\u0027x-extra\u0027: \u0027bar\u0027}\n    \u003e\u003e\u003e HeaderKeyDict({\u0027x-default\u0027: \u0027foo\u0027}, **(headers or {}))\n    {\u0027X-Default\u0027: \u0027foo\u0027, \u0027X-Extra\u0027: \u0027bar\u0027}\n\nfull transparency: i\u0027m starting to waffle on the idea of having callers pass in \"headers\" vs. explicit datafile_bytes, datafile_timestamp kwargs.  You might want to solicit other opionins or experiment with different designs and see if you can formulate an objective defensible opinion.","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f7b7d3e6972644b39157afefac52d5e03e4c98fb","unresolved":false,"context_lines":[{"line_number":458,"context_line":"        partition \u003d None"},{"line_number":459,"context_line":"        hosts \u003d contdevices \u003d [None]"},{"line_number":460,"context_line":"        headers_in \u003d request.headers"},{"line_number":461,"context_line":"        headers_out \u003d HeaderKeyDict({"},{"line_number":462,"context_line":"            # system accounts are always Policy-0"},{"line_number":463,"context_line":"            \u0027X-Backend-Storage-Policy-Index\u0027: 0,"},{"line_number":464,"context_line":"            \u0027x-timestamp\u0027: request.timestamp.internal,"}],"source_content_type":"text/x-python","patch_set":1,"id":"6506fb80_054624e3","line":461,"in_reply_to":"19adf8c1_657960da","updated":"2024-03-14 13:27:00.000000000","message":"Acknowledged","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"2278cdab961e6cbb73fd549a3a562b74976fa7bd","unresolved":true,"context_lines":[{"line_number":458,"context_line":"        partition \u003d None"},{"line_number":459,"context_line":"        hosts \u003d contdevices \u003d [None]"},{"line_number":460,"context_line":"        headers_in \u003d request.headers"},{"line_number":461,"context_line":"        headers_out \u003d HeaderKeyDict({"},{"line_number":462,"context_line":"            # system accounts are always Policy-0"},{"line_number":463,"context_line":"            \u0027X-Backend-Storage-Policy-Index\u0027: 0,"},{"line_number":464,"context_line":"            \u0027x-timestamp\u0027: request.timestamp.internal,"}],"source_content_type":"text/x-python","patch_set":1,"id":"19adf8c1_657960da","line":461,"in_reply_to":"e1bf4614_1f842ec2","updated":"2024-03-14 00:30:32.000000000","message":"I actually think that this might not be required. extra_headers is not passed in only when the request is to \u0027DELETE\u0027 the expirey queue entry, in which case the headers update will never occur. So for now, not using this logic","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58e58de8c57255f50c2bc3c343d796604465cf86","unresolved":true,"context_lines":[{"line_number":494,"context_line":"                updates \u003d [(None, None)]"},{"line_number":495,"context_line":"            headers_out[\u0027x-size\u0027] \u003d \u00270\u0027"},{"line_number":496,"context_line":"            headers_out[\u0027x-content-type\u0027] \u003d \u0027text/plain\u0027"},{"line_number":497,"context_line":"            headers_out[\u0027x-etag\u0027] \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":498,"context_line":"        else:"},{"line_number":499,"context_line":"            if not config_true_value("},{"line_number":500,"context_line":"                request.headers.get("}],"source_content_type":"text/x-python","patch_set":1,"id":"01b16e3f_1021b1e8","line":497,"updated":"2024-03-13 18:32:29.000000000","message":"it might make the most sense to add the x-content-type/x-content-type-timestamp headers to the update here where we\u0027re building the rest of the container update row values\n\n... it might even be confusing to explicitly set the x-content-type to text/plain here only to have it overwritten 21 lines below.","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"2278cdab961e6cbb73fd549a3a562b74976fa7bd","unresolved":false,"context_lines":[{"line_number":494,"context_line":"                updates \u003d [(None, None)]"},{"line_number":495,"context_line":"            headers_out[\u0027x-size\u0027] \u003d \u00270\u0027"},{"line_number":496,"context_line":"            headers_out[\u0027x-content-type\u0027] \u003d \u0027text/plain\u0027"},{"line_number":497,"context_line":"            headers_out[\u0027x-etag\u0027] \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":498,"context_line":"        else:"},{"line_number":499,"context_line":"            if not config_true_value("},{"line_number":500,"context_line":"                request.headers.get("}],"source_content_type":"text/x-python","patch_set":1,"id":"5485a43c_d5231345","line":497,"in_reply_to":"01b16e3f_1021b1e8","updated":"2024-03-14 00:30:32.000000000","message":"Makes sense, updated! I think this is what I initially had but pushed it down cause I thought I should do it at the very end, but it makes more sense to do this especially since we only need to do this update when the request is not a \u0027DELETE\u0027","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58e58de8c57255f50c2bc3c343d796604465cf86","unresolved":true,"context_lines":[{"line_number":515,"context_line":"            delete_at_container)"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"        # If update headers are passed in, headers_out will be updated"},{"line_number":518,"context_line":"        headers_out.update(headers_update)"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        for host, contdevice in updates:"},{"line_number":521,"context_line":"            self.async_update("}],"source_content_type":"text/x-python","patch_set":1,"id":"ad4f1e9e_79d3b3ba","line":518,"updated":"2024-03-13 18:32:29.000000000","message":"this is kind of subtle - maybe it\u0027s a good extensible interface; maybe it\u0027s hiding the complexity of content-type and content-type-timestamp - I\u0027m not sure!","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"2278cdab961e6cbb73fd549a3a562b74976fa7bd","unresolved":false,"context_lines":[{"line_number":515,"context_line":"            delete_at_container)"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"        # If update headers are passed in, headers_out will be updated"},{"line_number":518,"context_line":"        headers_out.update(headers_update)"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        for host, contdevice in updates:"},{"line_number":521,"context_line":"            self.async_update("}],"source_content_type":"text/x-python","patch_set":1,"id":"522d9c75_70a09d76","line":518,"in_reply_to":"ad4f1e9e_79d3b3ba","updated":"2024-03-14 00:30:32.000000000","message":"Got it. I realized that we only really need to update when we are not doing a \u0027DELETE\u0027 so I moved it up","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58e58de8c57255f50c2bc3c343d796604465cf86","unresolved":true,"context_lines":[{"line_number":683,"context_line":"            orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":684,"context_line":"            if orig_delete_at !\u003d new_delete_at:"},{"line_number":685,"context_line":"                disk_file_metadata \u003d disk_file.get_datafile_metadata()"},{"line_number":686,"context_line":"                headers_update \u003d {"},{"line_number":687,"context_line":"                    \u0027x-content-type\u0027: \u0027text/plain;bytes\u003d%s\u0027 %"},{"line_number":688,"context_line":"                    disk_file_metadata.get(\u0027Content-Length\u0027),"},{"line_number":689,"context_line":"                    \u0027x-content-type-timestamp\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"f775bdfe_d9b8a534","line":686,"updated":"2024-03-13 18:32:29.000000000","message":"I read this as headers.update\n\nI don\u0027t think this is the best variable name; swift has lots of code that deals with headers and interfaces that accept headers that are used to update/annotate requests - yet the string \"headers_update\" doesn\u0027t appear anywhere in swift short of test names like:\n\n    test_backend_headers_update_shard_container_no_cache\n    \ni.e. noun \"headers\" verb \"update\"\n\nI guess the thing that\u0027s tripping me up is using \"update\" as a noun?","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f7b7d3e6972644b39157afefac52d5e03e4c98fb","unresolved":false,"context_lines":[{"line_number":683,"context_line":"            orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":684,"context_line":"            if orig_delete_at !\u003d new_delete_at:"},{"line_number":685,"context_line":"                disk_file_metadata \u003d disk_file.get_datafile_metadata()"},{"line_number":686,"context_line":"                headers_update \u003d {"},{"line_number":687,"context_line":"                    \u0027x-content-type\u0027: \u0027text/plain;bytes\u003d%s\u0027 %"},{"line_number":688,"context_line":"                    disk_file_metadata.get(\u0027Content-Length\u0027),"},{"line_number":689,"context_line":"                    \u0027x-content-type-timestamp\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"23179ce0_5dca4b57","line":686,"in_reply_to":"48b03deb_db82577a","updated":"2024-03-14 13:27:00.000000000","message":"Acknowledged","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"2278cdab961e6cbb73fd549a3a562b74976fa7bd","unresolved":true,"context_lines":[{"line_number":683,"context_line":"            orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":684,"context_line":"            if orig_delete_at !\u003d new_delete_at:"},{"line_number":685,"context_line":"                disk_file_metadata \u003d disk_file.get_datafile_metadata()"},{"line_number":686,"context_line":"                headers_update \u003d {"},{"line_number":687,"context_line":"                    \u0027x-content-type\u0027: \u0027text/plain;bytes\u003d%s\u0027 %"},{"line_number":688,"context_line":"                    disk_file_metadata.get(\u0027Content-Length\u0027),"},{"line_number":689,"context_line":"                    \u0027x-content-type-timestamp\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"48b03deb_db82577a","line":686,"in_reply_to":"f775bdfe_d9b8a534","updated":"2024-03-14 00:30:32.000000000","message":"Got it—I\u0027m gonna stick to the naming convention I did with the arg, which is extra_headers","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58e58de8c57255f50c2bc3c343d796604465cf86","unresolved":true,"context_lines":[{"line_number":696,"context_line":"                if orig_delete_at:"},{"line_number":697,"context_line":"                    self.delete_at_update(\u0027DELETE\u0027, orig_delete_at, account,"},{"line_number":698,"context_line":"                                          container, obj, request, device,"},{"line_number":699,"context_line":"                                          policy, headers_update)"},{"line_number":700,"context_line":"        else:"},{"line_number":701,"context_line":"            # preserve existing metadata, only content-type may be updated"},{"line_number":702,"context_line":"            metadata \u003d dict(disk_file.get_metafile_metadata())"}],"source_content_type":"text/x-python","patch_set":1,"id":"c3a33269_1ea74967","line":699,"updated":"2024-03-13 18:32:29.000000000","message":"I\u0027m not exactly sure why/how the content-type annotation would be needed to remove the old expiry queue entry.","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"2278cdab961e6cbb73fd549a3a562b74976fa7bd","unresolved":false,"context_lines":[{"line_number":696,"context_line":"                if orig_delete_at:"},{"line_number":697,"context_line":"                    self.delete_at_update(\u0027DELETE\u0027, orig_delete_at, account,"},{"line_number":698,"context_line":"                                          container, obj, request, device,"},{"line_number":699,"context_line":"                                          policy, headers_update)"},{"line_number":700,"context_line":"        else:"},{"line_number":701,"context_line":"            # preserve existing metadata, only content-type may be updated"},{"line_number":702,"context_line":"            metadata \u003d dict(disk_file.get_metafile_metadata())"}],"source_content_type":"text/x-python","patch_set":1,"id":"17b91b95_bcf19422","line":699,"in_reply_to":"c3a33269_1ea74967","updated":"2024-03-14 00:30:32.000000000","message":"Good catch here as well—it is not required. There is actually another call with \u0027DELETE\u0027 where I did not add it, so made a mistake adding it here.","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58e58de8c57255f50c2bc3c343d796604465cf86","unresolved":true,"context_lines":[{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    def _post_commit_updates(self, request, device,"},{"line_number":1005,"context_line":"                             account, container, obj, policy, orig_metadata,"},{"line_number":1006,"context_line":"                             footers_metadata, metadata, headers_update):"},{"line_number":1007,"context_line":"        orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":1008,"context_line":"        new_delete_at \u003d int(request.headers.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":1009,"context_line":"        if orig_delete_at !\u003d new_delete_at:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5583a4da_61e3f0eb","line":1006,"updated":"2024-03-13 18:32:29.000000000","message":"probably since this method already recieves the metadata argument it would look better to pull the x-content-type/x-content-type-timestamp we need for the expirery queue update in to the update_headers w/i this method instead of plumbing them through separately.","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"2278cdab961e6cbb73fd549a3a562b74976fa7bd","unresolved":false,"context_lines":[{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    def _post_commit_updates(self, request, device,"},{"line_number":1005,"context_line":"                             account, container, obj, policy, orig_metadata,"},{"line_number":1006,"context_line":"                             footers_metadata, metadata, headers_update):"},{"line_number":1007,"context_line":"        orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":1008,"context_line":"        new_delete_at \u003d int(request.headers.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":1009,"context_line":"        if orig_delete_at !\u003d new_delete_at:"}],"source_content_type":"text/x-python","patch_set":1,"id":"31228b75_40ccb3de","line":1006,"in_reply_to":"5583a4da_61e3f0eb","updated":"2024-03-14 00:30:32.000000000","message":"Good catch. Making this change, the extra plumbing is not needed.","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f7b7d3e6972644b39157afefac52d5e03e4c98fb","unresolved":true,"context_lines":[{"line_number":495,"context_line":"            headers_out[\u0027x-size\u0027] \u003d \u00270\u0027"},{"line_number":496,"context_line":"            headers_out[\u0027x-content-type\u0027] \u003d \u0027text/plain\u0027"},{"line_number":497,"context_line":"            headers_out[\u0027x-etag\u0027] \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":498,"context_line":"            headers_out.update(extra_headers)"},{"line_number":499,"context_line":"        else:"},{"line_number":500,"context_line":"            if not config_true_value("},{"line_number":501,"context_line":"                request.headers.get("}],"source_content_type":"text/x-python","patch_set":3,"id":"56412a43_7217bc62","line":498,"updated":"2024-03-14 13:27:00.000000000","message":"I don\u0027t like an optional kwarg being *required*\n\n    \u003e\u003e\u003e d \u003d {}\n    \u003e\u003e\u003e d.update(None)\n    Traceback (most recent call last):\n      File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n    TypeError: \u0027NoneType\u0027 object is not iterable\n    \noh good, and this is why:\n\n                headers\u003d{\u0027X-Timestamp\u0027: 1,\n                         \u0027X-Trans-Id\u0027: \u00271234\u0027,\n                         \u0027X-Delete-At-Host\u0027: \u0027127.0.0.1:1234\u0027,\n                         \u0027X-Delete-At-Partition\u0027: \u00273\u0027,\n                         \u0027X-Delete-At-Device\u0027: \u0027sdc1\u0027,\n                         \u0027X-Backend-Storage-Policy-Index\u0027: int(policy)})\n            self.object_controller.delete_at_update(\u0027PUT\u0027, 2, \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,\n    \u003e                                               req, \u0027sda1\u0027, policy)\n\n    test/unit/obj/test_server.py:6708: \n    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n    swift/obj/server.py:498: in delete_at_update\n        headers_out.update(extra_headers)\n    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\n    self \u003d {\u0027X-Trans-Id\u0027: \u00271234\u0027, \u0027X-Timestamp\u0027: \u00270000000001.00000\u0027, \u0027X-Content-Type\u0027: \u0027t...04e9800998ecf8427e\u0027, \u0027Referer\u0027: \u0027PUT http://localhost/v1/a/c/o\u0027, \u0027X-Size\u0027: \u00270\u0027}\n    other \u003d None\n\n        def update(self, other):\n            if hasattr(other, \u0027keys\u0027):\n                for key in other.keys():\n                    self[self._title(key)] \u003d other[key]\n            else:\n    \u003e           for key, value in other:\n    E           TypeError: \u0027NoneType\u0027 object is not iterable\n\n    swift/common/header_key_dict.py:44: TypeError\n    ----------------------------- Captured stdout call -----------------------------\n    test-object-controller WARNING: X-Delete-At-Container header must be specified for expiring objects background PUT to work properly. Making best guess as to the container name for now.\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 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","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":false,"context_lines":[{"line_number":495,"context_line":"            headers_out[\u0027x-size\u0027] \u003d \u00270\u0027"},{"line_number":496,"context_line":"            headers_out[\u0027x-content-type\u0027] \u003d \u0027text/plain\u0027"},{"line_number":497,"context_line":"            headers_out[\u0027x-etag\u0027] \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":498,"context_line":"            headers_out.update(extra_headers)"},{"line_number":499,"context_line":"        else:"},{"line_number":500,"context_line":"            if not config_true_value("},{"line_number":501,"context_line":"                request.headers.get("}],"source_content_type":"text/x-python","patch_set":3,"id":"83bf2856_27978bcb","line":498,"in_reply_to":"0168dc05_9618b116","updated":"2024-04-18 23:00:22.000000000","message":"Done","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"ea4ae692cd44cbde8e1092e98ffca8673c16f816","unresolved":true,"context_lines":[{"line_number":495,"context_line":"            headers_out[\u0027x-size\u0027] \u003d \u00270\u0027"},{"line_number":496,"context_line":"            headers_out[\u0027x-content-type\u0027] \u003d \u0027text/plain\u0027"},{"line_number":497,"context_line":"            headers_out[\u0027x-etag\u0027] \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":498,"context_line":"            headers_out.update(extra_headers)"},{"line_number":499,"context_line":"        else:"},{"line_number":500,"context_line":"            if not config_true_value("},{"line_number":501,"context_line":"                request.headers.get("}],"source_content_type":"text/x-python","patch_set":3,"id":"0168dc05_9618b116","line":498,"in_reply_to":"56412a43_7217bc62","updated":"2024-03-18 22:58:33.000000000","message":"Got it, looks like I overlooked this test - updating with a check to make sure that `extra_headers` is not None.","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f7b7d3e6972644b39157afefac52d5e03e4c98fb","unresolved":true,"context_lines":[{"line_number":998,"context_line":""},{"line_number":999,"context_line":"    def _post_commit_updates(self, request, device,"},{"line_number":1000,"context_line":"                             account, container, obj, policy, orig_metadata,"},{"line_number":1001,"context_line":"                             footers_metadata, metadata):"},{"line_number":1002,"context_line":"        orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":1003,"context_line":"        new_delete_at \u003d int(request.headers.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":1004,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"f72e6a64_29ea2619","line":1001,"updated":"2024-03-14 13:27:00.000000000","message":"these lines changed; but I don\u0027t think the signature did - just a random formatting diff\n\nthe original formatting may have been attempting to \"group\" all 3 metadata items on the second line.","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8ae85199200a2f9a6034796439a354acf11d4dba","unresolved":false,"context_lines":[{"line_number":998,"context_line":""},{"line_number":999,"context_line":"    def _post_commit_updates(self, request, device,"},{"line_number":1000,"context_line":"                             account, container, obj, policy, orig_metadata,"},{"line_number":1001,"context_line":"                             footers_metadata, metadata):"},{"line_number":1002,"context_line":"        orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":1003,"context_line":"        new_delete_at \u003d int(request.headers.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":1004,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"774d7eec_764938c2","line":1001,"in_reply_to":"f72e6a64_29ea2619","updated":"2024-04-19 20:47:03.000000000","message":"Acknowledged","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f7b7d3e6972644b39157afefac52d5e03e4c98fb","unresolved":true,"context_lines":[{"line_number":1008,"context_line":"        if orig_delete_at !\u003d new_delete_at or ("},{"line_number":1009,"context_line":"            orig_datafile_timestamp !\u003d new_datafile_timestamp"},{"line_number":1010,"context_line":"        ):"},{"line_number":1011,"context_line":"            if new_delete_at:"},{"line_number":1012,"context_line":"                extra_headers \u003d {"},{"line_number":1013,"context_line":"                    \u0027x-content-type\u0027: \u0027text/plain;bytes\u003d%s\u0027 %"},{"line_number":1014,"context_line":"                    metadata.get(\u0027Content-Length\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"fae6674a_b4f0b296","line":1011,"updated":"2024-03-14 13:27:00.000000000","message":"so all this boolean is now saying something like:\n\n\"if there\u0027s a new delete-at (i.e. queue update required) and it\u0027s different from what was in the queue\"\n\nI guess the \"if it\u0027s different\" now includes the bytes (for which new_datafile_timestamp is a reasoable proxy, but it\u0027s not actually possible for orig_datafile_timestamp \u003d\u003d new_datafile_timestamp).  I think this can be simplified to \"if new_delete_at: send new update\" (even if it\u0027s equal to the existing old_delete_at)","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":false,"context_lines":[{"line_number":1008,"context_line":"        if orig_delete_at !\u003d new_delete_at or ("},{"line_number":1009,"context_line":"            orig_datafile_timestamp !\u003d new_datafile_timestamp"},{"line_number":1010,"context_line":"        ):"},{"line_number":1011,"context_line":"            if new_delete_at:"},{"line_number":1012,"context_line":"                extra_headers \u003d {"},{"line_number":1013,"context_line":"                    \u0027x-content-type\u0027: \u0027text/plain;bytes\u003d%s\u0027 %"},{"line_number":1014,"context_line":"                    metadata.get(\u0027Content-Length\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"caa51d62_657a9a1f","line":1011,"in_reply_to":"9db731e9_79e705a7","updated":"2024-04-18 23:00:22.000000000","message":"Done","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"ea4ae692cd44cbde8e1092e98ffca8673c16f816","unresolved":true,"context_lines":[{"line_number":1008,"context_line":"        if orig_delete_at !\u003d new_delete_at or ("},{"line_number":1009,"context_line":"            orig_datafile_timestamp !\u003d new_datafile_timestamp"},{"line_number":1010,"context_line":"        ):"},{"line_number":1011,"context_line":"            if new_delete_at:"},{"line_number":1012,"context_line":"                extra_headers \u003d {"},{"line_number":1013,"context_line":"                    \u0027x-content-type\u0027: \u0027text/plain;bytes\u003d%s\u0027 %"},{"line_number":1014,"context_line":"                    metadata.get(\u0027Content-Length\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"9db731e9_79e705a7","line":1011,"in_reply_to":"fae6674a_b4f0b296","updated":"2024-03-18 22:58:33.000000000","message":"Got it, and I\u0027m doing the same with the \u0027DELETE\u0027 request, since we want to delete if there was an old one at all. Updating the code!","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":993,"context_line":"                             orig_metadata, footers_metadata, metadata):"},{"line_number":994,"context_line":"        orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":995,"context_line":"        new_delete_at \u003d int(request.headers.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":996,"context_line":"        if orig_delete_at !\u003d new_delete_at:"},{"line_number":997,"context_line":"            if new_delete_at:"},{"line_number":998,"context_line":"                self.delete_at_update("},{"line_number":999,"context_line":"                    \u0027PUT\u0027, new_delete_at, account, container, obj, request,"}],"source_content_type":"text/x-python","patch_set":7,"id":"97830afa_491a2ecd","side":"PARENT","line":996,"updated":"2024-04-18 23:00:22.000000000","message":"right this isn\u0027t a reasonable optimization anymore since we potentially have new bytes...\n\nHonestly I\u0027m sure I understand how valuable it was to begin with... I guess I can sort of convince myself it must have been correct but definately not required...\n\n\"always create a new expirer entry if the request includes an x-delete-at\" is a totally reasonable and easy to understand strategy.","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8ae85199200a2f9a6034796439a354acf11d4dba","unresolved":false,"context_lines":[{"line_number":993,"context_line":"                             orig_metadata, footers_metadata, metadata):"},{"line_number":994,"context_line":"        orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":995,"context_line":"        new_delete_at \u003d int(request.headers.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":996,"context_line":"        if orig_delete_at !\u003d new_delete_at:"},{"line_number":997,"context_line":"            if new_delete_at:"},{"line_number":998,"context_line":"                self.delete_at_update("},{"line_number":999,"context_line":"                    \u0027PUT\u0027, new_delete_at, account, container, obj, request,"}],"source_content_type":"text/x-python","patch_set":7,"id":"bafbc159_5c579697","side":"PARENT","line":996,"in_reply_to":"97830afa_491a2ecd","updated":"2024-04-19 20:47:03.000000000","message":"Acknowledged","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":681,"context_line":"                disk_file_metadata \u003d disk_file.get_datafile_metadata()"},{"line_number":682,"context_line":"                extra_headers \u003d {"},{"line_number":683,"context_line":"                    \u0027x-content-type\u0027: \u0027text/plain;swift_expirer_bytes\u003d%s\u0027 %"},{"line_number":684,"context_line":"                    disk_file_metadata.get(\u0027Content-Length\u0027),"},{"line_number":685,"context_line":"                    \u0027x-content-type-timestamp\u0027:"},{"line_number":686,"context_line":"                    disk_file_metadata.get(\u0027X-Timestamp\u0027),"},{"line_number":687,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a09d28c_145f28ef","line":684,"updated":"2024-04-18 23:00:22.000000000","message":"it might look nice to have an \"embed_expirer_bytes_in_ctype\" helper that is the inverse of the \"extract_expirer_bytes_from_ctype\" helper.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8ae85199200a2f9a6034796439a354acf11d4dba","unresolved":false,"context_lines":[{"line_number":681,"context_line":"                disk_file_metadata \u003d disk_file.get_datafile_metadata()"},{"line_number":682,"context_line":"                extra_headers \u003d {"},{"line_number":683,"context_line":"                    \u0027x-content-type\u0027: \u0027text/plain;swift_expirer_bytes\u003d%s\u0027 %"},{"line_number":684,"context_line":"                    disk_file_metadata.get(\u0027Content-Length\u0027),"},{"line_number":685,"context_line":"                    \u0027x-content-type-timestamp\u0027:"},{"line_number":686,"context_line":"                    disk_file_metadata.get(\u0027X-Timestamp\u0027),"},{"line_number":687,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":7,"id":"a00188cf_1acb87fc","line":684,"in_reply_to":"3a09d28c_145f28ef","updated":"2024-04-19 20:47:03.000000000","message":"Good idea, added it to the object expirer as well.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":688,"context_line":"                if new_delete_at:"},{"line_number":689,"context_line":"                    self.delete_at_update("},{"line_number":690,"context_line":"                        \u0027PUT\u0027, new_delete_at, account, container, obj, request,"},{"line_number":691,"context_line":"                        device, policy, extra_headers)"},{"line_number":692,"context_line":"                if orig_delete_at:"},{"line_number":693,"context_line":"                    self.delete_at_update(\u0027DELETE\u0027, orig_delete_at, account,"},{"line_number":694,"context_line":"                                          container, obj, request, device,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3e86c06b_7142c683","line":691,"updated":"2024-04-18 23:00:22.000000000","message":"oic, we don\u0027t actually call `delete_at_update` with `extra_headers\u003dextra_headers` we just depend on the optional arguments posistion.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8ae85199200a2f9a6034796439a354acf11d4dba","unresolved":false,"context_lines":[{"line_number":688,"context_line":"                if new_delete_at:"},{"line_number":689,"context_line":"                    self.delete_at_update("},{"line_number":690,"context_line":"                        \u0027PUT\u0027, new_delete_at, account, container, obj, request,"},{"line_number":691,"context_line":"                        device, policy, extra_headers)"},{"line_number":692,"context_line":"                if orig_delete_at:"},{"line_number":693,"context_line":"                    self.delete_at_update(\u0027DELETE\u0027, orig_delete_at, account,"},{"line_number":694,"context_line":"                                          container, obj, request, device,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9b77decd_0012afea","line":691,"in_reply_to":"3e86c06b_7142c683","updated":"2024-04-19 20:47:03.000000000","message":"Acknowledged","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":1008,"context_line":"                \u0027x-content-type\u0027: \u0027text/plain;swift_expirer_bytes\u003d%s\u0027 %"},{"line_number":1009,"context_line":"                metadata.get(\u0027Content-Length\u0027),"},{"line_number":1010,"context_line":"                \u0027x-content-type-timestamp\u0027:"},{"line_number":1011,"context_line":"                metadata.get(\u0027X-Timestamp\u0027),"},{"line_number":1012,"context_line":"            }"},{"line_number":1013,"context_line":"            self.delete_at_update("},{"line_number":1014,"context_line":"                \u0027PUT\u0027, new_delete_at, account, container, obj, request,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3be26e6b_145078e9","line":1011,"updated":"2024-04-18 23:00:22.000000000","message":"right ok, for the current expirer queue entry we put the current content-length/bytes from the current PUT as coming from the the current x-timestamp; love it.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8ae85199200a2f9a6034796439a354acf11d4dba","unresolved":false,"context_lines":[{"line_number":1008,"context_line":"                \u0027x-content-type\u0027: \u0027text/plain;swift_expirer_bytes\u003d%s\u0027 %"},{"line_number":1009,"context_line":"                metadata.get(\u0027Content-Length\u0027),"},{"line_number":1010,"context_line":"                \u0027x-content-type-timestamp\u0027:"},{"line_number":1011,"context_line":"                metadata.get(\u0027X-Timestamp\u0027),"},{"line_number":1012,"context_line":"            }"},{"line_number":1013,"context_line":"            self.delete_at_update("},{"line_number":1014,"context_line":"                \u0027PUT\u0027, new_delete_at, account, container, obj, request,"}],"source_content_type":"text/x-python","patch_set":7,"id":"e7d11b18_a6690098","line":1011,"in_reply_to":"3be26e6b_145078e9","updated":"2024-04-19 20:47:03.000000000","message":"Acknowledged","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":1016,"context_line":"        if orig_delete_at:"},{"line_number":1017,"context_line":"            self.delete_at_update("},{"line_number":1018,"context_line":"                \u0027DELETE\u0027, orig_delete_at, account, container, obj,"},{"line_number":1019,"context_line":"                request, device, policy)"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"        update_headers \u003d HeaderKeyDict({"},{"line_number":1022,"context_line":"            \u0027x-size\u0027: metadata[\u0027Content-Length\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"d6f3d88c_71508563","line":1019,"updated":"2024-04-18 23:00:22.000000000","message":"ok, well NOW I can sort of imagine the case where the orig_delete_at \u003d\u003d new_delete_at and we end up deleting the record we just created!","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8e7aad8ac987b1518a0f52e637cf1caa5495fd5e","unresolved":true,"context_lines":[{"line_number":1016,"context_line":"        if orig_delete_at:"},{"line_number":1017,"context_line":"            self.delete_at_update("},{"line_number":1018,"context_line":"                \u0027DELETE\u0027, orig_delete_at, account, container, obj,"},{"line_number":1019,"context_line":"                request, device, policy)"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"        update_headers \u003d HeaderKeyDict({"},{"line_number":1022,"context_line":"            \u0027x-size\u0027: metadata[\u0027Content-Length\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"f44a724b_44bbd010","line":1019,"in_reply_to":"09363888_cbee8bc1","updated":"2024-04-22 21:59:36.000000000","message":"OK, having the helper (and using it in `POST`!) works, too. I get the logic (now), it was the hodgepodge of logic blocks that really gave me pause.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a02602be18b5a5219f3a573df606d0b9e96227e8","unresolved":false,"context_lines":[{"line_number":1016,"context_line":"        if orig_delete_at:"},{"line_number":1017,"context_line":"            self.delete_at_update("},{"line_number":1018,"context_line":"                \u0027DELETE\u0027, orig_delete_at, account, container, obj,"},{"line_number":1019,"context_line":"                request, device, policy)"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"        update_headers \u003d HeaderKeyDict({"},{"line_number":1022,"context_line":"            \u0027x-size\u0027: metadata[\u0027Content-Length\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"05cd16b0_c0dc9cda","line":1019,"in_reply_to":"3554ae1d_1b043a26","updated":"2024-04-22 20:50:26.000000000","message":"Done","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b3467a47cb4478eccdeca3945b64923a8b5a2f17","unresolved":true,"context_lines":[{"line_number":1016,"context_line":"        if orig_delete_at:"},{"line_number":1017,"context_line":"            self.delete_at_update("},{"line_number":1018,"context_line":"                \u0027DELETE\u0027, orig_delete_at, account, container, obj,"},{"line_number":1019,"context_line":"                request, device, policy)"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"        update_headers \u003d HeaderKeyDict({"},{"line_number":1022,"context_line":"            \u0027x-size\u0027: metadata[\u0027Content-Length\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"09363888_cbee8bc1","line":1019,"in_reply_to":"3554ae1d_1b043a26","updated":"2024-04-22 21:53:04.000000000","message":"Took me a sec to realize why the logic needed to change (as opposed to just plumbing in the extra headers, like we did in `POST`), but this is so we get updated byte counts when overwriting with new data but the same `x-delete-at`. Maybe it\u0027d be more obvious like\n```\nif (orig_delete_at, orig_content_len) !\u003d (new_delete_at, new_content_len):\n    if new_delete_at:\n        self.delete_at_update(\u0027PUT\u0027, ...)\n    if orig_delete_at and orig_delete_at !\u003d new_delete_at:\n        self.delete_at_update(\u0027DELETE\u0027, ...)\n```\n? IDK that I expect the `(orig_delete_at, orig_content_len) \u003d\u003d (new_delete_at, new_content_len)` case to be terribly common, but I *also* wasn\u0027t really expecting the `orig_delete_at \u003d\u003d new_delete_at` to be terribly common for PUTs, so...","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8ae85199200a2f9a6034796439a354acf11d4dba","unresolved":true,"context_lines":[{"line_number":1016,"context_line":"        if orig_delete_at:"},{"line_number":1017,"context_line":"            self.delete_at_update("},{"line_number":1018,"context_line":"                \u0027DELETE\u0027, orig_delete_at, account, container, obj,"},{"line_number":1019,"context_line":"                request, device, policy)"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"        update_headers \u003d HeaderKeyDict({"},{"line_number":1022,"context_line":"            \u0027x-size\u0027: metadata[\u0027Content-Length\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa9219bf_30b3cbca","line":1019,"in_reply_to":"d6f3d88c_71508563","updated":"2024-04-19 20:47:03.000000000","message":"Updating so that we only delete if orig_delete_at !\u003d new_delete_at. Will look at the tests you made.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":false,"context_lines":[{"line_number":1016,"context_line":"        if orig_delete_at:"},{"line_number":1017,"context_line":"            self.delete_at_update("},{"line_number":1018,"context_line":"                \u0027DELETE\u0027, orig_delete_at, account, container, obj,"},{"line_number":1019,"context_line":"                request, device, policy)"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"        update_headers \u003d HeaderKeyDict({"},{"line_number":1022,"context_line":"            \u0027x-size\u0027: metadata[\u0027Content-Length\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"c96c2d9e_d6aa1784","line":1019,"in_reply_to":"f44a724b_44bbd010","updated":"2024-04-23 00:05:29.000000000","message":"Done","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":1016,"context_line":"        if orig_delete_at:"},{"line_number":1017,"context_line":"            self.delete_at_update("},{"line_number":1018,"context_line":"                \u0027DELETE\u0027, orig_delete_at, account, container, obj,"},{"line_number":1019,"context_line":"                request, device, policy)"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"        update_headers \u003d HeaderKeyDict({"},{"line_number":1022,"context_line":"            \u0027x-size\u0027: metadata[\u0027Content-Length\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"3554ae1d_1b043a26","line":1019,"in_reply_to":"fa9219bf_30b3cbca","updated":"2024-04-22 16:47:38.000000000","message":"The logic here looks correct to me.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":1069,"context_line":"            return HTTPRequestTimeout(request\u003drequest)"},{"line_number":1070,"context_line":"        finally:"},{"line_number":1071,"context_line":"            writer.close()"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        self._post_commit_updates(request, device,"},{"line_number":1074,"context_line":"                                  account, container, obj, policy,"},{"line_number":1075,"context_line":"                                  orig_metadata, footers_metadata, metadata)"}],"source_content_type":"text/x-python","patch_set":7,"id":"386ff988_2815b4f9","line":1072,"updated":"2024-04-18 23:00:22.000000000","message":"random formatting diff","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8ae85199200a2f9a6034796439a354acf11d4dba","unresolved":false,"context_lines":[{"line_number":1069,"context_line":"            return HTTPRequestTimeout(request\u003drequest)"},{"line_number":1070,"context_line":"        finally:"},{"line_number":1071,"context_line":"            writer.close()"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        self._post_commit_updates(request, device,"},{"line_number":1074,"context_line":"                                  account, container, obj, policy,"},{"line_number":1075,"context_line":"                                  orig_metadata, footers_metadata, metadata)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ee6226e0_baabc005","line":1072,"in_reply_to":"386ff988_2815b4f9","updated":"2024-04-19 20:47:03.000000000","message":"Acknowledged","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"38139a8262fad2b3db73bcc18e8968435edbad89","unresolved":true,"context_lines":[{"line_number":676,"context_line":"                    metadata[header_caps] \u003d request.headers[header_key]"},{"line_number":677,"context_line":"            orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":678,"context_line":"            if orig_delete_at !\u003d new_delete_at:"},{"line_number":679,"context_line":"                if new_delete_at:"},{"line_number":680,"context_line":"                    self.delete_at_update("},{"line_number":681,"context_line":"                        \u0027PUT\u0027, new_delete_at, account, container, obj, request,"},{"line_number":682,"context_line":"                        device, policy)"},{"line_number":683,"context_line":"                if orig_delete_at:"},{"line_number":684,"context_line":"                    self.delete_at_update(\u0027DELETE\u0027, orig_delete_at, account,"},{"line_number":685,"context_line":"                                          container, obj, request, device,"},{"line_number":686,"context_line":"                                          policy)"},{"line_number":687,"context_line":"        else:"},{"line_number":688,"context_line":"            # preserve existing metadata, only content-type may be updated"},{"line_number":689,"context_line":"            metadata \u003d dict(disk_file.get_metafile_metadata())"}],"source_content_type":"text/x-python","patch_set":9,"id":"b215da87_29e2335d","side":"PARENT","line":686,"range":{"start_line":679,"start_character":16,"end_line":686,"end_character":49},"updated":"2024-04-22 09:32:15.000000000","message":"hmm, this code and the code down in _post_commit_updates in the original code are basically the same. And now we\u0027re doing more of the same. Would this be a good candidate to refactor this out? Maybe break out the delete_at stuff from _post_commit_updates and call that in both places?\n\nI don\u0027t mind a bit of code reuse, but now adding a bunch of extra headers, maybe it\u0027s now getting too much?","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":676,"context_line":"                    metadata[header_caps] \u003d request.headers[header_key]"},{"line_number":677,"context_line":"            orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":678,"context_line":"            if orig_delete_at !\u003d new_delete_at:"},{"line_number":679,"context_line":"                if new_delete_at:"},{"line_number":680,"context_line":"                    self.delete_at_update("},{"line_number":681,"context_line":"                        \u0027PUT\u0027, new_delete_at, account, container, obj, request,"},{"line_number":682,"context_line":"                        device, policy)"},{"line_number":683,"context_line":"                if orig_delete_at:"},{"line_number":684,"context_line":"                    self.delete_at_update(\u0027DELETE\u0027, orig_delete_at, account,"},{"line_number":685,"context_line":"                                          container, obj, request, device,"},{"line_number":686,"context_line":"                                          policy)"},{"line_number":687,"context_line":"        else:"},{"line_number":688,"context_line":"            # preserve existing metadata, only content-type may be updated"},{"line_number":689,"context_line":"            metadata \u003d dict(disk_file.get_metafile_metadata())"}],"source_content_type":"text/x-python","patch_set":9,"id":"f23a3427_0c17f177","side":"PARENT","line":686,"range":{"start_line":679,"start_character":16,"end_line":686,"end_character":49},"in_reply_to":"b215da87_29e2335d","updated":"2024-04-22 16:47:38.000000000","message":"method extraction is always a good idea when you have some duplicated code!\n\nThe logic here is slightly different form PUT case, and I\"m not sure I\u0027m convinced it should be.  \"always send new_delete_at update\" seems like a sound strategy.  \"do not delete if old_delete_at \u003d\u003d new_delete_at\" also seems necessary.\n\nI\u0027m not sure why we wouldn\u0027t send a new_delete_at just cause it was the same as old_delete_data - how strongly do we feel about the guarantee that bytes must be the same if the delete-at is the same... strongly enough to want to \"optimize\" out the new_delete_at update?  I\u0027m not sure about that...","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a02602be18b5a5219f3a573df606d0b9e96227e8","unresolved":false,"context_lines":[{"line_number":676,"context_line":"                    metadata[header_caps] \u003d request.headers[header_key]"},{"line_number":677,"context_line":"            orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":678,"context_line":"            if orig_delete_at !\u003d new_delete_at:"},{"line_number":679,"context_line":"                if new_delete_at:"},{"line_number":680,"context_line":"                    self.delete_at_update("},{"line_number":681,"context_line":"                        \u0027PUT\u0027, new_delete_at, account, container, obj, request,"},{"line_number":682,"context_line":"                        device, policy)"},{"line_number":683,"context_line":"                if orig_delete_at:"},{"line_number":684,"context_line":"                    self.delete_at_update(\u0027DELETE\u0027, orig_delete_at, account,"},{"line_number":685,"context_line":"                                          container, obj, request, device,"},{"line_number":686,"context_line":"                                          policy)"},{"line_number":687,"context_line":"        else:"},{"line_number":688,"context_line":"            # preserve existing metadata, only content-type may be updated"},{"line_number":689,"context_line":"            metadata \u003d dict(disk_file.get_metafile_metadata())"}],"source_content_type":"text/x-python","patch_set":9,"id":"8cd540d0_481dac94","side":"PARENT","line":686,"range":{"start_line":679,"start_character":16,"end_line":686,"end_character":49},"in_reply_to":"f23a3427_0c17f177","updated":"2024-04-22 20:50:26.000000000","message":"Acknowledged","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"38139a8262fad2b3db73bcc18e8968435edbad89","unresolved":true,"context_lines":[{"line_number":447,"context_line":"        :param obj: object name"},{"line_number":448,"context_line":"        :param request: the original request driving the update"},{"line_number":449,"context_line":"        :param objdevice: device name that the object is in"},{"line_number":450,"context_line":"        :param policy: the BaseStoragePolicy instance (used for tmp dir)"},{"line_number":451,"context_line":"        \"\"\""},{"line_number":452,"context_line":"        if config_true_value("},{"line_number":453,"context_line":"                request.headers.get(\u0027x-backend-replication\u0027, \u0027f\u0027)):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ec439682_d41b7bc8","line":450,"updated":"2024-04-22 09:32:15.000000000","message":"Need to add extra_headers here","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a02602be18b5a5219f3a573df606d0b9e96227e8","unresolved":false,"context_lines":[{"line_number":447,"context_line":"        :param obj: object name"},{"line_number":448,"context_line":"        :param request: the original request driving the update"},{"line_number":449,"context_line":"        :param objdevice: device name that the object is in"},{"line_number":450,"context_line":"        :param policy: the BaseStoragePolicy instance (used for tmp dir)"},{"line_number":451,"context_line":"        \"\"\""},{"line_number":452,"context_line":"        if config_true_value("},{"line_number":453,"context_line":"                request.headers.get(\u0027x-backend-replication\u0027, \u0027f\u0027)):"}],"source_content_type":"text/x-python","patch_set":9,"id":"c4621ac5_f2917a6a","line":450,"in_reply_to":"7ec96d70_66947549","updated":"2024-04-22 20:50:26.000000000","message":"Done","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b3467a47cb4478eccdeca3945b64923a8b5a2f17","unresolved":true,"context_lines":[{"line_number":447,"context_line":"        :param obj: object name"},{"line_number":448,"context_line":"        :param request: the original request driving the update"},{"line_number":449,"context_line":"        :param objdevice: device name that the object is in"},{"line_number":450,"context_line":"        :param policy: the BaseStoragePolicy instance (used for tmp dir)"},{"line_number":451,"context_line":"        \"\"\""},{"line_number":452,"context_line":"        if config_true_value("},{"line_number":453,"context_line":"                request.headers.get(\u0027x-backend-replication\u0027, \u0027f\u0027)):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bdd7b866_dd82e670","line":450,"in_reply_to":"7ec96d70_66947549","updated":"2024-04-22 21:53:04.000000000","message":"Especially since it will only apply when `op \u003d\u003d \u0027PUT\u0027`","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":false,"context_lines":[{"line_number":447,"context_line":"        :param obj: object name"},{"line_number":448,"context_line":"        :param request: the original request driving the update"},{"line_number":449,"context_line":"        :param objdevice: device name that the object is in"},{"line_number":450,"context_line":"        :param policy: the BaseStoragePolicy instance (used for tmp dir)"},{"line_number":451,"context_line":"        \"\"\""},{"line_number":452,"context_line":"        if config_true_value("},{"line_number":453,"context_line":"                request.headers.get(\u0027x-backend-replication\u0027, \u0027f\u0027)):"}],"source_content_type":"text/x-python","patch_set":9,"id":"77fcc9bb_5ef350a9","line":450,"in_reply_to":"bdd7b866_dd82e670","updated":"2024-04-23 00:05:29.000000000","message":"Done","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":447,"context_line":"        :param obj: object name"},{"line_number":448,"context_line":"        :param request: the original request driving the update"},{"line_number":449,"context_line":"        :param objdevice: device name that the object is in"},{"line_number":450,"context_line":"        :param policy: the BaseStoragePolicy instance (used for tmp dir)"},{"line_number":451,"context_line":"        \"\"\""},{"line_number":452,"context_line":"        if config_true_value("},{"line_number":453,"context_line":"                request.headers.get(\u0027x-backend-replication\u0027, \u0027f\u0027)):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7ec96d70_66947549","line":450,"in_reply_to":"ec439682_d41b7bc8","updated":"2024-04-22 16:47:38.000000000","message":"sho nuff!","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b3467a47cb4478eccdeca3945b64923a8b5a2f17","unresolved":true,"context_lines":[{"line_number":684,"context_line":"                        \u0027text/plain\u0027, disk_file_metadata.get(\u0027Content-Length\u0027)"},{"line_number":685,"context_line":"                    ),"},{"line_number":686,"context_line":"                    \u0027x-content-type-timestamp\u0027:"},{"line_number":687,"context_line":"                    disk_file_metadata.get(\u0027X-Timestamp\u0027),"},{"line_number":688,"context_line":"                }"},{"line_number":689,"context_line":"                if new_delete_at:"},{"line_number":690,"context_line":"                    self.delete_at_update("}],"source_content_type":"text/x-python","patch_set":9,"id":"41309f00_7c819527","line":687,"updated":"2024-04-22 21:53:04.000000000","message":"Oh, interesting -- so we can have content-type timestamps that pre-date the main record timestamp? I suppose [`encode_timestamps` is pretty clear about the ability to have both `+` and `-` in there](https://github.com/openstack/swift/blob/2.33.0/swift/common/utils/timestamp.py#L268-L274) and how that means you can\u0027t rely on lexicographical sorting.\n\nAnd in general, having this extra timestamp also means we\u0027ll do the right thing when we\u0027ve got a split-brain with a POST at t3 updating both t1.data on server A and t2.data on server B -- eventually, the t2 byte count will win out.\n\nRolling upgrades are a little unfortunate: if any of the object-servers sending updates were still running old code, the `ctype_timestamp` will settle to the overall timestamp. At least it\u0027s consistent, though -- it won\u0027t be left flapping between states.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"43578a5cfb95b9310569459dadb84cf4c8f645a2","unresolved":true,"context_lines":[{"line_number":684,"context_line":"                        \u0027text/plain\u0027, disk_file_metadata.get(\u0027Content-Length\u0027)"},{"line_number":685,"context_line":"                    ),"},{"line_number":686,"context_line":"                    \u0027x-content-type-timestamp\u0027:"},{"line_number":687,"context_line":"                    disk_file_metadata.get(\u0027X-Timestamp\u0027),"},{"line_number":688,"context_line":"                }"},{"line_number":689,"context_line":"                if new_delete_at:"},{"line_number":690,"context_line":"                    self.delete_at_update("}],"source_content_type":"text/x-python","patch_set":9,"id":"724e3516_7ff5b633","line":687,"in_reply_to":"41309f00_7c819527","updated":"2024-04-26 15:04:31.000000000","message":"oh, that\u0027s interesting - I hadn\u0027t thought about the upgrade concerns.\n\nI guess it\u0027s just a hint anyways; as long as it resolves to some consistent content-type.\n\nI guess if the most recent update lands on an upgraded server with out-of-date .data file (and there\u0027s no upgraded servers with current data to recieve the update to set-correct-ctype-timestamp) we get stuck with a *stale* bytes until another PUT or POST to that object after upgrading.  I might be unclear on how the container-server resolves the same x-timestamp with different ctype but only one ctype-timestamp.\n\nWe could make ops turn it on after upgrading?","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7a6f6fa2e2eb29bb082a7fb2cbe97f898ce92512","unresolved":false,"context_lines":[{"line_number":684,"context_line":"                        \u0027text/plain\u0027, disk_file_metadata.get(\u0027Content-Length\u0027)"},{"line_number":685,"context_line":"                    ),"},{"line_number":686,"context_line":"                    \u0027x-content-type-timestamp\u0027:"},{"line_number":687,"context_line":"                    disk_file_metadata.get(\u0027X-Timestamp\u0027),"},{"line_number":688,"context_line":"                }"},{"line_number":689,"context_line":"                if new_delete_at:"},{"line_number":690,"context_line":"                    self.delete_at_update("}],"source_content_type":"text/x-python","patch_set":9,"id":"676d9e45_054d36e2","line":687,"in_reply_to":"71101920_7acd0c73","updated":"2024-06-07 17:40:21.000000000","message":"Acknowledged","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2315c8e57dce047e4a1d5d8e8d9f93fd369b7e36","unresolved":true,"context_lines":[{"line_number":684,"context_line":"                        \u0027text/plain\u0027, disk_file_metadata.get(\u0027Content-Length\u0027)"},{"line_number":685,"context_line":"                    ),"},{"line_number":686,"context_line":"                    \u0027x-content-type-timestamp\u0027:"},{"line_number":687,"context_line":"                    disk_file_metadata.get(\u0027X-Timestamp\u0027),"},{"line_number":688,"context_line":"                }"},{"line_number":689,"context_line":"                if new_delete_at:"},{"line_number":690,"context_line":"                    self.delete_at_update("}],"source_content_type":"text/x-python","patch_set":9,"id":"71101920_7acd0c73","line":687,"in_reply_to":"724e3516_7ff5b633","updated":"2024-06-04 18:14:05.000000000","message":"\u003e the ctype_timestamp will settle to the overall timestamp. At least it\u0027s consistent, though -- it won\u0027t be left flapping between states.\n\nI wrote some tests to help me understand this.  Tim is right the unupgraded server will send it\u0027s update with just content_type\u003d\u0027text/plain\u0027 and w/o a ctype_timestamp and that ctype will \"win out\" over any updates from upgraded servers.\n\nSo you\u0027ll consistently get the unupgraded behavior if any updates arrive from unupgraded servers until your cluster is fully upgraded - this does seem fine.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8e7aad8ac987b1518a0f52e637cf1caa5495fd5e","unresolved":true,"context_lines":[{"line_number":1276,"context_line":"            else:"},{"line_number":1277,"context_line":"                # differentiate success from no object at all"},{"line_number":1278,"context_line":"                response_class \u003d HTTPNoContent"},{"line_number":1279,"context_line":"        if orig_delete_at:"},{"line_number":1280,"context_line":"            self.delete_at_update(\u0027DELETE\u0027, orig_delete_at, account,"},{"line_number":1281,"context_line":"                                  container, obj, request, device,"},{"line_number":1282,"context_line":"                                  policy)"}],"source_content_type":"text/x-python","patch_set":10,"id":"a6b14c58_c538570e","line":1279,"updated":"2024-04-22 21:59:36.000000000","message":"Could we use the new helper here, too, with `new_delete_at\u003d0`?","commit_id":"c318cae3dcb5111745bb630b8584bcf50429c8ff"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":false,"context_lines":[{"line_number":1276,"context_line":"            else:"},{"line_number":1277,"context_line":"                # differentiate success from no object at all"},{"line_number":1278,"context_line":"                response_class \u003d HTTPNoContent"},{"line_number":1279,"context_line":"        if orig_delete_at:"},{"line_number":1280,"context_line":"            self.delete_at_update(\u0027DELETE\u0027, orig_delete_at, account,"},{"line_number":1281,"context_line":"                                  container, obj, request, device,"},{"line_number":1282,"context_line":"                                  policy)"}],"source_content_type":"text/x-python","patch_set":10,"id":"2112fec0_895a308d","line":1279,"in_reply_to":"a6b14c58_c538570e","updated":"2024-04-23 00:05:29.000000000","message":"Done","commit_id":"c318cae3dcb5111745bb630b8584bcf50429c8ff"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":true,"context_lines":[{"line_number":625,"context_line":"    def _conditional_delete_at_update(self, request, device, account,"},{"line_number":626,"context_line":"                                      container, obj, policy, metadata,"},{"line_number":627,"context_line":"                                      orig_delete_at, new_delete_at):"},{"line_number":628,"context_line":"        if new_delete_at:"},{"line_number":629,"context_line":"            extra_headers \u003d {"},{"line_number":630,"context_line":"                \u0027x-content-type\u0027: embed_expirer_bytes_in_ctype("},{"line_number":631,"context_line":"                    \u0027text/plain\u0027, metadata.get(\u0027Content-Length\u0027)),"}],"source_content_type":"text/x-python","patch_set":11,"id":"55e2ddd7_5762b3be","line":628,"updated":"2024-04-23 00:05:29.000000000","message":"I thought this was only conditional for DELETE requests, but a PUT/POST w/o a x-delete-at may also need to clean up the old queue entry.","commit_id":"2f4e6bc410e93e7911d994f72af5a53139de3fe7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"09582a38009ef84935eb32f17d14c36a4a5bae7d","unresolved":false,"context_lines":[{"line_number":625,"context_line":"    def _conditional_delete_at_update(self, request, device, account,"},{"line_number":626,"context_line":"                                      container, obj, policy, metadata,"},{"line_number":627,"context_line":"                                      orig_delete_at, new_delete_at):"},{"line_number":628,"context_line":"        if new_delete_at:"},{"line_number":629,"context_line":"            extra_headers \u003d {"},{"line_number":630,"context_line":"                \u0027x-content-type\u0027: embed_expirer_bytes_in_ctype("},{"line_number":631,"context_line":"                    \u0027text/plain\u0027, metadata.get(\u0027Content-Length\u0027)),"}],"source_content_type":"text/x-python","patch_set":11,"id":"a501b91b_432427dd","line":628,"in_reply_to":"55e2ddd7_5762b3be","updated":"2024-04-26 14:53:16.000000000","message":"Acknowledged","commit_id":"2f4e6bc410e93e7911d994f72af5a53139de3fe7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":true,"context_lines":[{"line_number":1250,"context_line":"            else:"},{"line_number":1251,"context_line":"                response_class \u003d HTTPConflict"},{"line_number":1252,"context_line":"        response_timestamp \u003d max(orig_timestamp, req_timestamp)"},{"line_number":1253,"context_line":"        orig_delete_at \u003d Timestamp(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":1254,"context_line":"        try:"},{"line_number":1255,"context_line":"            req_if_delete_at_val \u003d request.headers[\u0027x-if-delete-at\u0027]"},{"line_number":1256,"context_line":"            req_if_delete_at \u003d Timestamp(req_if_delete_at_val)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3c647ce2_c711100c","line":1253,"updated":"2024-04-23 00:05:29.000000000","message":"perhaps curious that the PUT/POST path use int when casting the orig_delete_at instead of Timestamp","commit_id":"2f4e6bc410e93e7911d994f72af5a53139de3fe7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"09582a38009ef84935eb32f17d14c36a4a5bae7d","unresolved":false,"context_lines":[{"line_number":1250,"context_line":"            else:"},{"line_number":1251,"context_line":"                response_class \u003d HTTPConflict"},{"line_number":1252,"context_line":"        response_timestamp \u003d max(orig_timestamp, req_timestamp)"},{"line_number":1253,"context_line":"        orig_delete_at \u003d Timestamp(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":1254,"context_line":"        try:"},{"line_number":1255,"context_line":"            req_if_delete_at_val \u003d request.headers[\u0027x-if-delete-at\u0027]"},{"line_number":1256,"context_line":"            req_if_delete_at \u003d Timestamp(req_if_delete_at_val)"}],"source_content_type":"text/x-python","patch_set":11,"id":"f005f87d_61d577cc","line":1253,"in_reply_to":"3c647ce2_c711100c","updated":"2024-04-26 14:53:16.000000000","message":"meh, existing weirdness","commit_id":"2f4e6bc410e93e7911d994f72af5a53139de3fe7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":true,"context_lines":[{"line_number":1278,"context_line":"                response_class \u003d HTTPNoContent"},{"line_number":1279,"context_line":"        self._conditional_delete_at_update("},{"line_number":1280,"context_line":"            request, device, account, container, obj, policy, {},"},{"line_number":1281,"context_line":"            orig_delete_at, 0"},{"line_number":1282,"context_line":"        )"},{"line_number":1283,"context_line":"        if orig_timestamp \u003c req_timestamp:"},{"line_number":1284,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"e5a85bac_0186bcb9","line":1281,"updated":"2024-04-23 00:05:29.000000000","message":"interesting, so in the \"there is not and never was a delete-at record\" this method will conclude `if 0:` and `if Timestamp(0) and Timestamp(0) !\u003d 0:` are both `False` and turn it into a noop.  If `orig_delete_at` is a non-zero Timestamp, the `0` for `new_delete_at` is still `False` but since it\u0027s `!\u003d 0` we still get the DELETE request.\n\nI\u0027m hoping this is pretty well covered by existing unittests; but I\u0027m ok with it.","commit_id":"2f4e6bc410e93e7911d994f72af5a53139de3fe7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"09582a38009ef84935eb32f17d14c36a4a5bae7d","unresolved":false,"context_lines":[{"line_number":1278,"context_line":"                response_class \u003d HTTPNoContent"},{"line_number":1279,"context_line":"        self._conditional_delete_at_update("},{"line_number":1280,"context_line":"            request, device, account, container, obj, policy, {},"},{"line_number":1281,"context_line":"            orig_delete_at, 0"},{"line_number":1282,"context_line":"        )"},{"line_number":1283,"context_line":"        if orig_timestamp \u003c req_timestamp:"},{"line_number":1284,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"c0f115d3_820ce159","line":1281,"in_reply_to":"e5a85bac_0186bcb9","updated":"2024-04-26 14:53:16.000000000","message":"Acknowledged","commit_id":"2f4e6bc410e93e7911d994f72af5a53139de3fe7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90ffcdb2299c6402bfc30708fa034e24c3e67451","unresolved":true,"context_lines":[{"line_number":629,"context_line":"        if new_delete_at:"},{"line_number":630,"context_line":"            extra_headers \u003d {"},{"line_number":631,"context_line":"                \u0027x-content-type\u0027: embed_expirer_bytes_in_ctype("},{"line_number":632,"context_line":"                    \u0027text/plain\u0027, metadata),"},{"line_number":633,"context_line":"                \u0027x-content-type-timestamp\u0027:"},{"line_number":634,"context_line":"                metadata.get(\u0027X-Timestamp\u0027),"},{"line_number":635,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":20,"id":"ce618ebf_e3ee326a","line":632,"range":{"start_line":632,"start_character":20,"end_line":632,"end_character":32},"updated":"2024-05-31 21:26:26.000000000","message":"Anything bad/weird happen if this gets out of sync with the `text/plain` up on L498? I don\u0027t *love* the duplication, but maybe there\u0027s not much to be done about it.","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2315c8e57dce047e4a1d5d8e8d9f93fd369b7e36","unresolved":false,"context_lines":[{"line_number":629,"context_line":"        if new_delete_at:"},{"line_number":630,"context_line":"            extra_headers \u003d {"},{"line_number":631,"context_line":"                \u0027x-content-type\u0027: embed_expirer_bytes_in_ctype("},{"line_number":632,"context_line":"                    \u0027text/plain\u0027, metadata),"},{"line_number":633,"context_line":"                \u0027x-content-type-timestamp\u0027:"},{"line_number":634,"context_line":"                metadata.get(\u0027X-Timestamp\u0027),"},{"line_number":635,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":20,"id":"f956109b_afe08548","line":632,"range":{"start_line":632,"start_character":20,"end_line":632,"end_character":32},"in_reply_to":"ce618ebf_e3ee326a","updated":"2024-06-04 18:14:05.000000000","message":"nothing *bad* I wouldn\u0027t imagine, but since we have `expirer.ASYNC_DELETE_TYPE` I don\u0027t see a good reason not to add `expirer.X_DELETE_TYPE`","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7a6f6fa2e2eb29bb082a7fb2cbe97f898ce92512","unresolved":false,"context_lines":[{"line_number":697,"context_line":"                        wsgi_to_bytes(header_key).title())"},{"line_number":698,"context_line":"                    metadata[header_caps] \u003d request.headers[header_key]"},{"line_number":699,"context_line":"            orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":700,"context_line":"            disk_file_metadata \u003d disk_file.get_datafile_metadata()"},{"line_number":701,"context_line":"            self._conditional_delete_at_update("},{"line_number":702,"context_line":"                request, device, account, container, obj, policy,"},{"line_number":703,"context_line":"                disk_file_metadata, orig_delete_at, new_delete_at"}],"source_content_type":"text/x-python","patch_set":23,"id":"094a0292_0514617e","line":700,"updated":"2024-06-07 17:40:21.000000000","message":"I was a little surprised we can\u0027t just use `orig_metadata` -- even in the SLO case, we\u0027re going for sysmeta that can\u0027t be updated on POST... but we need to be careful to get the right timestamp plumbed in for the content-type-timestamp on the update. Regardless, this won\u0027t actually touch disk -- the diskfile is already opened and everything\u0027s been read.","commit_id":"4e1c0e16a925bfaeb78cea9a34cf88feb7145caa"}],"test/probe/test_mixed_policy_mpu.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90ffcdb2299c6402bfc30708fa034e24c3e67451","unresolved":true,"context_lines":[{"line_number":40,"context_line":"        if not s3api_info:"},{"line_number":41,"context_line":"            raise unittest.SkipTest(\u0027s3api not enabled\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # lazy import boto only required if cluster supports s3api"},{"line_number":44,"context_line":"        from test.s3api import get_s3_client"},{"line_number":45,"context_line":"        self.s3 \u003d get_s3_client(1)"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"09522fcb_46605946","side":"PARENT","line":43,"updated":"2024-05-31 21:26:26.000000000","message":"Little funny, but sure -- and even https://bugs.launchpad.net/swift/+bug/2063367 seems to mostly be around func tests, and we already import `boto3` at the module level.","commit_id":"99c629edb813c7d9fcd736f5d34b3a47d224a457"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2315c8e57dce047e4a1d5d8e8d9f93fd369b7e36","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        if not s3api_info:"},{"line_number":41,"context_line":"            raise unittest.SkipTest(\u0027s3api not enabled\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # lazy import boto only required if cluster supports s3api"},{"line_number":44,"context_line":"        from test.s3api import get_s3_client"},{"line_number":45,"context_line":"        self.s3 \u003d get_s3_client(1)"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7c71d7d1_91bfe2a7","side":"PARENT","line":43,"in_reply_to":"09522fcb_46605946","updated":"2024-06-04 18:14:05.000000000","message":"yeah sorry to throw in the test only drive-by cleanup as a distraction; I think I can pull it out.","commit_id":"99c629edb813c7d9fcd736f5d34b3a47d224a457"}],"test/probe/test_object_expirer.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58e58de8c57255f50c2bc3c343d796604465cf86","unresolved":true,"context_lines":[{"line_number":386,"context_line":"            t1_content_length: 1"},{"line_number":387,"context_line":"        }"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"        self.assertEqual(expected_byte_size_counts, byte_size_counts)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"        # Run the replicator to update expirey queue entries"},{"line_number":392,"context_line":"        Manager([\u0027container-replicator\u0027]).once()"}],"source_content_type":"text/x-python","patch_set":1,"id":"47486c8e_2df5dda4","line":389,"updated":"2024-03-13 18:32:29.000000000","message":"oh i love this!","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"2278cdab961e6cbb73fd549a3a562b74976fa7bd","unresolved":false,"context_lines":[{"line_number":386,"context_line":"            t1_content_length: 1"},{"line_number":387,"context_line":"        }"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"        self.assertEqual(expected_byte_size_counts, byte_size_counts)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"        # Run the replicator to update expirey queue entries"},{"line_number":392,"context_line":"        Manager([\u0027container-replicator\u0027]).once()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1df90117_7a23a10e","line":389,"in_reply_to":"47486c8e_2df5dda4","updated":"2024-03-14 00:30:32.000000000","message":"Acknowledged","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58e58de8c57255f50c2bc3c343d796604465cf86","unresolved":true,"context_lines":[{"line_number":406,"context_line":"        ])"},{"line_number":407,"context_line":"        expected_byte_size_counts \u003d {t1_content_length: 3}"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        self.assertEqual(expected_byte_size_counts, byte_size_counts)"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def _test_expirer_delete_outdated_object_version(self, object_exists):"},{"line_number":412,"context_line":"        # This test simulates a case where the expirer tries to delete"}],"source_content_type":"text/x-python","patch_set":1,"id":"5c274dcd_170bf942","line":409,"updated":"2024-03-13 18:32:29.000000000","message":"boom!","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"2278cdab961e6cbb73fd549a3a562b74976fa7bd","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        ])"},{"line_number":407,"context_line":"        expected_byte_size_counts \u003d {t1_content_length: 3}"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        self.assertEqual(expected_byte_size_counts, byte_size_counts)"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def _test_expirer_delete_outdated_object_version(self, object_exists):"},{"line_number":412,"context_line":"        # This test simulates a case where the expirer tries to delete"}],"source_content_type":"text/x-python","patch_set":1,"id":"491e328f_abd8adc6","line":409,"in_reply_to":"5c274dcd_170bf942","updated":"2024-03-14 00:30:32.000000000","message":"Acknowledged","commit_id":"ac7492f664fa8c0948ee29999bfce09a2d3a85fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":297,"context_line":"        t0 \u003d int(time.time())"},{"line_number":298,"context_line":"        t1 \u003d int(t0 + 2.0)"},{"line_number":299,"context_line":"        t2 \u003d int(t1 + 2.0)"},{"line_number":300,"context_line":"        put_object(headers\u003d{\u0027X-Timestamp\u0027: Timestamp(t0).normal},"},{"line_number":301,"context_line":"                   content_length\u003dt0_content_length)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"        obj_brain.stop_primary_half()"}],"source_content_type":"text/x-python","patch_set":9,"id":"01a57ffe_e046a0f3","line":300,"updated":"2024-04-22 16:47:38.000000000","message":"i think we could also just do the put and let InternalClient assign the x-timestamp.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a02602be18b5a5219f3a573df606d0b9e96227e8","unresolved":true,"context_lines":[{"line_number":297,"context_line":"        t0 \u003d int(time.time())"},{"line_number":298,"context_line":"        t1 \u003d int(t0 + 2.0)"},{"line_number":299,"context_line":"        t2 \u003d int(t1 + 2.0)"},{"line_number":300,"context_line":"        put_object(headers\u003d{\u0027X-Timestamp\u0027: Timestamp(t0).normal},"},{"line_number":301,"context_line":"                   content_length\u003dt0_content_length)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"        obj_brain.stop_primary_half()"}],"source_content_type":"text/x-python","patch_set":9,"id":"efb3a6a7_87ead6fd","line":300,"in_reply_to":"01a57ffe_e046a0f3","updated":"2024-04-22 20:50:26.000000000","message":"Got it, I\u0027m letting InternalClient assign the timestamp, but I\u0027m requesting it later so I can use it when checking the results of `expected_counts` later.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        t0 \u003d int(time.time())"},{"line_number":298,"context_line":"        t1 \u003d int(t0 + 2.0)"},{"line_number":299,"context_line":"        t2 \u003d int(t1 + 2.0)"},{"line_number":300,"context_line":"        put_object(headers\u003d{\u0027X-Timestamp\u0027: Timestamp(t0).normal},"},{"line_number":301,"context_line":"                   content_length\u003dt0_content_length)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"        obj_brain.stop_primary_half()"}],"source_content_type":"text/x-python","patch_set":9,"id":"5661d15a_547cd669","line":300,"in_reply_to":"efb3a6a7_87ead6fd","updated":"2024-04-23 00:05:29.000000000","message":"right, i wasn\u0027t sure if the x-timestamp would be in the put response.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":303,"context_line":"        obj_brain.stop_primary_half()"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        t1_content_length \u003d 32"},{"line_number":306,"context_line":"        put_object(headers\u003d{\u0027X-Timestamp\u0027: Timestamp(t1).normal},"},{"line_number":307,"context_line":"                   content_length\u003dt1_content_length)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        # Manager([\u0027container-updater\u0027]).once() # maybe later"}],"source_content_type":"text/x-python","patch_set":9,"id":"115816e9_62b86e36","line":306,"updated":"2024-04-22 16:47:38.000000000","message":"it\u0027s actually a little weird to me to see a PUT happening 2s in the future.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a02602be18b5a5219f3a573df606d0b9e96227e8","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        obj_brain.stop_primary_half()"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        t1_content_length \u003d 32"},{"line_number":306,"context_line":"        put_object(headers\u003d{\u0027X-Timestamp\u0027: Timestamp(t1).normal},"},{"line_number":307,"context_line":"                   content_length\u003dt1_content_length)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        # Manager([\u0027container-updater\u0027]).once() # maybe later"}],"source_content_type":"text/x-python","patch_set":9,"id":"08fd0fa6_28b2e03e","line":306,"in_reply_to":"115816e9_62b86e36","updated":"2024-04-22 20:50:26.000000000","message":"I see - I\u0027m sticking with letting the InternalClient make the timestamps.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":306,"context_line":"        put_object(headers\u003d{\u0027X-Timestamp\u0027: Timestamp(t1).normal},"},{"line_number":307,"context_line":"                   content_length\u003dt1_content_length)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        # Manager([\u0027container-updater\u0027]).once() # maybe later"},{"line_number":310,"context_line":"        try:"},{"line_number":311,"context_line":"            metadata \u003d self.client.get_object_metadata("},{"line_number":312,"context_line":"                self.account, self.container_name, self.object_name)"}],"source_content_type":"text/x-python","patch_set":9,"id":"8e3f9652_7bd6fe20","line":309,"updated":"2024-04-22 16:47:38.000000000","message":"probably remove the stale comments, although it\u0027s not strictly obvious to me why this wouldn\u0027t be more-or-less fine to do pretty much at any time..","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a02602be18b5a5219f3a573df606d0b9e96227e8","unresolved":false,"context_lines":[{"line_number":306,"context_line":"        put_object(headers\u003d{\u0027X-Timestamp\u0027: Timestamp(t1).normal},"},{"line_number":307,"context_line":"                   content_length\u003dt1_content_length)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        # Manager([\u0027container-updater\u0027]).once() # maybe later"},{"line_number":310,"context_line":"        try:"},{"line_number":311,"context_line":"            metadata \u003d self.client.get_object_metadata("},{"line_number":312,"context_line":"                self.account, self.container_name, self.object_name)"}],"source_content_type":"text/x-python","patch_set":9,"id":"4419000f_754b460e","line":309,"in_reply_to":"8e3f9652_7bd6fe20","updated":"2024-04-22 20:50:26.000000000","message":"Done","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":310,"context_line":"        try:"},{"line_number":311,"context_line":"            metadata \u003d self.client.get_object_metadata("},{"line_number":312,"context_line":"                self.account, self.container_name, self.object_name)"},{"line_number":313,"context_line":"            assert metadata[\u0027content-length\u0027] \u003d\u003d str(t1_content_length)"},{"line_number":314,"context_line":"        except UnexpectedResponse as e:"},{"line_number":315,"context_line":"            self.fail("},{"line_number":316,"context_line":"                \u0027Expected 200 for HEAD object but got %s\u0027 % e.resp.status)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f0213b3_4ca2d60d","line":313,"updated":"2024-04-22 16:47:38.000000000","message":"probaby it would look better to move this assert out of the except block\n\nthe reason we get t1_content_length is because the servers holding the old t0_content_length aren\u0027t alive atm.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a02602be18b5a5219f3a573df606d0b9e96227e8","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        try:"},{"line_number":311,"context_line":"            metadata \u003d self.client.get_object_metadata("},{"line_number":312,"context_line":"                self.account, self.container_name, self.object_name)"},{"line_number":313,"context_line":"            assert metadata[\u0027content-length\u0027] \u003d\u003d str(t1_content_length)"},{"line_number":314,"context_line":"        except UnexpectedResponse as e:"},{"line_number":315,"context_line":"            self.fail("},{"line_number":316,"context_line":"                \u0027Expected 200 for HEAD object but got %s\u0027 % e.resp.status)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3063e7a5_6586e603","line":313,"in_reply_to":"5f0213b3_4ca2d60d","updated":"2024-04-22 20:50:26.000000000","message":"Done","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":336,"context_line":"        # POST will create an expiry queue entry with 2 landing on t0, 1 on t1"},{"line_number":337,"context_line":"        path \u003d self.client.make_path(self.account, self.container_name,"},{"line_number":338,"context_line":"                                     self.object_name)"},{"line_number":339,"context_line":"        self.client.make_request(\u0027POST\u0027, path,"},{"line_number":340,"context_line":"                                 {\u0027X-Timestamp\u0027: Timestamp(t2).normal,"},{"line_number":341,"context_line":"                                  \u0027X-Delete-After\u0027: \u00275\u0027}, (2,))"},{"line_number":342,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"55033418_c55492ca","line":339,"updated":"2024-04-22 16:47:38.000000000","message":"`client.set_object_metadata` would be more idomatic; I don\u0027t think the `metadata_prefix` gets in the way too much if you ignore it.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a02602be18b5a5219f3a573df606d0b9e96227e8","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        # POST will create an expiry queue entry with 2 landing on t0, 1 on t1"},{"line_number":337,"context_line":"        path \u003d self.client.make_path(self.account, self.container_name,"},{"line_number":338,"context_line":"                                     self.object_name)"},{"line_number":339,"context_line":"        self.client.make_request(\u0027POST\u0027, path,"},{"line_number":340,"context_line":"                                 {\u0027X-Timestamp\u0027: Timestamp(t2).normal,"},{"line_number":341,"context_line":"                                  \u0027X-Delete-After\u0027: \u00275\u0027}, (2,))"},{"line_number":342,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"c070f552_b22c1f09","line":339,"in_reply_to":"55033418_c55492ca","updated":"2024-04-22 20:50:26.000000000","message":"Done","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        # Run the container updater once to register new container containing"},{"line_number":344,"context_line":"        # expirey queue entry"},{"line_number":345,"context_line":"        Manager([\u0027container-updater\u0027]).once()"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        # Find the name of the container containing the expiring object"},{"line_number":348,"context_line":"        expiring_containers \u003d list("}],"source_content_type":"text/x-python","patch_set":9,"id":"b64489e6_ce574e7d","line":345,"updated":"2024-04-22 16:47:38.000000000","message":"at first I read this as object-udpater, but the comment explains what\u0027s going on","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":407,"context_line":"        ])"},{"line_number":408,"context_line":"        expected_byte_size_counts \u003d {t1_content_length: 3}"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"        self.assertEqual(expected_byte_size_counts, byte_size_counts)"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def _test_expirer_delete_outdated_object_version(self, object_exists):"},{"line_number":413,"context_line":"        # This test simulates a case where the expirer tries to delete"}],"source_content_type":"text/x-python","patch_set":9,"id":"e7168eaf_f9e1cad0","line":410,"updated":"2024-04-22 16:47:38.000000000","message":"this is really nice!\n\nwe\u0027re testing specifically the case of POST x-delete-at on inconsistent .datafiles; I think that\u0027s probably the most important case for probe-testing\n\nThere\u0027s probably some other \"correctness\" behaviors, but nothing I can think of we couldn\u0027t more easily verify with unittests e.g. POST over PUT w/ x-delete-at calls `delete_at_update(\u0027DELETE\u0027)`","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a02602be18b5a5219f3a573df606d0b9e96227e8","unresolved":false,"context_lines":[{"line_number":407,"context_line":"        ])"},{"line_number":408,"context_line":"        expected_byte_size_counts \u003d {t1_content_length: 3}"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"        self.assertEqual(expected_byte_size_counts, byte_size_counts)"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def _test_expirer_delete_outdated_object_version(self, object_exists):"},{"line_number":413,"context_line":"        # This test simulates a case where the expirer tries to delete"}],"source_content_type":"text/x-python","patch_set":9,"id":"7ff653f2_79a86850","line":410,"in_reply_to":"e7168eaf_f9e1cad0","updated":"2024-04-22 20:50:26.000000000","message":"Acknowledged","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":true,"context_lines":[{"line_number":301,"context_line":"            self.fail("},{"line_number":302,"context_line":"                \u0027Expected 200 for HEAD object but got %s\u0027 % e.resp.status)"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"        assert metadata[\u0027content-length\u0027] \u003d\u003d str(t0_content_length)"},{"line_number":305,"context_line":"        t0 \u003d metadata[\u0027x-timestamp\u0027]"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"        obj_brain.stop_primary_half()"}],"source_content_type":"text/x-python","patch_set":11,"id":"7aac39c2_97792b46","line":304,"updated":"2024-04-23 00:05:29.000000000","message":"nit: slightly more idiomatic to use assertEqual but maybe pytest doesn\u0027t actually care that much when it comes to test failure output:\n\n\t\u003e       assert metadata[\u0027content-length\u0027] \u003d\u003d str(t0_content_length + 1)\n\tE       AssertionError: assert \u002724\u0027 \u003d\u003d \u002725\u0027\n\tE         - 25\n\tE         + 24\n\n\tswift/test/probe/test_object_expirer.py:304: AssertionError","commit_id":"2f4e6bc410e93e7911d994f72af5a53139de3fe7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"09582a38009ef84935eb32f17d14c36a4a5bae7d","unresolved":false,"context_lines":[{"line_number":301,"context_line":"            self.fail("},{"line_number":302,"context_line":"                \u0027Expected 200 for HEAD object but got %s\u0027 % e.resp.status)"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"        assert metadata[\u0027content-length\u0027] \u003d\u003d str(t0_content_length)"},{"line_number":305,"context_line":"        t0 \u003d metadata[\u0027x-timestamp\u0027]"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"        obj_brain.stop_primary_half()"}],"source_content_type":"text/x-python","patch_set":11,"id":"358b73ed_4ab7233c","line":304,"in_reply_to":"7aac39c2_97792b46","updated":"2024-04-26 14:53:16.000000000","message":"Acknowledged","commit_id":"2f4e6bc410e93e7911d994f72af5a53139de3fe7"}],"test/unit/container/test_backend.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90ffcdb2299c6402bfc30708fa034e24c3e67451","unresolved":true,"context_lines":[{"line_number":7181,"context_line":"        self.assertEqual({\u0027a/o\u0027}, to_delete)"},{"line_number":7182,"context_line":""},{"line_number":7183,"context_line":""},{"line_number":7184,"context_line":"class TestExpirerBytesCtypeTimestamp(test_db.TestDbBase):"},{"line_number":7185,"context_line":""},{"line_number":7186,"context_line":"    def setUp(self):"},{"line_number":7187,"context_line":"        super(TestExpirerBytesCtypeTimestamp, self).setUp()"}],"source_content_type":"text/x-python","patch_set":20,"id":"c1ce9a66_91e812a2","line":7184,"updated":"2024-05-31 21:26:26.000000000","message":"Feels a little weird -- we didn\u0027t actually need to do anything to the container layer, did we?","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2315c8e57dce047e4a1d5d8e8d9f93fd369b7e36","unresolved":false,"context_lines":[{"line_number":7181,"context_line":"        self.assertEqual({\u0027a/o\u0027}, to_delete)"},{"line_number":7182,"context_line":""},{"line_number":7183,"context_line":""},{"line_number":7184,"context_line":"class TestExpirerBytesCtypeTimestamp(test_db.TestDbBase):"},{"line_number":7185,"context_line":""},{"line_number":7186,"context_line":"    def setUp(self):"},{"line_number":7187,"context_line":"        super(TestExpirerBytesCtypeTimestamp, self).setUp()"}],"source_content_type":"text/x-python","patch_set":20,"id":"775c031f_8f7fabad","line":7184,"in_reply_to":"c1ce9a66_91e812a2","updated":"2024-06-04 18:14:05.000000000","message":"right, totally arbitrary where to stick this test - but I wanted to write it to convince myself about the upgrade behavior.","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90ffcdb2299c6402bfc30708fa034e24c3e67451","unresolved":true,"context_lines":[{"line_number":7217,"context_line":""},{"line_number":7218,"context_line":"        self.assertEqual([{"},{"line_number":7219,"context_line":"            \u0027content_type\u0027: \u0027text/plain;swift_expirer_bytes\u003d2\u0027,"},{"line_number":7220,"context_line":"            \u0027created_at\u0027: encode_timestamps(post_ts, put2_ts, put2_ts),"},{"line_number":7221,"context_line":"            \u0027deleted\u0027: 0,"},{"line_number":7222,"context_line":"            \u0027etag\u0027: \u0027d41d8cd98f00b204e9800998ecf8427e\u0027,"},{"line_number":7223,"context_line":"            \u0027name\u0027: \u00271234-a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"0c2cd330_8dc292b0","line":7220,"range":{"start_line":7220,"start_character":26,"end_line":7220,"end_character":70},"updated":"2024-05-31 21:26:26.000000000","message":"Right -- this looks a little funny if you\u0027re used to the\n```\nencode_timestamps(item_ts_data, item_ts_ctype, item_ts_meta)\n```\nform that we usually use for `encode_timestamps`, but this is for the expiry queue, so it makes sense.","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2315c8e57dce047e4a1d5d8e8d9f93fd369b7e36","unresolved":true,"context_lines":[{"line_number":7217,"context_line":""},{"line_number":7218,"context_line":"        self.assertEqual([{"},{"line_number":7219,"context_line":"            \u0027content_type\u0027: \u0027text/plain;swift_expirer_bytes\u003d2\u0027,"},{"line_number":7220,"context_line":"            \u0027created_at\u0027: encode_timestamps(post_ts, put2_ts, put2_ts),"},{"line_number":7221,"context_line":"            \u0027deleted\u0027: 0,"},{"line_number":7222,"context_line":"            \u0027etag\u0027: \u0027d41d8cd98f00b204e9800998ecf8427e\u0027,"},{"line_number":7223,"context_line":"            \u0027name\u0027: \u00271234-a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"06537996_6051f5d7","line":7220,"range":{"start_line":7220,"start_character":26,"end_line":7220,"end_character":70},"in_reply_to":"0c2cd330_8dc292b0","updated":"2024-06-04 18:14:05.000000000","message":"if you think there\u0027s a better way to demonstrate/maintain the requirements of how the expier is going to be using this content-type-timestamp for out-of-order updates of expirer task rows I\u0027d be happy to spin on this some more while it\u0027s fresh!","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"}],"test/unit/obj/test_expirer.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"2c9f74f7ed179695ddb7baae7d86aa9d5c7cd22d","unresolved":true,"context_lines":[{"line_number":104,"context_line":"        self.assertEqual("},{"line_number":105,"context_line":"            \u0027text/plain;some_foo\u003dbar;swift_expirer_bytes\u003d10\u0027,"},{"line_number":106,"context_line":"            expirer.embed_expirer_bytes_in_ctype("},{"line_number":107,"context_line":"                \u0027text/plain;some_foo\u003dbar\u0027, 10))"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def test_extract_expirer_bytes_from_ctype(self):"},{"line_number":110,"context_line":"        self.assertEqual(10, expirer.extract_expirer_bytes_from_ctype("}],"source_content_type":"text/x-python","patch_set":15,"id":"90817a74_1e5f92e2","line":107,"updated":"2024-05-03 06:51:29.000000000","message":"What happens if we have a content_type that already has swift_expirer_bytes? I mean it shouldn\u0027t happen but what if it does? Should we replace the existing key/value?\n\nI assume at the moment we just add another one","commit_id":"cb776885bc74111941e2cfad78cf6bb3d43db850"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2315c8e57dce047e4a1d5d8e8d9f93fd369b7e36","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        self.assertEqual("},{"line_number":105,"context_line":"            \u0027text/plain;some_foo\u003dbar;swift_expirer_bytes\u003d10\u0027,"},{"line_number":106,"context_line":"            expirer.embed_expirer_bytes_in_ctype("},{"line_number":107,"context_line":"                \u0027text/plain;some_foo\u003dbar\u0027, 10))"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def test_extract_expirer_bytes_from_ctype(self):"},{"line_number":110,"context_line":"        self.assertEqual(10, expirer.extract_expirer_bytes_from_ctype("}],"source_content_type":"text/x-python","patch_set":15,"id":"cbe6990c_26766274","line":107,"in_reply_to":"90817a74_1e5f92e2","updated":"2024-06-04 18:14:05.000000000","message":"that\u0027s correct, i added a new test and a comment.","commit_id":"cb776885bc74111941e2cfad78cf6bb3d43db850"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7a6f6fa2e2eb29bb082a7fb2cbe97f898ce92512","unresolved":true,"context_lines":[{"line_number":106,"context_line":"        self.assertEqual("},{"line_number":107,"context_line":"            \u0027text/plain;some_foo\u003dbar;swift_expirer_bytes\u003d10\u0027,"},{"line_number":108,"context_line":"            expirer.embed_expirer_bytes_in_ctype("},{"line_number":109,"context_line":"                \u0027text/plain;some_foo\u003dbar\u0027, {\u0027Content-Length\u0027: \u002710\u0027}))"},{"line_number":110,"context_line":"        # you could probably make a case it\u0027d be better to replace an existing"},{"line_number":111,"context_line":"        # value if the swift_expirer_bytes key already exists in the content"},{"line_number":112,"context_line":"        # type; but in the only case we use this function currently the content"}],"source_content_type":"text/x-python","patch_set":23,"id":"8ca63071_585bc945","line":109,"range":{"start_line":109,"start_character":62,"end_line":109,"end_character":66},"updated":"2024-06-07 17:40:21.000000000","message":"When it comes out of diskfile, is `Content-Length` an `int` or a `str`? Or does it depend upon the version of Swift that was used to write it down?","commit_id":"4e1c0e16a925bfaeb78cea9a34cf88feb7145caa"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f6a38f71a18b4cb52bbdac84f7f512ab1b231e34","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        self.assertEqual("},{"line_number":107,"context_line":"            \u0027text/plain;some_foo\u003dbar;swift_expirer_bytes\u003d10\u0027,"},{"line_number":108,"context_line":"            expirer.embed_expirer_bytes_in_ctype("},{"line_number":109,"context_line":"                \u0027text/plain;some_foo\u003dbar\u0027, {\u0027Content-Length\u0027: \u002710\u0027}))"},{"line_number":110,"context_line":"        # you could probably make a case it\u0027d be better to replace an existing"},{"line_number":111,"context_line":"        # value if the swift_expirer_bytes key already exists in the content"},{"line_number":112,"context_line":"        # type; but in the only case we use this function currently the content"}],"source_content_type":"text/x-python","patch_set":23,"id":"d71769fa_1756da77","line":109,"range":{"start_line":109,"start_character":62,"end_line":109,"end_character":66},"in_reply_to":"8ca63071_585bc945","updated":"2024-06-14 01:19:48.000000000","message":"it appears to be a string, like all the headers - I assume that\u0027s consistent across swift version:\n\n```\n\u003e\u003e\u003e read_metadata(\u0027/srv/node1/sdb5/objects-1/21/a80/5658e7d556e6724c0a83629c214f0a80/1717522817.71807#1#d.data\u0027)[\u0027Content-Length\u0027]\n\u00271311120\u0027\n```","commit_id":"4e1c0e16a925bfaeb78cea9a34cf88feb7145caa"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f7b7d3e6972644b39157afefac52d5e03e4c98fb","unresolved":true,"context_lines":[{"line_number":6988,"context_line":"                given_args[5], \u0027sda1\u0027, policy, {"},{"line_number":6989,"context_line":"                    \u0027x-content-type\u0027: \u0027text/plain;bytes\u003d4\u0027,"},{"line_number":6990,"context_line":"                    \u0027x-content-type-timestamp\u0027: timestamp2"},{"line_number":6991,"context_line":"                }])"},{"line_number":6992,"context_line":""},{"line_number":6993,"context_line":"    def test_GET_but_expired(self):"},{"line_number":6994,"context_line":"        # Start off with an existing object that will expire"}],"source_content_type":"text/x-python","patch_set":3,"id":"30da349a_270429b4","line":6991,"updated":"2024-03-14 13:27:00.000000000","message":"are we still giving DELETE the extra_headers?","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"ea4ae692cd44cbde8e1092e98ffca8673c16f816","unresolved":false,"context_lines":[{"line_number":6988,"context_line":"                given_args[5], \u0027sda1\u0027, policy, {"},{"line_number":6989,"context_line":"                    \u0027x-content-type\u0027: \u0027text/plain;bytes\u003d4\u0027,"},{"line_number":6990,"context_line":"                    \u0027x-content-type-timestamp\u0027: timestamp2"},{"line_number":6991,"context_line":"                }])"},{"line_number":6992,"context_line":""},{"line_number":6993,"context_line":"    def test_GET_but_expired(self):"},{"line_number":6994,"context_line":"        # Start off with an existing object that will expire"}],"source_content_type":"text/x-python","patch_set":3,"id":"a55ccc20_f94ca189","line":6991,"in_reply_to":"30da349a_270429b4","updated":"2024-03-18 22:58:33.000000000","message":"Nope - this looks like an error, fixed!","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f7b7d3e6972644b39157afefac52d5e03e4c98fb","unresolved":true,"context_lines":[{"line_number":7468,"context_line":"    def test_extra_headers_contain_object_bytes(self):"},{"line_number":7469,"context_line":"        given_args \u003d []"},{"line_number":7470,"context_line":""},{"line_number":7471,"context_line":"        def fake_delete_at_update(*args):"},{"line_number":7472,"context_line":"            given_args.extend(args)"},{"line_number":7473,"context_line":""},{"line_number":7474,"context_line":"        self.object_controller.delete_at_update \u003d fake_delete_at_update"}],"source_content_type":"text/x-python","patch_set":3,"id":"f3bc8b51_0ef678b4","line":7471,"updated":"2024-03-14 13:27:00.000000000","message":"since the real delete_at_update takes kwags, it might be reasonable for this signature to accept named arguments (in case for whatever reason maintainers choose to update the signature of delete_at_update again there may not be a good reason for this test to break)","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":false,"context_lines":[{"line_number":7468,"context_line":"    def test_extra_headers_contain_object_bytes(self):"},{"line_number":7469,"context_line":"        given_args \u003d []"},{"line_number":7470,"context_line":""},{"line_number":7471,"context_line":"        def fake_delete_at_update(*args):"},{"line_number":7472,"context_line":"            given_args.extend(args)"},{"line_number":7473,"context_line":""},{"line_number":7474,"context_line":"        self.object_controller.delete_at_update \u003d fake_delete_at_update"}],"source_content_type":"text/x-python","patch_set":3,"id":"95c16c9d_b38fff1b","line":7471,"in_reply_to":"e8277d24_8738df5e","updated":"2024-04-18 23:00:22.000000000","message":"Acknowledged","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"ea4ae692cd44cbde8e1092e98ffca8673c16f816","unresolved":true,"context_lines":[{"line_number":7468,"context_line":"    def test_extra_headers_contain_object_bytes(self):"},{"line_number":7469,"context_line":"        given_args \u003d []"},{"line_number":7470,"context_line":""},{"line_number":7471,"context_line":"        def fake_delete_at_update(*args):"},{"line_number":7472,"context_line":"            given_args.extend(args)"},{"line_number":7473,"context_line":""},{"line_number":7474,"context_line":"        self.object_controller.delete_at_update \u003d fake_delete_at_update"}],"source_content_type":"text/x-python","patch_set":3,"id":"e8277d24_8738df5e","line":7471,"in_reply_to":"f3bc8b51_0ef678b4","updated":"2024-03-18 22:58:33.000000000","message":"Reasonable - I added named arguments and supported the case when `extra_headers` is none. Hopefully my implementation makes sense.","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f7b7d3e6972644b39157afefac52d5e03e4c98fb","unresolved":true,"context_lines":[{"line_number":7492,"context_line":"            \u0027PUT\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7493,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0], {"},{"line_number":7494,"context_line":"                \u0027x-content-type\u0027: \u0027text/plain;bytes\u003d4096\u0027,"},{"line_number":7495,"context_line":"                \u0027x-content-type-timestamp\u0027: timestamp1"},{"line_number":7496,"context_line":"            }])"},{"line_number":7497,"context_line":""},{"line_number":7498,"context_line":"        while given_args:"}],"source_content_type":"text/x-python","patch_set":3,"id":"a69f44af_26a3ce0a","line":7495,"updated":"2024-03-14 13:27:00.000000000","message":"a PUT sends bytes","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"ea4ae692cd44cbde8e1092e98ffca8673c16f816","unresolved":false,"context_lines":[{"line_number":7492,"context_line":"            \u0027PUT\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7493,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0], {"},{"line_number":7494,"context_line":"                \u0027x-content-type\u0027: \u0027text/plain;bytes\u003d4096\u0027,"},{"line_number":7495,"context_line":"                \u0027x-content-type-timestamp\u0027: timestamp1"},{"line_number":7496,"context_line":"            }])"},{"line_number":7497,"context_line":""},{"line_number":7498,"context_line":"        while given_args:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a4a2304_00b72b75","line":7495,"in_reply_to":"a69f44af_26a3ce0a","updated":"2024-03-18 22:58:33.000000000","message":"Acknowledged","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f7b7d3e6972644b39157afefac52d5e03e4c98fb","unresolved":true,"context_lines":[{"line_number":7514,"context_line":"            \u0027PUT\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7515,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0], {"},{"line_number":7516,"context_line":"                \u0027x-content-type\u0027: \u0027text/plain;bytes\u003d5120\u0027,"},{"line_number":7517,"context_line":"                \u0027x-content-type-timestamp\u0027: timestamp2"},{"line_number":7518,"context_line":"            },"},{"line_number":7519,"context_line":"            \u0027DELETE\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7520,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0]"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a76f4e4_0e85a90c","line":7517,"updated":"2024-03-14 13:27:00.000000000","message":"another PUT sends the *current* bytes (even with same delete_at_timestamp)","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"ea4ae692cd44cbde8e1092e98ffca8673c16f816","unresolved":false,"context_lines":[{"line_number":7514,"context_line":"            \u0027PUT\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7515,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0], {"},{"line_number":7516,"context_line":"                \u0027x-content-type\u0027: \u0027text/plain;bytes\u003d5120\u0027,"},{"line_number":7517,"context_line":"                \u0027x-content-type-timestamp\u0027: timestamp2"},{"line_number":7518,"context_line":"            },"},{"line_number":7519,"context_line":"            \u0027DELETE\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7520,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0]"}],"source_content_type":"text/x-python","patch_set":3,"id":"f5d97cbd_b4638b57","line":7517,"in_reply_to":"9a76f4e4_0e85a90c","updated":"2024-03-18 22:58:33.000000000","message":"Acknowledged","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f7b7d3e6972644b39157afefac52d5e03e4c98fb","unresolved":true,"context_lines":[{"line_number":7536,"context_line":"            \u0027PUT\u0027, int(delete_at_timestamp2), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7537,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0], {"},{"line_number":7538,"context_line":"                \u0027x-content-type\u0027: \u0027text/plain;bytes\u003d5120\u0027,"},{"line_number":7539,"context_line":"                \u0027x-content-type-timestamp\u0027: timestamp2"},{"line_number":7540,"context_line":"            },"},{"line_number":7541,"context_line":"            \u0027DELETE\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7542,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0]])"}],"source_content_type":"text/x-python","patch_set":3,"id":"a33e5ab3_c83e26ac","line":7539,"updated":"2024-03-14 13:27:00.000000000","message":"and POST sends previous bytes with previous timestamp - very nice!","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"ea4ae692cd44cbde8e1092e98ffca8673c16f816","unresolved":false,"context_lines":[{"line_number":7536,"context_line":"            \u0027PUT\u0027, int(delete_at_timestamp2), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7537,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0], {"},{"line_number":7538,"context_line":"                \u0027x-content-type\u0027: \u0027text/plain;bytes\u003d5120\u0027,"},{"line_number":7539,"context_line":"                \u0027x-content-type-timestamp\u0027: timestamp2"},{"line_number":7540,"context_line":"            },"},{"line_number":7541,"context_line":"            \u0027DELETE\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7542,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0]])"}],"source_content_type":"text/x-python","patch_set":3,"id":"d6be059e_7e61a910","line":7539,"in_reply_to":"a33e5ab3_c83e26ac","updated":"2024-03-18 22:58:33.000000000","message":"Acknowledged","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f7b7d3e6972644b39157afefac52d5e03e4c98fb","unresolved":true,"context_lines":[{"line_number":7555,"context_line":"        self.assertEqual(resp.status_int, 204)"},{"line_number":7556,"context_line":"        self.assertEqual(given_args, ["},{"line_number":7557,"context_line":"            \u0027DELETE\u0027, int(delete_at_timestamp2), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7558,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0]])"},{"line_number":7559,"context_line":""},{"line_number":7560,"context_line":"    def test_DELETE_calls_delete_at(self):"},{"line_number":7561,"context_line":"        given_args \u003d []"}],"source_content_type":"text/x-python","patch_set":3,"id":"15116d70_040788e9","line":7558,"updated":"2024-03-14 13:27:00.000000000","message":"and DELETE does NOT send bytes - this whole test is perfect - KUDOS","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"ea4ae692cd44cbde8e1092e98ffca8673c16f816","unresolved":false,"context_lines":[{"line_number":7555,"context_line":"        self.assertEqual(resp.status_int, 204)"},{"line_number":7556,"context_line":"        self.assertEqual(given_args, ["},{"line_number":7557,"context_line":"            \u0027DELETE\u0027, int(delete_at_timestamp2), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7558,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0]])"},{"line_number":7559,"context_line":""},{"line_number":7560,"context_line":"    def test_DELETE_calls_delete_at(self):"},{"line_number":7561,"context_line":"        given_args \u003d []"}],"source_content_type":"text/x-python","patch_set":3,"id":"68409758_c136186f","line":7558,"in_reply_to":"15116d70_040788e9","updated":"2024-03-18 22:58:33.000000000","message":"Acknowledged","commit_id":"d910937495f86036824a6bf98ae4b3c259418d64"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":5642,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":5643,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: \u002712345\u0027,"},{"line_number":5644,"context_line":"                     \u0027Content-Type\u0027: \u0027application/burrito\u0027,"},{"line_number":5645,"context_line":"                     \u0027Content-Length\u0027: \u00270\u0027,"},{"line_number":5646,"context_line":"                     \u0027X-Backend-Storage-Policy-Index\u0027: int(policy),"},{"line_number":5647,"context_line":"                     \u0027X-Container-Partition\u0027: \u002720\u0027,"},{"line_number":5648,"context_line":"                     \u0027X-Container-Host\u0027: \u00271.2.3.4:5\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"5d3cf483_0da5bf1d","line":5645,"updated":"2024-04-18 23:00:22.000000000","message":"bytes\u003d0 and x-timestamp\u003d12345 - makes sense.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8ae85199200a2f9a6034796439a354acf11d4dba","unresolved":false,"context_lines":[{"line_number":5642,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":5643,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: \u002712345\u0027,"},{"line_number":5644,"context_line":"                     \u0027Content-Type\u0027: \u0027application/burrito\u0027,"},{"line_number":5645,"context_line":"                     \u0027Content-Length\u0027: \u00270\u0027,"},{"line_number":5646,"context_line":"                     \u0027X-Backend-Storage-Policy-Index\u0027: int(policy),"},{"line_number":5647,"context_line":"                     \u0027X-Container-Partition\u0027: \u002720\u0027,"},{"line_number":5648,"context_line":"                     \u0027X-Container-Host\u0027: \u00271.2.3.4:5\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"76f7010c_de108732","line":5645,"in_reply_to":"5d3cf483_0da5bf1d","updated":"2024-04-19 20:47:03.000000000","message":"Acknowledged","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":5712,"context_line":"             \u0027ssl\u0027: False,"},{"line_number":5713,"context_line":"             \u0027headers\u0027: HeaderKeyDict({"},{"line_number":5714,"context_line":"                 \u0027x-content-type\u0027: \u0027text/plain;swift_expirer_bytes\u003d0\u0027,"},{"line_number":5715,"context_line":"                 \u0027x-content-type-timestamp\u0027: utils.Timestamp(\u002712345\u0027).internal,"},{"line_number":5716,"context_line":"                 \u0027x-etag\u0027: \u0027d41d8cd98f00b204e9800998ecf8427e\u0027,"},{"line_number":5717,"context_line":"                 \u0027x-size\u0027: \u00270\u0027,"},{"line_number":5718,"context_line":"                 \u0027x-timestamp\u0027: utils.Timestamp(\u002712345\u0027).internal,"}],"source_content_type":"text/x-python","patch_set":7,"id":"f78fa517_2038ec62","line":5715,"updated":"2024-04-18 23:00:22.000000000","message":"so this existing test actually does a good job of demonstrating how the new extra_headers argument effects the headers sent to the container-server\n\nI suppose a more targeted unittest would demonstrate that the extra_headers interface is generic and callers can send whatever additional headers they want.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":false,"context_lines":[{"line_number":5712,"context_line":"             \u0027ssl\u0027: False,"},{"line_number":5713,"context_line":"             \u0027headers\u0027: HeaderKeyDict({"},{"line_number":5714,"context_line":"                 \u0027x-content-type\u0027: \u0027text/plain;swift_expirer_bytes\u003d0\u0027,"},{"line_number":5715,"context_line":"                 \u0027x-content-type-timestamp\u0027: utils.Timestamp(\u002712345\u0027).internal,"},{"line_number":5716,"context_line":"                 \u0027x-etag\u0027: \u0027d41d8cd98f00b204e9800998ecf8427e\u0027,"},{"line_number":5717,"context_line":"                 \u0027x-size\u0027: \u00270\u0027,"},{"line_number":5718,"context_line":"                 \u0027x-timestamp\u0027: utils.Timestamp(\u002712345\u0027).internal,"}],"source_content_type":"text/x-python","patch_set":7,"id":"520e0ebd_c96a7f0f","line":5715,"in_reply_to":"f78fa517_2038ec62","updated":"2024-04-23 00:05:29.000000000","message":"Acknowledged","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":6842,"context_line":"        given_args \u003d []"},{"line_number":6843,"context_line":""},{"line_number":6844,"context_line":"        def fake_delete_at_update(*args):"},{"line_number":6845,"context_line":"            given_args.extend(args)"},{"line_number":6846,"context_line":""},{"line_number":6847,"context_line":"        self.object_controller.delete_at_update \u003d fake_delete_at_update"},{"line_number":6848,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ca0e05ef_1026b391","line":6845,"updated":"2024-04-18 23:00:22.000000000","message":"oh here\u0027s fake_delete_at_update taking on `*args` again; I guess we don\u0027t ever actually call this method with a named argument: i.e. `extra_headers\u003dextra_headers`","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":false,"context_lines":[{"line_number":6842,"context_line":"        given_args \u003d []"},{"line_number":6843,"context_line":""},{"line_number":6844,"context_line":"        def fake_delete_at_update(*args):"},{"line_number":6845,"context_line":"            given_args.extend(args)"},{"line_number":6846,"context_line":""},{"line_number":6847,"context_line":"        self.object_controller.delete_at_update \u003d fake_delete_at_update"},{"line_number":6848,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"78687520_31fce833","line":6845,"in_reply_to":"ca0e05ef_1026b391","updated":"2024-04-23 00:05:29.000000000","message":"Acknowledged","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":6846,"context_line":""},{"line_number":6847,"context_line":"        self.object_controller.delete_at_update \u003d fake_delete_at_update"},{"line_number":6848,"context_line":""},{"line_number":6849,"context_line":"        timestamp0 \u003d normalize_timestamp(time())"},{"line_number":6850,"context_line":"        req \u003d Request.blank("},{"line_number":6851,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":6852,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: timestamp0,"}],"source_content_type":"text/x-python","patch_set":7,"id":"fcb48ee0_6caac4e7","line":6849,"updated":"2024-04-18 23:00:22.000000000","message":"possibly reasonable to replace with `next(self.ts).normal` for the most modern pattern for stubbing timestamps; but just lifting what already eixsts is also typically fine.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":false,"context_lines":[{"line_number":6846,"context_line":""},{"line_number":6847,"context_line":"        self.object_controller.delete_at_update \u003d fake_delete_at_update"},{"line_number":6848,"context_line":""},{"line_number":6849,"context_line":"        timestamp0 \u003d normalize_timestamp(time())"},{"line_number":6850,"context_line":"        req \u003d Request.blank("},{"line_number":6851,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":6852,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: timestamp0,"}],"source_content_type":"text/x-python","patch_set":7,"id":"527c500c_354a6ede","line":6849,"in_reply_to":"c5e91189_6c5431b7","updated":"2024-04-22 16:47:38.000000000","message":"I guess not completely - but again this is an existing test","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8ae85199200a2f9a6034796439a354acf11d4dba","unresolved":true,"context_lines":[{"line_number":6846,"context_line":""},{"line_number":6847,"context_line":"        self.object_controller.delete_at_update \u003d fake_delete_at_update"},{"line_number":6848,"context_line":""},{"line_number":6849,"context_line":"        timestamp0 \u003d normalize_timestamp(time())"},{"line_number":6850,"context_line":"        req \u003d Request.blank("},{"line_number":6851,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":6852,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: timestamp0,"}],"source_content_type":"text/x-python","patch_set":7,"id":"c5e91189_6c5431b7","line":6849,"in_reply_to":"fcb48ee0_6caac4e7","updated":"2024-04-19 20:47:03.000000000","message":"Looks like you\u0027ve made this change on the latest patch, thanks!","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":6885,"context_line":"        self.assertEqual("},{"line_number":6886,"context_line":"            given_args, ["},{"line_number":6887,"context_line":"                \u0027PUT\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":6888,"context_line":"                given_args[5], \u0027sda1\u0027, policy, {"},{"line_number":6889,"context_line":"                    \u0027x-content-type\u0027: \u0027text/plain;swift_expirer_bytes\u003d4\u0027,"},{"line_number":6890,"context_line":"                    \u0027x-content-type-timestamp\u0027: timestamp0"},{"line_number":6891,"context_line":"                }])"}],"source_content_type":"text/x-python","patch_set":7,"id":"9e475163_986be3d4","line":6888,"updated":"2024-04-18 23:00:22.000000000","message":"so `given_args[5]` is the request object - which is not *strictly* equal to the request object we create on L6876 since the obj.server creates it\u0027s own requst object.\n\nI wonder if a mock.ANY would be more clear followed by an assert on the equivilancy of the request\u0027s environ?\n\n```\n(Pdb) req.environ \u003d\u003d given_args[5].environ\nTrue\n```","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":false,"context_lines":[{"line_number":6885,"context_line":"        self.assertEqual("},{"line_number":6886,"context_line":"            given_args, ["},{"line_number":6887,"context_line":"                \u0027PUT\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":6888,"context_line":"                given_args[5], \u0027sda1\u0027, policy, {"},{"line_number":6889,"context_line":"                    \u0027x-content-type\u0027: \u0027text/plain;swift_expirer_bytes\u003d4\u0027,"},{"line_number":6890,"context_line":"                    \u0027x-content-type-timestamp\u0027: timestamp0"},{"line_number":6891,"context_line":"                }])"}],"source_content_type":"text/x-python","patch_set":7,"id":"aeee13b2_4c5d1699","line":6888,"in_reply_to":"9e475163_986be3d4","updated":"2024-04-22 16:47:38.000000000","message":"existing test, so keeping given_args[5] and only adding new extra_headers arg expectations is totaly fine... \n\nbut the new SameReqEnv would be a stronger assertion while mock.ANY would be more idiomatic - the existing test code here is just weird.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":7469,"context_line":"                                  request, objdevice, policy,"},{"line_number":7470,"context_line":"                                  extra_headers\u003dNone):"},{"line_number":7471,"context_line":"            given_args.extend([op, delete_at, account, container, obj,"},{"line_number":7472,"context_line":"                               request, objdevice, policy, extra_headers])"},{"line_number":7473,"context_line":""},{"line_number":7474,"context_line":"        self.object_controller.delete_at_update \u003d fake_delete_at_update"},{"line_number":7475,"context_line":"        timestamp1 \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":7,"id":"aa02e21e_2cf92177","line":7472,"updated":"2024-04-18 23:00:22.000000000","message":"Given the existing patterns I wonder if `*args` would have technically worked here as well!?\n\nI think ...\n\n```\ndef fake_delete_at_update(*args, **kwargs):\n    given_args.append((args, kwargs))\n```\n\nwould have also potentially been reasonable or slightly less brittle; perhaps this is also fine; but I\u0027m realizing `given_args.extend` tends to mush multiple calls together.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":false,"context_lines":[{"line_number":7469,"context_line":"                                  request, objdevice, policy,"},{"line_number":7470,"context_line":"                                  extra_headers\u003dNone):"},{"line_number":7471,"context_line":"            given_args.extend([op, delete_at, account, container, obj,"},{"line_number":7472,"context_line":"                               request, objdevice, policy, extra_headers])"},{"line_number":7473,"context_line":""},{"line_number":7474,"context_line":"        self.object_controller.delete_at_update \u003d fake_delete_at_update"},{"line_number":7475,"context_line":"        timestamp1 \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":7,"id":"b5c4d698_c1068f8e","line":7472,"in_reply_to":"aa02e21e_2cf92177","updated":"2024-04-22 16:47:38.000000000","message":"Done","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":7471,"context_line":"            given_args.extend([op, delete_at, account, container, obj,"},{"line_number":7472,"context_line":"                               request, objdevice, policy, extra_headers])"},{"line_number":7473,"context_line":""},{"line_number":7474,"context_line":"        self.object_controller.delete_at_update \u003d fake_delete_at_update"},{"line_number":7475,"context_line":"        timestamp1 \u003d normalize_timestamp(time())"},{"line_number":7476,"context_line":"        delete_at_timestamp1 \u003d int(time() + 1000)"},{"line_number":7477,"context_line":"        delete_at_container1 \u003d str("}],"source_content_type":"text/x-python","patch_set":7,"id":"bacc18d9_40ebafba","line":7474,"updated":"2024-04-18 23:00:22.000000000","message":"I think the most modern/idomatic way to write this is just a mock.patch.object","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":false,"context_lines":[{"line_number":7471,"context_line":"            given_args.extend([op, delete_at, account, container, obj,"},{"line_number":7472,"context_line":"                               request, objdevice, policy, extra_headers])"},{"line_number":7473,"context_line":""},{"line_number":7474,"context_line":"        self.object_controller.delete_at_update \u003d fake_delete_at_update"},{"line_number":7475,"context_line":"        timestamp1 \u003d normalize_timestamp(time())"},{"line_number":7476,"context_line":"        delete_at_timestamp1 \u003d int(time() + 1000)"},{"line_number":7477,"context_line":"        delete_at_container1 \u003d str("}],"source_content_type":"text/x-python","patch_set":7,"id":"19c781cf_3a369d55","line":7474,"in_reply_to":"bacc18d9_40ebafba","updated":"2024-04-22 16:47:38.000000000","message":"Done","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2492da6baa2a6b4816c2483564731cfc4034159b","unresolved":true,"context_lines":[{"line_number":7496,"context_line":"            }])"},{"line_number":7497,"context_line":""},{"line_number":7498,"context_line":"        while given_args:"},{"line_number":7499,"context_line":"            given_args.pop()"},{"line_number":7500,"context_line":""},{"line_number":7501,"context_line":"        sleep(.00001)"},{"line_number":7502,"context_line":"        timestamp2 \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":7,"id":"a329c3b4_fbdf941d","line":7499,"updated":"2024-04-18 23:00:22.000000000","message":"this is such a funny way to spell `del given_args[:]` or on modern python `given_args.clear()`\n\ndon\u0027t feel TOO obligated to carry forward dumb patterns just for consistency; especially in tests.","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8ae85199200a2f9a6034796439a354acf11d4dba","unresolved":true,"context_lines":[{"line_number":7496,"context_line":"            }])"},{"line_number":7497,"context_line":""},{"line_number":7498,"context_line":"        while given_args:"},{"line_number":7499,"context_line":"            given_args.pop()"},{"line_number":7500,"context_line":""},{"line_number":7501,"context_line":"        sleep(.00001)"},{"line_number":7502,"context_line":"        timestamp2 \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":7,"id":"c3d4e920_0519398b","line":7499,"in_reply_to":"a329c3b4_fbdf941d","updated":"2024-04-19 20:47:03.000000000","message":"Looks like you\u0027ve changed this in the new patch as well","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":false,"context_lines":[{"line_number":7496,"context_line":"            }])"},{"line_number":7497,"context_line":""},{"line_number":7498,"context_line":"        while given_args:"},{"line_number":7499,"context_line":"            given_args.pop()"},{"line_number":7500,"context_line":""},{"line_number":7501,"context_line":"        sleep(.00001)"},{"line_number":7502,"context_line":"        timestamp2 \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":7,"id":"cfaea75b_e977b77f","line":7499,"in_reply_to":"c3d4e920_0519398b","updated":"2024-04-22 16:47:38.000000000","message":"Done","commit_id":"12ddcf2aaad10df71e13838794fbf0bb5587b1d6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":6846,"context_line":""},{"line_number":6847,"context_line":"        req \u003d Request.blank("},{"line_number":6848,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":6849,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(time()),"},{"line_number":6850,"context_line":"                     \u0027Content-Length\u0027: \u00274\u0027,"},{"line_number":6851,"context_line":"                     \u0027Content-Type\u0027: \u0027application/octet-stream\u0027,"},{"line_number":6852,"context_line":"                     \u0027X-Backend-Storage-Policy-Index\u0027: int(policy),"}],"source_content_type":"text/x-python","patch_set":9,"id":"b9f3e795_3de6a7a7","side":"PARENT","line":6849,"updated":"2024-04-22 16:47:38.000000000","message":"keeping the existing spelling of creating stub timestamps used in the test is the best way to demonstrate it\u0027s working consistently","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":false,"context_lines":[{"line_number":6846,"context_line":""},{"line_number":6847,"context_line":"        req \u003d Request.blank("},{"line_number":6848,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":6849,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(time()),"},{"line_number":6850,"context_line":"                     \u0027Content-Length\u0027: \u00274\u0027,"},{"line_number":6851,"context_line":"                     \u0027Content-Type\u0027: \u0027application/octet-stream\u0027,"},{"line_number":6852,"context_line":"                     \u0027X-Backend-Storage-Policy-Index\u0027: int(policy),"}],"source_content_type":"text/x-python","patch_set":9,"id":"b9e6b689_e60d7f6c","side":"PARENT","line":6849,"in_reply_to":"b9f3e795_3de6a7a7","updated":"2024-04-23 00:05:29.000000000","message":"Acknowledged","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":6566,"context_line":"            with mock.patch.object(self.object_controller, \u0027async_update\u0027,"},{"line_number":6567,"context_line":"                                   fake_async_update):"},{"line_number":6568,"context_line":"                self.object_controller.delete_at_update("},{"line_number":6569,"context_line":"                    \u0027DELETE\u0027, 2, \u0027a\u0027, \u0027c\u0027, \u0027o\u0027, req, \u0027sda1\u0027, policy)"},{"line_number":6570,"context_line":"            self.assertEqual(expected_args, given_args)"},{"line_number":6571,"context_line":""},{"line_number":6572,"context_line":"        for method in (\u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027):"}],"source_content_type":"text/x-python","patch_set":9,"id":"fcbe95ae_6edc7ca4","line":6569,"updated":"2024-04-22 16:47:38.000000000","message":"nit pre-existing:\n\nthis is *such* a weird test - does the req.method have *anything* to do with the behavior in this call?\n\nThe use of `x-timestamp: 1` to cleanup an `orig_delete_at @ 2` also kind of annoys me.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":false,"context_lines":[{"line_number":6566,"context_line":"            with mock.patch.object(self.object_controller, \u0027async_update\u0027,"},{"line_number":6567,"context_line":"                                   fake_async_update):"},{"line_number":6568,"context_line":"                self.object_controller.delete_at_update("},{"line_number":6569,"context_line":"                    \u0027DELETE\u0027, 2, \u0027a\u0027, \u0027c\u0027, \u0027o\u0027, req, \u0027sda1\u0027, policy)"},{"line_number":6570,"context_line":"            self.assertEqual(expected_args, given_args)"},{"line_number":6571,"context_line":""},{"line_number":6572,"context_line":"        for method in (\u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027):"}],"source_content_type":"text/x-python","patch_set":9,"id":"975bb8b7_5a3579e8","line":6569,"in_reply_to":"c6cd618f_96b351e3","updated":"2024-04-23 00:05:29.000000000","message":"\u003e This is reasonable, though -- if the x-timestamp were after orig_delete_at, you would\u0027ve needed x-backend-open-expired.\n\nthat\u0027s a good point!  I guess i was getting my x-timestamps and my x-delete-at timestamps mixed up!","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b3467a47cb4478eccdeca3945b64923a8b5a2f17","unresolved":true,"context_lines":[{"line_number":6566,"context_line":"            with mock.patch.object(self.object_controller, \u0027async_update\u0027,"},{"line_number":6567,"context_line":"                                   fake_async_update):"},{"line_number":6568,"context_line":"                self.object_controller.delete_at_update("},{"line_number":6569,"context_line":"                    \u0027DELETE\u0027, 2, \u0027a\u0027, \u0027c\u0027, \u0027o\u0027, req, \u0027sda1\u0027, policy)"},{"line_number":6570,"context_line":"            self.assertEqual(expected_args, given_args)"},{"line_number":6571,"context_line":""},{"line_number":6572,"context_line":"        for method in (\u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027):"}],"source_content_type":"text/x-python","patch_set":9,"id":"c6cd618f_96b351e3","line":6569,"in_reply_to":"fcbe95ae_6edc7ca4","updated":"2024-04-22 21:53:04.000000000","message":"\u003e does the req.method have *anything* to do with the behavior in this call?\n\nNot really; if the new request included `x-delete-at` it would, though. (`PUT` and `POST` would enqueue new entries, but not `DELETE`.)\n\n\u003e The use of `x-timestamp: 1` to cleanup an `orig_delete_at @ 2` also kind of annoys me.\n\nThis is reasonable, though -- if the `x-timestamp` were *after* `orig_delete_at`, you would\u0027ve needed `x-backend-open-expired`.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":6994,"context_line":"                    \u0027x-content-type-timestamp\u0027: timestamp2"},{"line_number":6995,"context_line":"                },"},{"line_number":6996,"context_line":"                \u0027DELETE\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":6997,"context_line":"                given_args[5], \u0027sda1\u0027, policy])"},{"line_number":6998,"context_line":""},{"line_number":6999,"context_line":"    def test_GET_but_expired(self):"},{"line_number":7000,"context_line":"        # Start off with an existing object that will expire"}],"source_content_type":"text/x-python","patch_set":9,"id":"2a22050e_76d1c586","line":6997,"updated":"2024-04-22 16:47:38.000000000","message":"this was the test I was looking for!  two puts with different x-delete-at; second PUT issues a PUT and a DELETE\n\nit\u0027s worth noting in reality the DELETE actually goes to async_pending; but this test stubs out one level higher than that.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a02602be18b5a5219f3a573df606d0b9e96227e8","unresolved":false,"context_lines":[{"line_number":6994,"context_line":"                    \u0027x-content-type-timestamp\u0027: timestamp2"},{"line_number":6995,"context_line":"                },"},{"line_number":6996,"context_line":"                \u0027DELETE\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":6997,"context_line":"                given_args[5], \u0027sda1\u0027, policy])"},{"line_number":6998,"context_line":""},{"line_number":6999,"context_line":"    def test_GET_but_expired(self):"},{"line_number":7000,"context_line":"        # Start off with an existing object that will expire"}],"source_content_type":"text/x-python","patch_set":9,"id":"aeff111c_2ed5148c","line":6997,"in_reply_to":"2a22050e_76d1c586","updated":"2024-04-22 20:50:26.000000000","message":"Acknowledged","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":7516,"context_line":"                \u0027x-content-type\u0027: \u0027text/plain;swift_expirer_bytes\u003d5120\u0027,"},{"line_number":7517,"context_line":"                \u0027x-content-type-timestamp\u0027: timestamp2"},{"line_number":7518,"context_line":"            }"},{"line_number":7519,"context_line":"        )])"},{"line_number":7520,"context_line":""},{"line_number":7521,"context_line":"        timestamp3 \u003d next(self.ts).normal"},{"line_number":7522,"context_line":"        delete_at_timestamp2 \u003d str(int(next(self.ts)) + 2000)"}],"source_content_type":"text/x-python","patch_set":9,"id":"c5717e3b_b1f1dc64","line":7519,"updated":"2024-04-22 16:47:38.000000000","message":"this probably another scenario where we PUT with a different x-delete-at and have to cleanup the old queue entry; maybe that\u0027s covered by another test.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":false,"context_lines":[{"line_number":7516,"context_line":"                \u0027x-content-type\u0027: \u0027text/plain;swift_expirer_bytes\u003d5120\u0027,"},{"line_number":7517,"context_line":"                \u0027x-content-type-timestamp\u0027: timestamp2"},{"line_number":7518,"context_line":"            }"},{"line_number":7519,"context_line":"        )])"},{"line_number":7520,"context_line":""},{"line_number":7521,"context_line":"        timestamp3 \u003d next(self.ts).normal"},{"line_number":7522,"context_line":"        delete_at_timestamp2 \u003d str(int(next(self.ts)) + 2000)"}],"source_content_type":"text/x-python","patch_set":9,"id":"b6c91ab9_f275a874","line":7519,"in_reply_to":"c5717e3b_b1f1dc64","updated":"2024-04-23 00:05:29.000000000","message":"Acknowledged","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":7552,"context_line":"        self.assertEqual(fake_delete_at_update.call_args_list, [mock.call("},{"line_number":7553,"context_line":"            \u0027DELETE\u0027, int(delete_at_timestamp2), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7554,"context_line":"            SameReqEnv(req), \u0027sda1\u0027, POLICIES[0]"},{"line_number":7555,"context_line":"        )])"},{"line_number":7556,"context_line":""},{"line_number":7557,"context_line":"    def test_delete_at_overwrite_same_expiration_different_bytes(self):"},{"line_number":7558,"context_line":"        container_updates \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"8c301738_eb768154","line":7555,"updated":"2024-04-22 16:47:38.000000000","message":"the thing I don\u0027t love about stubbing our own delete_at_update method is I don\u0027t get to see what\u0027s actually sent to the container-server\n\nThis request in particular - it\u0027s fine that we DELETE delete_at_timestamp2 (we\u0027re cleaning up an old queue entry) but I\u0027d love to know for sure that we use timestamp4 as the x-timestamp for that container-server update and I have to assume it pulls it out of the request.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":false,"context_lines":[{"line_number":7552,"context_line":"        self.assertEqual(fake_delete_at_update.call_args_list, [mock.call("},{"line_number":7553,"context_line":"            \u0027DELETE\u0027, int(delete_at_timestamp2), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7554,"context_line":"            SameReqEnv(req), \u0027sda1\u0027, POLICIES[0]"},{"line_number":7555,"context_line":"        )])"},{"line_number":7556,"context_line":""},{"line_number":7557,"context_line":"    def test_delete_at_overwrite_same_expiration_different_bytes(self):"},{"line_number":7558,"context_line":"        container_updates \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"a59e58a3_78385a89","line":7555,"in_reply_to":"8c301738_eb768154","updated":"2024-04-23 00:05:29.000000000","message":"Acknowledged","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":7637,"context_line":"                \u0027X-Content-Type-Timestamp\u0027: put2_ts.normal,"},{"line_number":7638,"context_line":"                \u0027User-Agent\u0027: \u0027object-server %s\u0027 % os.getpid(),"},{"line_number":7639,"context_line":"            }"},{"line_number":7640,"context_line":"        )], container_updates)"},{"line_number":7641,"context_line":""},{"line_number":7642,"context_line":"        async_pendings \u003d []"},{"line_number":7643,"context_line":"        async_pending_dir \u003d os.path.join("}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0ee0d9_fcbf22f7","line":7640,"updated":"2024-04-22 16:47:38.000000000","message":"ok, THIS test doesn\u0027t do two PUTs with different x-delete-at\n\nBut I like that I get to see the x-timestamp of the queue PUT requests.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":false,"context_lines":[{"line_number":7637,"context_line":"                \u0027X-Content-Type-Timestamp\u0027: put2_ts.normal,"},{"line_number":7638,"context_line":"                \u0027User-Agent\u0027: \u0027object-server %s\u0027 % os.getpid(),"},{"line_number":7639,"context_line":"            }"},{"line_number":7640,"context_line":"        )], container_updates)"},{"line_number":7641,"context_line":""},{"line_number":7642,"context_line":"        async_pendings \u003d []"},{"line_number":7643,"context_line":"        async_pending_dir \u003d os.path.join("}],"source_content_type":"text/x-python","patch_set":9,"id":"3ae25d0c_17ea7637","line":7640,"in_reply_to":"9a0ee0d9_fcbf22f7","updated":"2024-04-23 00:05:29.000000000","message":"Acknowledged","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":7646,"context_line":"            for filename in filenames:"},{"line_number":7647,"context_line":"                async_pendings.append(os.path.join(dirpath, filename))"},{"line_number":7648,"context_line":""},{"line_number":7649,"context_line":"        self.assertEqual(len(async_pendings), 0)"},{"line_number":7650,"context_line":""},{"line_number":7651,"context_line":"    def test_delete_at_POST_update_same_expiration(self):"},{"line_number":7652,"context_line":"        container_updates \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"30f3c0ea_b0093ccb","line":7649,"updated":"2024-04-22 16:47:38.000000000","message":"sweet no async pendings in the default PUT overwrite case - love it.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a02602be18b5a5219f3a573df606d0b9e96227e8","unresolved":false,"context_lines":[{"line_number":7646,"context_line":"            for filename in filenames:"},{"line_number":7647,"context_line":"                async_pendings.append(os.path.join(dirpath, filename))"},{"line_number":7648,"context_line":""},{"line_number":7649,"context_line":"        self.assertEqual(len(async_pendings), 0)"},{"line_number":7650,"context_line":""},{"line_number":7651,"context_line":"    def test_delete_at_POST_update_same_expiration(self):"},{"line_number":7652,"context_line":"        container_updates \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"eaabf214_b41e3878","line":7649,"in_reply_to":"30f3c0ea_b0093ccb","updated":"2024-04-22 20:50:26.000000000","message":"Acknowledged","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":7707,"context_line":"        # reset container updates"},{"line_number":7708,"context_line":"        container_updates \u003d []"},{"line_number":7709,"context_line":""},{"line_number":7710,"context_line":"        delete_at \u003d int(next(self.ts)) + 30"},{"line_number":7711,"context_line":"        delete_at_container \u003d utils.get_expirer_container("},{"line_number":7712,"context_line":"            delete_at, 86400, \u0027a\u0027, \u0027c\u0027, \u0027o\u0027)"},{"line_number":7713,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"6ea30460_30f3a9f6","line":7710,"updated":"2024-04-22 16:47:38.000000000","message":"i know that next(self.ts) is guaranteed to make this different from put_delete_at but reusing the 30s offset obfuscates it a little bit, maybe + 100 or\n\n    self.assertNotEqual(delete_at, put_delete_at)  # sanity","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a02602be18b5a5219f3a573df606d0b9e96227e8","unresolved":false,"context_lines":[{"line_number":7707,"context_line":"        # reset container updates"},{"line_number":7708,"context_line":"        container_updates \u003d []"},{"line_number":7709,"context_line":""},{"line_number":7710,"context_line":"        delete_at \u003d int(next(self.ts)) + 30"},{"line_number":7711,"context_line":"        delete_at_container \u003d utils.get_expirer_container("},{"line_number":7712,"context_line":"            delete_at, 86400, \u0027a\u0027, \u0027c\u0027, \u0027o\u0027)"},{"line_number":7713,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"82acc818_25d9db23","line":7710,"in_reply_to":"6ea30460_30f3a9f6","updated":"2024-04-22 20:50:26.000000000","message":"Acknowledged","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":7751,"context_line":"                delete_at_container, delete_at"},{"line_number":7752,"context_line":"            ), {"},{"line_number":7753,"context_line":"                \u0027X-Backend-Storage-Policy-Index\u0027: \u00270\u0027,"},{"line_number":7754,"context_line":"                # only the first POST generates an update?"},{"line_number":7755,"context_line":"                \u0027X-Timestamp\u0027: post1_ts.normal,"},{"line_number":7756,"context_line":"                \u0027X-Trans-Id\u0027: \u0027txn2\u0027,"},{"line_number":7757,"context_line":"                \u0027Referer\u0027: \u0027POST http://localhost/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"01f20b79_2f190d18","line":7754,"updated":"2024-04-22 16:47:38.000000000","message":"yeah, i\u0027m still unsure about this...","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a02602be18b5a5219f3a573df606d0b9e96227e8","unresolved":true,"context_lines":[{"line_number":7751,"context_line":"                delete_at_container, delete_at"},{"line_number":7752,"context_line":"            ), {"},{"line_number":7753,"context_line":"                \u0027X-Backend-Storage-Policy-Index\u0027: \u00270\u0027,"},{"line_number":7754,"context_line":"                # only the first POST generates an update?"},{"line_number":7755,"context_line":"                \u0027X-Timestamp\u0027: post1_ts.normal,"},{"line_number":7756,"context_line":"                \u0027X-Trans-Id\u0027: \u0027txn2\u0027,"},{"line_number":7757,"context_line":"                \u0027Referer\u0027: \u0027POST http://localhost/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"da8a1ce9_a9448099","line":7754,"in_reply_to":"01f20b79_2f190d18","updated":"2024-04-22 20:50:26.000000000","message":"You\u0027re right, this shouldn\u0027t be expected since in two POSTS, the first should issue a PUT + DELETE and the second should just be a PUT. Hopefully this is clarified in the newer patch I\u0027m pushing.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"09582a38009ef84935eb32f17d14c36a4a5bae7d","unresolved":false,"context_lines":[{"line_number":7751,"context_line":"                delete_at_container, delete_at"},{"line_number":7752,"context_line":"            ), {"},{"line_number":7753,"context_line":"                \u0027X-Backend-Storage-Policy-Index\u0027: \u00270\u0027,"},{"line_number":7754,"context_line":"                # only the first POST generates an update?"},{"line_number":7755,"context_line":"                \u0027X-Timestamp\u0027: post1_ts.normal,"},{"line_number":7756,"context_line":"                \u0027X-Trans-Id\u0027: \u0027txn2\u0027,"},{"line_number":7757,"context_line":"                \u0027Referer\u0027: \u0027POST http://localhost/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5d9acbdd_1991a7af","line":7754,"in_reply_to":"098a7b1f_47c9082f","updated":"2024-04-26 14:53:16.000000000","message":"Done","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":true,"context_lines":[{"line_number":7751,"context_line":"                delete_at_container, delete_at"},{"line_number":7752,"context_line":"            ), {"},{"line_number":7753,"context_line":"                \u0027X-Backend-Storage-Policy-Index\u0027: \u00270\u0027,"},{"line_number":7754,"context_line":"                # only the first POST generates an update?"},{"line_number":7755,"context_line":"                \u0027X-Timestamp\u0027: post1_ts.normal,"},{"line_number":7756,"context_line":"                \u0027X-Trans-Id\u0027: \u0027txn2\u0027,"},{"line_number":7757,"context_line":"                \u0027Referer\u0027: \u0027POST http://localhost/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"098a7b1f_47c9082f","line":7754,"in_reply_to":"da8a1ce9_a9448099","updated":"2024-04-23 00:05:29.000000000","message":"I think the mocked_http_conn helper can be a little confusing - it\u0027s *args is a list of response status codes.  I think L7602 for the PUT overwrite case shows how to make two requests with two expected container updates.","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"596e4deb55475d50b5447b1cf1e11bf430cb419d","unresolved":true,"context_lines":[{"line_number":7791,"context_line":"                \u0027Referer\u0027: \u0027POST http://localhost/sda1/p/a/c/o\u0027,"},{"line_number":7792,"context_line":"                \u0027User-Agent\u0027: \u0027object-server %s\u0027 % os.getpid(),"},{"line_number":7793,"context_line":"            },"},{"line_number":7794,"context_line":"        }], async_updates)"},{"line_number":7795,"context_line":""},{"line_number":7796,"context_line":"    def test_DELETE_calls_delete_at(self):"},{"line_number":7797,"context_line":"        given_args \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"74c4da30_0f35abc6","line":7794,"updated":"2024-04-22 16:47:38.000000000","message":"ok, so a POST to update x-delete-at will cleanup the existing old_delete_at record with an async pending because the incoming x-delete-at container headers were for the *current* x-delete-at target and the proxy can\u0027t possibly know where the DELETE old_delete_at update should go.\n\nI think a test that demonstrates this clean-up behavior on two PUTs with different x-delete-at would be nice; maybe it\u0027s covered by an existing test...","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"09582a38009ef84935eb32f17d14c36a4a5bae7d","unresolved":false,"context_lines":[{"line_number":7791,"context_line":"                \u0027Referer\u0027: \u0027POST http://localhost/sda1/p/a/c/o\u0027,"},{"line_number":7792,"context_line":"                \u0027User-Agent\u0027: \u0027object-server %s\u0027 % os.getpid(),"},{"line_number":7793,"context_line":"            },"},{"line_number":7794,"context_line":"        }], async_updates)"},{"line_number":7795,"context_line":""},{"line_number":7796,"context_line":"    def test_DELETE_calls_delete_at(self):"},{"line_number":7797,"context_line":"        given_args \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"58c86705_43743e39","line":7794,"in_reply_to":"0745e45b_ee26c5c7","updated":"2024-04-26 14:53:16.000000000","message":"Done","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":true,"context_lines":[{"line_number":7791,"context_line":"                \u0027Referer\u0027: \u0027POST http://localhost/sda1/p/a/c/o\u0027,"},{"line_number":7792,"context_line":"                \u0027User-Agent\u0027: \u0027object-server %s\u0027 % os.getpid(),"},{"line_number":7793,"context_line":"            },"},{"line_number":7794,"context_line":"        }], async_updates)"},{"line_number":7795,"context_line":""},{"line_number":7796,"context_line":"    def test_DELETE_calls_delete_at(self):"},{"line_number":7797,"context_line":"        given_args \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"0745e45b_ee26c5c7","line":7794,"in_reply_to":"74c4da30_0f35abc6","updated":"2024-04-23 00:05:29.000000000","message":"I think the earlier comment was from an earlier patch speaking specifically about the DELETE async pending.  The only reason the second POST has a PUT here in async\u0027s is because we didn\u0027t make the test under the mocked_http_conn context manager.\n\nThe second POST *is* making a PUT request with the new post2_ts x-timestamp; so that\u0027s good!","commit_id":"3d9e14aa7b89b307eede9523ddc29951258fd1d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f27888ad6bf63a6c162c60eebd640dbf7d09bf8","unresolved":true,"context_lines":[{"line_number":7743,"context_line":"            resp1 \u003d req1.get_response(self.object_controller)"},{"line_number":7744,"context_line":"        self.assertEqual(resp1.status_int, 202)"},{"line_number":7745,"context_line":""},{"line_number":7746,"context_line":"        # this request does not trigger a expirer queue update"},{"line_number":7747,"context_line":"        resp2 \u003d req2.get_response(self.object_controller)"},{"line_number":7748,"context_line":"        self.assertEqual(resp2.status_int, 202)"},{"line_number":7749,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"70c1cdd7_31564809","line":7746,"updated":"2024-04-23 00:05:29.000000000","message":"that\u0027s not right tho, it should... maybe the problem is we\u0027re just not capturing it?  I\u0027m guessing it hits a timeout trying to connect to our stub container server and ends up writing it to an async pending...","commit_id":"2f4e6bc410e93e7911d994f72af5a53139de3fe7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"09582a38009ef84935eb32f17d14c36a4a5bae7d","unresolved":false,"context_lines":[{"line_number":7743,"context_line":"            resp1 \u003d req1.get_response(self.object_controller)"},{"line_number":7744,"context_line":"        self.assertEqual(resp1.status_int, 202)"},{"line_number":7745,"context_line":""},{"line_number":7746,"context_line":"        # this request does not trigger a expirer queue update"},{"line_number":7747,"context_line":"        resp2 \u003d req2.get_response(self.object_controller)"},{"line_number":7748,"context_line":"        self.assertEqual(resp2.status_int, 202)"},{"line_number":7749,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"c7a18c43_2c0c0afd","line":7746,"in_reply_to":"70c1cdd7_31564809","updated":"2024-04-26 14:53:16.000000000","message":"Done","commit_id":"2f4e6bc410e93e7911d994f72af5a53139de3fe7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90ffcdb2299c6402bfc30708fa034e24c3e67451","unresolved":true,"context_lines":[{"line_number":136,"context_line":"class SameReqEnv(object):"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def __init__(self, req):"},{"line_number":139,"context_line":"        self.environ \u003d req.environ"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def __eq__(self, other):"},{"line_number":142,"context_line":"        return self.environ \u003d\u003d other.environ"}],"source_content_type":"text/x-python","patch_set":20,"id":"8f0f75cc_2a6ad142","line":139,"updated":"2024-05-31 21:26:26.000000000","message":"Should this make a (deep)copy? I found this a little surprising:\n```\n\u003e\u003e\u003e req \u003d Request.blank(\u0027/\u0027)\n\u003e\u003e\u003e sre \u003d SameReqEnv(req)\n\u003e\u003e\u003e sre \u003d\u003d req\nTrue\n\u003e\u003e\u003e req.environ[\u0027swift.foo\u0027] \u003d \u0027bar\u0027\n\u003e\u003e\u003e sre \u003d\u003d req\nTrue\n```\nOh, but then `test_extra_headers_contain_object_bytes` fails...\n\nI\u0027m really torn about this -- the more I play with it (even trying to get rid of it), the more I see why we need it, to the point that I\u0027m surprised we don\u0027t *already* have something like it, or just implement a `__eq__` on `swob.Request`. I feel like this is maybe a sign that we\u0027re drawing a strange boundary in the **one** new test that uses it.","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2315c8e57dce047e4a1d5d8e8d9f93fd369b7e36","unresolved":true,"context_lines":[{"line_number":136,"context_line":"class SameReqEnv(object):"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def __init__(self, req):"},{"line_number":139,"context_line":"        self.environ \u003d req.environ"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def __eq__(self, other):"},{"line_number":142,"context_line":"        return self.environ \u003d\u003d other.environ"}],"source_content_type":"text/x-python","patch_set":20,"id":"6295cd70_05c9c937","line":139,"in_reply_to":"8f0f75cc_2a6ad142","updated":"2024-06-04 18:14:05.000000000","message":"Yeah this was sort of a kludge.  I appreciate you thinking about it.\n\nI could change the `call_args_list` assertion to use a `mock.Any` in the 5th slot, then we don\u0027t need this weird jig and I don\u0027t think the material behaviors we want to maintain a grossly impacted.  I think mock.Any was basically about all the existing style is currently asserting.\n\nI could also in theory get behind an `__eq__` in `swob.Request`, but since apparently this is the only test module that wants to mock a method that accepts a req argument and call a method one layer above with a stub request and then assert the mock was called with that stub - maybe it\u0027s best to leave things together for now and replace/adapt/evolve the tests and this helper together as needed?","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2315c8e57dce047e4a1d5d8e8d9f93fd369b7e36","unresolved":true,"context_lines":[{"line_number":7702,"context_line":"        container_updates \u003d []"},{"line_number":7703,"context_line":""},{"line_number":7704,"context_line":"        def capture_updates(ip, port, method, path, headers, *args, **kwargs):"},{"line_number":7705,"context_line":"            container_updates.append((ip, port, method, path, headers))"},{"line_number":7706,"context_line":""},{"line_number":7707,"context_line":"        policy \u003d random.choice(list(POLICIES))"},{"line_number":7708,"context_line":"        delete_at \u003d int(next(self.ts)) + 30"}],"source_content_type":"text/x-python","patch_set":20,"id":"b86e621c_ee346380","line":7705,"updated":"2024-06-04 18:14:05.000000000","message":"frankly I find mocking at *this* level way more convincing that capturing the calls to `fake_delete_at_update`","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7a6f6fa2e2eb29bb082a7fb2cbe97f898ce92512","unresolved":true,"context_lines":[{"line_number":7702,"context_line":"        container_updates \u003d []"},{"line_number":7703,"context_line":""},{"line_number":7704,"context_line":"        def capture_updates(ip, port, method, path, headers, *args, **kwargs):"},{"line_number":7705,"context_line":"            container_updates.append((ip, port, method, path, headers))"},{"line_number":7706,"context_line":""},{"line_number":7707,"context_line":"        policy \u003d random.choice(list(POLICIES))"},{"line_number":7708,"context_line":"        delete_at \u003d int(next(self.ts)) + 30"}],"source_content_type":"text/x-python","patch_set":20,"id":"fdfc18db_462023bd","line":7705,"in_reply_to":"b86e621c_ee346380","updated":"2024-06-07 17:40:21.000000000","message":"Exactly! That was kind of where I landed, too -- we shouldn\u0027t care about exactly *how* the metadata ends up on the content-type, just that **it does**.\n\nWas it that we wanted assertions about the headers getting updated even if we\u0027re destined for async_pendings or something? The previous test (sometimes?) contains `X-Delete-At-Container` headers, but never the ring-lookup headers...\n\nEven if that *were* the goal, why not just read the pickles off disk?","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f6a38f71a18b4cb52bbdac84f7f512ab1b231e34","unresolved":false,"context_lines":[{"line_number":7702,"context_line":"        container_updates \u003d []"},{"line_number":7703,"context_line":""},{"line_number":7704,"context_line":"        def capture_updates(ip, port, method, path, headers, *args, **kwargs):"},{"line_number":7705,"context_line":"            container_updates.append((ip, port, method, path, headers))"},{"line_number":7706,"context_line":""},{"line_number":7707,"context_line":"        policy \u003d random.choice(list(POLICIES))"},{"line_number":7708,"context_line":"        delete_at \u003d int(next(self.ts)) + 30"}],"source_content_type":"text/x-python","patch_set":20,"id":"1b0a9738_7125f897","line":7705,"in_reply_to":"fdfc18db_462023bd","updated":"2024-06-14 01:19:48.000000000","message":"IIRC, I think the original author was just copying the existing test style; when I noticed a bug in an earlier version and added a test for it I choose to write it a style that I liked better.  That got squashed in (along with a fix) and now this change has schizophrenic test patterns in the same diff.\n\nWe could port `test_extra_headers_contain_object_bytes` to the new style introduced by `test_delete_at_overwrite_same_expiration_different_bytes` and `test_delete_at_POST_update_same_expiration` but it does tend to make for a longer test and would be more work and there\u0027d still be other tests using the pre-existing `mock.patch.object(self.object_controller, \u0027delete_at_update\u0027)` test style.\n\nI think this is fine; but recognize depending on how much we want to invest it could potentially be better.  Maybe ideal to port all the `self.object_controller.delete_at_update \u003d fake_delete_at_update` tests to the new style in a follow-on (I count 3, plus this new one - there\u0027s also some `diskfile_mgr.pickle_async_update \u003d fake_pickle_async_update` tests that could just write the pickle to a tempdir), but I could also understand the argument for \"please don\u0027t continue to expand the pre-existing pattern\" - feel free to push a new version or follow-up depending on your appitite for improving this test infra.","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2315c8e57dce047e4a1d5d8e8d9f93fd369b7e36","unresolved":true,"context_lines":[{"line_number":7979,"context_line":"        self.assertEqual(resp.status_int, 201)"},{"line_number":7980,"context_line":"        self.assertEqual(given_args, ["},{"line_number":7981,"context_line":"            \u0027PUT\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7982,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0], {"},{"line_number":7983,"context_line":"                \u0027x-content-type\u0027: \u0027text/plain;swift_expirer_bytes\u003d4\u0027,"},{"line_number":7984,"context_line":"                \u0027x-content-type-timestamp\u0027: timestamp1"},{"line_number":7985,"context_line":"            }])"}],"source_content_type":"text/x-python","patch_set":20,"id":"7516ea3b_bd2623f3","line":7982,"updated":"2024-06-04 18:14:05.000000000","message":"The main thing I was trying to get away from with SameReqEnv was this pre-existing-style of assertion where we assert the req in the given args is whatever was the 5th argument we captured in given args.\n\nMay as well be:\n\n    self.assertEqual([a][0], a)\n    \n... or maybe even dumber than *that*?","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f6a38f71a18b4cb52bbdac84f7f512ab1b231e34","unresolved":false,"context_lines":[{"line_number":7979,"context_line":"        self.assertEqual(resp.status_int, 201)"},{"line_number":7980,"context_line":"        self.assertEqual(given_args, ["},{"line_number":7981,"context_line":"            \u0027PUT\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7982,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0], {"},{"line_number":7983,"context_line":"                \u0027x-content-type\u0027: \u0027text/plain;swift_expirer_bytes\u003d4\u0027,"},{"line_number":7984,"context_line":"                \u0027x-content-type-timestamp\u0027: timestamp1"},{"line_number":7985,"context_line":"            }])"}],"source_content_type":"text/x-python","patch_set":20,"id":"6f44d5a4_ac4a1a02","line":7982,"in_reply_to":"3b9f639c_57608b93","updated":"2024-06-14 01:19:48.000000000","message":"Acknowledged","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7a6f6fa2e2eb29bb082a7fb2cbe97f898ce92512","unresolved":true,"context_lines":[{"line_number":7979,"context_line":"        self.assertEqual(resp.status_int, 201)"},{"line_number":7980,"context_line":"        self.assertEqual(given_args, ["},{"line_number":7981,"context_line":"            \u0027PUT\u0027, int(delete_at_timestamp1), \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":7982,"context_line":"            given_args[5], \u0027sda1\u0027, POLICIES[0], {"},{"line_number":7983,"context_line":"                \u0027x-content-type\u0027: \u0027text/plain;swift_expirer_bytes\u003d4\u0027,"},{"line_number":7984,"context_line":"                \u0027x-content-type-timestamp\u0027: timestamp1"},{"line_number":7985,"context_line":"            }])"}],"source_content_type":"text/x-python","patch_set":20,"id":"3b9f639c_57608b93","line":7982,"in_reply_to":"7516ea3b_bd2623f3","updated":"2024-06-07 17:40:21.000000000","message":"Yeah, fair enough -- that does look pretty dumb.","commit_id":"5ad3a5a4fe193e8cd9b4e67bce377363e890098a"}]}
