)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a79043e569a789197d3d3a377073f0dc29cf740d","unresolved":true,"context_lines":[{"line_number":17,"context_line":"Add tests for bad config."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Add documentation for account and container level grace periods."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I106103438c4162a561486ac73a09436e998ae1f0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9fa99f19_b09f9bc6","line":20,"updated":"2024-03-14 14:27:27.000000000","message":"@Anish - add yourself as co-author\n\n```\nCo-Authored-By: Anish Kachinthaya \u003cakachinthaya@nvidia.com\u003e\n```","commit_id":"a342856a1c5bf85679a9ae32c6e5ddce8f94f4ae"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Add tests for bad config."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Add documentation for account and container level grace periods."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I106103438c4162a561486ac73a09436e998ae1f0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"e7a78e08_5ae0a31c","line":20,"in_reply_to":"9fa99f19_b09f9bc6","updated":"2024-03-15 01:38:23.000000000","message":"Done","commit_id":"a342856a1c5bf85679a9ae32c6e5ddce8f94f4ae"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Add tests for bad config."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Add documentation for account and container level grace periods."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Co-Authored-By: Anish Kachinthaya \u003cakachinthaya@nvidia.com\u003e"},{"line_number":22,"context_line":"Change-Id: I106103438c4162a561486ac73a09436e998ae1f0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"fc62200c_f4b5844e","line":19,"updated":"2024-03-19 20:17:11.000000000","message":"this commit message just a great job describing the WHAT - I couple of senteances on the WHY would make it stand out as truely exceptional.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d3fa1288016e101c084197cd9f0e283b2570d7ea","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Add tests for bad config."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Add documentation for account and container level grace periods."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Co-Authored-By: Anish Kachinthaya \u003cakachinthaya@nvidia.com\u003e"},{"line_number":22,"context_line":"Change-Id: I106103438c4162a561486ac73a09436e998ae1f0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"99c14682_97041e2b","line":19,"in_reply_to":"df760dfe_dc2aefb4","updated":"2024-04-01 19:43:12.000000000","message":"Done","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":true,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Add tests for bad config."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Add documentation for account and container level grace periods."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Co-Authored-By: Anish Kachinthaya \u003cakachinthaya@nvidia.com\u003e"},{"line_number":22,"context_line":"Change-Id: I106103438c4162a561486ac73a09436e998ae1f0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"df760dfe_dc2aefb4","line":19,"in_reply_to":"fc62200c_f4b5844e","updated":"2024-03-20 22:17:08.000000000","message":"Got it. I am taking a stab at this, let me know what you think.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d3fa1288016e101c084197cd9f0e283b2570d7ea","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"expirer: per account and container grace period"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The object expirer can be configured to allow access to objects"},{"line_number":10,"context_line":"in specified accounts and containers even after their expiration"},{"line_number":11,"context_line":"time using per-account and per-container grace periods. The grace"},{"line_number":12,"context_line":"period of accounts and containers in seconds is configured in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"7e760d0a_462f4a40","line":9,"updated":"2024-04-01 19:43:12.000000000","message":"i wouldn\u0027t say the expirer is what allows access - this sounds like it\u0027s talking more about the follow-on patch with the proxy config option for enable_open_expired.","commit_id":"7bffb150fd2281e125cdb5ac99a627aa035a5ead"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"57a01146a3965cb166bf3dd0ce267ced030dc5b3","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"expirer: per account and container grace period"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The object expirer can be configured to allow access to objects"},{"line_number":10,"context_line":"in specified accounts and containers even after their expiration"},{"line_number":11,"context_line":"time using per-account and per-container grace periods. The grace"},{"line_number":12,"context_line":"period of accounts and containers in seconds is configured in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"f8c308b0_5f088a08","line":9,"in_reply_to":"7242dee0_d6d59650","updated":"2024-04-22 18:40:51.000000000","message":"Done","commit_id":"7bffb150fd2281e125cdb5ac99a627aa035a5ead"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"1092af33b3baa80286c6c87b3c16d1c3841fc3b7","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"expirer: per account and container grace period"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The object expirer can be configured to allow access to objects"},{"line_number":10,"context_line":"in specified accounts and containers even after their expiration"},{"line_number":11,"context_line":"time using per-account and per-container grace periods. The grace"},{"line_number":12,"context_line":"period of accounts and containers in seconds is configured in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"7242dee0_d6d59650","line":9,"in_reply_to":"7e760d0a_462f4a40","updated":"2024-04-17 20:05:11.000000000","message":"That makes sense, polishing this up.","commit_id":"7bffb150fd2281e125cdb5ac99a627aa035a5ead"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d3fa1288016e101c084197cd9f0e283b2570d7ea","unresolved":true,"context_lines":[{"line_number":17,"context_line":"The goal of the grace period feature is to prevent accidental or"},{"line_number":18,"context_line":"premature data loss if an object marked for deletion with the"},{"line_number":19,"context_line":"\u0027x-delete-at\u0027 feature should not be deleted immediately, for"},{"line_number":20,"context_line":"whatever reason."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Configuring the grace period in a granular per-account and"},{"line_number":23,"context_line":"per-container manner is beneficial for being able to keep"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"90b70e04_c0e9da71","line":20,"updated":"2024-04-01 19:43:12.000000000","message":"this is good.","commit_id":"7bffb150fd2281e125cdb5ac99a627aa035a5ead"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"e859efbab069a688bdb0d231c81b1d7052a3bc0f","unresolved":false,"context_lines":[{"line_number":17,"context_line":"The goal of the grace period feature is to prevent accidental or"},{"line_number":18,"context_line":"premature data loss if an object marked for deletion with the"},{"line_number":19,"context_line":"\u0027x-delete-at\u0027 feature should not be deleted immediately, for"},{"line_number":20,"context_line":"whatever reason."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Configuring the grace period in a granular per-account and"},{"line_number":23,"context_line":"per-container manner is beneficial for being able to keep"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"ac8934da_9c4d44b4","line":20,"in_reply_to":"90b70e04_c0e9da71","updated":"2024-04-24 21:15:22.000000000","message":"Acknowledged","commit_id":"7bffb150fd2281e125cdb5ac99a627aa035a5ead"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f501b54be83fd1e0dbff5943a9cdcc40d9a15fa7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"fd45d3c9_27a7d896","updated":"2023-02-22 20:31:02.000000000","message":"I\u0027m digging it -- should pair well with something like https://review.opendev.org/c/openstack/swift/+/874710/ :-)\n\nTests shouldn\u0027t be too bad -- I\u0027d look to test with a delay like 3600 or something -- solidly between `past_time` and `just_past_time`: https://github.com/openstack/swift/blob/master/test/unit/obj/test_expirer.py#L114-L115","commit_id":"639625dda626c68fabd4bc0a98c69cb90daeb03f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"659a3ab10c546453c1591b245ae5c3f48b823192","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"eed6b168_6b4fe0a3","updated":"2023-03-27 21:08:33.000000000","message":"I guess we could bury it under an os.environ(\u0027LEGACY_SWIFT_CASE_INSENSITIVE_CONFIG\u0027) as an escape hatch and add a UpgradeImpact if we\u0027re *super* worried about it.  I\u0027d default to case-sensitive configs to match common.wsgi tho.","commit_id":"083cde333c61c988d89816e642f474b238d68721"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ceadb0d90d63dc190ffed8ccfbff54af4f4551e7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"cb99e0b1_640d7a5f","updated":"2023-04-04 21:12:20.000000000","message":"at somepoint we can rebase this on https://review.opendev.org/c/openstack/swift/+/879513","commit_id":"083cde333c61c988d89816e642f474b238d68721"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"44585cc05c3de34aa31101585d15872fa9d5f223","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"7d63a473_d9438008","updated":"2023-03-27 19:17:30.000000000","message":"i think our wsgi configs always worked like this, and maybe this is the first config key were wer wanted case sensitiveity?  i\u0027ll keep digging and write some tests.","commit_id":"083cde333c61c988d89816e642f474b238d68721"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2d8bbb9a801919376f06d10c7853821e3feb2e7d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"a3d64c0c_f90ab55d","updated":"2023-05-04 20:17:36.000000000","message":"I think this might be reasonable as an upstream operator sneaky get out of jail escape hatch.\n\nWe need to rebase it on https://review.opendev.org/c/openstack/swift/+/879513 and figure out how to better document.  e.g. https://docs.openstack.org/swift/latest/overview_expiring_objects.html","commit_id":"e1b8c4b68fb58efded42166b866c64b60b3dd9ea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5100d643476f92ae9eac0a477b171cdd5c9305d7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"0b2dd5b9_23fcfe62","updated":"2023-05-24 00:10:47.000000000","message":"I want to revisit a little the idea of whether this should go in configs, or hang it off the account DBs -- kinda like what we do in the read-only middleware: https://github.com/openstack/swift/blob/master/swift/common/middleware/read_only.py#L50-L55","commit_id":"e1b8c4b68fb58efded42166b866c64b60b3dd9ea"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"12134b7f11cc97dc1ba63d1c87c64e229e13735e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"1b6866ca_747b5ab9","updated":"2024-02-14 21:14:49.000000000","message":"leave just a small comment on the impl.","commit_id":"e22691b7aa2d5036280a58ddc9d4fefe64c4b273"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c9b2aeebb031cb40e07f1a76de631f52641a3129","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"d517387c_be2e876e","updated":"2024-03-08 05:34:50.000000000","message":"A thought we were keeping these as 2 patches.. 1 grace_period and then X-open-expired.. Did we end up squashing them both together?","commit_id":"5f753b64956a8bb7292ae034f44c674a9872fb99"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6e0fa030403260d51e4986a3df4c910ad36df073","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"d2fcae4d_476680e1","updated":"2024-03-08 05:33:54.000000000","message":"had these comments from patchset 12.. will post them","commit_id":"5f753b64956a8bb7292ae034f44c674a9872fb99"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"a730ce0d227dfac5339ea008f303b16764aca4dc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"6de293bd_96a9fc37","updated":"2024-03-13 19:12:28.000000000","message":"@Anish, since your per-container work is squashed into this patch, you should update the commit message to include youself as a co-author. you can search up \"Co-Authored-By\" in the swift git history for reference.","commit_id":"a70d230f7cdf7a4c202d727e11454b798d2fda9c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a79043e569a789197d3d3a377073f0dc29cf740d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"5ae22252_8d029fbf","updated":"2024-03-14 14:27:27.000000000","message":"-1 because of the sample config file confusion. Otherwise looks good.\n\nIs there a reason for not providing a global option, other than that the code hasn\u0027t been written/the use case hasn\u0027t arisen (which is fine) - I am just curious if there is a principled reason rather than pragmatic reason?","commit_id":"8e7d26f249249f324bf9953b577cd47a1bddf85c"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"e048a972_0b8a96bb","updated":"2024-03-15 01:38:23.000000000","message":"Looked at Matt and Alistair\u0027s review - will send a message regarding global grace period in the Slack","commit_id":"8e7d26f249249f324bf9953b577cd47a1bddf85c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5171b4ae2bd6ce0225359af7d6b037bbe7abd4b7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"5b5f6fe4_661f55a5","updated":"2024-03-20 10:52:09.000000000","message":"-1 because I\u0027d prefer the doc to be clearer about expired vs deleted. Small changes but worth it IMHO.\n\nOtherwise it LGTM. The nit in the conf files really is just a nit. I\u0027m ambivalent about the renaming of the conf options. There\u0027s some other minor comments where there is polishing that could be done, but none of that would stop me being +2.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"972e2959_5500a665","updated":"2024-03-19 20:17:11.000000000","message":"I honestly think we could merge this now; but I\u0027d like the commit message and docs to include a little more justification for the use-case which might be non-obvious.\n\nI also note there\u0027s some ongoing discussions about the name of the config option, and the need for a global setting and possibly a simplification of the business logic that would make it more clear we haven\u0027t changed the early break behavior.\n\nI *think* the helper functions are quite nice and useful.  I *think* the ratelimiting works the way we want.  The testing is very thorough and passes the sniff test coming in at something like 5:1!?\n\nIMHO, this is a useful and complete change that makes swift better; I need to go over the follow-up x-open-expired work before +A.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"16eb821c_a5fd3c3f","updated":"2024-03-20 22:17:08.000000000","message":"Updated commit message, documentation and wording, and small other changes","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"400ab710b516aa4f5e0b16b56a73bd0e34338242","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"e4c0c58b_2168c497","updated":"2024-04-02 09:27:57.000000000","message":"Not merging because we\u0027re planning on squashing in the renaming patch","commit_id":"7bffb150fd2281e125cdb5ac99a627aa035a5ead"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d3fa1288016e101c084197cd9f0e283b2570d7ea","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"871446b7_4f7729b1","updated":"2024-04-01 19:43:12.000000000","message":"waiting to +A pending the sq of delay_reaping - but I think this is still good to go.","commit_id":"7bffb150fd2281e125cdb5ac99a627aa035a5ead"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a7d11d55556695f07bc2713ab84d9856c59ef748","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"f932788f_71b59402","updated":"2024-04-09 11:04:39.000000000","message":"Squash looks good, This is identical to state of the patch chain at https://review.opendev.org/c/openstack/swift/+/914768/4","commit_id":"d51168cc493a7326f5af30e15550efa272dd571e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"42d4c8f469bb0116aa2a333c18a3a72568f15660","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"baddf506_9805fec0","updated":"2024-04-16 18:14:01.000000000","message":"object-server example config has docs in the wrong place.","commit_id":"d51168cc493a7326f5af30e15550efa272dd571e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"1092af33b3baa80286c6c87b3c16d1c3841fc3b7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"c4aef3e7_f20799aa","updated":"2024-04-17 20:05:11.000000000","message":"updated docs and commit message","commit_id":"d51168cc493a7326f5af30e15550efa272dd571e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"b2617d896106f8d5fb1b6df6be7a69de91d59631","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"7667ee10_f1b6a60b","updated":"2024-04-18 16:11:29.000000000","message":"small change in conf example","commit_id":"d875bee2f4458f4e47652c147335c6611566a684"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9bfa35a2708b8ac0f90a56523284457677874aa4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"066520bf_06e451bd","updated":"2024-04-18 08:00:46.000000000","message":"still some muddling w.r.t. xprofile conf section","commit_id":"d875bee2f4458f4e47652c147335c6611566a684"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"34a158cade6e3149ba96b72056a1562194f31b9f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"835f6913_cf16d98e","updated":"2024-04-22 20:15:17.000000000","message":"Do we have any examples of other per-container config options? I suppose the hope is that any given cluster would only need this for at most a handful of containers; it worked out OK-ish for the (out-of-tree) 1space project.\n\nI\u0027m worried about our ability to handle names with special characters, though; maybe it\u0027d work to use url-quoted names in configs?","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"e859efbab069a688bdb0d231c81b1d7052a3bc0f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"3ff0ea7e_c7ba9a3a","updated":"2024-04-24 21:15:22.000000000","message":"Squashed in URL parsing for container names","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"57a01146a3965cb166bf3dd0ce267ced030dc5b3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"cc28e925_629bcf93","updated":"2024-04-22 18:40:51.000000000","message":"good tests and docs - all the comments look to be praise, AFAIK everyone involved with this is happy and it already has one +2","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bd450a5a8c81e890b63aefbadd633983db5aca38","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"c882bf65_9a27c82c","in_reply_to":"835f6913_cf16d98e","updated":"2024-04-24 16:37:37.000000000","message":"Oh, right -- we already had this conversation around config vs sysmeta: https://review.opendev.org/c/openstack/swift/+/874806/comment/3fefcf1e_4259ca7e/\n\nI think we can ignore that concern.\n\nI\u0027ll work on a follow-up for the url-encoded configs today.","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"20ba874544f66649f542817bdc5117cd1babbb79","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"f012c6ef_542122b7","updated":"2024-04-25 18:07:13.000000000","message":"Added is_async and test for it","commit_id":"1c8b1e86343c1c4caf9d75d9359b2126b4b37788"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"102bbd9cfafa9498248a92979321670650def8b0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"67de2cbc_cfa9b49a","updated":"2024-04-25 22:00:26.000000000","message":"nice turn around on the fix for async_delted!\n\n917070: sq? this convined me! | https://review.opendev.org/c/openstack/swift/+/917070","commit_id":"5961ba0ca7ddcfe296627fbef01ec4b32d538290"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d7388f52791539a1e3b06cc1066ac172e44f6e78","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"027d3916_dd160b7b","updated":"2024-04-26 07:42:49.000000000","message":"recheck","commit_id":"5961ba0ca7ddcfe296627fbef01ec4b32d538290"}],"doc/source/config/object_server_config.rst":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a79043e569a789197d3d3a377073f0dc29cf740d","unresolved":true,"context_lines":[{"line_number":756,"context_line":"                                                              The grace period is configured for"},{"line_number":757,"context_line":"                                                              the container with the account name"},{"line_number":758,"context_line":"                                                              placed in \u003cACCT\u003e and the container"},{"line_number":759,"context_line":"                                                              name in \u003cCNTR\u003e."},{"line_number":760,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":16,"id":"5fcda601_9841bf67","line":759,"updated":"2024-03-14 14:27:27.000000000","message":"this is fine - it is easier to read when rendered https://storage.bhs.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_38f/874806/16/check/openstack-tox-docs/38f3195/docs/config/object_server_config.html#object-expirer","commit_id":"8e7d26f249249f324bf9953b577cd47a1bddf85c"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":false,"context_lines":[{"line_number":756,"context_line":"                                                              The grace period is configured for"},{"line_number":757,"context_line":"                                                              the container with the account name"},{"line_number":758,"context_line":"                                                              placed in \u003cACCT\u003e and the container"},{"line_number":759,"context_line":"                                                              name in \u003cCNTR\u003e."},{"line_number":760,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a2c18f5_a468c0d1","line":759,"in_reply_to":"5fcda601_9841bf67","updated":"2024-03-15 01:38:23.000000000","message":"Acknowledged","commit_id":"8e7d26f249249f324bf9953b577cd47a1bddf85c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":756,"context_line":"                                                              The grace period is configured for"},{"line_number":757,"context_line":"                                                              the container with the account name"},{"line_number":758,"context_line":"                                                              placed in \u003cACCT\u003e and the container"},{"line_number":759,"context_line":"                                                              name in \u003cCNTR\u003e."},{"line_number":760,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":17,"id":"52b05b2f_e774a32f","line":759,"updated":"2024-03-19 20:17:11.000000000","message":"confirmed there is no `doc/source/config/object_expirer_config.rst` file (thank goodness!)","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":756,"context_line":"                                                              The grace period is configured for"},{"line_number":757,"context_line":"                                                              the container with the account name"},{"line_number":758,"context_line":"                                                              placed in \u003cACCT\u003e and the container"},{"line_number":759,"context_line":"                                                              name in \u003cCNTR\u003e."},{"line_number":760,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":17,"id":"893b003c_8a525fd1","line":759,"in_reply_to":"52b05b2f_e774a32f","updated":"2024-03-20 22:17:08.000000000","message":"Haha great","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"}],"doc/source/overview_expiring_objects.rst":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a79043e569a789197d3d3a377073f0dc29cf740d","unresolved":true,"context_lines":[{"line_number":68,"context_line":"The grace period can be set either at a per-account level or a per-container"},{"line_number":69,"context_line":"level. When set at a per-account level, the object expirer will only delete"},{"line_number":70,"context_line":"objects within the account after the grace period. A per-container level grace"},{"line_number":71,"context_line":"period works similarly for containers and overrides a per-account grace period."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Grace periods are set in the config ``object-server.conf``, in the"},{"line_number":74,"context_line":"``[object-expirer]`` section. They are configured with dynamic config option"}],"source_content_type":"text/x-rst","patch_set":11,"id":"596575fa_024da50e","line":71,"updated":"2024-03-14 14:27:27.000000000","message":"Have we considered a global config? We\u0027ve not wanted it in our prod, but I can imagine ops getting tired of adding accounts to the config if all their end-users want this feature.","commit_id":"a342856a1c5bf85679a9ae32c6e5ddce8f94f4ae"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5171b4ae2bd6ce0225359af7d6b037bbe7abd4b7","unresolved":false,"context_lines":[{"line_number":68,"context_line":"The grace period can be set either at a per-account level or a per-container"},{"line_number":69,"context_line":"level. When set at a per-account level, the object expirer will only delete"},{"line_number":70,"context_line":"objects within the account after the grace period. A per-container level grace"},{"line_number":71,"context_line":"period works similarly for containers and overrides a per-account grace period."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Grace periods are set in the config ``object-server.conf``, in the"},{"line_number":74,"context_line":"``[object-expirer]`` section. They are configured with dynamic config option"}],"source_content_type":"text/x-rst","patch_set":11,"id":"376cc7e5_3f225f31","line":71,"in_reply_to":"007cd5f2_0e355e10","updated":"2024-03-20 10:52:09.000000000","message":"I agree this could come later - I merely wondered if there had been any discussion of why it should or should not ever be an option.","commit_id":"a342856a1c5bf85679a9ae32c6e5ddce8f94f4ae"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":true,"context_lines":[{"line_number":68,"context_line":"The grace period can be set either at a per-account level or a per-container"},{"line_number":69,"context_line":"level. When set at a per-account level, the object expirer will only delete"},{"line_number":70,"context_line":"objects within the account after the grace period. A per-container level grace"},{"line_number":71,"context_line":"period works similarly for containers and overrides a per-account grace period."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Grace periods are set in the config ``object-server.conf``, in the"},{"line_number":74,"context_line":"``[object-expirer]`` section. They are configured with dynamic config option"}],"source_content_type":"text/x-rst","patch_set":11,"id":"ab7fb224_23ee39cf","line":71,"in_reply_to":"596575fa_024da50e","updated":"2024-03-15 01:38:23.000000000","message":"We have not as of rn, I think this patch mostly meets the requirements for Maglev, but this is something to consider. We could have just a global `grace_period \u003d x` possibly. I\u0027ll take this up with Clay","commit_id":"a342856a1c5bf85679a9ae32c6e5ddce8f94f4ae"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":68,"context_line":"The grace period can be set either at a per-account level or a per-container"},{"line_number":69,"context_line":"level. When set at a per-account level, the object expirer will only delete"},{"line_number":70,"context_line":"objects within the account after the grace period. A per-container level grace"},{"line_number":71,"context_line":"period works similarly for containers and overrides a per-account grace period."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Grace periods are set in the config ``object-server.conf``, in the"},{"line_number":74,"context_line":"``[object-expirer]`` section. They are configured with dynamic config option"}],"source_content_type":"text/x-rst","patch_set":11,"id":"007cd5f2_0e355e10","line":71,"in_reply_to":"ab7fb224_23ee39cf","updated":"2024-03-19 20:17:11.000000000","message":"I agree it simply wasn\u0027t in the requirements.  If some other swift user finds grace period useful and wants to configure it globally for their cluster they can submit a patch or a bug report.  AFAIK if we have time we could add it as a follow-on.","commit_id":"a342856a1c5bf85679a9ae32c6e5ddce8f94f4ae"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a79043e569a789197d3d3a377073f0dc29cf740d","unresolved":true,"context_lines":[{"line_number":89,"context_line":"    A per-container grace period does not require a per-account grace period"},{"line_number":90,"context_line":"    but overrides the per-account grace period for the same account if it"},{"line_number":91,"context_line":"    exists. By default, no grace_period is configured for any accounts or"},{"line_number":92,"context_line":"    containers."},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"Upgrading impact: General Task Queue vs Legacy Queue"},{"line_number":95,"context_line":"----------------------------------------------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"920bbe98_cad46d1a","line":92,"updated":"2024-03-14 14:27:27.000000000","message":"looks good https://storage.bhs.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_38f/874806/16/check/openstack-tox-docs/38f3195/docs/overview_expiring_objects.html#account-and-container-level-grace-period-support","commit_id":"8e7d26f249249f324bf9953b577cd47a1bddf85c"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    A per-container grace period does not require a per-account grace period"},{"line_number":90,"context_line":"    but overrides the per-account grace period for the same account if it"},{"line_number":91,"context_line":"    exists. By default, no grace_period is configured for any accounts or"},{"line_number":92,"context_line":"    containers."},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"Upgrading impact: General Task Queue vs Legacy Queue"},{"line_number":95,"context_line":"----------------------------------------------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"cfa2a256_d9165607","line":92,"in_reply_to":"920bbe98_cad46d1a","updated":"2024-03-15 01:38:23.000000000","message":"Acknowledged","commit_id":"8e7d26f249249f324bf9953b577cd47a1bddf85c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":63,"context_line":"when they are actually deleted. When this is set in the object expirer config"},{"line_number":64,"context_line":"the object expirer leaves expired objects on disk (and in container listings)"},{"line_number":65,"context_line":"for the length of the grace period. After the grace_period has passed objects"},{"line_number":66,"context_line":"will be expired as normal."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"The grace period can be set either at a per-account level or a per-container"},{"line_number":69,"context_line":"level. When set at a per-account level, the object expirer will only delete"}],"source_content_type":"text/x-rst","patch_set":17,"id":"e75f0601_5fea738a","line":66,"updated":"2024-03-19 20:17:11.000000000","message":"i was hoping to find some prose as to the WHY you could steal from the docs for your commit message; but these also explain the what with little explination of \"why would i need this\".\n\nMaybe:\n\nSwift\u0027s expiring object x-delete-at feature can be used to have the cluster delete user\u0027s objects automatically on their behalf when they no longer want them stored in their account.  In some cases it may be necessary to \"intervene\" in the expected expiration process to prevent accidental/premature data loss if an object marked for expiration should NOT be deleted immediately when it expires for whatever reason.  In these cases the swift-object-expirer offers ...","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5171b4ae2bd6ce0225359af7d6b037bbe7abd4b7","unresolved":true,"context_lines":[{"line_number":63,"context_line":"when they are actually deleted. When this is set in the object expirer config"},{"line_number":64,"context_line":"the object expirer leaves expired objects on disk (and in container listings)"},{"line_number":65,"context_line":"for the length of the grace period. After the grace_period has passed objects"},{"line_number":66,"context_line":"will be expired as normal."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"The grace period can be set either at a per-account level or a per-container"},{"line_number":69,"context_line":"level. When set at a per-account level, the object expirer will only delete"}],"source_content_type":"text/x-rst","patch_set":17,"id":"785ac070_baec26f1","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":15},"updated":"2024-03-20 10:52:09.000000000","message":"s/expired/deleted/\n\nNow that I have thought about the ``grace_period`` vs ``delay_expiring`` question I am more alert to the distinction between an object being \"expired\" vs \"deleted\".","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"when they are actually deleted. When this is set in the object expirer config"},{"line_number":64,"context_line":"the object expirer leaves expired objects on disk (and in container listings)"},{"line_number":65,"context_line":"for the length of the grace period. After the grace_period has passed objects"},{"line_number":66,"context_line":"will be expired as normal."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"The grace period can be set either at a per-account level or a per-container"},{"line_number":69,"context_line":"level. When set at a per-account level, the object expirer will only delete"}],"source_content_type":"text/x-rst","patch_set":17,"id":"2bda3cb7_da473b4b","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":15},"in_reply_to":"785ac070_baec26f1","updated":"2024-03-20 22:17:08.000000000","message":"Got it, it\u0027s becoming clearer to me as well.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"when they are actually deleted. When this is set in the object expirer config"},{"line_number":64,"context_line":"the object expirer leaves expired objects on disk (and in container listings)"},{"line_number":65,"context_line":"for the length of the grace period. After the grace_period has passed objects"},{"line_number":66,"context_line":"will be expired as normal."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"The grace period can be set either at a per-account level or a per-container"},{"line_number":69,"context_line":"level. When set at a per-account level, the object expirer will only delete"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3320fbff_0d01158f","line":66,"in_reply_to":"e75f0601_5fea738a","updated":"2024-03-20 22:17:08.000000000","message":"Acknowledged","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":71,"context_line":"period works similarly for containers and overrides a per-account grace period."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Grace periods are set in the config ``object-server.conf``, in the"},{"line_number":74,"context_line":"``[object-expirer]`` section. They are configured with dynamic config option"},{"line_number":75,"context_line":"names prefixed with ``grace_period_\u003cACCT\u003e`` for per-account grace periods and"},{"line_number":76,"context_line":"``grace_period_\u003cACCT\u003e/\u003cCNTR\u003e`` for per-container grace periods, with the grace"},{"line_number":77,"context_line":"period value in seconds."}],"source_content_type":"text/x-rst","patch_set":17,"id":"b6a1952b_971828a6","line":74,"updated":"2024-03-19 20:17:11.000000000","message":"Maybe reprhase this to be more agnostic about \"legacy\" object-expirer config files:\n\nGrace periods are set in the `[object-expirer]` section in either the object-server or object-expirer config files.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":71,"context_line":"period works similarly for containers and overrides a per-account grace period."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Grace periods are set in the config ``object-server.conf``, in the"},{"line_number":74,"context_line":"``[object-expirer]`` section. They are configured with dynamic config option"},{"line_number":75,"context_line":"names prefixed with ``grace_period_\u003cACCT\u003e`` for per-account grace periods and"},{"line_number":76,"context_line":"``grace_period_\u003cACCT\u003e/\u003cCNTR\u003e`` for per-container grace periods, with the grace"},{"line_number":77,"context_line":"period value in seconds."}],"source_content_type":"text/x-rst","patch_set":17,"id":"f40fef19_fc11b3ac","line":74,"in_reply_to":"b6a1952b_971828a6","updated":"2024-03-20 22:17:08.000000000","message":"Got it, updating!","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d3fa1288016e101c084197cd9f0e283b2570d7ea","unresolved":true,"context_lines":[{"line_number":63,"context_line":"them stored in their account. In some cases it may be necessary to \"intervene\""},{"line_number":64,"context_line":"in the expected expiration process to prevent accidental or premature data loss"},{"line_number":65,"context_line":"if an object marked for expiration should NOT be deleted immediately when it"},{"line_number":66,"context_line":"expires for whatever reason. In these cases ``swift-object-expirer`` offers"},{"line_number":67,"context_line":"grace periods on accounts and containers, which provide a time period between"},{"line_number":68,"context_line":"when an object is marked for deletion and when they are actually deleted. When"},{"line_number":69,"context_line":"this is set in the object expirer config the object expirer leaves expired"}],"source_content_type":"text/x-rst","patch_set":18,"id":"50ce20db_63f7c239","line":66,"updated":"2024-04-01 19:43:12.000000000","message":"this is good.","commit_id":"7bffb150fd2281e125cdb5ac99a627aa035a5ead"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"e859efbab069a688bdb0d231c81b1d7052a3bc0f","unresolved":false,"context_lines":[{"line_number":63,"context_line":"them stored in their account. In some cases it may be necessary to \"intervene\""},{"line_number":64,"context_line":"in the expected expiration process to prevent accidental or premature data loss"},{"line_number":65,"context_line":"if an object marked for expiration should NOT be deleted immediately when it"},{"line_number":66,"context_line":"expires for whatever reason. In these cases ``swift-object-expirer`` offers"},{"line_number":67,"context_line":"grace periods on accounts and containers, which provide a time period between"},{"line_number":68,"context_line":"when an object is marked for deletion and when they are actually deleted. When"},{"line_number":69,"context_line":"this is set in the object expirer config the object expirer leaves expired"}],"source_content_type":"text/x-rst","patch_set":18,"id":"2ff789c8_43d0cfb0","line":66,"in_reply_to":"50ce20db_63f7c239","updated":"2024-04-24 21:15:22.000000000","message":"Acknowledged","commit_id":"7bffb150fd2281e125cdb5ac99a627aa035a5ead"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"102bbd9cfafa9498248a92979321670650def8b0","unresolved":true,"context_lines":[{"line_number":96,"context_line":"    A container level ``delay_reaping`` value does not require an account level"},{"line_number":97,"context_line":"    ``delay_reaping`` value but overrides the account level value for the same"},{"line_number":98,"context_line":"    account if it exists. By default, no ``delay_reaping`` value is configured"},{"line_number":99,"context_line":"    for any accounts or containers."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Upgrading impact: General Task Queue vs Legacy Queue"},{"line_number":102,"context_line":"----------------------------------------------------"}],"source_content_type":"text/x-rst","patch_set":24,"id":"ad80021c_6ae84a59","line":99,"updated":"2024-04-25 22:00:26.000000000","message":"since this doc doesn\u0027t curently mention async it\u0027s probably best not to try and bring it up and explain it in the context of delay reaping (which says specifically it applies to x-delete-at)\n\nwhich i think is what we always intended - and now works!  We fixed a bug before we even landed it.  WTG review!","commit_id":"5961ba0ca7ddcfe296627fbef01ec4b32d538290"}],"etc/object-expirer.conf-sample":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a79043e569a789197d3d3a377073f0dc29cf740d","unresolved":true,"context_lines":[{"line_number":84,"context_line":"# grace_period_AUTH_test \u003d 300.0"},{"line_number":85,"context_line":"# grace_period_AUTH_test2 \u003d 86400.0"},{"line_number":86,"context_line":"# grace_period_AUTH_test/test \u003d 400.0"},{"line_number":87,"context_line":"# grace_period_AUTH_test/test2 \u003d 600.0"},{"line_number":88,"context_line":"#"},{"line_number":89,"context_line":"# recon_cache_path \u003d /var/cache/swift"},{"line_number":90,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"f6ddfb77_ad46d097","line":87,"updated":"2024-03-14 14:27:27.000000000","message":"This config file is deprecated, we should be maintaining this in object-server.conf-sample\n\nI guess that while this file exists it makes sense to put this content in both.\n\nsee: https://review.opendev.org/c/openstack/swift/+/909928/comment/0e927b7c_742aeb30/","commit_id":"a342856a1c5bf85679a9ae32c6e5ddce8f94f4ae"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bd450a5a8c81e890b63aefbadd633983db5aca38","unresolved":false,"context_lines":[{"line_number":84,"context_line":"# grace_period_AUTH_test \u003d 300.0"},{"line_number":85,"context_line":"# grace_period_AUTH_test2 \u003d 86400.0"},{"line_number":86,"context_line":"# grace_period_AUTH_test/test \u003d 400.0"},{"line_number":87,"context_line":"# grace_period_AUTH_test/test2 \u003d 600.0"},{"line_number":88,"context_line":"#"},{"line_number":89,"context_line":"# recon_cache_path \u003d /var/cache/swift"},{"line_number":90,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"a97ea9ac_ef42606b","line":87,"in_reply_to":"72f6fc73_1eacc9fb","updated":"2024-04-24 16:37:37.000000000","message":"\u003e This config file is deprecated\n\nIs it, though? We certainly don\u0027t seem to treat it that way. We started allowing config in `object-server.conf` in [`443f029a`](https://github.com/openstack/swift/commit/443f029a584c5bb7dd7b910ddacd8fa562272dfb) which was intended as a pre-req for [implementing a general task queue](https://review.opendev.org/c/openstack/swift/+/517389) (which I realized recently would probably have helped with some of the account/container server overloading we\u0027re [trying](https://review.opendev.org/c/openstack/swift/+/914713) to [address](https://review.opendev.org/c/openstack/swift/+/916026)!) to [enable tiering](https://review.opendev.org/c/openstack/swift/+/546958), but that all got left in a state with no good path forward...\n\nHaving it in both was definitely the right call, thanks.","commit_id":"a342856a1c5bf85679a9ae32c6e5ddce8f94f4ae"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":true,"context_lines":[{"line_number":84,"context_line":"# grace_period_AUTH_test \u003d 300.0"},{"line_number":85,"context_line":"# grace_period_AUTH_test2 \u003d 86400.0"},{"line_number":86,"context_line":"# grace_period_AUTH_test/test \u003d 400.0"},{"line_number":87,"context_line":"# grace_period_AUTH_test/test2 \u003d 600.0"},{"line_number":88,"context_line":"#"},{"line_number":89,"context_line":"# recon_cache_path \u003d /var/cache/swift"},{"line_number":90,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"fe2c7aac_e6b81334","line":87,"in_reply_to":"f6ddfb77_ad46d097","updated":"2024-03-15 01:38:23.000000000","message":"Got it, I\u0027m putting it in the object-server.conf-sample as well for now.","commit_id":"a342856a1c5bf85679a9ae32c6e5ddce8f94f4ae"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":false,"context_lines":[{"line_number":84,"context_line":"# grace_period_AUTH_test \u003d 300.0"},{"line_number":85,"context_line":"# grace_period_AUTH_test2 \u003d 86400.0"},{"line_number":86,"context_line":"# grace_period_AUTH_test/test \u003d 400.0"},{"line_number":87,"context_line":"# grace_period_AUTH_test/test2 \u003d 600.0"},{"line_number":88,"context_line":"#"},{"line_number":89,"context_line":"# recon_cache_path \u003d /var/cache/swift"},{"line_number":90,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"72f6fc73_1eacc9fb","line":87,"in_reply_to":"fe2c7aac_e6b81334","updated":"2024-03-19 20:17:11.000000000","message":"Done","commit_id":"a342856a1c5bf85679a9ae32c6e5ddce8f94f4ae"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a79043e569a789197d3d3a377073f0dc29cf740d","unresolved":true,"context_lines":[{"line_number":77,"context_line":"# After the grace_period has passed objects will be expired as normal."},{"line_number":78,"context_line":"# You may configure this grace period in seconds with dynamic config"},{"line_number":79,"context_line":"# option names prefixed with grace_period_\u003cACCT\u003e for per-account grace periods"},{"line_number":80,"context_line":"# and grace_period_\u003cACCT\u003e/\u003cCNTR\u003e for per-container grace periods."},{"line_number":81,"context_line":"# A per-container grace period does not require a per-account grace period"},{"line_number":82,"context_line":"# but overrides the per-account grace period for the same account if it exists."},{"line_number":83,"context_line":"# N.B. By default no grace_period is configured for any accounts or containers."}],"source_content_type":"application/octet-stream","patch_set":16,"id":"5e9ade70_6a7bfdaa","line":80,"updated":"2024-03-14 14:27:27.000000000","message":"nit: Insert \"Should be a float value greater than or equal to zero.\"","commit_id":"8e7d26f249249f324bf9953b577cd47a1bddf85c"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":false,"context_lines":[{"line_number":77,"context_line":"# After the grace_period has passed objects will be expired as normal."},{"line_number":78,"context_line":"# You may configure this grace period in seconds with dynamic config"},{"line_number":79,"context_line":"# option names prefixed with grace_period_\u003cACCT\u003e for per-account grace periods"},{"line_number":80,"context_line":"# and grace_period_\u003cACCT\u003e/\u003cCNTR\u003e for per-container grace periods."},{"line_number":81,"context_line":"# A per-container grace period does not require a per-account grace period"},{"line_number":82,"context_line":"# but overrides the per-account grace period for the same account if it exists."},{"line_number":83,"context_line":"# N.B. By default no grace_period is configured for any accounts or containers."}],"source_content_type":"application/octet-stream","patch_set":16,"id":"893440b6_124499ba","line":80,"in_reply_to":"5e9ade70_6a7bfdaa","updated":"2024-03-15 01:38:23.000000000","message":"Acknowledged","commit_id":"8e7d26f249249f324bf9953b577cd47a1bddf85c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5171b4ae2bd6ce0225359af7d6b037bbe7abd4b7","unresolved":true,"context_lines":[{"line_number":74,"context_line":"#"},{"line_number":75,"context_line":"# The expirer can be tuned to leave expired objects on disk (and in container"},{"line_number":76,"context_line":"# listings) for a per-account or per-container grace_period."},{"line_number":77,"context_line":"# After the grace_period has passed objects will be expired as normal."},{"line_number":78,"context_line":"# You may configure this grace period in seconds with dynamic config"},{"line_number":79,"context_line":"# option names prefixed with grace_period_\u003cACCT\u003e for per-account grace periods"},{"line_number":80,"context_line":"# and grace_period_\u003cACCT\u003e/\u003cCNTR\u003e for per-container grace periods."}],"source_content_type":"application/octet-stream","patch_set":17,"id":"609385fa_68a6002c","line":77,"range":{"start_line":77,"start_character":52,"end_line":77,"end_character":60},"updated":"2024-03-20 10:52:09.000000000","message":"s/expired/deleted/","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":74,"context_line":"#"},{"line_number":75,"context_line":"# The expirer can be tuned to leave expired objects on disk (and in container"},{"line_number":76,"context_line":"# listings) for a per-account or per-container grace_period."},{"line_number":77,"context_line":"# After the grace_period has passed objects will be expired as normal."},{"line_number":78,"context_line":"# You may configure this grace period in seconds with dynamic config"},{"line_number":79,"context_line":"# option names prefixed with grace_period_\u003cACCT\u003e for per-account grace periods"},{"line_number":80,"context_line":"# and grace_period_\u003cACCT\u003e/\u003cCNTR\u003e for per-container grace periods."}],"source_content_type":"application/octet-stream","patch_set":17,"id":"26c37c22_72d0688c","line":77,"range":{"start_line":77,"start_character":52,"end_line":77,"end_character":60},"in_reply_to":"609385fa_68a6002c","updated":"2024-03-20 22:17:08.000000000","message":"Done","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5171b4ae2bd6ce0225359af7d6b037bbe7abd4b7","unresolved":true,"context_lines":[{"line_number":85,"context_line":"# grace_period_AUTH_test \u003d 300.0"},{"line_number":86,"context_line":"# grace_period_AUTH_test2 \u003d 86400.0"},{"line_number":87,"context_line":"# grace_period_AUTH_test/test \u003d 400.0"},{"line_number":88,"context_line":"# grace_period_AUTH_test/test2 \u003d 600.0"},{"line_number":89,"context_line":"#"},{"line_number":90,"context_line":"# recon_cache_path \u003d /var/cache/swift"},{"line_number":91,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"7bb1c302_7889713b","line":88,"updated":"2024-03-20 10:52:09.000000000","message":"nit: elsewhere I/we said that we only ever put default values in conf files, but here of course there is no sensible default, and the examples are useful. It\u0027s kind of obvious, but maybe add clarify:\n\n```\nFor example:\n# grace_period_AUTH_test \u003d 300.0\n# grace_period_AUTH_test2 \u003d 86400.0\n# grace_period_AUTH_test/test \u003d 400.0\n# grace_period_AUTH_test/test2 \u003d 600.0\n# N.B. By default no grace_period is configured for any accounts or containers.\n```\n\nI moved the N.B. so that it\u0027s the last thing you read.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":85,"context_line":"# grace_period_AUTH_test \u003d 300.0"},{"line_number":86,"context_line":"# grace_period_AUTH_test2 \u003d 86400.0"},{"line_number":87,"context_line":"# grace_period_AUTH_test/test \u003d 400.0"},{"line_number":88,"context_line":"# grace_period_AUTH_test/test2 \u003d 600.0"},{"line_number":89,"context_line":"#"},{"line_number":90,"context_line":"# recon_cache_path \u003d /var/cache/swift"},{"line_number":91,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"a27998b6_bb760e75","line":88,"in_reply_to":"7bb1c302_7889713b","updated":"2024-03-20 22:17:08.000000000","message":"Got it. Thanks for pointing this out. I think this makes it much more readable","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"34a158cade6e3149ba96b72056a1562194f31b9f","unresolved":true,"context_lines":[{"line_number":87,"context_line":"# For example:"},{"line_number":88,"context_line":"# delay_reaping_AUTH_test \u003d 300.0"},{"line_number":89,"context_line":"# delay_reaping_AUTH_test2 \u003d 86400.0"},{"line_number":90,"context_line":"# delay_reaping_AUTH_test/test \u003d 400.0"},{"line_number":91,"context_line":"# delay_reaping_AUTH_test/test2 \u003d 600.0"},{"line_number":92,"context_line":"# N.B. By default no delay_reaping value is configured for any accounts or"},{"line_number":93,"context_line":"# containers."}],"source_content_type":"application/octet-stream","patch_set":21,"id":"28a5f7a4_e43a75cc","line":90,"range":{"start_line":90,"start_character":16,"end_line":90,"end_character":30},"updated":"2024-04-22 20:15:17.000000000","message":"How should we deal with container names with newlines, or equals signs?","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"e859efbab069a688bdb0d231c81b1d7052a3bc0f","unresolved":false,"context_lines":[{"line_number":87,"context_line":"# For example:"},{"line_number":88,"context_line":"# delay_reaping_AUTH_test \u003d 300.0"},{"line_number":89,"context_line":"# delay_reaping_AUTH_test2 \u003d 86400.0"},{"line_number":90,"context_line":"# delay_reaping_AUTH_test/test \u003d 400.0"},{"line_number":91,"context_line":"# delay_reaping_AUTH_test/test2 \u003d 600.0"},{"line_number":92,"context_line":"# N.B. By default no delay_reaping value is configured for any accounts or"},{"line_number":93,"context_line":"# containers."}],"source_content_type":"application/octet-stream","patch_set":21,"id":"b78e0bf7_2e01a5d2","line":90,"range":{"start_line":90,"start_character":16,"end_line":90,"end_character":30},"in_reply_to":"28a5f7a4_e43a75cc","updated":"2024-04-24 21:15:22.000000000","message":"Using url parsing with Tim\u0027s new patch, just squashed that patch in","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"}],"etc/object-server.conf-sample":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f501b54be83fd1e0dbff5943a9cdcc40d9a15fa7","unresolved":true,"context_lines":[{"line_number":652,"context_line":"#"},{"line_number":653,"context_line":"# grace_period is a minimum time after object expiry before it will be deleted"},{"line_number":654,"context_line":"#"},{"line_number":655,"context_line":"# grace period \u003d 86400.0"},{"line_number":656,"context_line":"#"},{"line_number":657,"context_line":"# report_interval \u003d 300.0"},{"line_number":658,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"34cf1c4a_a93251bc","line":655,"range":{"start_line":655,"start_character":17,"end_line":655,"end_character":24},"updated":"2023-02-22 20:31:02.000000000","message":"Usually, the sample config has the default value, so `0.0`\n\n(Which is definitely the right default, BTW -- love that we\u0027re preserving existing behavior.)","commit_id":"639625dda626c68fabd4bc0a98c69cb90daeb03f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":false,"context_lines":[{"line_number":652,"context_line":"#"},{"line_number":653,"context_line":"# grace_period is a minimum time after object expiry before it will be deleted"},{"line_number":654,"context_line":"#"},{"line_number":655,"context_line":"# grace period \u003d 86400.0"},{"line_number":656,"context_line":"#"},{"line_number":657,"context_line":"# report_interval \u003d 300.0"},{"line_number":658,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"ec93eaee_2c3f9c18","line":655,"range":{"start_line":655,"start_character":17,"end_line":655,"end_character":24},"in_reply_to":"34cf1c4a_a93251bc","updated":"2024-03-19 20:17:11.000000000","message":"the \"default\" is really that no \"grace_period_\" prefixed config options exist.  I think the \"N.B. By default no grace_period is configured\" is about as good as we can do in the example config.","commit_id":"639625dda626c68fabd4bc0a98c69cb90daeb03f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5171b4ae2bd6ce0225359af7d6b037bbe7abd4b7","unresolved":true,"context_lines":[{"line_number":727,"context_line":"#"},{"line_number":728,"context_line":"# The expirer can be tuned to leave expired objects on disk (and in container"},{"line_number":729,"context_line":"# listings) for a per-account or per-container grace_period."},{"line_number":730,"context_line":"# After the grace_period has passed objects will be expired as normal."},{"line_number":731,"context_line":"# You may configure this grace period in seconds with dynamic config"},{"line_number":732,"context_line":"# option names prefixed with grace_period_\u003cACCT\u003e for per-account grace periods"},{"line_number":733,"context_line":"# and grace_period_\u003cACCT\u003e/\u003cCNTR\u003e for per-container grace periods."}],"source_content_type":"application/octet-stream","patch_set":17,"id":"8cae0c37_2c94f205","line":730,"range":{"start_line":730,"start_character":52,"end_line":730,"end_character":59},"updated":"2024-03-20 10:52:09.000000000","message":"s/expired/deleted/","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":727,"context_line":"#"},{"line_number":728,"context_line":"# The expirer can be tuned to leave expired objects on disk (and in container"},{"line_number":729,"context_line":"# listings) for a per-account or per-container grace_period."},{"line_number":730,"context_line":"# After the grace_period has passed objects will be expired as normal."},{"line_number":731,"context_line":"# You may configure this grace period in seconds with dynamic config"},{"line_number":732,"context_line":"# option names prefixed with grace_period_\u003cACCT\u003e for per-account grace periods"},{"line_number":733,"context_line":"# and grace_period_\u003cACCT\u003e/\u003cCNTR\u003e for per-container grace periods."}],"source_content_type":"application/octet-stream","patch_set":17,"id":"50b75031_93ac9bd0","line":730,"range":{"start_line":730,"start_character":52,"end_line":730,"end_character":59},"in_reply_to":"8cae0c37_2c94f205","updated":"2024-03-20 22:17:08.000000000","message":"Done","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":733,"context_line":"# and grace_period_\u003cACCT\u003e/\u003cCNTR\u003e for per-container grace periods."},{"line_number":734,"context_line":"# The grace period should be a float value greater than or equal to zero."},{"line_number":735,"context_line":"# A per-container grace period does not require a per-account grace period"},{"line_number":736,"context_line":"# but overrides the per-account grace period for the same account if it exists."},{"line_number":737,"context_line":"# N.B. By default no grace_period is configured for any accounts or containers."},{"line_number":738,"context_line":"# grace_period_AUTH_test \u003d 300.0"},{"line_number":739,"context_line":"# grace_period_AUTH_test2 \u003d 86400.0"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"23b5c206_3da0f4fa","line":736,"updated":"2024-03-19 20:17:11.000000000","message":"this is great!","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":733,"context_line":"# and grace_period_\u003cACCT\u003e/\u003cCNTR\u003e for per-container grace periods."},{"line_number":734,"context_line":"# The grace period should be a float value greater than or equal to zero."},{"line_number":735,"context_line":"# A per-container grace period does not require a per-account grace period"},{"line_number":736,"context_line":"# but overrides the per-account grace period for the same account if it exists."},{"line_number":737,"context_line":"# N.B. By default no grace_period is configured for any accounts or containers."},{"line_number":738,"context_line":"# grace_period_AUTH_test \u003d 300.0"},{"line_number":739,"context_line":"# grace_period_AUTH_test2 \u003d 86400.0"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"6294873c_cf4e862b","line":736,"in_reply_to":"23b5c206_3da0f4fa","updated":"2024-03-20 22:17:08.000000000","message":"Acknowledged","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":738,"context_line":"# grace_period_AUTH_test \u003d 300.0"},{"line_number":739,"context_line":"# grace_period_AUTH_test2 \u003d 86400.0"},{"line_number":740,"context_line":"# grace_period_AUTH_test/test \u003d 400.0"},{"line_number":741,"context_line":"# grace_period_AUTH_test/test2 \u003d 600.0"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"[object-relinker]"},{"line_number":744,"context_line":"# You can override the default log routing for this app here (don\u0027t use set!):"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"1893bdf3_9800d184","line":741,"updated":"2024-03-19 20:17:11.000000000","message":"there\u0027s a strong convention of \"documenting\" the defaults; but to me this is clear as-is, and I can\u0027t think of any good ways to make it more clear that these are just e.g. than the N.B.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":738,"context_line":"# grace_period_AUTH_test \u003d 300.0"},{"line_number":739,"context_line":"# grace_period_AUTH_test2 \u003d 86400.0"},{"line_number":740,"context_line":"# grace_period_AUTH_test/test \u003d 400.0"},{"line_number":741,"context_line":"# grace_period_AUTH_test/test2 \u003d 600.0"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"[object-relinker]"},{"line_number":744,"context_line":"# You can override the default log routing for this app here (don\u0027t use set!):"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"a6a1aab8_2fa17d8c","line":741,"in_reply_to":"1893bdf3_9800d184","updated":"2024-03-20 22:17:08.000000000","message":"Acknowledged","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5171b4ae2bd6ce0225359af7d6b037bbe7abd4b7","unresolved":true,"context_lines":[{"line_number":738,"context_line":"# grace_period_AUTH_test \u003d 300.0"},{"line_number":739,"context_line":"# grace_period_AUTH_test2 \u003d 86400.0"},{"line_number":740,"context_line":"# grace_period_AUTH_test/test \u003d 400.0"},{"line_number":741,"context_line":"# grace_period_AUTH_test/test2 \u003d 600.0"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"[object-relinker]"},{"line_number":744,"context_line":"# You can override the default log routing for this app here (don\u0027t use set!):"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"b09d6c74_792af973","line":741,"in_reply_to":"1893bdf3_9800d184","updated":"2024-03-20 10:52:09.000000000","message":"hehe, so I just wrote in the previous file...\n\nnit: elsewhere I/we said that we only ever put default values in conf files, but here of course there is no sensible default, and the examples are useful. It\u0027s kind of obvious, but maybe add clarify:\n\n```\nFor example:\n# grace_period_AUTH_test \u003d 300.0\n# grace_period_AUTH_test2 \u003d 86400.0\n# grace_period_AUTH_test/test \u003d 400.0\n# grace_period_AUTH_test/test2 \u003d 600.0\n# N.B. By default no grace_period is configured for any accounts or containers.\n```\n\nI moved the N.B. so that it\u0027s the last thing you read.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"42d4c8f469bb0116aa2a333c18a3a72568f15660","unresolved":true,"context_lines":[{"line_number":743,"context_line":"# delay_reaping_AUTH_test/test \u003d 400.0"},{"line_number":744,"context_line":"# delay_reaping_AUTH_test/test2 \u003d 600.0"},{"line_number":745,"context_line":"# N.B. By default no delay_reaping value is configured for any accounts or"},{"line_number":746,"context_line":"# containers."},{"line_number":747,"context_line":""},{"line_number":748,"context_line":"[object-relinker]"},{"line_number":749,"context_line":"# You can override the default log routing for this app here (don\u0027t use set!):"}],"source_content_type":"application/octet-stream","patch_set":19,"id":"a7f0a96d_91906144","line":746,"updated":"2024-04-16 18:14:01.000000000","message":"this is in the xprofile section","commit_id":"d51168cc493a7326f5af30e15550efa272dd571e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"1092af33b3baa80286c6c87b3c16d1c3841fc3b7","unresolved":false,"context_lines":[{"line_number":743,"context_line":"# delay_reaping_AUTH_test/test \u003d 400.0"},{"line_number":744,"context_line":"# delay_reaping_AUTH_test/test2 \u003d 600.0"},{"line_number":745,"context_line":"# N.B. By default no delay_reaping value is configured for any accounts or"},{"line_number":746,"context_line":"# containers."},{"line_number":747,"context_line":""},{"line_number":748,"context_line":"[object-relinker]"},{"line_number":749,"context_line":"# You can override the default log routing for this app here (don\u0027t use set!):"}],"source_content_type":"application/octet-stream","patch_set":19,"id":"142c5389_0ffcc82e","line":746,"in_reply_to":"a7f0a96d_91906144","updated":"2024-04-17 20:05:11.000000000","message":"Good catch, ended up there by mistake","commit_id":"d51168cc493a7326f5af30e15550efa272dd571e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9bfa35a2708b8ac0f90a56523284457677874aa4","unresolved":true,"context_lines":[{"line_number":692,"context_line":"# ionice_class \u003d"},{"line_number":693,"context_line":"# ionice_priority \u003d"},{"line_number":694,"context_line":"#"},{"line_number":695,"context_line":"# Note: Put it at the beginning of the pipleline to profile all middleware. But"},{"line_number":696,"context_line":"# it is safer to put this after healthcheck."},{"line_number":697,"context_line":"#"},{"line_number":698,"context_line":"# The expirer can delay the reaping of expired objects on disk (and in"},{"line_number":699,"context_line":"# container listings) with an account level or container level delay_reaping"}],"source_content_type":"application/octet-stream","patch_set":20,"id":"0ab3a7a6_ecfee4eb","line":696,"range":{"start_line":695,"start_character":2,"end_line":696,"end_character":44},"updated":"2024-04-18 08:00:46.000000000","message":"These two lines belong with the xprofile section.\n\nIMHO it would have been better if this Note was after line 718, so clearly part of xprofile.","commit_id":"d875bee2f4458f4e47652c147335c6611566a684"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"b2617d896106f8d5fb1b6df6be7a69de91d59631","unresolved":true,"context_lines":[{"line_number":692,"context_line":"# ionice_class \u003d"},{"line_number":693,"context_line":"# ionice_priority \u003d"},{"line_number":694,"context_line":"#"},{"line_number":695,"context_line":"# Note: Put it at the beginning of the pipleline to profile all middleware. But"},{"line_number":696,"context_line":"# it is safer to put this after healthcheck."},{"line_number":697,"context_line":"#"},{"line_number":698,"context_line":"# The expirer can delay the reaping of expired objects on disk (and in"},{"line_number":699,"context_line":"# container listings) with an account level or container level delay_reaping"}],"source_content_type":"application/octet-stream","patch_set":20,"id":"2b6684b5_d2efd0e2","line":696,"range":{"start_line":695,"start_character":2,"end_line":696,"end_character":44},"in_reply_to":"0ab3a7a6_ecfee4eb","updated":"2024-04-18 16:11:29.000000000","message":"I see. Moved it to right around 718, hopefully that makes sense.","commit_id":"d875bee2f4458f4e47652c147335c6611566a684"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"63dc6ad992976da09ba7926745c90e4b75e9638a","unresolved":false,"context_lines":[{"line_number":692,"context_line":"# ionice_class \u003d"},{"line_number":693,"context_line":"# ionice_priority \u003d"},{"line_number":694,"context_line":"#"},{"line_number":695,"context_line":"# Note: Put it at the beginning of the pipleline to profile all middleware. But"},{"line_number":696,"context_line":"# it is safer to put this after healthcheck."},{"line_number":697,"context_line":"#"},{"line_number":698,"context_line":"# The expirer can delay the reaping of expired objects on disk (and in"},{"line_number":699,"context_line":"# container listings) with an account level or container level delay_reaping"}],"source_content_type":"application/octet-stream","patch_set":20,"id":"389c16f8_e21f5aeb","line":696,"range":{"start_line":695,"start_character":2,"end_line":696,"end_character":44},"in_reply_to":"2b6684b5_d2efd0e2","updated":"2024-04-19 10:35:48.000000000","message":"Done","commit_id":"d875bee2f4458f4e47652c147335c6611566a684"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"34a158cade6e3149ba96b72056a1562194f31b9f","unresolved":true,"context_lines":[{"line_number":710,"context_line":"# delay_reaping_AUTH_test/test \u003d 400.0"},{"line_number":711,"context_line":"# delay_reaping_AUTH_test/test2 \u003d 600.0"},{"line_number":712,"context_line":"# N.B. By default no delay_reaping value is configured for any accounts or"},{"line_number":713,"context_line":"# containers."},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"[filter:xprofile]"},{"line_number":716,"context_line":"use \u003d egg:swift#xprofile"}],"source_content_type":"application/octet-stream","patch_set":21,"id":"45cc4a7b_c7ce2fb2","line":713,"updated":"2024-04-22 20:15:17.000000000","message":"I kind of expected there to be a cluster-wide `delay_reaping` option as well.","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6666e57b021ef828ad08294c1c6034301663b130","unresolved":true,"context_lines":[{"line_number":710,"context_line":"# delay_reaping_AUTH_test/test \u003d 400.0"},{"line_number":711,"context_line":"# delay_reaping_AUTH_test/test2 \u003d 600.0"},{"line_number":712,"context_line":"# N.B. By default no delay_reaping value is configured for any accounts or"},{"line_number":713,"context_line":"# containers."},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"[filter:xprofile]"},{"line_number":716,"context_line":"use \u003d egg:swift#xprofile"}],"source_content_type":"application/octet-stream","patch_set":21,"id":"d87c789f_e57bd9ac","line":713,"in_reply_to":"262db8c4_cdde6330","updated":"2024-04-26 09:19:50.000000000","message":"I also queried this. When we discussed it we concluded that (a) yes it might be a nice feature, (b) nothing precludes it being added, (c) no-one has asked for it yet. So, ok to leave for a follow-up as and when.","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d7388f52791539a1e3b06cc1066ac172e44f6e78","unresolved":true,"context_lines":[{"line_number":710,"context_line":"# delay_reaping_AUTH_test/test \u003d 400.0"},{"line_number":711,"context_line":"# delay_reaping_AUTH_test/test2 \u003d 600.0"},{"line_number":712,"context_line":"# N.B. By default no delay_reaping value is configured for any accounts or"},{"line_number":713,"context_line":"# containers."},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"[filter:xprofile]"},{"line_number":716,"context_line":"use \u003d egg:swift#xprofile"}],"source_content_type":"application/octet-stream","patch_set":21,"id":"262db8c4_cdde6330","line":713,"in_reply_to":"35345a27_aba4096b","updated":"2024-04-26 07:42:49.000000000","message":"I agree with Tim, but as mentioned, this can easily be a follow up, let\u0027s not hold up things.","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"e859efbab069a688bdb0d231c81b1d7052a3bc0f","unresolved":true,"context_lines":[{"line_number":710,"context_line":"# delay_reaping_AUTH_test/test \u003d 400.0"},{"line_number":711,"context_line":"# delay_reaping_AUTH_test/test2 \u003d 600.0"},{"line_number":712,"context_line":"# N.B. By default no delay_reaping value is configured for any accounts or"},{"line_number":713,"context_line":"# containers."},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"[filter:xprofile]"},{"line_number":716,"context_line":"use \u003d egg:swift#xprofile"}],"source_content_type":"application/octet-stream","patch_set":21,"id":"35345a27_aba4096b","line":713,"in_reply_to":"45cc4a7b_c7ce2fb2","updated":"2024-04-24 21:15:22.000000000","message":"We discussed having this, but we concluded that this isn\u0027t something we need right now. \n\nThis feature came forward mostly out of need for Maglev, who only needed account/container level delay_reaping, and not a global `delay_reaping` option, but this is definitely something we could add in the future","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"}],"swift/common/middleware/tempurl.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"724938bca5d080010f7816148cef66a5179199e1","unresolved":true,"context_lines":[{"line_number":326,"context_line":"#: delimited list of header names and names can optionally end with \u0027*\u0027 to"},{"line_number":327,"context_line":"#: indicate a prefix match. DEFAULT_INCOMING_ALLOW_HEADERS is a list of"},{"line_number":328,"context_line":"#: exceptions to these removals."},{"line_number":329,"context_line":"DEFAULT_INCOMING_REMOVE_HEADERS \u003d \u0027x-timestamp x-open-expired\u0027"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"#: Default headers as exceptions to DEFAULT_INCOMING_REMOVE_HEADERS. Simply a"},{"line_number":332,"context_line":"#: whitespace delimited list of header names and names can optionally end with"}],"source_content_type":"text/x-python","patch_set":14,"id":"2c30474f_4f03f0a7","line":329,"updated":"2024-03-08 05:38:04.000000000","message":"Cool! Nice like we talked about","commit_id":"5f753b64956a8bb7292ae034f44c674a9872fb99"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":false,"context_lines":[{"line_number":326,"context_line":"#: delimited list of header names and names can optionally end with \u0027*\u0027 to"},{"line_number":327,"context_line":"#: indicate a prefix match. DEFAULT_INCOMING_ALLOW_HEADERS is a list of"},{"line_number":328,"context_line":"#: exceptions to these removals."},{"line_number":329,"context_line":"DEFAULT_INCOMING_REMOVE_HEADERS \u003d \u0027x-timestamp x-open-expired\u0027"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"#: Default headers as exceptions to DEFAULT_INCOMING_REMOVE_HEADERS. Simply a"},{"line_number":332,"context_line":"#: whitespace delimited list of header names and names can optionally end with"}],"source_content_type":"text/x-python","patch_set":14,"id":"7baea1b2_71d50a50","line":329,"in_reply_to":"2c30474f_4f03f0a7","updated":"2024-03-15 01:38:23.000000000","message":"Acknowledged","commit_id":"5f753b64956a8bb7292ae034f44c674a9872fb99"}],"swift/common/utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"44585cc05c3de34aa31101585d15872fa9d5f223","unresolved":true,"context_lines":[{"line_number":3205,"context_line":"            # values like \"1%\" (which we want to support for"},{"line_number":3206,"context_line":"            # fallocate_reserve)."},{"line_number":3207,"context_line":"            c \u003d ConfigParser(defaults, interpolation\u003dNicerInterpolation())"},{"line_number":3208,"context_line":"    c.optionxform \u003d str  # Don\u0027t lower-case keys"},{"line_number":3209,"context_line":""},{"line_number":3210,"context_line":"    if hasattr(conf_path, \u0027readline\u0027):"},{"line_number":3211,"context_line":"        if hasattr(conf_path, \u0027seek\u0027):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a9b6eca_76c2e0c7","line":3208,"updated":"2023-03-27 19:17:30.000000000","message":"i know this seems like a big deal, but maybe it\u0027s not\n\nhttps://review.opendev.org/c/openstack/swift/+/25353/1#message-a0b5241ac060de5edf820e29aa83ddca7822d0e7","commit_id":"083cde333c61c988d89816e642f474b238d68721"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d3fa1288016e101c084197cd9f0e283b2570d7ea","unresolved":false,"context_lines":[{"line_number":3205,"context_line":"            # values like \"1%\" (which we want to support for"},{"line_number":3206,"context_line":"            # fallocate_reserve)."},{"line_number":3207,"context_line":"            c \u003d ConfigParser(defaults, interpolation\u003dNicerInterpolation())"},{"line_number":3208,"context_line":"    c.optionxform \u003d str  # Don\u0027t lower-case keys"},{"line_number":3209,"context_line":""},{"line_number":3210,"context_line":"    if hasattr(conf_path, \u0027readline\u0027):"},{"line_number":3211,"context_line":"        if hasattr(conf_path, \u0027seek\u0027):"}],"source_content_type":"text/x-python","patch_set":6,"id":"290533c1_ba9074f4","line":3208,"in_reply_to":"6d376de6_0bd82249","updated":"2024-04-01 19:43:12.000000000","message":"looks like this was adressed/merged.","commit_id":"083cde333c61c988d89816e642f474b238d68721"},{"author":{"_account_id":396,"name":"Mandell","email":"mdegerness@nvidia.com","username":"mdegerne"},"change_message_id":"915909ba1bdda5d32499ece5525fa83a19a57080","unresolved":true,"context_lines":[{"line_number":3205,"context_line":"            # values like \"1%\" (which we want to support for"},{"line_number":3206,"context_line":"            # fallocate_reserve)."},{"line_number":3207,"context_line":"            c \u003d ConfigParser(defaults, interpolation\u003dNicerInterpolation())"},{"line_number":3208,"context_line":"    c.optionxform \u003d str  # Don\u0027t lower-case keys"},{"line_number":3209,"context_line":""},{"line_number":3210,"context_line":"    if hasattr(conf_path, \u0027readline\u0027):"},{"line_number":3211,"context_line":"        if hasattr(conf_path, \u0027seek\u0027):"}],"source_content_type":"text/x-python","patch_set":6,"id":"c3b97698_0bd25d10","line":3208,"in_reply_to":"9a9b6eca_76c2e0c7","updated":"2023-03-27 20:24:40.000000000","message":"Possibly breaking people\u0027s configs seems like a big deal, even if we don\u0027t know anyone personally effected.","commit_id":"083cde333c61c988d89816e642f474b238d68721"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"659a3ab10c546453c1591b245ae5c3f48b823192","unresolved":true,"context_lines":[{"line_number":3205,"context_line":"            # values like \"1%\" (which we want to support for"},{"line_number":3206,"context_line":"            # fallocate_reserve)."},{"line_number":3207,"context_line":"            c \u003d ConfigParser(defaults, interpolation\u003dNicerInterpolation())"},{"line_number":3208,"context_line":"    c.optionxform \u003d str  # Don\u0027t lower-case keys"},{"line_number":3209,"context_line":""},{"line_number":3210,"context_line":"    if hasattr(conf_path, \u0027readline\u0027):"},{"line_number":3211,"context_line":"        if hasattr(conf_path, \u0027seek\u0027):"}],"source_content_type":"text/x-python","patch_set":6,"id":"e1251aad_06830475","line":3208,"in_reply_to":"c3b97698_0bd25d10","updated":"2023-03-27 21:08:33.000000000","message":"Everything we could type could *possibly* break someone\u0027s config even if we don\u0027t know anyone personally effected - so that doesn\u0027t seem like a strong argument for inaction.\n\nBesides, do you have a better idea?  Or a good reason to maintain the case-insensitive nature that a) we didn\u0027t even know we had and b) is the source of *this* bug (i.e. a BUG that expected case-sensitive configs is how we found out about this surprising inconsistency).\n\nI\u0027m not saying disregard the risk, i\u0027m saying there\u0027s no evidence yet to suggest this will cause a problem (all tests are passing, wsgi configs already worked this way, etc)","commit_id":"083cde333c61c988d89816e642f474b238d68721"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ceadb0d90d63dc190ffed8ccfbff54af4f4551e7","unresolved":true,"context_lines":[{"line_number":3205,"context_line":"            # values like \"1%\" (which we want to support for"},{"line_number":3206,"context_line":"            # fallocate_reserve)."},{"line_number":3207,"context_line":"            c \u003d ConfigParser(defaults, interpolation\u003dNicerInterpolation())"},{"line_number":3208,"context_line":"    c.optionxform \u003d str  # Don\u0027t lower-case keys"},{"line_number":3209,"context_line":""},{"line_number":3210,"context_line":"    if hasattr(conf_path, \u0027readline\u0027):"},{"line_number":3211,"context_line":"        if hasattr(conf_path, \u0027seek\u0027):"}],"source_content_type":"text/x-python","patch_set":6,"id":"6d376de6_0bd82249","line":3208,"in_reply_to":"e1251aad_06830475","updated":"2023-04-04 21:12:20.000000000","message":"https://review.opendev.org/c/openstack/swift/+/879513","commit_id":"083cde333c61c988d89816e642f474b238d68721"}],"swift/obj/expirer.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f501b54be83fd1e0dbff5943a9cdcc40d9a15fa7","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        self.read_conf_for_queue_access(swift)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        self.report_interval \u003d float(conf.get(\u0027report_interval\u0027) or 300)"},{"line_number":103,"context_line":"        self.grace_period \u003d float(conf.get(\u0027grace_period\u0027) or 0)"},{"line_number":104,"context_line":"        self.report_first_time \u003d self.report_last_time \u003d time()"},{"line_number":105,"context_line":"        self.report_objects \u003d 0"},{"line_number":106,"context_line":"        self.recon_cache_path \u003d conf.get(\u0027recon_cache_path\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"8a7d2912_012a737e","line":103,"updated":"2023-02-22 20:31:02.000000000","message":"Probably good to raise an error on negative values.","commit_id":"639625dda626c68fabd4bc0a98c69cb90daeb03f"},{"author":{"_account_id":396,"name":"Mandell","email":"mdegerness@nvidia.com","username":"mdegerne"},"change_message_id":"915909ba1bdda5d32499ece5525fa83a19a57080","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        self.read_conf_for_queue_access(swift)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        self.report_interval \u003d float(conf.get(\u0027report_interval\u0027) or 300)"},{"line_number":103,"context_line":"        self.grace_period \u003d float(conf.get(\u0027grace_period\u0027) or 0)"},{"line_number":104,"context_line":"        self.report_first_time \u003d self.report_last_time \u003d time()"},{"line_number":105,"context_line":"        self.report_objects \u003d 0"},{"line_number":106,"context_line":"        self.recon_cache_path \u003d conf.get(\u0027recon_cache_path\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"52795d54_a22bdb6c","line":103,"in_reply_to":"8a7d2912_012a737e","updated":"2023-03-27 20:24:40.000000000","message":"Done","commit_id":"639625dda626c68fabd4bc0a98c69cb90daeb03f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f501b54be83fd1e0dbff5943a9cdcc40d9a15fa7","unresolved":true,"context_lines":[{"line_number":255,"context_line":"                                            prefix\u003dself.task_container_prefix):"},{"line_number":256,"context_line":"            task_container \u003d str(c[\u0027name\u0027])"},{"line_number":257,"context_line":"            timestamp \u003d self.delete_at_time_of_task_container(task_container)"},{"line_number":258,"context_line":"            now \u003d time() - self.grace_period"},{"line_number":259,"context_line":"            if timestamp \u003e Timestamp(now):"},{"line_number":260,"context_line":"                break"},{"line_number":261,"context_line":"            yield task_container"}],"source_content_type":"text/x-python","patch_set":1,"id":"9b3c2565_d8597a78","line":258,"range":{"start_line":258,"start_character":12,"end_line":258,"end_character":15},"updated":"2023-02-22 20:31:02.000000000","message":"nit: Might be better named `cutoff` or something? Seems odd to call it `now` when we\u0027re explicitly allowing it to *not* be right now...","commit_id":"639625dda626c68fabd4bc0a98c69cb90daeb03f"},{"author":{"_account_id":396,"name":"Mandell","email":"mdegerness@nvidia.com","username":"mdegerne"},"change_message_id":"915909ba1bdda5d32499ece5525fa83a19a57080","unresolved":false,"context_lines":[{"line_number":255,"context_line":"                                            prefix\u003dself.task_container_prefix):"},{"line_number":256,"context_line":"            task_container \u003d str(c[\u0027name\u0027])"},{"line_number":257,"context_line":"            timestamp \u003d self.delete_at_time_of_task_container(task_container)"},{"line_number":258,"context_line":"            now \u003d time() - self.grace_period"},{"line_number":259,"context_line":"            if timestamp \u003e Timestamp(now):"},{"line_number":260,"context_line":"                break"},{"line_number":261,"context_line":"            yield task_container"}],"source_content_type":"text/x-python","patch_set":1,"id":"24ca7eb3_c04ee00f","line":258,"range":{"start_line":258,"start_character":12,"end_line":258,"end_character":15},"in_reply_to":"9b3c2565_d8597a78","updated":"2023-03-27 20:24:40.000000000","message":"Done","commit_id":"639625dda626c68fabd4bc0a98c69cb90daeb03f"},{"author":{"_account_id":396,"name":"Mandell","email":"mdegerness@nvidia.com","username":"mdegerne"},"change_message_id":"915909ba1bdda5d32499ece5525fa83a19a57080","unresolved":true,"context_lines":[{"line_number":307,"context_line":"                    if grace_period:"},{"line_number":308,"context_line":"                        # we shouldn\u0027t yield the object if it\u0027s target_account"},{"line_number":309,"context_line":"                        # is under configured grace_period"},{"line_number":310,"context_line":"                        continue"},{"line_number":311,"context_line":"                    else:"},{"line_number":312,"context_line":"                        # we shouldn\u0027t yield ANY more objects that can\u0027t reach"},{"line_number":313,"context_line":"                        # the expiration date yet."}],"source_content_type":"text/x-python","patch_set":4,"id":"9ca27e75_feb840b8","line":310,"updated":"2023-03-27 20:24:40.000000000","message":"Please clarify my understanding. It is possible to have objects with multiple target_account values yielded from within the loop of swift.iter_objects(task_account, task_container)? I think I am missing something.","commit_id":"89c1fc5cc46e7272e8a95c9d15334373d58f8ff3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":false,"context_lines":[{"line_number":307,"context_line":"                    if grace_period:"},{"line_number":308,"context_line":"                        # we shouldn\u0027t yield the object if it\u0027s target_account"},{"line_number":309,"context_line":"                        # is under configured grace_period"},{"line_number":310,"context_line":"                        continue"},{"line_number":311,"context_line":"                    else:"},{"line_number":312,"context_line":"                        # we shouldn\u0027t yield ANY more objects that can\u0027t reach"},{"line_number":313,"context_line":"                        # the expiration date yet."}],"source_content_type":"text/x-python","patch_set":4,"id":"476172ad_283c417f","line":310,"in_reply_to":"28518ecd_3fce524b","updated":"2024-03-19 20:17:11.000000000","message":"Done","commit_id":"89c1fc5cc46e7272e8a95c9d15334373d58f8ff3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"659a3ab10c546453c1591b245ae5c3f48b823192","unresolved":true,"context_lines":[{"line_number":307,"context_line":"                    if grace_period:"},{"line_number":308,"context_line":"                        # we shouldn\u0027t yield the object if it\u0027s target_account"},{"line_number":309,"context_line":"                        # is under configured grace_period"},{"line_number":310,"context_line":"                        continue"},{"line_number":311,"context_line":"                    else:"},{"line_number":312,"context_line":"                        # we shouldn\u0027t yield ANY more objects that can\u0027t reach"},{"line_number":313,"context_line":"                        # the expiration date yet."}],"source_content_type":"text/x-python","patch_set":4,"id":"28518ecd_3fce524b","line":310,"in_reply_to":"9ca27e75_feb840b8","updated":"2023-03-27 21:08:33.000000000","message":"you might be getting mixed up with task_account (i.e. .expiring_objects) and target_account (e.g. AUTH_dev)\n\nany given expiring_objects container will have tasks for all the a/c/o that are set to expire in that time window.","commit_id":"89c1fc5cc46e7272e8a95c9d15334373d58f8ff3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"659a3ab10c546453c1591b245ae5c3f48b823192","unresolved":true,"context_lines":[{"line_number":311,"context_line":"                    else:"},{"line_number":312,"context_line":"                        # we shouldn\u0027t yield ANY more objects that can\u0027t reach"},{"line_number":313,"context_line":"                        # the expiration date yet."},{"line_number":314,"context_line":"                        break"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"                # Only one expirer daemon assigned for one task"},{"line_number":317,"context_line":"                if self.hash_mod(\u0027%s/%s\u0027 % (task_container, task_object),"}],"source_content_type":"text/x-python","patch_set":4,"id":"12c95993_fecf2ba2","line":314,"updated":"2023-03-27 21:08:33.000000000","message":"there\u0027s probably some dumb logic where half-way through a task_container we start to get tasks past now, but we keep parsing them until we get one that doesn\u0027t have a grace_period configured\n\ni think the early break might just be an optimization, but maybe I could phrase it better.","commit_id":"89c1fc5cc46e7272e8a95c9d15334373d58f8ff3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":311,"context_line":"                    else:"},{"line_number":312,"context_line":"                        # we shouldn\u0027t yield ANY more objects that can\u0027t reach"},{"line_number":313,"context_line":"                        # the expiration date yet."},{"line_number":314,"context_line":"                        break"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"                # Only one expirer daemon assigned for one task"},{"line_number":317,"context_line":"                if self.hash_mod(\u0027%s/%s\u0027 % (task_container, task_object),"}],"source_content_type":"text/x-python","patch_set":4,"id":"76838a67_46bbc6b9","line":314,"in_reply_to":"0786577b_a62f869d","updated":"2024-03-19 20:17:11.000000000","message":"YES!  and I find the logic slightly easier to reason about despite calling time.time twice and creating two Timestamps.\n\nTests seem happy with this diff; which I think might look even simpler against master:\n\n```\ndiff --git a/swift/obj/expirer.py b/swift/obj/expirer.py\nindex e58f14d0a..5647926bf 100644\n--- a/swift/obj/expirer.py\n+++ b/swift/obj/expirer.py\n@@ -314,18 +314,16 @@ class ObjectExpirer(Daemon):\n                     self.logger.exception(\u0027Unexcepted error handling task %r\u0027 %\n                                           task_object)\n                     continue\n+                if delete_timestamp \u003e Timestamp.now():\n+                    # we shouldn\u0027t yield ANY more objects that can\u0027t reach\n+                    # the expiration date yet.\n+                    break\n                 grace_period \u003d self.get_grace_period(target_account,\n                                                      target_container)\n-                cutoff \u003d time() - grace_period\n-                if delete_timestamp \u003e Timestamp(cutoff):\n-                    if grace_period:\n-                        # we shouldn\u0027t yield the object if it\n-                        # is subject to a grace_period\n-                        continue\n-                    else:\n-                        # we shouldn\u0027t yield ANY more objects that can\u0027t reach\n-                        # the expiration date yet.\n-                        break\n+                if delete_timestamp \u003e Timestamp(time() - grace_period):\n+                    # we shouldn\u0027t yield the object if it\n+                    # is subject to a grace_period\n+                    continue\n \n                 # Only one expirer daemon assigned for one task\n                 if self.hash_mod(\u0027%s/%s\u0027 % (task_container, task_object),\n```","commit_id":"89c1fc5cc46e7272e8a95c9d15334373d58f8ff3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5100d643476f92ae9eac0a477b171cdd5c9305d7","unresolved":true,"context_lines":[{"line_number":311,"context_line":"                    else:"},{"line_number":312,"context_line":"                        # we shouldn\u0027t yield ANY more objects that can\u0027t reach"},{"line_number":313,"context_line":"                        # the expiration date yet."},{"line_number":314,"context_line":"                        break"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"                # Only one expirer daemon assigned for one task"},{"line_number":317,"context_line":"                if self.hash_mod(\u0027%s/%s\u0027 % (task_container, task_object),"}],"source_content_type":"text/x-python","patch_set":4,"id":"47c4b09c_c657fe4e","line":314,"in_reply_to":"12c95993_fecf2ba2","updated":"2023-05-24 00:10:47.000000000","message":"We\u0027ve got the backstop in `iter_task_containers_to_expire` so I guess I\u0027m not _super_ worried...","commit_id":"89c1fc5cc46e7272e8a95c9d15334373d58f8ff3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a79043e569a789197d3d3a377073f0dc29cf740d","unresolved":true,"context_lines":[{"line_number":311,"context_line":"                    else:"},{"line_number":312,"context_line":"                        # we shouldn\u0027t yield ANY more objects that can\u0027t reach"},{"line_number":313,"context_line":"                        # the expiration date yet."},{"line_number":314,"context_line":"                        break"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"                # Only one expirer daemon assigned for one task"},{"line_number":317,"context_line":"                if self.hash_mod(\u0027%s/%s\u0027 % (task_container, task_object),"}],"source_content_type":"text/x-python","patch_set":4,"id":"0786577b_a62f869d","line":314,"in_reply_to":"47c4b09c_c657fe4e","updated":"2024-03-14 14:27:27.000000000","message":"can this not be written:\n\n```\nif delete_timestamp \u003e Timestamp.now():\n    break\nif delete_timestamp \u003e Timestamp(time() - grace_period):\n    continue\n```","commit_id":"89c1fc5cc46e7272e8a95c9d15334373d58f8ff3"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":311,"context_line":"                    else:"},{"line_number":312,"context_line":"                        # we shouldn\u0027t yield ANY more objects that can\u0027t reach"},{"line_number":313,"context_line":"                        # the expiration date yet."},{"line_number":314,"context_line":"                        break"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"                # Only one expirer daemon assigned for one task"},{"line_number":317,"context_line":"                if self.hash_mod(\u0027%s/%s\u0027 % (task_container, task_object),"}],"source_content_type":"text/x-python","patch_set":4,"id":"76eb42b2_587ad552","line":314,"in_reply_to":"76838a67_46bbc6b9","updated":"2024-03-20 22:17:08.000000000","message":"Took me a second to wrap my head around this logic but it makes a lot of sense now. Updating!","commit_id":"89c1fc5cc46e7272e8a95c9d15334373d58f8ff3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5100d643476f92ae9eac0a477b171cdd5c9305d7","unresolved":true,"context_lines":[{"line_number":114,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 604800))"},{"line_number":115,"context_line":"        self.acct_grace_periods \u003d {}"},{"line_number":116,"context_line":"        for conf_key in conf:"},{"line_number":117,"context_line":"            grace_period_prefix \u003d \"grace_period_\""},{"line_number":118,"context_line":"            if not conf_key.startswith(grace_period_prefix):"},{"line_number":119,"context_line":"                continue"},{"line_number":120,"context_line":"            account \u003d conf_key[len(grace_period_prefix):]"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f5a3bb0_e6b65ac2","line":117,"range":{"start_line":117,"start_character":35,"end_line":117,"end_character":48},"updated":"2023-05-24 00:10:47.000000000","message":"Maybe `delay_expiring_`, similar to account-reaper\u0027s `delay_reaping`? https://github.com/openstack/swift/blob/2.31.0/etc/account-server.conf-sample#L274","commit_id":"e1b8c4b68fb58efded42166b866c64b60b3dd9ea"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d3fa1288016e101c084197cd9f0e283b2570d7ea","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 604800))"},{"line_number":115,"context_line":"        self.acct_grace_periods \u003d {}"},{"line_number":116,"context_line":"        for conf_key in conf:"},{"line_number":117,"context_line":"            grace_period_prefix \u003d \"grace_period_\""},{"line_number":118,"context_line":"            if not conf_key.startswith(grace_period_prefix):"},{"line_number":119,"context_line":"                continue"},{"line_number":120,"context_line":"            account \u003d conf_key[len(grace_period_prefix):]"}],"source_content_type":"text/x-python","patch_set":9,"id":"c5d21420_d7f695cc","line":117,"range":{"start_line":117,"start_character":35,"end_line":117,"end_character":48},"in_reply_to":"55f49f1e_6d3cd53f","updated":"2024-04-01 19:43:12.000000000","message":"addressed in a follow-on 914768: expirer: account and container level delay_reaping | https://review.opendev.org/c/openstack/swift/+/914768 - we can squash before merge if we\u0027re ready.","commit_id":"e1b8c4b68fb58efded42166b866c64b60b3dd9ea"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5171b4ae2bd6ce0225359af7d6b037bbe7abd4b7","unresolved":true,"context_lines":[{"line_number":114,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 604800))"},{"line_number":115,"context_line":"        self.acct_grace_periods \u003d {}"},{"line_number":116,"context_line":"        for conf_key in conf:"},{"line_number":117,"context_line":"            grace_period_prefix \u003d \"grace_period_\""},{"line_number":118,"context_line":"            if not conf_key.startswith(grace_period_prefix):"},{"line_number":119,"context_line":"                continue"},{"line_number":120,"context_line":"            account \u003d conf_key[len(grace_period_prefix):]"}],"source_content_type":"text/x-python","patch_set":9,"id":"55f49f1e_6d3cd53f","line":117,"range":{"start_line":117,"start_character":35,"end_line":117,"end_character":48},"in_reply_to":"8f479c5b_1e87b4d8","updated":"2024-03-20 10:52:09.000000000","message":"uh-oh, \"naming\" 😄\n\nMy 2cents:\n* the *object has expired* when it is in the grace period - the docstrings describe it as expired, it can only be accessed by sending ``x-open-expired`` which very much suggests that it has *expired*, so grace period does not delay expiry. I\u0027d find it confusing to think about how long we delay expiring an object that has expired. Therefore ``delay_deleting`` would be a better alternative.\n\n* ``delay_reaping`` sounds like a command to me and I expected it to be a boolean. IMHO ``reaping_delay`` fits better with the actual dimension of a time period. In my head I\u0027d think \"Q: What is the reaping delay? A: 3600\". But I can see how another person might think \"Q: For how long do we delay reaping? A: 3600\". Anyway, it is what is, but I don\u0027t feel compelled to propagate that naming pattern.\n\n* ``delay_expiring`` or ``delay_deleting`` would be consistent with ``delay_reaping``, but then ``expiry_age`` would be consistent with ``reclaim_age``, and we also have a ``nondurable_purge_delay`` in diskfile which is configured using ``commit_window`` (!!), so we could have chosen ``grace_window`` (but that\u0027s a much weaker association that the reaper).\n\nLike Clay, I could live with ``grace_period``, but I also would not oppose a change. However, I think I\u0027d grumble about ``delay_expiring`` (for the reason that it\u0027s not delaying expiring).","commit_id":"e1b8c4b68fb58efded42166b866c64b60b3dd9ea"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":114,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 604800))"},{"line_number":115,"context_line":"        self.acct_grace_periods \u003d {}"},{"line_number":116,"context_line":"        for conf_key in conf:"},{"line_number":117,"context_line":"            grace_period_prefix \u003d \"grace_period_\""},{"line_number":118,"context_line":"            if not conf_key.startswith(grace_period_prefix):"},{"line_number":119,"context_line":"                continue"},{"line_number":120,"context_line":"            account \u003d conf_key[len(grace_period_prefix):]"}],"source_content_type":"text/x-python","patch_set":9,"id":"8f479c5b_1e87b4d8","line":117,"range":{"start_line":117,"start_character":35,"end_line":117,"end_character":48},"in_reply_to":"9f5a3bb0_e6b65ac2","updated":"2024-03-19 20:17:11.000000000","message":"I forgot about the account reaper!?\n\nyes I think that \"delay_expiring_\" would have been a very good prefix option for this feature.  I\u0027m not opposed to encouraging Anish/Mandell if they\u0027d consider changing it for the sake of consistency - but we\u0027d also have to get ops to write out a pre-upgrade migration config with both values.\n\nI\u0027m more inclined to say leave it; but that may be laziness - if someone else wanted to take up the SRE coordination it\u0027d be a lot easier to change it now than after we merge it!","commit_id":"e1b8c4b68fb58efded42166b866c64b60b3dd9ea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5100d643476f92ae9eac0a477b171cdd5c9305d7","unresolved":true,"context_lines":[{"line_number":274,"context_line":"                break"},{"line_number":275,"context_line":"            yield task_container"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def get_grace_period(self, target_account):"},{"line_number":278,"context_line":"        try:"},{"line_number":279,"context_line":"            return self.acct_grace_periods[target_account]"},{"line_number":280,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fefcf1e_4259ca7e","line":277,"updated":"2023-05-24 00:10:47.000000000","message":"Would it be _so_ crazy to have this go HEAD the account and parse it out of some new sysmeta? (Probably with some local caching so we don\u0027t have to do it for _every_ queue entry.) I\u0027m not sure I\u0027m sold on having per-account settings in configs on every server...","commit_id":"e1b8c4b68fb58efded42166b866c64b60b3dd9ea"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":false,"context_lines":[{"line_number":274,"context_line":"                break"},{"line_number":275,"context_line":"            yield task_container"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def get_grace_period(self, target_account):"},{"line_number":278,"context_line":"        try:"},{"line_number":279,"context_line":"            return self.acct_grace_periods[target_account]"},{"line_number":280,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":9,"id":"6cd362d7_e0a08c94","line":277,"in_reply_to":"3fefcf1e_4259ca7e","updated":"2024-03-19 20:17:11.000000000","message":"I think it would be a significant depature from the current implementation with potential performance implications.  The trade-off on sysmeta vs config has everything to do with how ops is managing the complexity.  If they have some small N of grace_periods to manage having them all in one place in a single config file they can audit is probably easiest.  If the N**2 it probably gets annoying to have to restart the expirer every time they want to change it and moving to sysmeta becomes more attractive.\n\nFWIW implementing in the config as an initial MVP has the benifit of being simpler and solving for the ops use-case where the N is small.  If someone needs to manage a lager N I don\u0027t think anything in this design prevents us from extending in that direction.  Then grace_period can have config defaults which get \"extended\" from sysmeta at run-time - but I\u0027d still suggest the config would take precedence over the sysmeta in case ops needs to make sure \"this account\u0027s data doesn\u0027t expire for 100 years or until we can sort out the problem\"","commit_id":"e1b8c4b68fb58efded42166b866c64b60b3dd9ea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5100d643476f92ae9eac0a477b171cdd5c9305d7","unresolved":false,"context_lines":[{"line_number":303,"context_line":"                    continue"},{"line_number":304,"context_line":"                grace_period \u003d self.get_grace_period(target_account)"},{"line_number":305,"context_line":"                cutoff \u003d time() - grace_period"},{"line_number":306,"context_line":"                if delete_timestamp \u003e Timestamp(cutoff):"},{"line_number":307,"context_line":"                    if grace_period:"},{"line_number":308,"context_line":"                        # we shouldn\u0027t yield the object if it\u0027s target_account"},{"line_number":309,"context_line":"                        # is under configured grace_period"}],"source_content_type":"text/x-python","patch_set":9,"id":"9086528e_f15f394d","line":306,"range":{"start_line":306,"start_character":38,"end_line":306,"end_character":55},"updated":"2023-05-24 00:10:47.000000000","message":"I _was_ going to be all\n\n\u003e nit: `Timestamp.now()` accepts a `delta` kwarg, we could rephrase this as ...\n\nand then I realized that `delta` is in deca-microseconds, so it\u0027d have to be `Timestamp.now(delta\u003d-grace_period * 1e5)` -- what an awkward API!","commit_id":"e1b8c4b68fb58efded42166b866c64b60b3dd9ea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5100d643476f92ae9eac0a477b171cdd5c9305d7","unresolved":true,"context_lines":[{"line_number":395,"context_line":"                        task_account_container_list, my_index, divisor))"},{"line_number":396,"context_line":"                rate_limited_iter \u003d RateLimitedIterator("},{"line_number":397,"context_line":"                    delete_task_iter,"},{"line_number":398,"context_line":"                    elements_per_second\u003dself.tasks_per_second)"},{"line_number":399,"context_line":"                for delete_task in rate_limited_iter:"},{"line_number":400,"context_line":"                    pool.spawn_n(self.delete_object, **delete_task)"},{"line_number":401,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"f6785895_688b4d84","line":398,"updated":"2023-05-24 00:10:47.000000000","message":"So we do our rate-limiting between finding actionable work and executing it -- do we need to worry at all about listings overwhelming the `.expiring_objects` container servers as we go through a bunch of deferred items looking for one that\u0027s actually actionable? Maybe we want a new `listings_per_second` option...","commit_id":"e1b8c4b68fb58efded42166b866c64b60b3dd9ea"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":395,"context_line":"                        task_account_container_list, my_index, divisor))"},{"line_number":396,"context_line":"                rate_limited_iter \u003d RateLimitedIterator("},{"line_number":397,"context_line":"                    delete_task_iter,"},{"line_number":398,"context_line":"                    elements_per_second\u003dself.tasks_per_second)"},{"line_number":399,"context_line":"                for delete_task in rate_limited_iter:"},{"line_number":400,"context_line":"                    pool.spawn_n(self.delete_object, **delete_task)"},{"line_number":401,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"4f396cfd_aa5ec389","line":398,"in_reply_to":"f6785895_688b4d84","updated":"2024-03-19 20:17:11.000000000","message":"I think rate limits and ops expectations is a valid concern.  The option sounds like it controls the tasks - not the listings.\n\nIME SRE tunes the expirer to prevent over-running a single container with DELETE updates (there\u0027s 1000\u0027s of expirers running across all the nodes) more-so than the LISTINGS on the expirer containers (which are are already sharded to 100 per day)\n\nI assume we should ratelimit the delete_task_iter to *yield* at tasks_per_second even if it was very quickly listing/discarding tasks because of grace_period.  And I think we already do that since we only yield from `iter_task_to_expire` when we\u0027ve \"found a good one\"?","commit_id":"e1b8c4b68fb58efded42166b866c64b60b3dd9ea"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"12134b7f11cc97dc1ba63d1c87c64e229e13735e","unresolved":true,"context_lines":[{"line_number":278,"context_line":"        try:"},{"line_number":279,"context_line":"            return self.acct_grace_periods[target_account]"},{"line_number":280,"context_line":"        except KeyError:"},{"line_number":281,"context_line":"            return 0.0"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def iter_task_to_expire(self, task_account_container_list,"},{"line_number":284,"context_line":"                            my_index, divisor):"}],"source_content_type":"text/x-python","patch_set":10,"id":"84bebd12_ebd54df1","line":281,"updated":"2024-02-14 21:14:49.000000000","message":"If you wanna return 0.0 for non-existence keys, perhaps collections.defaultdict(float) could be useful for self.acct_grace_periods instead of creating the getter method.","commit_id":"e22691b7aa2d5036280a58ddc9d4fefe64c4b273"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a79043e569a789197d3d3a377073f0dc29cf740d","unresolved":true,"context_lines":[{"line_number":278,"context_line":"        try:"},{"line_number":279,"context_line":"            return self.acct_grace_periods[target_account]"},{"line_number":280,"context_line":"        except KeyError:"},{"line_number":281,"context_line":"            return 0.0"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def iter_task_to_expire(self, task_account_container_list,"},{"line_number":284,"context_line":"                            my_index, divisor):"}],"source_content_type":"text/x-python","patch_set":10,"id":"98363a28_e770ad8f","line":281,"in_reply_to":"84bebd12_ebd54df1","updated":"2024-03-14 14:27:27.000000000","message":"@Kota that\u0027s a nice idea. But defaultdict.get() does not create a default entry so I\u0027m not sure how much simpler the getter would be.\n\n```\nd\u003dcollections.defaultdict(int)\nprint(d.get(1))\nNone\nprint(d[1])\n0\nprint(d.get(1))\n0\n\n```\n\nI guess it could be \n```\nreturn grace_periods[(target_account, target_container)] or grace_periods[(target_account, None)]\n```\n\nbut perhaps not worth it?","commit_id":"e22691b7aa2d5036280a58ddc9d4fefe64c4b273"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        try:"},{"line_number":279,"context_line":"            return self.acct_grace_periods[target_account]"},{"line_number":280,"context_line":"        except KeyError:"},{"line_number":281,"context_line":"            return 0.0"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def iter_task_to_expire(self, task_account_container_list,"},{"line_number":284,"context_line":"                            my_index, divisor):"}],"source_content_type":"text/x-python","patch_set":10,"id":"cc738701_bd88e029","line":281,"in_reply_to":"98363a28_e770ad8f","updated":"2024-03-15 01:38:23.000000000","message":"Resolving this—I believe it is part of an older patch set.","commit_id":"e22691b7aa2d5036280a58ddc9d4fefe64c4b273"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a79043e569a789197d3d3a377073f0dc29cf740d","unresolved":true,"context_lines":[{"line_number":333,"context_line":"                cutoff \u003d time() - grace_period"},{"line_number":334,"context_line":"                if delete_timestamp \u003e Timestamp(cutoff):"},{"line_number":335,"context_line":"                    if grace_period:"},{"line_number":336,"context_line":"                        # we shouldn\u0027t yield the object if it\u0027s target_account"},{"line_number":337,"context_line":"                        # is under configured grace_period"},{"line_number":338,"context_line":"                        continue"},{"line_number":339,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"c1452597_4223f2ae","line":336,"range":{"start_line":336,"start_character":64,"end_line":336,"end_character":78},"updated":"2024-03-14 14:27:27.000000000","message":"\"target account\" is stale now we have per-container support. Perhaps:\n\n```\n# we shouldn\u0027t yield the object if it is subject to a grace_period\n```","commit_id":"a342856a1c5bf85679a9ae32c6e5ddce8f94f4ae"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":false,"context_lines":[{"line_number":333,"context_line":"                cutoff \u003d time() - grace_period"},{"line_number":334,"context_line":"                if delete_timestamp \u003e Timestamp(cutoff):"},{"line_number":335,"context_line":"                    if grace_period:"},{"line_number":336,"context_line":"                        # we shouldn\u0027t yield the object if it\u0027s target_account"},{"line_number":337,"context_line":"                        # is under configured grace_period"},{"line_number":338,"context_line":"                        continue"},{"line_number":339,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"15101afd_ea9ecdbe","line":336,"range":{"start_line":336,"start_character":64,"end_line":336,"end_character":78},"in_reply_to":"c1452597_4223f2ae","updated":"2024-03-15 01:38:23.000000000","message":"Good point! Updating this.","commit_id":"a342856a1c5bf85679a9ae32c6e5ddce8f94f4ae"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6e0fa030403260d51e4986a3df4c910ad36df073","unresolved":true,"context_lines":[{"line_number":91,"context_line":"                \u0027should be in the form grace_period_\u003caccount\u003e \u0027"},{"line_number":92,"context_line":"                \u0027or grace_period_\u003caccount\u003e/\u003ccontainer\u003e \u0027"},{"line_number":93,"context_line":"                \u0027(at most one \"/\" is allowed)\u0027 % conf_key)"},{"line_number":94,"context_line":"        gp \u003d None"},{"line_number":95,"context_line":"        try:"},{"line_number":96,"context_line":"            gp \u003d float(conf.get(conf_key))"},{"line_number":97,"context_line":"        except ValueError:"},{"line_number":98,"context_line":"            pass"},{"line_number":99,"context_line":"        if gp is None or gp \u003c 0:"},{"line_number":100,"context_line":"            raise ValueError("},{"line_number":101,"context_line":"                \u0027%s must be a float \u0027"},{"line_number":102,"context_line":"                \u0027greater than or equal to 0\u0027 % conf_key)"},{"line_number":103,"context_line":"        grace_periods[(account, container)] \u003d gp"},{"line_number":104,"context_line":"    return grace_periods"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"dfe438c9_885990b7","line":102,"range":{"start_line":94,"start_character":8,"end_line":102,"end_character":56},"updated":"2024-03-08 05:33:54.000000000","message":"couldn\u0027t we just use swift.common.utils.non_negative_float here?","commit_id":"0e32dd691ce00bad6dbdfc769716fc6e69c08f4b"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                \u0027should be in the form grace_period_\u003caccount\u003e \u0027"},{"line_number":92,"context_line":"                \u0027or grace_period_\u003caccount\u003e/\u003ccontainer\u003e \u0027"},{"line_number":93,"context_line":"                \u0027(at most one \"/\" is allowed)\u0027 % conf_key)"},{"line_number":94,"context_line":"        gp \u003d None"},{"line_number":95,"context_line":"        try:"},{"line_number":96,"context_line":"            gp \u003d float(conf.get(conf_key))"},{"line_number":97,"context_line":"        except ValueError:"},{"line_number":98,"context_line":"            pass"},{"line_number":99,"context_line":"        if gp is None or gp \u003c 0:"},{"line_number":100,"context_line":"            raise ValueError("},{"line_number":101,"context_line":"                \u0027%s must be a float \u0027"},{"line_number":102,"context_line":"                \u0027greater than or equal to 0\u0027 % conf_key)"},{"line_number":103,"context_line":"        grace_periods[(account, container)] \u003d gp"},{"line_number":104,"context_line":"    return grace_periods"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"2189712a_46789230","line":102,"range":{"start_line":94,"start_character":8,"end_line":102,"end_character":56},"in_reply_to":"dfe438c9_885990b7","updated":"2024-03-15 01:38:23.000000000","message":"Great point! Updating it","commit_id":"0e32dd691ce00bad6dbdfc769716fc6e69c08f4b"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6e0fa030403260d51e4986a3df4c910ad36df073","unresolved":true,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def get_grace_period(grace_periods, target_account, target_container):"},{"line_number":108,"context_line":"    return grace_periods.get((target_account, target_container),"},{"line_number":109,"context_line":"                             grace_periods.get((target_account, None), 0.0))"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class ObjectExpirer(Daemon):"}],"source_content_type":"text/x-python","patch_set":12,"id":"78dd5cc0_097cde3f","line":109,"updated":"2024-03-08 05:33:54.000000000","message":"Was there a reasion this was pulled out of the class, and then a get_grace_period method in ObjectExpirer was added just to call this. As far as I can tell it\u0027s the only caller of this function.\n\nUsually we do this if something else needs it or maybe even to simplify testing.","commit_id":"0e32dd691ce00bad6dbdfc769716fc6e69c08f4b"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"724938bca5d080010f7816148cef66a5179199e1","unresolved":true,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def get_grace_period(grace_periods, target_account, target_container):"},{"line_number":108,"context_line":"    return grace_periods.get((target_account, target_container),"},{"line_number":109,"context_line":"                             grace_periods.get((target_account, None), 0.0))"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class ObjectExpirer(Daemon):"}],"source_content_type":"text/x-python","patch_set":12,"id":"e4f9749c_a65717a8","line":109,"in_reply_to":"78dd5cc0_097cde3f","updated":"2024-03-08 05:38:04.000000000","message":"Now that this has sqaushed has this changed I wonder?","commit_id":"0e32dd691ce00bad6dbdfc769716fc6e69c08f4b"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":true,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def get_grace_period(grace_periods, target_account, target_container):"},{"line_number":108,"context_line":"    return grace_periods.get((target_account, target_container),"},{"line_number":109,"context_line":"                             grace_periods.get((target_account, None), 0.0))"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class ObjectExpirer(Daemon):"}],"source_content_type":"text/x-python","patch_set":12,"id":"fd7962c6_9f56e48e","line":109,"in_reply_to":"7c3a8de5_2c6e8e1a","updated":"2024-03-15 01:38:23.000000000","message":"That\u0027s right, this function is used by the expirey queue explorer gizmos as well when reading the grace periods.","commit_id":"0e32dd691ce00bad6dbdfc769716fc6e69c08f4b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a79043e569a789197d3d3a377073f0dc29cf740d","unresolved":true,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def get_grace_period(grace_periods, target_account, target_container):"},{"line_number":108,"context_line":"    return grace_periods.get((target_account, target_container),"},{"line_number":109,"context_line":"                             grace_periods.get((target_account, None), 0.0))"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class ObjectExpirer(Daemon):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7c3a8de5_2c6e8e1a","line":109,"in_reply_to":"e4f9749c_a65717a8","updated":"2024-03-14 14:27:27.000000000","message":"@Matt IIRC these were made functions so that they could be used by other scripts e.g. expiry queue exploring","commit_id":"0e32dd691ce00bad6dbdfc769716fc6e69c08f4b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def get_grace_period(grace_periods, target_account, target_container):"},{"line_number":108,"context_line":"    return grace_periods.get((target_account, target_container),"},{"line_number":109,"context_line":"                             grace_periods.get((target_account, None), 0.0))"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class ObjectExpirer(Daemon):"}],"source_content_type":"text/x-python","patch_set":12,"id":"6bc31579_ff12e89a","line":109,"in_reply_to":"fd7962c6_9f56e48e","updated":"2024-03-19 20:17:11.000000000","message":"yeah, the logic of this precedence when using the parsed data structure was complicated enough it seemed reasonable to have a helper method.   The implementation choice of using a module level function was primarily motivated for re-use out-side of the ObjectExpirer class; but testing would have also been as good a reason as any.","commit_id":"0e32dd691ce00bad6dbdfc769716fc6e69c08f4b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":71,"context_line":"    for conf_key in conf:"},{"line_number":72,"context_line":"        grace_period_prefix \u003d \"grace_period_\""},{"line_number":73,"context_line":"        if not conf_key.startswith(grace_period_prefix):"},{"line_number":74,"context_line":"            continue"},{"line_number":75,"context_line":"        grace_period_key \u003d conf_key[len(grace_period_prefix):]"},{"line_number":76,"context_line":"        if grace_period_key.strip(\u0027/\u0027) !\u003d grace_period_key:"},{"line_number":77,"context_line":"            raise ValueError("}],"source_content_type":"text/x-python","patch_set":17,"id":"875eca87_0792a3ac","line":74,"updated":"2024-03-19 20:17:11.000000000","message":"N.B. there\u0027s a helper method in utils who\u0027s name *sort of* sounds like it might do this for us; but it\u0027s use-case is slightly different:\n\nhttps://github.com/NVIDIA/swift/blob/master/swift/common/utils/__init__.py#L442\n\n... I think this might not be the only place in swift we use this pattern but it\u0027s probably simple enough to justify writing it all in-line here.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    for conf_key in conf:"},{"line_number":72,"context_line":"        grace_period_prefix \u003d \"grace_period_\""},{"line_number":73,"context_line":"        if not conf_key.startswith(grace_period_prefix):"},{"line_number":74,"context_line":"            continue"},{"line_number":75,"context_line":"        grace_period_key \u003d conf_key[len(grace_period_prefix):]"},{"line_number":76,"context_line":"        if grace_period_key.strip(\u0027/\u0027) !\u003d grace_period_key:"},{"line_number":77,"context_line":"            raise ValueError("}],"source_content_type":"text/x-python","patch_set":17,"id":"08023271_134b61a8","line":74,"in_reply_to":"875eca87_0792a3ac","updated":"2024-03-20 22:17:08.000000000","message":"Yes - took a look at this function and doesn\u0027t look like it does exactly what we want, going to stick with keeping it inline here.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":154,"context_line":"        # with the tombstone reclaim age in the consistency engine."},{"line_number":155,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 604800))"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        self.grace_periods \u003d read_conf_for_grace_periods(conf)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def read_conf_for_queue_access(self, swift):"},{"line_number":160,"context_line":"        self.expiring_objects_account \u003d AUTO_CREATE_ACCOUNT_PREFIX + \\"}],"source_content_type":"text/x-python","patch_set":17,"id":"48811d9b_bfa452ac","line":157,"updated":"2024-03-19 20:17:11.000000000","message":"I\u0027m glad to see this logic pulled out of `__init__` into a helper just for readability.  The re-useability of `read_conf_for_grace_periods` may as well be a knock on side-effect.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        # with the tombstone reclaim age in the consistency engine."},{"line_number":155,"context_line":"        self.reclaim_age \u003d int(conf.get(\u0027reclaim_age\u0027, 604800))"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        self.grace_periods \u003d read_conf_for_grace_periods(conf)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def read_conf_for_queue_access(self, swift):"},{"line_number":160,"context_line":"        self.expiring_objects_account \u003d AUTO_CREATE_ACCOUNT_PREFIX + \\"}],"source_content_type":"text/x-python","patch_set":17,"id":"9d8a55dc_ec8a3645","line":157,"in_reply_to":"48811d9b_bfa452ac","updated":"2024-03-20 22:17:08.000000000","message":"Done","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"34a158cade6e3149ba96b72056a1562194f31b9f","unresolved":true,"context_lines":[{"line_number":291,"context_line":"            yield task_container"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def get_delay_reaping(self, target_account, target_container):"},{"line_number":294,"context_line":"        return get_delay_reaping(self.delay_reaping_times, target_account,"},{"line_number":295,"context_line":"                                 target_container)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    def iter_task_to_expire(self, task_account_container_list,"}],"source_content_type":"text/x-python","patch_set":21,"id":"f135fbd0_245ad0e6","line":294,"range":{"start_line":294,"start_character":15,"end_line":294,"end_character":32},"updated":"2024-04-22 20:15:17.000000000","message":"This is the only place we call this function -- I guess we pulled it out to the module for the sake of testing?","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"01bce868600f37e421ab91ae1210cc263374b0e9","unresolved":false,"context_lines":[{"line_number":291,"context_line":"            yield task_container"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def get_delay_reaping(self, target_account, target_container):"},{"line_number":294,"context_line":"        return get_delay_reaping(self.delay_reaping_times, target_account,"},{"line_number":295,"context_line":"                                 target_container)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    def iter_task_to_expire(self, task_account_container_list,"}],"source_content_type":"text/x-python","patch_set":21,"id":"c5703f2f_b8212f80","line":294,"range":{"start_line":294,"start_character":15,"end_line":294,"end_character":32},"in_reply_to":"e6ce830c_c81c4462","updated":"2024-04-24 23:07:41.000000000","message":"Acknowledged","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"e859efbab069a688bdb0d231c81b1d7052a3bc0f","unresolved":true,"context_lines":[{"line_number":291,"context_line":"            yield task_container"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def get_delay_reaping(self, target_account, target_container):"},{"line_number":294,"context_line":"        return get_delay_reaping(self.delay_reaping_times, target_account,"},{"line_number":295,"context_line":"                                 target_container)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    def iter_task_to_expire(self, task_account_container_list,"}],"source_content_type":"text/x-python","patch_set":21,"id":"e6ce830c_c81c4462","line":294,"range":{"start_line":294,"start_character":15,"end_line":294,"end_character":32},"in_reply_to":"f135fbd0_245ad0e6","updated":"2024-04-24 21:15:22.000000000","message":"Yes, that\u0027s right - we use it on the gizmo side!","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6415f27c2c9cff12d6e7aed26a3d71fcd41baa62","unresolved":true,"context_lines":[{"line_number":331,"context_line":"                                 divisor) !\u003d my_index:"},{"line_number":332,"context_line":"                    continue"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"                is_async \u003d o.get(\u0027content_type\u0027) \u003d\u003d ASYNC_DELETE_TYPE"},{"line_number":335,"context_line":"                yield {\u0027task_account\u0027: task_account,"},{"line_number":336,"context_line":"                       \u0027task_container\u0027: task_container,"},{"line_number":337,"context_line":"                       \u0027task_object\u0027: task_object,"}],"source_content_type":"text/x-python","patch_set":21,"id":"97faff79_d645dd08","line":334,"updated":"2024-04-23 00:02:42.000000000","message":"Should we defer the decision a little and only delay `if delete_timestamp \u003e Timestamp(time() - delay_reaping) and not is_async`?\n\nAs is, async deletes just *aren\u0027t processed* until the delay has passed, no `x-open-expired` required. I think this maybe explains some concerns our users have expressed about deleting data to try to help a capacity crunch, but then still seeing MPU segment data.","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ba31ecfe07e5a7ddf48cb80a6a6797b1b865687e","unresolved":false,"context_lines":[{"line_number":331,"context_line":"                                 divisor) !\u003d my_index:"},{"line_number":332,"context_line":"                    continue"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"                is_async \u003d o.get(\u0027content_type\u0027) \u003d\u003d ASYNC_DELETE_TYPE"},{"line_number":335,"context_line":"                yield {\u0027task_account\u0027: task_account,"},{"line_number":336,"context_line":"                       \u0027task_container\u0027: task_container,"},{"line_number":337,"context_line":"                       \u0027task_object\u0027: task_object,"}],"source_content_type":"text/x-python","patch_set":21,"id":"7434b2fe_e5dd5199","line":334,"in_reply_to":"2a85b948_24f8898b","updated":"2024-04-25 19:47:15.000000000","message":"Done","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"20ba874544f66649f542817bdc5117cd1babbb79","unresolved":true,"context_lines":[{"line_number":331,"context_line":"                                 divisor) !\u003d my_index:"},{"line_number":332,"context_line":"                    continue"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"                is_async \u003d o.get(\u0027content_type\u0027) \u003d\u003d ASYNC_DELETE_TYPE"},{"line_number":335,"context_line":"                yield {\u0027task_account\u0027: task_account,"},{"line_number":336,"context_line":"                       \u0027task_container\u0027: task_container,"},{"line_number":337,"context_line":"                       \u0027task_object\u0027: task_object,"}],"source_content_type":"text/x-python","patch_set":21,"id":"2a85b948_24f8898b","line":334,"in_reply_to":"97faff79_d645dd08","updated":"2024-04-25 18:07:13.000000000","message":"Added in this to delete async objects and a test to make sure that they do in fact get processed when they are async.","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"01bce868600f37e421ab91ae1210cc263374b0e9","unresolved":true,"context_lines":[{"line_number":325,"context_line":"                    # the expiration date yet."},{"line_number":326,"context_line":"                    break"},{"line_number":327,"context_line":"                if delete_timestamp \u003e Timestamp(time() - delay_reaping):"},{"line_number":328,"context_line":"                    # we shouldn\u0027t yield the object during the delay"},{"line_number":329,"context_line":"                    continue"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"                # Only one expirer daemon assigned for one task"}],"source_content_type":"text/x-python","patch_set":22,"id":"101bec01_eac5303b","line":328,"updated":"2024-04-24 23:07:41.000000000","message":"Should we maybe increment some stat here? It\u0027s a little weird seeing\n```\nApr 24 23:01:28 saio object-expirer: Pass beginning for task account .expiring_objects; 1 possible containers; 13 possible objects\nApr 24 23:01:28 saio object-expirer: Run end\nApr 24 23:01:28 saio object-expirer: Pass completed in 0s; 0 objects expired\nApr 24 23:01:28 saio object-expirer: Exited 24795\n```\nwhen I know that they\u0027re all in that delay period.","commit_id":"1c8b1e86343c1c4caf9d75d9359b2126b4b37788"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"102bbd9cfafa9498248a92979321670650def8b0","unresolved":true,"context_lines":[{"line_number":325,"context_line":"                    # the expiration date yet."},{"line_number":326,"context_line":"                    break"},{"line_number":327,"context_line":"                if delete_timestamp \u003e Timestamp(time() - delay_reaping):"},{"line_number":328,"context_line":"                    # we shouldn\u0027t yield the object during the delay"},{"line_number":329,"context_line":"                    continue"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"                # Only one expirer daemon assigned for one task"}],"source_content_type":"text/x-python","patch_set":22,"id":"f52ef11b_5a51dd23","line":328,"in_reply_to":"101bec01_eac5303b","updated":"2024-04-25 22:00:26.000000000","message":"better telemetry is always nice to have - but that output is already weird\n\n```\n                container_count, obj_count \u003d \\\n                    self.swift.get_account_info(task_account)\n\n                # the task account is skipped if there are no task container\n                if not container_count:\n                    continue\n\n                self.logger.info(\n                    \u0027Pass beginning for task account %(account)s; \u0027\n                    \u0027%(container_count)s possible containers; \u0027\n                    \u0027%(obj_count)s possible objects\u0027, {\n                        \u0027account\u0027: task_account,\n                        \u0027container_count\u0027: container_count,\n                        \u0027obj_count\u0027: obj_count})\n```\n\n^ it\u0027s just the x-object-count from the account info call","commit_id":"1c8b1e86343c1c4caf9d75d9359b2126b4b37788"}],"test/unit/obj/test_expirer.py":[{"author":{"_account_id":396,"name":"Mandell","email":"mdegerness@nvidia.com","username":"mdegerne"},"change_message_id":"915909ba1bdda5d32499ece5525fa83a19a57080","unresolved":true,"context_lines":[{"line_number":300,"context_line":"        self.assertEqual(x.acct_grace_periods, {})"},{"line_number":301,"context_line":"        # there is no global grace_period"},{"line_number":302,"context_line":"        conf \u003d {"},{"line_number":303,"context_line":"            \u0027grace_period\u0027: 0.0,"},{"line_number":304,"context_line":"        }"},{"line_number":305,"context_line":"        x \u003d expirer.ObjectExpirer(conf, swift\u003dself.fake_swift)"},{"line_number":306,"context_line":"        self.assertEqual(x.acct_grace_periods, {})"}],"source_content_type":"text/x-python","patch_set":4,"id":"e9b4e58b_6acc33de","line":303,"updated":"2023-03-27 20:24:40.000000000","message":"Including this is likely to confuse later devs when we don\u0027t use bare grace_period any longer.","commit_id":"89c1fc5cc46e7272e8a95c9d15334373d58f8ff3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":300,"context_line":"        self.assertEqual(x.acct_grace_periods, {})"},{"line_number":301,"context_line":"        # there is no global grace_period"},{"line_number":302,"context_line":"        conf \u003d {"},{"line_number":303,"context_line":"            \u0027grace_period\u0027: 0.0,"},{"line_number":304,"context_line":"        }"},{"line_number":305,"context_line":"        x \u003d expirer.ObjectExpirer(conf, swift\u003dself.fake_swift)"},{"line_number":306,"context_line":"        self.assertEqual(x.acct_grace_periods, {})"}],"source_content_type":"text/x-python","patch_set":4,"id":"14223a1b_4a808e2a","line":303,"in_reply_to":"0fcb156d_c06d4af7","updated":"2024-03-19 20:17:11.000000000","message":"the negative assertion is fine; but maybe it belongs in the \"test_invalid\" method?\n\nI could also see \"grace_period\" w/o a suffix raising a ValueError until someone desides to implement a global grace period option.  I think the comment \"there is no global grace_period\" was meant to avoid confusion.","commit_id":"89c1fc5cc46e7272e8a95c9d15334373d58f8ff3"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        self.assertEqual(x.acct_grace_periods, {})"},{"line_number":301,"context_line":"        # there is no global grace_period"},{"line_number":302,"context_line":"        conf \u003d {"},{"line_number":303,"context_line":"            \u0027grace_period\u0027: 0.0,"},{"line_number":304,"context_line":"        }"},{"line_number":305,"context_line":"        x \u003d expirer.ObjectExpirer(conf, swift\u003dself.fake_swift)"},{"line_number":306,"context_line":"        self.assertEqual(x.acct_grace_periods, {})"}],"source_content_type":"text/x-python","patch_set":4,"id":"00f652b7_a4393a28","line":303,"in_reply_to":"14223a1b_4a808e2a","updated":"2024-03-20 22:17:08.000000000","message":"Moved it to `test_invalid_grace_period_keys` since just grace_period is not a key that we look for in the config.","commit_id":"89c1fc5cc46e7272e8a95c9d15334373d58f8ff3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a79043e569a789197d3d3a377073f0dc29cf740d","unresolved":true,"context_lines":[{"line_number":300,"context_line":"        self.assertEqual(x.acct_grace_periods, {})"},{"line_number":301,"context_line":"        # there is no global grace_period"},{"line_number":302,"context_line":"        conf \u003d {"},{"line_number":303,"context_line":"            \u0027grace_period\u0027: 0.0,"},{"line_number":304,"context_line":"        }"},{"line_number":305,"context_line":"        x \u003d expirer.ObjectExpirer(conf, swift\u003dself.fake_swift)"},{"line_number":306,"context_line":"        self.assertEqual(x.acct_grace_periods, {})"}],"source_content_type":"text/x-python","patch_set":4,"id":"f2b10626_8df4b7f0","line":303,"in_reply_to":"3fd3726d_5d53e017","updated":"2024-03-14 14:27:27.000000000","message":"since it\u0027s already been written, I quite like it for the negative assertion.\n\nI also wonder why there is no global option?","commit_id":"89c1fc5cc46e7272e8a95c9d15334373d58f8ff3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"659a3ab10c546453c1591b245ae5c3f48b823192","unresolved":true,"context_lines":[{"line_number":300,"context_line":"        self.assertEqual(x.acct_grace_periods, {})"},{"line_number":301,"context_line":"        # there is no global grace_period"},{"line_number":302,"context_line":"        conf \u003d {"},{"line_number":303,"context_line":"            \u0027grace_period\u0027: 0.0,"},{"line_number":304,"context_line":"        }"},{"line_number":305,"context_line":"        x \u003d expirer.ObjectExpirer(conf, swift\u003dself.fake_swift)"},{"line_number":306,"context_line":"        self.assertEqual(x.acct_grace_periods, {})"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fd3726d_5d53e017","line":303,"in_reply_to":"e9b4e58b_6acc33de","updated":"2023-03-27 21:08:33.000000000","message":"I think that\u0027s why I added the comment on L301, and assert it has no effect.\n\n    # there is no global grace_period\n\nI wrote this test mainly for the people that may have looked at earlier versions of this change, we can remove it now.","commit_id":"89c1fc5cc46e7272e8a95c9d15334373d58f8ff3"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":true,"context_lines":[{"line_number":300,"context_line":"        self.assertEqual(x.acct_grace_periods, {})"},{"line_number":301,"context_line":"        # there is no global grace_period"},{"line_number":302,"context_line":"        conf \u003d {"},{"line_number":303,"context_line":"            \u0027grace_period\u0027: 0.0,"},{"line_number":304,"context_line":"        }"},{"line_number":305,"context_line":"        x \u003d expirer.ObjectExpirer(conf, swift\u003dself.fake_swift)"},{"line_number":306,"context_line":"        self.assertEqual(x.acct_grace_periods, {})"}],"source_content_type":"text/x-python","patch_set":4,"id":"0fcb156d_c06d4af7","line":303,"in_reply_to":"f2b10626_8df4b7f0","updated":"2024-03-15 01:38:23.000000000","message":"It could honestly be quite useful? I will send a message","commit_id":"89c1fc5cc46e7272e8a95c9d15334373d58f8ff3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a79043e569a789197d3d3a377073f0dc29cf740d","unresolved":true,"context_lines":[{"line_number":295,"context_line":"            x.get_process_values(vals)"},{"line_number":296,"context_line":"        self.assertEqual(str(ctx.exception), expected_msg)"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def test_init_per_container_grace_period_with_slash(self):"},{"line_number":299,"context_line":"        # Multiple \"/\" or invalid parsing"},{"line_number":300,"context_line":"        conf \u003d {"},{"line_number":301,"context_line":"            \u0027grace_period_A_U_TH_foo_bar/my-container_name/with/slash\u0027: 60400,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a29e9fb_46e9807c","line":298,"range":{"start_line":298,"start_character":18,"end_line":298,"end_character":32},"updated":"2024-03-14 14:27:27.000000000","message":"nit: this test isn\u0027t specific to per-container config","commit_id":"a342856a1c5bf85679a9ae32c6e5ddce8f94f4ae"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":false,"context_lines":[{"line_number":295,"context_line":"            x.get_process_values(vals)"},{"line_number":296,"context_line":"        self.assertEqual(str(ctx.exception), expected_msg)"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def test_init_per_container_grace_period_with_slash(self):"},{"line_number":299,"context_line":"        # Multiple \"/\" or invalid parsing"},{"line_number":300,"context_line":"        conf \u003d {"},{"line_number":301,"context_line":"            \u0027grace_period_A_U_TH_foo_bar/my-container_name/with/slash\u0027: 60400,"}],"source_content_type":"text/x-python","patch_set":11,"id":"8ac3fb68_84a2f1af","line":298,"range":{"start_line":298,"start_character":18,"end_line":298,"end_character":32},"in_reply_to":"7a29e9fb_46e9807c","updated":"2024-03-15 01:38:23.000000000","message":"True! updating the name.","commit_id":"a342856a1c5bf85679a9ae32c6e5ddce8f94f4ae"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6e0fa030403260d51e4986a3df4c910ad36df073","unresolved":true,"context_lines":[{"line_number":403,"context_line":"            (\u0027b\u0027, None): 259200.0,"},{"line_number":404,"context_line":"            (\u0027AUTH_aBC\u0027, \u0027test2\u0027): 999,"},{"line_number":405,"context_line":"            (u\u0027AUTH_aBáC\u0027, u\u0027tést\u0027): 555,"},{"line_number":406,"context_line":"        })"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def test_init_invalid_grace_period(self):"},{"line_number":409,"context_line":"        # negative tests"}],"source_content_type":"text/x-python","patch_set":12,"id":"a8fcaba9_e3b461b8","line":406,"updated":"2024-03-08 05:33:54.000000000","message":"Could we have an example of the an account having one and a container in the account overriding in this test:\n\n    (\u0027a\u0027, None): 10.0,\n    (\u0027a\u0027, \u0027test\u0027): 999,\n\nOr something similar just for completeness?","commit_id":"0e32dd691ce00bad6dbdfc769716fc6e69c08f4b"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":false,"context_lines":[{"line_number":403,"context_line":"            (\u0027b\u0027, None): 259200.0,"},{"line_number":404,"context_line":"            (\u0027AUTH_aBC\u0027, \u0027test2\u0027): 999,"},{"line_number":405,"context_line":"            (u\u0027AUTH_aBáC\u0027, u\u0027tést\u0027): 555,"},{"line_number":406,"context_line":"        })"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def test_init_invalid_grace_period(self):"},{"line_number":409,"context_line":"        # negative tests"}],"source_content_type":"text/x-python","patch_set":12,"id":"3d6786d0_03296225","line":406,"in_reply_to":"a8fcaba9_e3b461b8","updated":"2024-03-15 01:38:23.000000000","message":"Sure! adding it","commit_id":"0e32dd691ce00bad6dbdfc769716fc6e69c08f4b"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6e0fa030403260d51e4986a3df4c910ad36df073","unresolved":true,"context_lines":[{"line_number":475,"context_line":"        self.assertEqual(259200.0, x.get_grace_period(\u0027b\u0027, \u0027test\u0027))"},{"line_number":476,"context_line":"        self.assertEqual(3.0, x.get_grace_period(\u0027c\u0027, \u0027test\u0027))"},{"line_number":477,"context_line":"        self.assertEqual(0.0, x.get_grace_period(\u0027c\u0027, \u0027not-test\u0027))"},{"line_number":478,"context_line":"        self.assertEqual(0.0, x.get_grace_period(\u0027no-conf\u0027, \u0027test\u0027))"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    def test_init_concurrency_too_small(self):"},{"line_number":481,"context_line":"        conf \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"711b7b3a_16c2d3d6","line":478,"updated":"2024-03-08 05:33:54.000000000","message":"I guess it\u0027s kinda tested here. But this is more for get_grace_period.","commit_id":"0e32dd691ce00bad6dbdfc769716fc6e69c08f4b"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"a0e6178669056e2b4bab4b99d2d21551b9bc61e5","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        self.assertEqual(259200.0, x.get_grace_period(\u0027b\u0027, \u0027test\u0027))"},{"line_number":476,"context_line":"        self.assertEqual(3.0, x.get_grace_period(\u0027c\u0027, \u0027test\u0027))"},{"line_number":477,"context_line":"        self.assertEqual(0.0, x.get_grace_period(\u0027c\u0027, \u0027not-test\u0027))"},{"line_number":478,"context_line":"        self.assertEqual(0.0, x.get_grace_period(\u0027no-conf\u0027, \u0027test\u0027))"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    def test_init_concurrency_too_small(self):"},{"line_number":481,"context_line":"        conf \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ff5921b_81c9f6c6","line":478,"in_reply_to":"711b7b3a_16c2d3d6","updated":"2024-03-15 01:38:23.000000000","message":"Acknowledged","commit_id":"0e32dd691ce00bad6dbdfc769716fc6e69c08f4b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":285,"context_line":"            x.get_process_values(vals)"},{"line_number":286,"context_line":"        self.assertEqual(str(ctx.exception), expected_msg)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def test_init_grace_period_with_slash(self):"},{"line_number":289,"context_line":"        # Multiple \"/\" or invalid parsing"},{"line_number":290,"context_line":"        conf \u003d {"},{"line_number":291,"context_line":"            \u0027grace_period_A_U_TH_foo_bar/my-container_name/with/slash\u0027: 60400,"}],"source_content_type":"text/x-python","patch_set":17,"id":"316b8f36_a5a3ba81","line":288,"updated":"2024-03-19 20:17:11.000000000","message":"so the order is:\n\n\"test_grace_period_with_slash\" (which are all invalid \"keys\")\n\"test_grace_period\" (which are mostly valid except for global value)\n\"test_grace_period_invalid\" (which are all invalid values)\n\nmaybe consider re-ordering as\n\"test_valid_grace_period\"\n\"test_invalid_grace_period_keys\"\n\"test_invalid_grace_period_values\"","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":285,"context_line":"            x.get_process_values(vals)"},{"line_number":286,"context_line":"        self.assertEqual(str(ctx.exception), expected_msg)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def test_init_grace_period_with_slash(self):"},{"line_number":289,"context_line":"        # Multiple \"/\" or invalid parsing"},{"line_number":290,"context_line":"        conf \u003d {"},{"line_number":291,"context_line":"            \u0027grace_period_A_U_TH_foo_bar/my-container_name/with/slash\u0027: 60400,"}],"source_content_type":"text/x-python","patch_set":17,"id":"42582b79_ee0eaf0f","line":288,"in_reply_to":"316b8f36_a5a3ba81","updated":"2024-03-20 22:17:08.000000000","message":"Thanks for the suggestion, this is much cleaner - making updates.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":291,"context_line":"            \u0027grace_period_A_U_TH_foo_bar/my-container_name/with/slash\u0027: 60400,"},{"line_number":292,"context_line":"        }"},{"line_number":293,"context_line":"        with self.assertRaises(ValueError) as ctx:"},{"line_number":294,"context_line":"            expirer.ObjectExpirer(conf, swift\u003dself.fake_swift)"},{"line_number":295,"context_line":"        self.assertEqual("},{"line_number":296,"context_line":"            \u0027grace_period_A_U_TH_foo_bar/my-container_name/with/slash \u0027"},{"line_number":297,"context_line":"            \u0027should be in the form grace_period_\u003caccount\u003e \u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"9d251dea_13b2a7e2","line":294,"updated":"2024-03-19 20:17:11.000000000","message":"these tests could use the helper config parse method method directly; but it\u0027s also not bad to pick up the extra coverage.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":291,"context_line":"            \u0027grace_period_A_U_TH_foo_bar/my-container_name/with/slash\u0027: 60400,"},{"line_number":292,"context_line":"        }"},{"line_number":293,"context_line":"        with self.assertRaises(ValueError) as ctx:"},{"line_number":294,"context_line":"            expirer.ObjectExpirer(conf, swift\u003dself.fake_swift)"},{"line_number":295,"context_line":"        self.assertEqual("},{"line_number":296,"context_line":"            \u0027grace_period_A_U_TH_foo_bar/my-container_name/with/slash \u0027"},{"line_number":297,"context_line":"            \u0027should be in the form grace_period_\u003caccount\u003e \u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"3bd5769a_09ee89a3","line":294,"in_reply_to":"9d251dea_13b2a7e2","updated":"2024-03-20 22:17:08.000000000","message":"Acknowledged","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":291,"context_line":"            \u0027grace_period_A_U_TH_foo_bar/my-container_name/with/slash\u0027: 60400,"},{"line_number":292,"context_line":"        }"},{"line_number":293,"context_line":"        with self.assertRaises(ValueError) as ctx:"},{"line_number":294,"context_line":"            expirer.ObjectExpirer(conf, swift\u003dself.fake_swift)"},{"line_number":295,"context_line":"        self.assertEqual("},{"line_number":296,"context_line":"            \u0027grace_period_A_U_TH_foo_bar/my-container_name/with/slash \u0027"},{"line_number":297,"context_line":"            \u0027should be in the form grace_period_\u003caccount\u003e \u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"7912df86_7e748683","line":294,"in_reply_to":"9d251dea_13b2a7e2","updated":"2024-03-20 22:17:08.000000000","message":"Acknowledged","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":477,"context_line":"        self.assertEqual(259200.0, x.get_grace_period(\u0027b\u0027, \u0027test\u0027))"},{"line_number":478,"context_line":"        self.assertEqual(3.0, x.get_grace_period(\u0027c\u0027, \u0027test\u0027))"},{"line_number":479,"context_line":"        self.assertEqual(0.0, x.get_grace_period(\u0027c\u0027, \u0027not-test\u0027))"},{"line_number":480,"context_line":"        self.assertEqual(0.0, x.get_grace_period(\u0027no-conf\u0027, \u0027test\u0027))"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    def test_init_concurrency_too_small(self):"},{"line_number":483,"context_line":"        conf \u003d {"}],"source_content_type":"text/x-python","patch_set":17,"id":"90efe20a_12b385b3","line":480,"updated":"2024-03-19 20:17:11.000000000","message":"yeah this covers the cases I could think of - notably when `(acct, cont) \u003c (acct, None)`","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":477,"context_line":"        self.assertEqual(259200.0, x.get_grace_period(\u0027b\u0027, \u0027test\u0027))"},{"line_number":478,"context_line":"        self.assertEqual(3.0, x.get_grace_period(\u0027c\u0027, \u0027test\u0027))"},{"line_number":479,"context_line":"        self.assertEqual(0.0, x.get_grace_period(\u0027c\u0027, \u0027not-test\u0027))"},{"line_number":480,"context_line":"        self.assertEqual(0.0, x.get_grace_period(\u0027no-conf\u0027, \u0027test\u0027))"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    def test_init_concurrency_too_small(self):"},{"line_number":483,"context_line":"        conf \u003d {"}],"source_content_type":"text/x-python","patch_set":17,"id":"3cb88c97_ec04c339","line":480,"in_reply_to":"90efe20a_12b385b3","updated":"2024-03-20 22:17:08.000000000","message":"Acknowledged","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":954,"context_line":"                    # tasks only just ready for execution"},{"line_number":955,"context_line":"                    {\u0027name\u0027: self.just_past_time + \u0027-a0/c0/o0\u0027},"},{"line_number":956,"context_line":"                    {\u0027name\u0027: self.just_past_time + \u0027-a1/c1/o1\u0027},"},{"line_number":957,"context_line":"                    {\u0027name\u0027: self.just_past_time + \u0027-a1/c2/o2\u0027},"},{"line_number":958,"context_line":"                ],"},{"line_number":959,"context_line":"            }"},{"line_number":960,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":17,"id":"ed0adec5_49a860a1","line":957,"updated":"2024-03-19 20:17:11.000000000","message":"maybe un-needed scope; but if we\u0027re touching the `if delete_timestamp \u003e Timestamp.now()` code it *might* be reasonable to add some objects to our stub queue that are based on `self.future_time` just to prove to ourselves we didn\u0027t break the early break feature.","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":954,"context_line":"                    # tasks only just ready for execution"},{"line_number":955,"context_line":"                    {\u0027name\u0027: self.just_past_time + \u0027-a0/c0/o0\u0027},"},{"line_number":956,"context_line":"                    {\u0027name\u0027: self.just_past_time + \u0027-a1/c1/o1\u0027},"},{"line_number":957,"context_line":"                    {\u0027name\u0027: self.just_past_time + \u0027-a1/c2/o2\u0027},"},{"line_number":958,"context_line":"                ],"},{"line_number":959,"context_line":"            }"},{"line_number":960,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":17,"id":"76fac1d9_bd9f6ba9","line":957,"in_reply_to":"ed0adec5_49a860a1","updated":"2024-03-20 22:17:08.000000000","message":"That\u0027s reasonable - I added some in future time samples to make sure they aren\u0027t yielded (the early break works).","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bb2ac41ab492b4a2f08b5a5e158a8df78563c143","unresolved":true,"context_lines":[{"line_number":1073,"context_line":"        ]"},{"line_number":1074,"context_line":"        observed \u003d list(x.iter_task_to_expire("},{"line_number":1075,"context_line":"            task_account_container_list, 0, 1))"},{"line_number":1076,"context_line":"        self.assertEqual(expected, observed)"},{"line_number":1077,"context_line":""},{"line_number":1078,"context_line":"    def test_run_once_unicode_problem(self):"},{"line_number":1079,"context_line":"        requests \u003d []"}],"source_content_type":"text/x-python","patch_set":17,"id":"d533e534_edd04658","line":1076,"updated":"2024-03-19 20:17:11.000000000","message":"yeah, these are great too!","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"f39dba0a5f35cf4c1cbbf3e7300656860c5348c0","unresolved":false,"context_lines":[{"line_number":1073,"context_line":"        ]"},{"line_number":1074,"context_line":"        observed \u003d list(x.iter_task_to_expire("},{"line_number":1075,"context_line":"            task_account_container_list, 0, 1))"},{"line_number":1076,"context_line":"        self.assertEqual(expected, observed)"},{"line_number":1077,"context_line":""},{"line_number":1078,"context_line":"    def test_run_once_unicode_problem(self):"},{"line_number":1079,"context_line":"        requests \u003d []"}],"source_content_type":"text/x-python","patch_set":17,"id":"6beb5bbf_b765642f","line":1076,"in_reply_to":"d533e534_edd04658","updated":"2024-03-20 22:17:08.000000000","message":"Acknowledged","commit_id":"0c534050516b5923cf80aefdc287f8f1ebac2243"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"400ab710b516aa4f5e0b16b56a73bd0e34338242","unresolved":true,"context_lines":[{"line_number":285,"context_line":"            x.get_process_values(vals)"},{"line_number":286,"context_line":"        self.assertEqual(str(ctx.exception), expected_msg)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def test_valid_grace_period(self):"},{"line_number":289,"context_line":"        conf \u003d {}"},{"line_number":290,"context_line":"        x \u003d expirer.ObjectExpirer(conf, swift\u003dself.fake_swift)"},{"line_number":291,"context_line":"        self.assertEqual(x.grace_periods, {})"}],"source_content_type":"text/x-python","patch_set":18,"id":"5eb4a98d_c3adf1c0","line":288,"updated":"2024-04-02 09:27:57.000000000","message":"+1, this is better test naming/organisation","commit_id":"7bffb150fd2281e125cdb5ac99a627aa035a5ead"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"e859efbab069a688bdb0d231c81b1d7052a3bc0f","unresolved":false,"context_lines":[{"line_number":285,"context_line":"            x.get_process_values(vals)"},{"line_number":286,"context_line":"        self.assertEqual(str(ctx.exception), expected_msg)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def test_valid_grace_period(self):"},{"line_number":289,"context_line":"        conf \u003d {}"},{"line_number":290,"context_line":"        x \u003d expirer.ObjectExpirer(conf, swift\u003dself.fake_swift)"},{"line_number":291,"context_line":"        self.assertEqual(x.grace_periods, {})"}],"source_content_type":"text/x-python","patch_set":18,"id":"4c64279f_4c7c4e28","line":288,"in_reply_to":"5eb4a98d_c3adf1c0","updated":"2024-04-24 21:15:22.000000000","message":"Acknowledged","commit_id":"7bffb150fd2281e125cdb5ac99a627aa035a5ead"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"102bbd9cfafa9498248a92979321670650def8b0","unresolved":true,"context_lines":[{"line_number":1179,"context_line":"        self.assertEqual(expected, observed)"},{"line_number":1180,"context_line":""},{"line_number":1181,"context_line":"        # configure delays for all containers"},{"line_number":1182,"context_line":"        self.conf[\u0027delay_reaping_a1/c0\u0027] \u003d 300.0"},{"line_number":1183,"context_line":"        self.conf[\u0027delay_reaping_a1/c1\u0027] \u003d 300.0"},{"line_number":1184,"context_line":"        self.conf[\u0027delay_reaping_a1/c2\u0027] \u003d 300.0"},{"line_number":1185,"context_line":"        x \u003d expirer.ObjectExpirer(self.conf, logger\u003dself.logger,"}],"source_content_type":"text/x-python","patch_set":24,"id":"531a928f_f4fa9795","line":1182,"updated":"2024-04-25 22:00:26.000000000","message":"did you mean a0 here or are we testing something else?\n\nI guess as long as ALL the tasks are async-deleted we\u0027ll yeild them all!","commit_id":"5961ba0ca7ddcfe296627fbef01ec4b32d538290"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"102bbd9cfafa9498248a92979321670650def8b0","unresolved":true,"context_lines":[{"line_number":1187,"context_line":"        # ... and we we still expect all past async tasks to yield"},{"line_number":1188,"context_line":"        observed \u003d list(x.iter_task_to_expire("},{"line_number":1189,"context_line":"            task_account_container_list, 0, 1))"},{"line_number":1190,"context_line":"        self.assertEqual(expected, observed)"},{"line_number":1191,"context_line":""},{"line_number":1192,"context_line":"    def test_run_once_unicode_problem(self):"},{"line_number":1193,"context_line":"        requests \u003d []"}],"source_content_type":"text/x-python","patch_set":24,"id":"fadfa163_81beee51","line":1190,"updated":"2024-04-25 22:00:26.000000000","message":"it\u0027s not bad - it would probably better to have a mix so that we can see delay_reaping applly to *some* a1/c0 tasks but not the `application/async-deleted` ones","commit_id":"5961ba0ca7ddcfe296627fbef01ec4b32d538290"}]}
