)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d768d72a7d1f7d980dbed5a808af6656340c62db","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     ASHWIN A NAIR \u003cnairashwin952013@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2023-02-22 00:55:54 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add x-backend-open-expired to recover expired objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If we can get \u0027x-open-expired\u0027 header past gatekeeper a client could"},{"line_number":10,"context_line":"in theory open an expired object, and that will be helpful for"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"95356490_37a94dba","line":7,"range":{"start_line":7,"start_character":4,"end_line":7,"end_character":26},"updated":"2023-02-22 09:33:28.000000000","message":"this will be excluded by gatekeeper","commit_id":"1e2241afc62a6cb6f9f33ec425e46d0d026b1a77"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"6620822508a628ee6e4d857ec0e37dda50a0f17c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     ASHWIN A NAIR \u003cnairashwin952013@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2023-02-22 00:55:54 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add x-backend-open-expired to recover expired objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If we can get \u0027x-open-expired\u0027 header past gatekeeper a client could"},{"line_number":10,"context_line":"in theory open an expired object, and that will be helpful for"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"e97d67e4_198d0387","line":7,"range":{"start_line":7,"start_character":4,"end_line":7,"end_character":26},"in_reply_to":"95356490_37a94dba","updated":"2023-10-25 20:43:45.000000000","message":"Done","commit_id":"1e2241afc62a6cb6f9f33ec425e46d0d026b1a77"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d768d72a7d1f7d980dbed5a808af6656340c62db","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add x-backend-open-expired to recover expired objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If we can get \u0027x-open-expired\u0027 header past gatekeeper a client could"},{"line_number":10,"context_line":"in theory open an expired object, and that will be helpful for"},{"line_number":11,"context_line":"recovery."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"18a73021_eb9ab470","line":9,"range":{"start_line":9,"start_character":15,"end_line":9,"end_character":29},"updated":"2023-02-22 09:33:28.000000000","message":"you\u0027ve changed the proposed header name :) I don\u0027t think the gatekeeper will exclude this header.","commit_id":"1e2241afc62a6cb6f9f33ec425e46d0d026b1a77"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"6620822508a628ee6e4d857ec0e37dda50a0f17c","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add x-backend-open-expired to recover expired objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If we can get \u0027x-open-expired\u0027 header past gatekeeper a client could"},{"line_number":10,"context_line":"in theory open an expired object, and that will be helpful for"},{"line_number":11,"context_line":"recovery."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"59b18b9f_3850d981","line":9,"range":{"start_line":9,"start_character":15,"end_line":9,"end_character":29},"in_reply_to":"18a73021_eb9ab470","updated":"2023-10-25 20:43:45.000000000","message":"Done","commit_id":"1e2241afc62a6cb6f9f33ec425e46d0d026b1a77"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d768d72a7d1f7d980dbed5a808af6656340c62db","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If we can get \u0027x-open-expired\u0027 header past gatekeeper a client could"},{"line_number":10,"context_line":"in theory open an expired object, and that will be helpful for"},{"line_number":11,"context_line":"recovery."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Ibe7dde0e3bf587d77e14808b169c02f8fb3dddb3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"d5da76ab_16be8280","line":11,"updated":"2023-02-22 09:33:28.000000000","message":"This proposed feature needs documentation (in the API section), and the documentation should explain what the client\u0027s expectations should be. Specifically, IIUC, an explanation that it won\u0027t always work.\n\nI\u0027m not convinced that this is a good feature to add, because to be useful it requires the client to know details of the cluster\u0027s internal services (the expirer) and it puts the client in a race with internal service. How does the client ever know if this header will work without having some knowledge of the internal operation of the cluster?\n\nTo put it another way, once this header is supported, is there a requirement that the internal implementation can never change such that data *is* deleted immediately at the delete-at time, because there is supposed to be some variable grace period?","commit_id":"1e2241afc62a6cb6f9f33ec425e46d0d026b1a77"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"6620822508a628ee6e4d857ec0e37dda50a0f17c","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If we can get \u0027x-open-expired\u0027 header past gatekeeper a client could"},{"line_number":10,"context_line":"in theory open an expired object, and that will be helpful for"},{"line_number":11,"context_line":"recovery."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Ibe7dde0e3bf587d77e14808b169c02f8fb3dddb3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"b3e6566e_4eb7ff84","line":11,"in_reply_to":"d5da76ab_16be8280","updated":"2023-10-25 20:43:45.000000000","message":"Done","commit_id":"1e2241afc62a6cb6f9f33ec425e46d0d026b1a77"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-03-13 21:36:05 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"add x-open-expired to access expired objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the global configuration option \u0027enable_open_expired\u0027 is set"},{"line_number":10,"context_line":"to true in the config, then the client will be able to make a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"4465a7c6_705bc2d9","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":3},"updated":"2024-03-14 15:38:48.000000000","message":"s/add x-open-expired/Support x-open-expired header/ ??","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-03-13 21:36:05 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"add x-open-expired to access expired objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If the global configuration option \u0027enable_open_expired\u0027 is set"},{"line_number":10,"context_line":"to true in the config, then the client will be able to make a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"2716ea55_f2f9869a","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":3},"in_reply_to":"4465a7c6_705bc2d9","updated":"2024-03-18 21:57:15.000000000","message":"Acknowledged","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":9,"context_line":"If the global configuration option \u0027enable_open_expired\u0027 is set"},{"line_number":10,"context_line":"to true in the config, then the client will be able to make a"},{"line_number":11,"context_line":"request with the header \u0027x-open-expired\u0027 set to true in order"},{"line_number":12,"context_line":"to retrieve an object that has expired (it is in its grace period)."},{"line_number":13,"context_line":"If this config flag is set to false, the client will not be able"},{"line_number":14,"context_line":"to access any expired objects, even with the header, which is the"},{"line_number":15,"context_line":"default behavior unless the flag is set."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"63b4cff3_985c86da","line":12,"range":{"start_line":12,"start_character":3,"end_line":12,"end_character":11},"updated":"2024-03-14 15:38:48.000000000","message":"s/retrieve/access/ - POST is included as well as GET/HEAD","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":9,"context_line":"If the global configuration option \u0027enable_open_expired\u0027 is set"},{"line_number":10,"context_line":"to true in the config, then the client will be able to make a"},{"line_number":11,"context_line":"request with the header \u0027x-open-expired\u0027 set to true in order"},{"line_number":12,"context_line":"to retrieve an object that has expired (it is in its grace period)."},{"line_number":13,"context_line":"If this config flag is set to false, the client will not be able"},{"line_number":14,"context_line":"to access any expired objects, even with the header, which is the"},{"line_number":15,"context_line":"default behavior unless the flag is set."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"4f933584_83cf595e","line":12,"range":{"start_line":12,"start_character":40,"end_line":12,"end_character":65},"updated":"2024-03-14 15:38:48.000000000","message":"this is a necessary condition rather than consequence - perhaps drop the parentheses and add provided:\n```\nthat has expired, provided it is in its grace period.```","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":9,"context_line":"If the global configuration option \u0027enable_open_expired\u0027 is set"},{"line_number":10,"context_line":"to true in the config, then the client will be able to make a"},{"line_number":11,"context_line":"request with the header \u0027x-open-expired\u0027 set to true in order"},{"line_number":12,"context_line":"to retrieve an object that has expired (it is in its grace period)."},{"line_number":13,"context_line":"If this config flag is set to false, the client will not be able"},{"line_number":14,"context_line":"to access any expired objects, even with the header, which is the"},{"line_number":15,"context_line":"default behavior unless the flag is set."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"52b979b9_9d538db4","line":12,"range":{"start_line":12,"start_character":40,"end_line":12,"end_character":65},"in_reply_to":"4f933584_83cf595e","updated":"2024-03-18 21:57:15.000000000","message":"Done","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":9,"context_line":"If the global configuration option \u0027enable_open_expired\u0027 is set"},{"line_number":10,"context_line":"to true in the config, then the client will be able to make a"},{"line_number":11,"context_line":"request with the header \u0027x-open-expired\u0027 set to true in order"},{"line_number":12,"context_line":"to retrieve an object that has expired (it is in its grace period)."},{"line_number":13,"context_line":"If this config flag is set to false, the client will not be able"},{"line_number":14,"context_line":"to access any expired objects, even with the header, which is the"},{"line_number":15,"context_line":"default behavior unless the flag is set."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"43ee533f_1c6a41e6","line":12,"range":{"start_line":12,"start_character":3,"end_line":12,"end_character":11},"in_reply_to":"63b4cff3_985c86da","updated":"2024-03-18 21:57:15.000000000","message":"Done","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":17,"context_line":"When a client sets a \u0027x-open-expired\u0027 header to a true value for a"},{"line_number":18,"context_line":"GET/HEAD/POST request the proxy will forward x-backend-open-expired to"},{"line_number":19,"context_line":"storage server. The storage server will allow clients that set"},{"line_number":20,"context_line":"x-backend-open-expired to open and read an object even after the"},{"line_number":21,"context_line":"x-delete-at time as passed."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"During the period after an object is expired, but before it has been"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"3e774e79_f395d3bd","line":20,"range":{"start_line":20,"start_character":40,"end_line":20,"end_character":49},"updated":"2024-03-14 15:38:48.000000000","message":"worth clarifying, although intuitively obvious,\n```\nan object that has not yet been reaped by the object-expirer, even after...\n```","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":17,"context_line":"When a client sets a \u0027x-open-expired\u0027 header to a true value for a"},{"line_number":18,"context_line":"GET/HEAD/POST request the proxy will forward x-backend-open-expired to"},{"line_number":19,"context_line":"storage server. The storage server will allow clients that set"},{"line_number":20,"context_line":"x-backend-open-expired to open and read an object even after the"},{"line_number":21,"context_line":"x-delete-at time as passed."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"During the period after an object is expired, but before it has been"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"021054de_65f19331","line":20,"range":{"start_line":20,"start_character":40,"end_line":20,"end_character":49},"in_reply_to":"3e774e79_f395d3bd","updated":"2024-03-18 21:57:15.000000000","message":"Done","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"During the period after an object is expired, but before it has been"},{"line_number":24,"context_line":"reaped by the object-expirer this new feature will be helpful for"},{"line_number":25,"context_line":"recovery of encrypted or EC data."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"This feature is not enabled on temporary URLs."},{"line_number":28,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"293721ad_08e11c64","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":32},"updated":"2024-03-14 15:38:48.000000000","message":"I don\u0027t think the feature is particularly related to EC or encryption. I\u0027d suggest dropping this paragraph.","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"During the period after an object is expired, but before it has been"},{"line_number":24,"context_line":"reaped by the object-expirer this new feature will be helpful for"},{"line_number":25,"context_line":"recovery of encrypted or EC data."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"This feature is not enabled on temporary URLs."},{"line_number":28,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"8bd4e942_0a0aaeea","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":32},"in_reply_to":"293721ad_08e11c64","updated":"2024-03-18 21:57:15.000000000","message":"Done","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":24,"context_line":"reaped by the object-expirer this new feature will be helpful for"},{"line_number":25,"context_line":"recovery of encrypted or EC data."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"This feature is not enabled on temporary URLs."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: Ibe7dde0e3bf587d77e14808b169c02f8fb3dddb3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"4686a0e0_cbab2616","line":27,"range":{"start_line":27,"start_character":1,"end_line":27,"end_character":46},"updated":"2024-03-14 15:38:48.000000000","message":"?\n\n\"The header is always ignored when used with temporary URLs.\"","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":24,"context_line":"reaped by the object-expirer this new feature will be helpful for"},{"line_number":25,"context_line":"recovery of encrypted or EC data."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"This feature is not enabled on temporary URLs."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: Ibe7dde0e3bf587d77e14808b169c02f8fb3dddb3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"1d4c4150_9dba8f16","line":27,"range":{"start_line":27,"start_character":1,"end_line":27,"end_character":46},"in_reply_to":"4686a0e0_cbab2616","updated":"2024-03-18 21:57:15.000000000","message":"Done","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":25,"context_line":"recovery of encrypted or EC data."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"This feature is not enabled on temporary URLs."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: Ibe7dde0e3bf587d77e14808b169c02f8fb3dddb3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"ffe987ff_ab62f7f2","line":28,"updated":"2024-03-14 15:38:48.000000000","message":"please add\n```\nRelated-Change: I106103438c4162a561486ac73a09436e998ae1f0\n```\n\nwhich is the grace period patch. The two commits will not necessarily end up adjacent in git log.","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":25,"context_line":"recovery of encrypted or EC data."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"This feature is not enabled on temporary URLs."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: Ibe7dde0e3bf587d77e14808b169c02f8fb3dddb3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"dcc361b2_11ec9425","line":28,"in_reply_to":"ffe987ff_ab62f7f2","updated":"2024-03-18 21:57:15.000000000","message":"Got it!","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":10,"context_line":"to true in the config, then the client will be able to make a"},{"line_number":11,"context_line":"request with the header \u0027x-open-expired\u0027 set to true in order"},{"line_number":12,"context_line":"to access an object that has expired, provided it is in its"},{"line_number":13,"context_line":"grace period. If this config flag is set to false, the client"},{"line_number":14,"context_line":"will not be able to access any expired objects, even with the"},{"line_number":15,"context_line":"header, which is the default behavior unless the flag is set."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":42,"id":"294ba5fc_89740b61","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":12},"updated":"2024-04-05 11:25:53.000000000","message":"nit: we all know what grace period means but it\u0027s no longer a thing in the code 😄 If you make another push perhaps change this to \n\n```\nprovided it has not yet been reaped.\n```","commit_id":"01ba1f9e50f68639fc52278dd63b2d6c20dabb03"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":10,"context_line":"to true in the config, then the client will be able to make a"},{"line_number":11,"context_line":"request with the header \u0027x-open-expired\u0027 set to true in order"},{"line_number":12,"context_line":"to access an object that has expired, provided it is in its"},{"line_number":13,"context_line":"grace period. If this config flag is set to false, the client"},{"line_number":14,"context_line":"will not be able to access any expired objects, even with the"},{"line_number":15,"context_line":"header, which is the default behavior unless the flag is set."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":42,"id":"d06770c1_74ce7257","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":12},"in_reply_to":"294ba5fc_89740b61","updated":"2024-04-08 21:47:48.000000000","message":"That\u0027s right - thanks for pointing this out! Updating","commit_id":"01ba1f9e50f68639fc52278dd63b2d6c20dabb03"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7adf9a64e9357667ed65573c6f7d339916565211","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"8b867626_ca61d5d4","updated":"2023-02-22 00:46:38.000000000","message":"Pretty sure we\u0027re going to want to take x-open-expired in at the proxy, but use x-backend-open-expired when talking to object-servers. Proxy\u0027s the only one that understands who this user is, and whether they ought to be allowed to make this kind of request.","commit_id":"2246783942844a212c853dc727788c534ceeb156"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d768d72a7d1f7d980dbed5a808af6656340c62db","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"fa2192e6_f5cdd6c5","updated":"2023-02-22 09:33:28.000000000","message":"@Tim why would this be restricted to reseller admin?\n\n@Tim does it need to be translated to a -backend-h header? x-open-expired will propagate from client to object server IIUC. I think we use -backend- for headers that we do NOT want to come from the client. ","commit_id":"1e2241afc62a6cb6f9f33ec425e46d0d026b1a77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a4aa6cf7c28b85fdf498a77b8741e0a647fb015d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"f78d7645_4b71db8f","in_reply_to":"fa2192e6_f5cdd6c5","updated":"2023-02-22 17:24:53.000000000","message":"\u003e why would this be restricted to reseller admin?\n\nIt\u0027s the highest-privileged external client ;-) I could see this feature being opened up to swift owners -- but I\u0027d be very much opposed to having it be available to all users, or even all auth\u0027ed users. I can definitely imagine use-cases like\n\n- Create a public container, but use expiry to time-limit access to any particular object. Possibly even enable staticweb to allow browsing of data, assuming that we can tolerate the expired-but-not-yet-deleted data showing up in (staticweb) listings.\n- Issue a prefix-scoped tempurl, but use expiry to further time-limit access to some specific objects. Possibly combined with https://review.opendev.org/c/openstack/swift/+/810754 to aid in discovery.\n\nIn neither of these cases do I, as account owner, want other users to be able to bypass my expiries.\n\n\u003e does it need to be translated to a x-backend- header?\n\nYes, if we want to have any hope of being able to enforce auth-based restrictions around this feature.","commit_id":"1e2241afc62a6cb6f9f33ec425e46d0d026b1a77"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a7601bb6c400919ac72780e7dbc967fcf309a939","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"0bb479fa_2fada7da","updated":"2023-03-20 23:22:54.000000000","message":"i think this is getting pretty good; I guess we have to decide if we want to polish it more and try to merge it or leave well enough alone and move on for now.","commit_id":"b23a6195f11651a7c1b7923d68b4613317b973c8"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"30bf6816bd1c2c41363f8a1e2c777d0639452790","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"3ec74f00_886c9ab3","updated":"2023-10-30 04:14:14.000000000","message":"Looking good. Did some testing in my SAIO.","commit_id":"5a8eee9916f1f773cfebc7162ec1779366641318"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cbf478fe983845fa640a6ff9258a9f52daced3d4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"8e786348_ec5fa172","updated":"2023-11-06 19:36:22.000000000","message":"The access question is still a blocker for me.","commit_id":"0a885246badf3546da222feccd0e07f1202aed26"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":33,"id":"dbf8114a_28195a8d","updated":"2024-03-14 15:38:48.000000000","message":"Most of my comments are doc/test related but I think they should be addressed before merging.\n\nIn particular, I think a probe test where we can control exactly when the expirer runs would be more rigorous than the functional test. And the tempurl sample conf must be updated.","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":33,"id":"7174b997_7c4e3889","updated":"2024-03-18 21:57:15.000000000","message":"Updates based on comments and some follow ups!","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3cc6ff099db6fba5807f4de82cc9d68a54ab805a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":36,"id":"cba30f40_8f447e7f","updated":"2024-03-20 11:32:40.000000000","message":"a few minor comments, and I still think we should aim for a probe test to replace the functional test.\n\n@Anish a good starting point might be to base \n new test on ``test.probe.test_object_expirer.TestObjectExpirer.test_expirer_object_should_not_be_expired``\n\n...except your test will be simpler/different e.g. won\u0027t need any server stopping or starting. With the probe test you can control exactly when the expirer runs (using ``self.expirer.once()``) and therefore avoid any chance of a race.","commit_id":"0e6ddd55d4297eb758a23ce1a5b55469adff3c1c"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"960a734805b917f773eeabf57462d2761fa4f8ee","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"7d147bd8_f77f73dd","updated":"2024-03-22 20:42:20.000000000","message":"Updated with probe test","commit_id":"f15a6438a2b4e2853250c53580c2a37edd750596"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"253ac1f58f96d8e95128eb5aa0a436ae839a62a8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":40,"id":"93b94074_539ec63e","updated":"2024-04-02 16:49:45.000000000","message":"@Anish on reflection maybe the functional test can stay - since the work has been done and it tests a different target","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2f5e9000e647f40387c13a75fdbeb6506de99ae5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":40,"id":"cdd04f81_ea4c7639","updated":"2024-04-02 11:17:30.000000000","message":"@Anish thanks for adding the probe test, I think zuul is going to fail pep8, and there\u0027s a few improvements needed to the probe test, but in principle it\u0027s good.\n\nIMHO we could remove the functional test now we have a probe test. The functional test is not 100% reliable.","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8cd4ace66a51900860bea840b8c8a70b6fdd8542","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":40,"id":"f4b64c1a_d5ad2775","updated":"2024-04-02 10:47:24.000000000","message":"recheck\n\ntests don\u0027t seem to have run on this patchset","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0199903a49fff5a860adafd3d87a8fbcf661f5ad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"b2fd07a9_5c0957f0","updated":"2024-04-03 09:29:45.000000000","message":"@Anish some fixes needed w.r.t. use or assertRaises\n\nI like how you used the POST with x-open-expired to extend the expiry time, but with that you could also run the expirer again and verify that the new delete-at time really was applied (see inline comment)","commit_id":"d6808863999b02f628b70e646ecf22155993f6d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"5aa693b780c13aa26d6a60574f3bd398bbef7aa4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"d2dfb2dc_2d7514bc","updated":"2024-04-03 02:49:04.000000000","message":"Thanks for all the super helpful comments! Made updates to the probe test","commit_id":"d6808863999b02f628b70e646ecf22155993f6d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"bbc51c282681845c9e9bd79a218980a3021e8034","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"afbe436c_6187e387","updated":"2024-04-04 18:24:15.000000000","message":"Updated probe test and fixed asserts with dedentation","commit_id":"d6808863999b02f628b70e646ecf22155993f6d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":43,"id":"40d746a9_33083537","updated":"2024-04-08 21:47:48.000000000","message":"Updating by breaking down server tests into multiple tests, hopefully making it more coherent.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":43,"id":"3d38895d_1c4943e3","updated":"2024-04-05 11:25:53.000000000","message":"probe test LGTM\n\nI noticed found some issues in unit tests that I hadn\u0027t noticed before - I think they could use some more attention and *simplification*. Specifically, I suggest test_POST_but_expired in obj/test_server.py should be broken up into multiple smaller test cases:\n\nThe recreate_test_object helper could be made a class method.\n\nIdeally each test case creates an object once, makes one or two POSTs and assertions, period. The existing test goes horribly wrong when the object is \"recreated\" except there\u0027s a meta file from a previous scenario left on disk that confuses subsequent assertions.\n\nAlso, we seem to have lost an x-backend-replication case in that test. We expect x-backend-replication and x-backend-open-expired to behave the same way, so each test case could be parameterised to pass in request headers with a ``_do_test_xyz()``. Then we can have simple test cases that are re-used to cover x-backend-replication, x-backend-open-expired and combinations of both.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":45,"id":"3ef54bad_92b4c543","updated":"2024-04-09 12:16:26.000000000","message":"@Anish great work on straightening out the tests. Now that they are easier to understand there\u0027s a few assertions that are more obviously not quite right, plus some nits.","commit_id":"c4fa6dbb654d751bd9824fab2b2108a780c58fcf"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":45,"id":"ec746e76_ab70d5fa","updated":"2024-04-09 17:09:49.000000000","message":"Updated unit tests based on mostly small nits","commit_id":"c4fa6dbb654d751bd9824fab2b2108a780c58fcf"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"657e5b870fb74f7a654388696a7f034e8740a5c6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":47,"id":"f7fe09bb_14f589ec","updated":"2024-04-10 16:51:00.000000000","message":"Thanks for pointing out the typos and the need for request_helpers tests—added those in!","commit_id":"225c9a03b3055248ba3e7caa10c369b911a71f1c"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"3d45d6acb5891426a0dd54699a14d3b8ee6ee3d0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":48,"id":"b02b117d_be46b4bf","updated":"2024-04-15 04:13:42.000000000","message":"Updated for nits!","commit_id":"f84e42df73bb041b52c8e394024e9121586b1b69"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"edb8242995ea695fc30e9bc8b0245dacf20ab87f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":48,"id":"1d699a63_b4292fa9","updated":"2024-04-12 08:35:20.000000000","message":"a little more polishing of the new test needed","commit_id":"f84e42df73bb041b52c8e394024e9121586b1b69"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6b45a60bbf6ae8d1d06fd3a77867e4b969f0e207","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":51,"id":"d11234d0_af165c55","updated":"2024-04-23 03:01:09.000000000","message":"Anish said he likes the allow_open_expired name, but has graciously offered to wait until mid-week to change this patch so we can more easily coordinate the config update with SRE after the current release goes out.\n\nI think Tim\u0027s blockers are all other-wise non-functional requirements; mostly better tests - in addition to the rename both good reasons to wait to merge.","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"6c4fc915b42fe57fe0d87131393c3c43114ea568","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":51,"id":"44c9a0b1_9166530d","updated":"2024-04-24 19:50:46.000000000","message":"Changed enable_open_expired to allow_open_expired and updated some tests","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1bdcebd733613f6de075a64c5e9272abf44de452","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":51,"id":"91b04234_405efe92","updated":"2024-04-22 19:26:39.000000000","message":"Global cluster config option works for me to address the my access concern. Clay\u0027s got a point on the naming, though -- how does everyone else feel about that? Can we reach consensus on allow vs enable?\n\nTwo blockers for me:\n\n- Probe test ought to look at on-disk files, especially in the disabled case.\n- Skips should always include a reason.","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"066ea9148530b203111ca98bf0c83763cd235aad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":51,"id":"95d83e0b_d8fa4843","updated":"2024-04-19 15:09:18.000000000","message":"we managed to get delay_reaping right - might worth another rename for the proxy option too?","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"36f148521a373b93cf39ba4a27130abb25441e83","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":53,"id":"9a5d78f3_909ba221","updated":"2024-04-24 21:05:23.000000000","message":"Updated tests - needed to add additional time before reaping","commit_id":"e0d56936d9436b1ea83d1bec8642a45b75241059"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"567c4dfd34eed6044d460e46f8c49dcb2363f636","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":55,"id":"9b244964_945c4065","updated":"2024-04-24 22:13:59.000000000","message":"LGTM -- ran probe tests locally with `allow_open_expired` both on and off.","commit_id":"7221487aa0c543af97d247529123e74068ce2bc2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3980eee847d156c5ae08bfb52f293d9023fcae2f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":56,"id":"afb66550_0ac2576f","updated":"2024-04-26 07:35:00.000000000","message":"Looking great! And sorry to be that guy, but the main reason for a -1 is because the default in the sample config is wrong. But there are some other doc issues too.","commit_id":"32a15b5f4606c5ddc4b7b0c9f09cdfbd4f1f3b3c"}],"doc/source/config/proxy_server_config.rst":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":387,"context_line":"                                                                 This option may be overridden in a"},{"line_number":388,"context_line":"                                                                 per-policy configuration section."},{"line_number":389,"context_line":"enable_open_expired                             false            If true (default is false), an expired"},{"line_number":390,"context_line":"                                                                 object can be accessed by setting the"},{"line_number":391,"context_line":"                                                                 \u0027x-open-expired\u0027 header to true in"},{"line_number":392,"context_line":"                                                                 GET, HEAD, and POST requests."},{"line_number":393,"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"}],"source_content_type":"text/x-rst","patch_set":33,"id":"cf273be7_91c9e68a","line":390,"range":{"start_line":390,"start_character":65,"end_line":390,"end_character":87},"updated":"2024-03-14 15:38:48.000000000","message":"this needs a bit more clarification:\n\n```\nan object that has expired but not yet been reaped can be...\n```\n\nrendered here https://storage.gra.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_866/874710/33/check/openstack-tox-docs/866f108/docs/config/proxy_server_config.html#proxy-server","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                                                                 This option may be overridden in a"},{"line_number":388,"context_line":"                                                                 per-policy configuration section."},{"line_number":389,"context_line":"enable_open_expired                             false            If true (default is false), an expired"},{"line_number":390,"context_line":"                                                                 object can be accessed by setting the"},{"line_number":391,"context_line":"                                                                 \u0027x-open-expired\u0027 header to true in"},{"line_number":392,"context_line":"                                                                 GET, HEAD, and POST requests."},{"line_number":393,"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"}],"source_content_type":"text/x-rst","patch_set":33,"id":"31a79205_bbd59f70","line":390,"range":{"start_line":390,"start_character":65,"end_line":390,"end_character":87},"in_reply_to":"cf273be7_91c9e68a","updated":"2024-03-18 21:57:15.000000000","message":"Got it. Good to specify what an expired object is exactly.","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3980eee847d156c5ae08bfb52f293d9023fcae2f","unresolved":true,"context_lines":[{"line_number":386,"context_line":"                                                                 (replicas - len(local_primary_nodes))."},{"line_number":387,"context_line":"                                                                 This option may be overridden in a"},{"line_number":388,"context_line":"                                                                 per-policy configuration section."},{"line_number":389,"context_line":"allow_open_expired                              false            If true (default is false), an object that"},{"line_number":390,"context_line":"                                                                 has expired but not yet been reaped can be"},{"line_number":391,"context_line":"                                                                 can be accessed by setting the"},{"line_number":392,"context_line":"                                                                 \u0027x-open-expired\u0027 header to true in"}],"source_content_type":"text/x-rst","patch_set":56,"id":"9a9428e6_c7edc42b","line":389,"range":{"start_line":389,"start_character":73,"end_line":389,"end_character":91},"updated":"2024-04-26 07:35:00.000000000","message":"This is redundant seeing as we have the False in the previous column.","commit_id":"32a15b5f4606c5ddc4b7b0c9f09cdfbd4f1f3b3c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b94d2c15c9bfc817b4cfda4421d01ff03b0942a4","unresolved":true,"context_lines":[{"line_number":386,"context_line":"                                                                 (replicas - len(local_primary_nodes))."},{"line_number":387,"context_line":"                                                                 This option may be overridden in a"},{"line_number":388,"context_line":"                                                                 per-policy configuration section."},{"line_number":389,"context_line":"allow_open_expired                              false            If true (default is false), an object that"},{"line_number":390,"context_line":"                                                                 has expired but not yet been reaped can be"},{"line_number":391,"context_line":"                                                                 can be accessed by setting the"},{"line_number":392,"context_line":"                                                                 \u0027x-open-expired\u0027 header to true in"}],"source_content_type":"text/x-rst","patch_set":56,"id":"a52bc838_c01d7b73","line":389,"range":{"start_line":389,"start_character":73,"end_line":389,"end_character":91},"in_reply_to":"9a9428e6_c7edc42b","updated":"2024-04-26 09:14:08.000000000","message":"Strictly it is redundant. But there\u0027s other instances where the default is called out in the description (weak precedent I know!). \n\nGiven that I need to page up 4 screens to see the column headings, I don\u0027t mind too much that I get an immediate confirmation of the default value in the description, so I don\u0027t object to it, but would also understand if it was corrected.","commit_id":"32a15b5f4606c5ddc4b7b0c9f09cdfbd4f1f3b3c"}],"doc/source/overview_expiring_objects.rst":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":95,"context_line":"----------------------------------"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"By default, objects that expire become inaccessible, even to the account owner."},{"line_number":98,"context_line":"The object may not have been deleted, but any GET/HEAD client request for the"},{"line_number":99,"context_line":"object will respond 404 Not Found after the ``x-delete-at`` timestamp"},{"line_number":100,"context_line":"has passed."},{"line_number":101,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"ccbfa122_844ee812","line":98,"range":{"start_line":98,"start_character":46,"end_line":98,"end_character":55},"updated":"2024-03-14 15:38:48.000000000","message":"not just GET/HEAD","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3cc6ff099db6fba5807f4de82cc9d68a54ab805a","unresolved":false,"context_lines":[{"line_number":95,"context_line":"----------------------------------"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"By default, objects that expire become inaccessible, even to the account owner."},{"line_number":98,"context_line":"The object may not have been deleted, but any GET/HEAD client request for the"},{"line_number":99,"context_line":"object will respond 404 Not Found after the ``x-delete-at`` timestamp"},{"line_number":100,"context_line":"has passed."},{"line_number":101,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"4fce28c6_d7c7c329","line":98,"range":{"start_line":98,"start_character":46,"end_line":98,"end_character":55},"in_reply_to":"b4b862e6_c66b1d7a","updated":"2024-03-20 11:32:40.000000000","message":"Done","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":true,"context_lines":[{"line_number":95,"context_line":"----------------------------------"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"By default, objects that expire become inaccessible, even to the account owner."},{"line_number":98,"context_line":"The object may not have been deleted, but any GET/HEAD client request for the"},{"line_number":99,"context_line":"object will respond 404 Not Found after the ``x-delete-at`` timestamp"},{"line_number":100,"context_line":"has passed."},{"line_number":101,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"b4b862e6_c66b1d7a","line":98,"range":{"start_line":98,"start_character":46,"end_line":98,"end_character":55},"in_reply_to":"ccbfa122_844ee812","updated":"2024-03-18 21:57:15.000000000","message":"GET/HEAD/POST?","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"To discover whether this flag is set, you can send a **GET** request to the"},{"line_number":119,"context_line":"``/info`` path. This will return configuration data in JSON format where the"},{"line_number":120,"context_line":"value of ``enable_open_expired`` is exposed."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"When using a temporary URL to access the object, this feature is not enabled."},{"line_number":123,"context_line":"This means that adding the header will not allow requests to temporary URLs"}],"source_content_type":"text/x-rst","patch_set":33,"id":"97aea89c_17a53905","line":120,"updated":"2024-03-14 15:38:48.000000000","message":"sure enough, there it is:\n```\n% swift info |grep open\n  enable_open_expired: True\n  ```","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"To discover whether this flag is set, you can send a **GET** request to the"},{"line_number":119,"context_line":"``/info`` path. This will return configuration data in JSON format where the"},{"line_number":120,"context_line":"value of ``enable_open_expired`` is exposed."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"When using a temporary URL to access the object, this feature is not enabled."},{"line_number":123,"context_line":"This means that adding the header will not allow requests to temporary URLs"}],"source_content_type":"text/x-rst","patch_set":33,"id":"dede9ad3_cabf1b5b","line":120,"in_reply_to":"97aea89c_17a53905","updated":"2024-03-18 21:57:15.000000000","message":"yup!","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"When using a temporary URL to access the object, this feature is not enabled."},{"line_number":123,"context_line":"This means that adding the header will not allow requests to temporary URLs"},{"line_number":124,"context_line":"to access expired objects."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"Upgrading impact: General Task Queue vs Legacy Queue"},{"line_number":127,"context_line":"----------------------------------------------------"}],"source_content_type":"text/x-rst","patch_set":33,"id":"4fb52c8a_48a21e73","line":124,"updated":"2024-03-14 15:38:48.000000000","message":"rendered here https://storage.gra.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_866/874710/33/check/openstack-tox-docs/866f108/docs/overview_expiring_objects.html#accessing-objects-after-expiration","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"When using a temporary URL to access the object, this feature is not enabled."},{"line_number":123,"context_line":"This means that adding the header will not allow requests to temporary URLs"},{"line_number":124,"context_line":"to access expired objects."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"Upgrading impact: General Task Queue vs Legacy Queue"},{"line_number":127,"context_line":"----------------------------------------------------"}],"source_content_type":"text/x-rst","patch_set":33,"id":"553bc461_4edbb7e9","line":124,"in_reply_to":"4fb52c8a_48a21e73","updated":"2024-03-18 21:57:15.000000000","message":"That\u0027s right!","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"The ``swift-proxy-server`` offers the ability to globally configure a flag to"},{"line_number":103,"context_line":"enable requests to access expired objects that have not yet been deleted,"},{"line_number":104,"context_line":"which may be in their grace period. When this flag is enabled, a user"},{"line_number":105,"context_line":"can make a GET, HEAD, or POST request with the header ``x-open-expired`` set"},{"line_number":106,"context_line":"to true to access the expired object."},{"line_number":107,"context_line":""}],"source_content_type":"text/x-rst","patch_set":42,"id":"70b2887a_97e29108","line":104,"range":{"start_line":104,"start_character":22,"end_line":104,"end_character":34},"updated":"2024-04-05 11:25:53.000000000","message":"these docs need to be updated to reflect the change to delay_reaping terminology. In this case I think you could simply delete the phrase \"which may be in their grace period\".\n\nThis patch is not yet based on the patch to change the naming to delay_reaping, for good reason - we need to make ops changes before we change the config names. However I think that for the purposes of comments and docs it is OK to assume the naming change in this patch. I doubt you\u0027ll need to mention delay_reaping in this patch anyway, just avoid the now defunct concept of \"grace period\".","commit_id":"01ba1f9e50f68639fc52278dd63b2d6c20dabb03"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"The ``swift-proxy-server`` offers the ability to globally configure a flag to"},{"line_number":103,"context_line":"enable requests to access expired objects that have not yet been deleted,"},{"line_number":104,"context_line":"which may be in their grace period. When this flag is enabled, a user"},{"line_number":105,"context_line":"can make a GET, HEAD, or POST request with the header ``x-open-expired`` set"},{"line_number":106,"context_line":"to true to access the expired object."},{"line_number":107,"context_line":""}],"source_content_type":"text/x-rst","patch_set":42,"id":"4ac03c7d_27294427","line":104,"range":{"start_line":104,"start_character":22,"end_line":104,"end_character":34},"in_reply_to":"70b2887a_97e29108","updated":"2024-04-08 21:47:48.000000000","message":"got it, thanks for pointing this out!","commit_id":"01ba1f9e50f68639fc52278dd63b2d6c20dabb03"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1bdcebd733613f6de075a64c5e9272abf44de452","unresolved":true,"context_lines":[{"line_number":102,"context_line":"----------------------------------"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"By default, objects that expire become inaccessible, even to the account owner."},{"line_number":105,"context_line":"The object may not have been deleted, but any GET/HEAD/POST client request for "},{"line_number":106,"context_line":"the object will respond 404 Not Found after the ``x-delete-at`` timestamp"},{"line_number":107,"context_line":"has passed."},{"line_number":108,"context_line":""}],"source_content_type":"text/x-rst","patch_set":51,"id":"69d67dbe_095fd685","line":105,"range":{"start_line":105,"start_character":78,"end_line":105,"end_character":79},"updated":"2024-04-22 19:26:39.000000000","message":"nit: trailing space","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"6c4fc915b42fe57fe0d87131393c3c43114ea568","unresolved":false,"context_lines":[{"line_number":102,"context_line":"----------------------------------"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"By default, objects that expire become inaccessible, even to the account owner."},{"line_number":105,"context_line":"The object may not have been deleted, but any GET/HEAD/POST client request for "},{"line_number":106,"context_line":"the object will respond 404 Not Found after the ``x-delete-at`` timestamp"},{"line_number":107,"context_line":"has passed."},{"line_number":108,"context_line":""}],"source_content_type":"text/x-rst","patch_set":51,"id":"9c1a698b_1c0ba842","line":105,"range":{"start_line":105,"start_character":78,"end_line":105,"end_character":79},"in_reply_to":"69d67dbe_095fd685","updated":"2024-04-24 19:50:46.000000000","message":"Thanks for catching it!","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3980eee847d156c5ae08bfb52f293d9023fcae2f","unresolved":true,"context_lines":[{"line_number":112,"context_line":"the header ``x-open-expired`` set to true to access the expired object."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"The global configuration is an opt-in flag that can be set in the"},{"line_number":115,"context_line":"``[proxy-server]`` section of the ``proxy-server.conf`` file . It is configured"},{"line_number":116,"context_line":"with a single flag ``allow_open_expired`` set to true or false. By default,"},{"line_number":117,"context_line":"this flag is set to false."},{"line_number":118,"context_line":""}],"source_content_type":"text/x-rst","patch_set":56,"id":"cc1311ed_cf6c2ee7","line":115,"range":{"start_line":115,"start_character":60,"end_line":115,"end_character":61},"updated":"2024-04-26 07:35:00.000000000","message":"Extra space","commit_id":"32a15b5f4606c5ddc4b7b0c9f09cdfbd4f1f3b3c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b94d2c15c9bfc817b4cfda4421d01ff03b0942a4","unresolved":false,"context_lines":[{"line_number":112,"context_line":"the header ``x-open-expired`` set to true to access the expired object."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"The global configuration is an opt-in flag that can be set in the"},{"line_number":115,"context_line":"``[proxy-server]`` section of the ``proxy-server.conf`` file . It is configured"},{"line_number":116,"context_line":"with a single flag ``allow_open_expired`` set to true or false. By default,"},{"line_number":117,"context_line":"this flag is set to false."},{"line_number":118,"context_line":""}],"source_content_type":"text/x-rst","patch_set":56,"id":"20cc8ded_98cb65b5","line":115,"range":{"start_line":115,"start_character":60,"end_line":115,"end_character":61},"in_reply_to":"cc1311ed_cf6c2ee7","updated":"2024-04-26 09:14:08.000000000","message":"Done - good eyes Matt!","commit_id":"32a15b5f4606c5ddc4b7b0c9f09cdfbd4f1f3b3c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3980eee847d156c5ae08bfb52f293d9023fcae2f","unresolved":true,"context_lines":[{"line_number":122,"context_line":"    allow_open_expired \u003d false"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"To discover whether this flag is set, you can send a **GET** request to the"},{"line_number":125,"context_line":"``/info`` path. This will return configuration data in JSON format where the"},{"line_number":126,"context_line":"value of ``allow_open_expired`` is exposed."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"When using a temporary URL to access the object, this feature is not enabled."}],"source_content_type":"text/x-rst","patch_set":56,"id":"0f096705_84ca34b4","line":125,"range":{"start_line":125,"start_character":0,"end_line":125,"end_character":15},"updated":"2024-04-26 07:35:00.000000000","message":"Can we do an rst link to https://github.com/openstack/swift/blob/master/doc/source/middleware.rst#discoverability (not a http link to this link, but an RST link. There is a `.. _discoverability:` anchor defined)\n\nAs this talks about the /info path.","commit_id":"32a15b5f4606c5ddc4b7b0c9f09cdfbd4f1f3b3c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b94d2c15c9bfc817b4cfda4421d01ff03b0942a4","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    allow_open_expired \u003d false"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"To discover whether this flag is set, you can send a **GET** request to the"},{"line_number":125,"context_line":"``/info`` path. This will return configuration data in JSON format where the"},{"line_number":126,"context_line":"value of ``allow_open_expired`` is exposed."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"When using a temporary URL to access the object, this feature is not enabled."}],"source_content_type":"text/x-rst","patch_set":56,"id":"f8ce1724_5af7640a","line":125,"range":{"start_line":125,"start_character":0,"end_line":125,"end_character":15},"in_reply_to":"0f096705_84ca34b4","updated":"2024-04-26 09:14:08.000000000","message":"Done","commit_id":"32a15b5f4606c5ddc4b7b0c9f09cdfbd4f1f3b3c"}],"etc/proxy-server.conf-sample":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"65a6eb1b8566e7fe2688086dec3a6ac717872384","unresolved":true,"context_lines":[{"line_number":346,"context_line":"# the object-expirer \u0027grace period\u0027 feature."},{"line_number":347,"context_line":"# This flag is set to false by default, so it must be changed to access"},{"line_number":348,"context_line":"# expired objects."},{"line_number":349,"context_line":"# enable_open_expired \u003d true"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"# Some proxy-server configuration options may be overridden on a per-policy"},{"line_number":352,"context_line":"# basis by including per-policy config section(s). The value of any option"}],"source_content_type":"application/octet-stream","patch_set":32,"id":"e7e228ea_80b0c630","line":349,"updated":"2024-03-11 16:39:14.000000000","message":"I understand the default for this is \"false\" - typically our example configs docuent the default in the commented value.","commit_id":"56f8d4435a90147244dcdb14c51c1e79795c78db"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":346,"context_line":"# the object-expirer \u0027grace period\u0027 feature."},{"line_number":347,"context_line":"# This flag is set to false by default, so it must be changed to access"},{"line_number":348,"context_line":"# expired objects."},{"line_number":349,"context_line":"# enable_open_expired \u003d true"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"# Some proxy-server configuration options may be overridden on a per-policy"},{"line_number":352,"context_line":"# basis by including per-policy config section(s). The value of any option"}],"source_content_type":"application/octet-stream","patch_set":32,"id":"a7de2be2_7a301b1c","line":349,"in_reply_to":"82bd2e02_87bf6bcf","updated":"2024-03-18 21:57:15.000000000","message":"Got it, updating~","commit_id":"56f8d4435a90147244dcdb14c51c1e79795c78db"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":346,"context_line":"# the object-expirer \u0027grace period\u0027 feature."},{"line_number":347,"context_line":"# This flag is set to false by default, so it must be changed to access"},{"line_number":348,"context_line":"# expired objects."},{"line_number":349,"context_line":"# enable_open_expired \u003d true"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"# Some proxy-server configuration options may be overridden on a per-policy"},{"line_number":352,"context_line":"# basis by including per-policy config section(s). The value of any option"}],"source_content_type":"application/octet-stream","patch_set":32,"id":"82bd2e02_87bf6bcf","line":349,"in_reply_to":"e7e228ea_80b0c630","updated":"2024-03-14 15:38:48.000000000","message":"+1 sample configs should show the default","commit_id":"56f8d4435a90147244dcdb14c51c1e79795c78db"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":343,"context_line":"# Setting \u0027enable_open_expired\u0027 to \u0027true\u0027 allows the \u0027x-open-expired\u0027 header"},{"line_number":344,"context_line":"# to be used with HEAD, GET, or POST requests to access expired objects that"},{"line_number":345,"context_line":"# have not yet been deleted from disk. This can be useful in conjunction with"},{"line_number":346,"context_line":"# the object-expirer \u0027grace period\u0027 feature."},{"line_number":347,"context_line":"# This flag is set to false by default, so it must be changed to access"},{"line_number":348,"context_line":"# expired objects."},{"line_number":349,"context_line":"# enable_open_expired \u003d true"}],"source_content_type":"application/octet-stream","patch_set":43,"id":"551d20c7_5a674910","line":346,"range":{"start_line":346,"start_character":21,"end_line":346,"end_character":35},"updated":"2024-04-05 11:25:53.000000000","message":"needs updating","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":343,"context_line":"# Setting \u0027enable_open_expired\u0027 to \u0027true\u0027 allows the \u0027x-open-expired\u0027 header"},{"line_number":344,"context_line":"# to be used with HEAD, GET, or POST requests to access expired objects that"},{"line_number":345,"context_line":"# have not yet been deleted from disk. This can be useful in conjunction with"},{"line_number":346,"context_line":"# the object-expirer \u0027grace period\u0027 feature."},{"line_number":347,"context_line":"# This flag is set to false by default, so it must be changed to access"},{"line_number":348,"context_line":"# expired objects."},{"line_number":349,"context_line":"# enable_open_expired \u003d true"}],"source_content_type":"application/octet-stream","patch_set":43,"id":"51d30295_0619c25a","line":346,"range":{"start_line":346,"start_character":21,"end_line":346,"end_character":35},"in_reply_to":"551d20c7_5a674910","updated":"2024-04-08 21:47:48.000000000","message":"Acknowledged","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"066ea9148530b203111ca98bf0c83763cd235aad","unresolved":true,"context_lines":[{"line_number":346,"context_line":"# the object-expirer \u0027delay_reaping\u0027 feature."},{"line_number":347,"context_line":"# This flag is set to false by default, so it must be changed to access"},{"line_number":348,"context_line":"# expired objects."},{"line_number":349,"context_line":"# enable_open_expired \u003d true"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"# Some proxy-server configuration options may be overridden on a per-policy"},{"line_number":352,"context_line":"# basis by including per-policy config section(s). The value of any option"}],"source_content_type":"application/octet-stream","patch_set":51,"id":"d47a2c20_7852a1ed","line":349,"updated":"2024-04-19 15:09:18.000000000","message":"I think this would be more consistent with existing options as \"allow_open_expired\" instead of \"enable\"\n\n```\n(vagrant-swift-all-in-one) clayg@banana:~/Workspace/vagrant-swift-all-in-one/swift$ grep allow_ etc/proxy-server.conf-sample \n# cors_allow_origin \u003d\n# allow_account_management \u003d false\n# allow_overrides \u003d true\n# allow_overrides \u003d true\n# in ACLs by setting allow_names_in_acls to false:\n# allow_names_in_acls \u003d true\n# allow_no_owner \u003d false\n# allow_multipart_uploads \u003d True\n# cors_preflight_allow_origin \u003d\n# allow_deletes set to true means to allow deletes\n# allow_deletes \u003d false\n# prefix match. incoming_allow_headers is a list of exceptions to these\n# incoming_allow_headers \u003d\n# prefix match. outgoing_allow_headers is a list of exceptions to these\n# outgoing_allow_headers \u003d x-object-meta-public-*\n# allow_async_delete \u003d true\n# allow_reserved_names_header \u003d false\n# allow_full_urls \u003d true\n# WARNING: Setting this option bypasses the \"allow_versions\" option\n# allow_versioned_writes \u003d false\n# allow_object_versioning \u003d false\n(vagrant-swift-all-in-one) clayg@banana:~/Workspace/vagrant-swift-all-in-one/swift$ grep enable_ etc/proxy-server.conf-sample \n# Setting \u0027enable_open_expired\u0027 to \u0027true\u0027 allows the \u0027x-open-expired\u0027 header\n# enable_open_expired \u003d true\n# enable_by_default \u003d false\n```","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"6c4fc915b42fe57fe0d87131393c3c43114ea568","unresolved":false,"context_lines":[{"line_number":346,"context_line":"# the object-expirer \u0027delay_reaping\u0027 feature."},{"line_number":347,"context_line":"# This flag is set to false by default, so it must be changed to access"},{"line_number":348,"context_line":"# expired objects."},{"line_number":349,"context_line":"# enable_open_expired \u003d true"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"# Some proxy-server configuration options may be overridden on a per-policy"},{"line_number":352,"context_line":"# basis by including per-policy config section(s). The value of any option"}],"source_content_type":"application/octet-stream","patch_set":51,"id":"18c78b66_83dcf9b7","line":349,"in_reply_to":"4cbce719_e9b24554","updated":"2024-04-24 19:50:46.000000000","message":"Updated to use allow_open_expired in config rather than enable_open_expired.","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1bdcebd733613f6de075a64c5e9272abf44de452","unresolved":true,"context_lines":[{"line_number":346,"context_line":"# the object-expirer \u0027delay_reaping\u0027 feature."},{"line_number":347,"context_line":"# This flag is set to false by default, so it must be changed to access"},{"line_number":348,"context_line":"# expired objects."},{"line_number":349,"context_line":"# enable_open_expired \u003d true"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"# Some proxy-server configuration options may be overridden on a per-policy"},{"line_number":352,"context_line":"# basis by including per-policy config section(s). The value of any option"}],"source_content_type":"application/octet-stream","patch_set":51,"id":"4cbce719_e9b24554","line":349,"in_reply_to":"d47a2c20_7852a1ed","updated":"2024-04-22 19:26:39.000000000","message":"Fair point -- there\u0027s also `disable_encryption` and `disable_path` (for healthcheck) options, but critically, the enable/disable options are more about what the server will do (and clients get few if any options), while the allow options are more oriented around client-facing features/optional headers.","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3980eee847d156c5ae08bfb52f293d9023fcae2f","unresolved":true,"context_lines":[{"line_number":346,"context_line":"# the object-expirer \u0027delay_reaping\u0027 feature."},{"line_number":347,"context_line":"# This flag is set to false by default, so it must be changed to access"},{"line_number":348,"context_line":"# expired objects."},{"line_number":349,"context_line":"# allow_open_expired \u003d true"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"# Some proxy-server configuration options may be overridden on a per-policy"},{"line_number":352,"context_line":"# basis by including per-policy config section(s). The value of any option"}],"source_content_type":"application/octet-stream","patch_set":56,"id":"77fa722b_d4e43bc1","line":349,"range":{"start_line":349,"start_character":23,"end_line":349,"end_character":27},"updated":"2024-04-26 07:35:00.000000000","message":"When we define the option in our sample files, we always right the current default. So this should be a false.","commit_id":"32a15b5f4606c5ddc4b7b0c9f09cdfbd4f1f3b3c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b94d2c15c9bfc817b4cfda4421d01ff03b0942a4","unresolved":false,"context_lines":[{"line_number":346,"context_line":"# the object-expirer \u0027delay_reaping\u0027 feature."},{"line_number":347,"context_line":"# This flag is set to false by default, so it must be changed to access"},{"line_number":348,"context_line":"# expired objects."},{"line_number":349,"context_line":"# allow_open_expired \u003d true"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"# Some proxy-server configuration options may be overridden on a per-policy"},{"line_number":352,"context_line":"# basis by including per-policy config section(s). The value of any option"}],"source_content_type":"application/octet-stream","patch_set":56,"id":"6a3af042_8ad6cedd","line":349,"range":{"start_line":349,"start_character":23,"end_line":349,"end_character":27},"in_reply_to":"77fa722b_d4e43bc1","updated":"2024-04-26 09:14:08.000000000","message":"good catch @Matt. I think Clay and I caught this on an earlier patch but obviously slipped through the net.","commit_id":"32a15b5f4606c5ddc4b7b0c9f09cdfbd4f1f3b3c"}],"swift/common/middleware/tempurl.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":255,"context_line":"    incoming requests. Names may optionally end with ``*`` to"},{"line_number":256,"context_line":"    indicate a prefix match. ``incoming_allow_headers`` is a"},{"line_number":257,"context_line":"    list of exceptions to these removals."},{"line_number":258,"context_line":"    Default: ``x-timestamp``"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"``incoming_allow_headers``"},{"line_number":261,"context_line":"    A whitespace-delimited list of the headers allowed as"}],"source_content_type":"text/x-python","patch_set":33,"id":"2199b04e_22a80d0f","line":258,"updated":"2024-03-14 15:38:48.000000000","message":"needs updating","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":255,"context_line":"    incoming requests. Names may optionally end with ``*`` to"},{"line_number":256,"context_line":"    indicate a prefix match. ``incoming_allow_headers`` is a"},{"line_number":257,"context_line":"    list of exceptions to these removals."},{"line_number":258,"context_line":"    Default: ``x-timestamp``"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"``incoming_allow_headers``"},{"line_number":261,"context_line":"    A whitespace-delimited list of the headers allowed as"}],"source_content_type":"text/x-python","patch_set":33,"id":"3ef9f794_25141fd6","line":258,"in_reply_to":"2199b04e_22a80d0f","updated":"2024-03-18 21:57:15.000000000","message":"Got it, updating it!","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","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":33,"id":"41a96ec2_eadf6a11","line":329,"updated":"2024-03-14 15:38:48.000000000","message":"The tempurl section of proxy-server.conf-sample needs to be updated to reflect this change\n\n...which reveals a weakness, in that if the sample conf was not updated, and someone used its suggestion of\n```\nincoming_remove_headers \u003d x-timestamp\n```\nthen x-open-expired would be allowed :( because the config list is not additive.","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","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":33,"id":"bab47884_19036765","line":329,"in_reply_to":"41a96ec2_eadf6a11","updated":"2024-03-18 21:57:15.000000000","message":"Got it, updating the `proxy-server.conf-sample`. Would that be enough to resolve this? Not sure what you mean by the config list is not additive","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3cc6ff099db6fba5807f4de82cc9d68a54ab805a","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":33,"id":"84025c4b_d294a634","line":329,"in_reply_to":"bab47884_19036765","updated":"2024-03-20 11:32:40.000000000","message":"Yes you have resolved the immediate issue thanks.\n\nOtherwise, I was reflecting on the pattern of allowing config to *replace* the list of incoming remove headers, rather than *add* to it. So if you had \n\n```\nincoming_remove_headers \u003d x-timestamp\n```\n\nin config, then ``x-open-expired`` would not be removed :( Which is why it was important to update the sample config to at least show what ought to be there.","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"}],"swift/common/request_helpers.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"648b57ebd0aeb5db53f09319ecd35578a91ab2ab","unresolved":true,"context_lines":[{"line_number":48,"context_line":"OBJECT_SYSMETA_CONTAINER_UPDATE_OVERRIDE_PREFIX \u003d \\"},{"line_number":49,"context_line":"    \u0027x-object-sysmeta-container-update-override-\u0027"},{"line_number":50,"context_line":"USE_REPLICATION_NETWORK_HEADER \u003d \u0027x-backend-use-replication-network\u0027"},{"line_number":51,"context_line":"USE_OPEN_EXPIRED_HEADER \u003d \u0027x-open-expired\u0027"},{"line_number":52,"context_line":"MISPLACED_OBJECTS_ACCOUNT \u003d \u0027.misplaced_objects\u0027"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"04ddc3fe_e3a76c1e","line":51,"updated":"2023-02-28 10:42:33.000000000","message":"is \u0027USE_\u0027 relevant in the context of this variable name?","commit_id":"40576d39c83d8592b3ab8086790d9ea28963e1b0"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"8929f26021a671ca7006ce506445bbce707cd053","unresolved":false,"context_lines":[{"line_number":48,"context_line":"OBJECT_SYSMETA_CONTAINER_UPDATE_OVERRIDE_PREFIX \u003d \\"},{"line_number":49,"context_line":"    \u0027x-object-sysmeta-container-update-override-\u0027"},{"line_number":50,"context_line":"USE_REPLICATION_NETWORK_HEADER \u003d \u0027x-backend-use-replication-network\u0027"},{"line_number":51,"context_line":"USE_OPEN_EXPIRED_HEADER \u003d \u0027x-open-expired\u0027"},{"line_number":52,"context_line":"MISPLACED_OBJECTS_ACCOUNT \u003d \u0027.misplaced_objects\u0027"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"226eabcf_18694db2","line":51,"in_reply_to":"04ddc3fe_e3a76c1e","updated":"2023-08-17 16:15:24.000000000","message":"I was going for consistency in naming within that file.","commit_id":"40576d39c83d8592b3ab8086790d9ea28963e1b0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"648b57ebd0aeb5db53f09319ecd35578a91ab2ab","unresolved":true,"context_lines":[{"line_number":918,"context_line":"    return False"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"def is_open_expired_header(headers\u003dNone):"},{"line_number":922,"context_line":"    \"\"\""},{"line_number":923,"context_line":"    Determine if x-open-expired is used."},{"line_number":924,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a0baa4d_fe7d81d4","line":921,"updated":"2023-02-28 10:42:33.000000000","message":"It\u0027s not obvious to me why this function is necessary:\n\nIn obj/server.py you use:\n\n  config_true_value(\n            request.headers.get(\u0027x-backend-open-expired\u0027, \u0027false\u0027))\n            \nwhich seems sufficient given that swob.Request.headers is a case insensitive HeaderEnvironProxy.\n\nAlso, do we need to allow for this to be called with no arg?\n\nBTW, is_use_replication_network (which is a similar pattern) does look like it may be called with a plain dict, so the case-handling is perhaps more relevant in that function.","commit_id":"40576d39c83d8592b3ab8086790d9ea28963e1b0"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"8929f26021a671ca7006ce506445bbce707cd053","unresolved":false,"context_lines":[{"line_number":918,"context_line":"    return False"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"def is_open_expired_header(headers\u003dNone):"},{"line_number":922,"context_line":"    \"\"\""},{"line_number":923,"context_line":"    Determine if x-open-expired is used."},{"line_number":924,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"efaa1078_34724d5a","line":921,"in_reply_to":"7a0baa4d_fe7d81d4","updated":"2023-08-17 16:15:24.000000000","message":"Ack","commit_id":"40576d39c83d8592b3ab8086790d9ea28963e1b0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c0327644ec38a0ce70ea4c2e7d75fee64fb88fd4","unresolved":true,"context_lines":[{"line_number":998,"context_line":"def is_open_expired(app, req):"},{"line_number":999,"context_line":"    \"\"\""},{"line_number":1000,"context_line":"    Helper function to check if a request with the header \u0027x-open-expired\u0027"},{"line_number":1001,"context_line":"    can access an object object that has not yet been reaped by the"},{"line_number":1002,"context_line":"    object-expirer based on the enable_open_expired global config."},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    :param app: the application instance"}],"source_content_type":"text/x-python","patch_set":46,"id":"c9317d84_00f34dea","line":1001,"range":{"start_line":1001,"start_character":18,"end_line":1001,"end_character":31},"updated":"2024-04-10 10:42:32.000000000","message":"typo","commit_id":"04287753d4ad42b70bee47be4db8c04a5975f7ae"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"657e5b870fb74f7a654388696a7f034e8740a5c6","unresolved":false,"context_lines":[{"line_number":998,"context_line":"def is_open_expired(app, req):"},{"line_number":999,"context_line":"    \"\"\""},{"line_number":1000,"context_line":"    Helper function to check if a request with the header \u0027x-open-expired\u0027"},{"line_number":1001,"context_line":"    can access an object object that has not yet been reaped by the"},{"line_number":1002,"context_line":"    object-expirer based on the enable_open_expired global config."},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    :param app: the application instance"}],"source_content_type":"text/x-python","patch_set":46,"id":"fd082545_70f52a28","line":1001,"range":{"start_line":1001,"start_character":18,"end_line":1001,"end_character":31},"in_reply_to":"c9317d84_00f34dea","updated":"2024-04-10 16:51:00.000000000","message":"Done","commit_id":"04287753d4ad42b70bee47be4db8c04a5975f7ae"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c0327644ec38a0ce70ea4c2e7d75fee64fb88fd4","unresolved":true,"context_lines":[{"line_number":1005,"context_line":"    :param req: request object"},{"line_number":1006,"context_line":"    \"\"\""},{"line_number":1007,"context_line":"    return (config_true_value(app.enable_open_expired) and"},{"line_number":1008,"context_line":"            config_true_value(req.headers.get(\u0027x-open-expired\u0027)))"}],"source_content_type":"text/x-python","patch_set":46,"id":"752b1953_114d5374","line":1008,"updated":"2024-04-10 10:42:32.000000000","message":"I guess we should have a unit test for this","commit_id":"04287753d4ad42b70bee47be4db8c04a5975f7ae"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"657e5b870fb74f7a654388696a7f034e8740a5c6","unresolved":false,"context_lines":[{"line_number":1005,"context_line":"    :param req: request object"},{"line_number":1006,"context_line":"    \"\"\""},{"line_number":1007,"context_line":"    return (config_true_value(app.enable_open_expired) and"},{"line_number":1008,"context_line":"            config_true_value(req.headers.get(\u0027x-open-expired\u0027)))"}],"source_content_type":"text/x-python","patch_set":46,"id":"25d029dd_bd70e03e","line":1008,"in_reply_to":"752b1953_114d5374","updated":"2024-04-10 16:51:00.000000000","message":"Done","commit_id":"04287753d4ad42b70bee47be4db8c04a5975f7ae"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"edb8242995ea695fc30e9bc8b0245dacf20ab87f","unresolved":true,"context_lines":[{"line_number":1008,"context_line":"            config_true_value(req.headers.get(\u0027x-open-expired\u0027)))"},{"line_number":1009,"context_line":""},{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"def is_backend_open_expired(request):"},{"line_number":1012,"context_line":"    x_backend_open_expired \u003d config_true_value(request.headers.get("},{"line_number":1013,"context_line":"        \u0027x-backend-open-expired\u0027, \u0027false\u0027))"},{"line_number":1014,"context_line":"    x_backend_replication \u003d config_true_value(request.headers.get("}],"source_content_type":"text/x-python","patch_set":48,"id":"79d908d7_46f8e764","line":1011,"updated":"2024-04-12 08:35:20.000000000","message":"please add doc-string","commit_id":"f84e42df73bb041b52c8e394024e9121586b1b69"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"3d45d6acb5891426a0dd54699a14d3b8ee6ee3d0","unresolved":false,"context_lines":[{"line_number":1008,"context_line":"            config_true_value(req.headers.get(\u0027x-open-expired\u0027)))"},{"line_number":1009,"context_line":""},{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":"def is_backend_open_expired(request):"},{"line_number":1012,"context_line":"    x_backend_open_expired \u003d config_true_value(request.headers.get("},{"line_number":1013,"context_line":"        \u0027x-backend-open-expired\u0027, \u0027false\u0027))"},{"line_number":1014,"context_line":"    x_backend_replication \u003d config_true_value(request.headers.get("}],"source_content_type":"text/x-python","patch_set":48,"id":"c79c88c8_bfd6fa9d","line":1011,"in_reply_to":"79d908d7_46f8e764","updated":"2024-04-15 04:13:42.000000000","message":"Done","commit_id":"f84e42df73bb041b52c8e394024e9121586b1b69"}],"swift/obj/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5d5d137b2f38da74c0430db25c9dfabf65527649","unresolved":true,"context_lines":[{"line_number":1086,"context_line":"                policy\u003dpolicy, frag_prefs\u003dfrag_prefs,"},{"line_number":1087,"context_line":"                open_expired\u003dconfig_true_value("},{"line_number":1088,"context_line":"                    request.headers.get(\u0027x-backend-replication\u0027, \u0027false\u0027) or"},{"line_number":1089,"context_line":"                    request.headers.get(\u0027x-open-expired\u0027, \u0027false\u0027)))"},{"line_number":1090,"context_line":"        except DiskFileDeviceUnavailable:"},{"line_number":1091,"context_line":"            return HTTPInsufficientStorage(drive\u003ddevice, request\u003drequest)"},{"line_number":1092,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"acfd97de_8d2ccedc","line":1089,"updated":"2023-02-22 15:10:36.000000000","message":"this is mostly all i expected to see - is it not sufficient?","commit_id":"d54d38040aafa5c04fa9e695dd639efab5ee7a52"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"6620822508a628ee6e4d857ec0e37dda50a0f17c","unresolved":false,"context_lines":[{"line_number":1086,"context_line":"                policy\u003dpolicy, frag_prefs\u003dfrag_prefs,"},{"line_number":1087,"context_line":"                open_expired\u003dconfig_true_value("},{"line_number":1088,"context_line":"                    request.headers.get(\u0027x-backend-replication\u0027, \u0027false\u0027) or"},{"line_number":1089,"context_line":"                    request.headers.get(\u0027x-open-expired\u0027, \u0027false\u0027)))"},{"line_number":1090,"context_line":"        except DiskFileDeviceUnavailable:"},{"line_number":1091,"context_line":"            return HTTPInsufficientStorage(drive\u003ddevice, request\u003drequest)"},{"line_number":1092,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7e9376f9_45c27752","line":1089,"in_reply_to":"acfd97de_8d2ccedc","updated":"2023-10-25 20:43:45.000000000","message":"Done","commit_id":"d54d38040aafa5c04fa9e695dd639efab5ee7a52"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7adf9a64e9357667ed65573c6f7d339916565211","unresolved":true,"context_lines":[{"line_number":155,"context_line":"            content-disposition,"},{"line_number":156,"context_line":"            content-encoding,"},{"line_number":157,"context_line":"            x-delete-at,"},{"line_number":158,"context_line":"            x-open-expired"},{"line_number":159,"context_line":"            x-object-manifest,"},{"line_number":160,"context_line":"            x-static-large-object,"},{"line_number":161,"context_line":"            cache-control,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9466a92b_28fbfd87","line":158,"updated":"2023-02-22 00:46:38.000000000","message":"These headers are used during `PUT`/`POST` to decide what metadata we want to write down on disk -- we shouldn\u0027t need to add this.","commit_id":"697df368355f3c127874826ed877ae3b8bcbc92f"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"8929f26021a671ca7006ce506445bbce707cd053","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            content-disposition,"},{"line_number":156,"context_line":"            content-encoding,"},{"line_number":157,"context_line":"            x-delete-at,"},{"line_number":158,"context_line":"            x-open-expired"},{"line_number":159,"context_line":"            x-object-manifest,"},{"line_number":160,"context_line":"            x-static-large-object,"},{"line_number":161,"context_line":"            cache-control,"}],"source_content_type":"text/x-python","patch_set":3,"id":"8a3f3c70_d57fb6c4","line":158,"in_reply_to":"9466a92b_28fbfd87","updated":"2023-08-17 16:15:24.000000000","message":"Ack","commit_id":"697df368355f3c127874826ed877ae3b8bcbc92f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7adf9a64e9357667ed65573c6f7d339916565211","unresolved":true,"context_lines":[{"line_number":459,"context_line":"        \"\"\""},{"line_number":460,"context_line":"        if config_true_value("},{"line_number":461,"context_line":"                request.headers.get(\u0027x-backend-replication\u0027, \u0027f\u0027) or"},{"line_number":462,"context_line":"                request.headers.get(\u0027x-open-expired\u0027, \u0027f\u0027)):"},{"line_number":463,"context_line":"            return"},{"line_number":464,"context_line":"        delete_at \u003d normalize_delete_at_timestamp(delete_at)"},{"line_number":465,"context_line":"        updates \u003d [(None, None)]"}],"source_content_type":"text/x-python","patch_set":3,"id":"4752c393_9bb9417d","line":462,"updated":"2023-02-22 00:46:38.000000000","message":"I don\u0027t think we want this exception -- `x-backend-replication` gets it because we assume that the node sending us data either already updated the queues or still has an async pending to take care of it. Pretty sure that\u0027s the *only* exception we want.","commit_id":"697df368355f3c127874826ed877ae3b8bcbc92f"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"8929f26021a671ca7006ce506445bbce707cd053","unresolved":false,"context_lines":[{"line_number":459,"context_line":"        \"\"\""},{"line_number":460,"context_line":"        if config_true_value("},{"line_number":461,"context_line":"                request.headers.get(\u0027x-backend-replication\u0027, \u0027f\u0027) or"},{"line_number":462,"context_line":"                request.headers.get(\u0027x-open-expired\u0027, \u0027f\u0027)):"},{"line_number":463,"context_line":"            return"},{"line_number":464,"context_line":"        delete_at \u003d normalize_delete_at_timestamp(delete_at)"},{"line_number":465,"context_line":"        updates \u003d [(None, None)]"}],"source_content_type":"text/x-python","patch_set":3,"id":"71c1bc84_467c01d4","line":462,"in_reply_to":"4752c393_9bb9417d","updated":"2023-08-17 16:15:24.000000000","message":"Ack","commit_id":"697df368355f3c127874826ed877ae3b8bcbc92f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7adf9a64e9357667ed65573c6f7d339916565211","unresolved":true,"context_lines":[{"line_number":1078,"context_line":"        frag_prefs \u003d safe_json_loads("},{"line_number":1079,"context_line":"            request.headers.get(\u0027X-Backend-Fragment-Preferences\u0027))"},{"line_number":1080,"context_line":"        x_open_expired \u003d config_true_value(request.headers."},{"line_number":1081,"context_line":"                                           get(\u0027x-open-expired\u0027, \u0027false\u0027))"},{"line_number":1082,"context_line":"        try:"},{"line_number":1083,"context_line":"            disk_file \u003d self.get_diskfile("},{"line_number":1084,"context_line":"                device, partition, account, container, obj,"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7e15ed_42d7882e","line":1081,"range":{"start_line":1081,"start_character":48,"end_line":1081,"end_character":62},"updated":"2023-02-22 00:46:38.000000000","message":"I\u0027ve got a strong preference that this be `x-backend-open-expired` -- we can make it something that we expose to clients as `x-open-expired`, but only \"reseller admins\" should be able to do this (at least, by default -- *maybe* we could open it up to \"swift owners\" via some config option).","commit_id":"697df368355f3c127874826ed877ae3b8bcbc92f"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"8929f26021a671ca7006ce506445bbce707cd053","unresolved":false,"context_lines":[{"line_number":1078,"context_line":"        frag_prefs \u003d safe_json_loads("},{"line_number":1079,"context_line":"            request.headers.get(\u0027X-Backend-Fragment-Preferences\u0027))"},{"line_number":1080,"context_line":"        x_open_expired \u003d config_true_value(request.headers."},{"line_number":1081,"context_line":"                                           get(\u0027x-open-expired\u0027, \u0027false\u0027))"},{"line_number":1082,"context_line":"        try:"},{"line_number":1083,"context_line":"            disk_file \u003d self.get_diskfile("},{"line_number":1084,"context_line":"                device, partition, account, container, obj,"}],"source_content_type":"text/x-python","patch_set":3,"id":"53115178_a476e735","line":1081,"range":{"start_line":1081,"start_character":48,"end_line":1081,"end_character":62},"in_reply_to":"df7e15ed_42d7882e","updated":"2023-08-17 16:15:24.000000000","message":"Ack","commit_id":"697df368355f3c127874826ed877ae3b8bcbc92f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5d5d137b2f38da74c0430db25c9dfabf65527649","unresolved":true,"context_lines":[{"line_number":459,"context_line":"        \"\"\""},{"line_number":460,"context_line":"        if config_true_value("},{"line_number":461,"context_line":"                request.headers.get(\u0027x-backend-replication\u0027, \u0027f\u0027) or"},{"line_number":462,"context_line":"                request.headers.get(\u0027x-open-expired\u0027, \u0027f\u0027)):"},{"line_number":463,"context_line":"            return"},{"line_number":464,"context_line":"        delete_at \u003d normalize_delete_at_timestamp(delete_at)"},{"line_number":465,"context_line":"        updates \u003d [(None, None)]"}],"source_content_type":"text/x-python","patch_set":5,"id":"bc06807f_e1add2ad","line":462,"updated":"2023-02-22 15:10:36.000000000","message":"i think this one still suffers from `config_true_value(\u0027f\u0027 or \u0027true\u0027) \u003d\u003d False`","commit_id":"2246783942844a212c853dc727788c534ceeb156"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"6620822508a628ee6e4d857ec0e37dda50a0f17c","unresolved":false,"context_lines":[{"line_number":459,"context_line":"        \"\"\""},{"line_number":460,"context_line":"        if config_true_value("},{"line_number":461,"context_line":"                request.headers.get(\u0027x-backend-replication\u0027, \u0027f\u0027) or"},{"line_number":462,"context_line":"                request.headers.get(\u0027x-open-expired\u0027, \u0027f\u0027)):"},{"line_number":463,"context_line":"            return"},{"line_number":464,"context_line":"        delete_at \u003d normalize_delete_at_timestamp(delete_at)"},{"line_number":465,"context_line":"        updates \u003d [(None, None)]"}],"source_content_type":"text/x-python","patch_set":5,"id":"f17f65ab_4dc37eee","line":462,"in_reply_to":"bc06807f_e1add2ad","updated":"2023-10-25 20:43:45.000000000","message":"Done","commit_id":"2246783942844a212c853dc727788c534ceeb156"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"6620822508a628ee6e4d857ec0e37dda50a0f17c","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"                policy\u003dpolicy, frag_prefs\u003dfrag_prefs,"},{"line_number":1084,"context_line":"                open_expired\u003dconfig_true_value("},{"line_number":1085,"context_line":"                    request.headers.get(\u0027x-backend-replication\u0027, \u0027false\u0027)) or"},{"line_number":1086,"context_line":"                             x_backend_open_expired)"},{"line_number":1087,"context_line":"        except DiskFileDeviceUnavailable:"},{"line_number":1088,"context_line":"            return HTTPInsufficientStorage(drive\u003ddevice, request\u003drequest)"},{"line_number":1089,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"8b15338b_0aefe0c4","line":1086,"in_reply_to":"009b40e9_7c860104","updated":"2023-10-25 20:43:45.000000000","message":"Done","commit_id":"00c3df4a97083fea653a27d5b82081bdf7e0014c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"8929f26021a671ca7006ce506445bbce707cd053","unresolved":true,"context_lines":[{"line_number":1083,"context_line":"                policy\u003dpolicy, frag_prefs\u003dfrag_prefs,"},{"line_number":1084,"context_line":"                open_expired\u003dconfig_true_value("},{"line_number":1085,"context_line":"                    request.headers.get(\u0027x-backend-replication\u0027, \u0027false\u0027)) or"},{"line_number":1086,"context_line":"                             x_backend_open_expired)"},{"line_number":1087,"context_line":"        except DiskFileDeviceUnavailable:"},{"line_number":1088,"context_line":"            return HTTPInsufficientStorage(drive\u003ddevice, request\u003drequest)"},{"line_number":1089,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"009b40e9_7c860104","line":1086,"in_reply_to":"03d43be3_e4053cc8","updated":"2023-08-17 16:15:24.000000000","message":"\u003e pep8: E131 continuation line unaligned for hanging indent\n\nPlease fix.","commit_id":"00c3df4a97083fea653a27d5b82081bdf7e0014c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":637,"context_line":"        try:"},{"line_number":638,"context_line":"            disk_file \u003d self.get_diskfile("},{"line_number":639,"context_line":"                device, partition, account, container, obj,"},{"line_number":640,"context_line":"                policy\u003dpolicy, open_expired\u003dconfig_true_value("},{"line_number":641,"context_line":"                    request.headers.get(\u0027x-backend-replication\u0027,"},{"line_number":642,"context_line":"                                        \u0027false\u0027)) or x_backend_open_expired,"},{"line_number":643,"context_line":"                next_part_power\u003dnext_part_power)"},{"line_number":644,"context_line":"        except DiskFileDeviceUnavailable:"},{"line_number":645,"context_line":"            return HTTPInsufficientStorage(drive\u003ddevice, request\u003drequest)"}],"source_content_type":"text/x-python","patch_set":33,"id":"6192c484_0517048d","line":642,"range":{"start_line":640,"start_character":44,"end_line":642,"end_character":49},"updated":"2024-03-14 15:38:48.000000000","message":"it seems odd that we parse one of the headers inline here but the other we do above and assign a var...and we do it three times\n\nhow about a helper function (in request_helpers.py)\n\n```\ndef is_backend_open_expired(req):\n    # test both the headers\n```","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":637,"context_line":"        try:"},{"line_number":638,"context_line":"            disk_file \u003d self.get_diskfile("},{"line_number":639,"context_line":"                device, partition, account, container, obj,"},{"line_number":640,"context_line":"                policy\u003dpolicy, open_expired\u003dconfig_true_value("},{"line_number":641,"context_line":"                    request.headers.get(\u0027x-backend-replication\u0027,"},{"line_number":642,"context_line":"                                        \u0027false\u0027)) or x_backend_open_expired,"},{"line_number":643,"context_line":"                next_part_power\u003dnext_part_power)"},{"line_number":644,"context_line":"        except DiskFileDeviceUnavailable:"},{"line_number":645,"context_line":"            return HTTPInsufficientStorage(drive\u003ddevice, request\u003drequest)"}],"source_content_type":"text/x-python","patch_set":33,"id":"31deb3ce_be00f24f","line":642,"range":{"start_line":640,"start_character":44,"end_line":642,"end_character":49},"in_reply_to":"6192c484_0517048d","updated":"2024-03-18 21:57:15.000000000","message":"Thanks for calling this out, updating. Much cleaner solution!","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9aa96adc006482db492a2fddc34074b7e7d486dc","unresolved":true,"context_lines":[{"line_number":116,"context_line":"        \u0027x-backend-open-expired\u0027, \u0027false\u0027))"},{"line_number":117,"context_line":"    x_backend_replication \u003d config_true_value(request.headers.get("},{"line_number":118,"context_line":"        \u0027x-backend-replication\u0027, \u0027false\u0027))"},{"line_number":119,"context_line":"    return x_backend_open_expired or x_backend_replication"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"class EventletPlungerString(bytes):"}],"source_content_type":"text/x-python","patch_set":47,"id":"9c4eef6e_e9e7d32f","line":119,"updated":"2024-04-10 10:47:46.000000000","message":"nit: given that is_open_expired is in request_helpers.py, it might make sense for this to also be in request_helpers.py. In which case, it should also have a unit test very similar to the one I added for is_open_expired in test_request_helpers.\n\nArguably it should have a unit test since it\u0027s a module level \"public\" function, but it is covered by the ObjectController tests.","commit_id":"225c9a03b3055248ba3e7caa10c369b911a71f1c"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"657e5b870fb74f7a654388696a7f034e8740a5c6","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        \u0027x-backend-open-expired\u0027, \u0027false\u0027))"},{"line_number":117,"context_line":"    x_backend_replication \u003d config_true_value(request.headers.get("},{"line_number":118,"context_line":"        \u0027x-backend-replication\u0027, \u0027false\u0027))"},{"line_number":119,"context_line":"    return x_backend_open_expired or x_backend_replication"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"class EventletPlungerString(bytes):"}],"source_content_type":"text/x-python","patch_set":47,"id":"214107f8_1642e2c9","line":119,"in_reply_to":"9c4eef6e_e9e7d32f","updated":"2024-04-10 16:51:00.000000000","message":"Got it, added a test + moved to request helpers, this whole thing makes sense - wasn\u0027t familiar with request_helpers having tests, but good to know that most methods should have their own tests","commit_id":"225c9a03b3055248ba3e7caa10c369b911a71f1c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"616db680566770b17c1bdf0514d7843621af09c9","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"            disk_file \u003d self.get_diskfile("},{"line_number":1075,"context_line":"                device, partition, account, container, obj,"},{"line_number":1076,"context_line":"                policy\u003dpolicy, frag_prefs\u003dfrag_prefs,"},{"line_number":1077,"context_line":"                open_expired\u003dis_backend_open_expired(request))"},{"line_number":1078,"context_line":"        except DiskFileDeviceUnavailable:"},{"line_number":1079,"context_line":"            return HTTPInsufficientStorage(drive\u003ddevice, request\u003drequest)"},{"line_number":1080,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":49,"id":"cd1639b5_e50c9ea7","line":1077,"updated":"2024-04-16 12:46:28.000000000","message":"Unifying detection of both headers was nice!","commit_id":"efb0f08ddd5253c84691c62927bb1e4a4d55f872"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3980eee847d156c5ae08bfb52f293d9023fcae2f","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        try:"},{"line_number":637,"context_line":"            disk_file \u003d self.get_diskfile("},{"line_number":638,"context_line":"                device, partition, account, container, obj,"},{"line_number":639,"context_line":"                policy\u003dpolicy, open_expired\u003dis_backend_open_expired(request),"},{"line_number":640,"context_line":"                next_part_power\u003dnext_part_power)"},{"line_number":641,"context_line":"        except DiskFileDeviceUnavailable:"},{"line_number":642,"context_line":"            return HTTPInsufficientStorage(drive\u003ddevice, request\u003drequest)"}],"source_content_type":"text/x-python","patch_set":56,"id":"cb729069_76c6b2cf","line":639,"updated":"2024-04-26 07:35:00.000000000","message":"Nice love this, much easier to read!","commit_id":"32a15b5f4606c5ddc4b7b0c9f09cdfbd4f1f3b3c"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"648b57ebd0aeb5db53f09319ecd35578a91ab2ab","unresolved":true,"context_lines":[{"line_number":249,"context_line":"        obj_ring \u003d self.app.get_object_ring(policy_index)"},{"line_number":250,"context_line":"        req.headers[\u0027X-Backend-Storage-Policy-Index\u0027] \u003d policy_index"},{"line_number":251,"context_line":"        req.headers[\u0027X-Backend-Open-Expired\u0027] \u003d is_open_expired_header("},{"line_number":252,"context_line":"            req.headers)"},{"line_number":253,"context_line":"        if \u0027swift.authorize\u0027 in req.environ:"},{"line_number":254,"context_line":"            aresp \u003d req.environ[\u0027swift.authorize\u0027](req)"},{"line_number":255,"context_line":"            if aresp:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9908656b_e61d1630","line":252,"updated":"2023-02-28 10:42:33.000000000","message":"I still don\u0027t see any reason to translate the header to a -Backend- header unless there is a plan to make the propagation of the header conditional on e.g. auth [1]. Otherwise, it can be treated like an X-Delete-At, X-If_Delete-At and just pass from client to backend.\n\n[1] I am aware that there are arguments for gating this header based on user privilege.","commit_id":"40576d39c83d8592b3ab8086790d9ea28963e1b0"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"8929f26021a671ca7006ce506445bbce707cd053","unresolved":false,"context_lines":[{"line_number":249,"context_line":"        obj_ring \u003d self.app.get_object_ring(policy_index)"},{"line_number":250,"context_line":"        req.headers[\u0027X-Backend-Storage-Policy-Index\u0027] \u003d policy_index"},{"line_number":251,"context_line":"        req.headers[\u0027X-Backend-Open-Expired\u0027] \u003d is_open_expired_header("},{"line_number":252,"context_line":"            req.headers)"},{"line_number":253,"context_line":"        if \u0027swift.authorize\u0027 in req.environ:"},{"line_number":254,"context_line":"            aresp \u003d req.environ[\u0027swift.authorize\u0027](req)"},{"line_number":255,"context_line":"            if aresp:"}],"source_content_type":"text/x-python","patch_set":12,"id":"aa96e47b_9d135897","line":252,"in_reply_to":"9908656b_e61d1630","updated":"2023-08-17 16:15:24.000000000","message":"Ack","commit_id":"40576d39c83d8592b3ab8086790d9ea28963e1b0"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a2080683760067df3e449276746ea12016d35fe3","unresolved":true,"context_lines":[{"line_number":249,"context_line":"        obj_ring \u003d self.app.get_object_ring(policy_index)"},{"line_number":250,"context_line":"        req.headers[\u0027X-Backend-Storage-Policy-Index\u0027] \u003d policy_index"},{"line_number":251,"context_line":"        req.headers[\u0027X-Backend-Open-Expired\u0027] \u003d is_open_expired_header("},{"line_number":252,"context_line":"            req.headers)"},{"line_number":253,"context_line":"        if \u0027swift.authorize\u0027 in req.environ:"},{"line_number":254,"context_line":"            aresp \u003d req.environ[\u0027swift.authorize\u0027](req)"},{"line_number":255,"context_line":"            if aresp:"}],"source_content_type":"text/x-python","patch_set":12,"id":"cbbc78d3_e951c69d","line":252,"in_reply_to":"9908656b_e61d1630","updated":"2023-05-23 23:34:12.000000000","message":"True, but I don\u0027t think I\u0027m comfortable merging this upstream _without_ making it conditional on auth. We should probably make it so ops can configure whether to require reseller-admin access or just swift-owner access, but I\u0027m absolutely certain this should not be a thing exposed to general users.","commit_id":"40576d39c83d8592b3ab8086790d9ea28963e1b0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2570ca6151c02ce57e1ca11fdc1dca5d7c2ec078","unresolved":true,"context_lines":[{"line_number":248,"context_line":"        policy \u003d POLICIES.get_by_index(policy_index)"},{"line_number":249,"context_line":"        obj_ring \u003d self.app.get_object_ring(policy_index)"},{"line_number":250,"context_line":"        req.headers[\u0027X-Backend-Storage-Policy-Index\u0027] \u003d policy_index"},{"line_number":251,"context_line":"        if \u0027x-open-expired\u0027 in req.headers:"},{"line_number":252,"context_line":"            req.headers[\u0027X-Backend-Open-Expired\u0027] \u003d \u0027true\u0027"},{"line_number":253,"context_line":"        if \u0027swift.authorize\u0027 in req.environ:"},{"line_number":254,"context_line":"            aresp \u003d req.environ[\u0027swift.authorize\u0027](req)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa9f7aef_e3c5216f","line":251,"updated":"2023-03-07 11:02:01.000000000","message":"This works (i.e. existence of header is sufficient), but it might be more intuitive for the header value to also need to be truthy so that sending:\n\n  \u0027x-open-expired\u0027: \u0027False\u0027\n  \ndoes not return an expired object","commit_id":"57289ff1c5b8ef8b482bf31e599c95a1266822cd"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"6620822508a628ee6e4d857ec0e37dda50a0f17c","unresolved":false,"context_lines":[{"line_number":248,"context_line":"        policy \u003d POLICIES.get_by_index(policy_index)"},{"line_number":249,"context_line":"        obj_ring \u003d self.app.get_object_ring(policy_index)"},{"line_number":250,"context_line":"        req.headers[\u0027X-Backend-Storage-Policy-Index\u0027] \u003d policy_index"},{"line_number":251,"context_line":"        if \u0027x-open-expired\u0027 in req.headers:"},{"line_number":252,"context_line":"            req.headers[\u0027X-Backend-Open-Expired\u0027] \u003d \u0027true\u0027"},{"line_number":253,"context_line":"        if \u0027swift.authorize\u0027 in req.environ:"},{"line_number":254,"context_line":"            aresp \u003d req.environ[\u0027swift.authorize\u0027](req)"}],"source_content_type":"text/x-python","patch_set":14,"id":"e4153125_02c6b2a7","line":251,"in_reply_to":"ae723f1d_95e3a38b","updated":"2023-10-25 20:43:45.000000000","message":"Done","commit_id":"57289ff1c5b8ef8b482bf31e599c95a1266822cd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"10c7dcc1c9a5c1b44d8f2656cfe23c9a505b8955","unresolved":true,"context_lines":[{"line_number":248,"context_line":"        policy \u003d POLICIES.get_by_index(policy_index)"},{"line_number":249,"context_line":"        obj_ring \u003d self.app.get_object_ring(policy_index)"},{"line_number":250,"context_line":"        req.headers[\u0027X-Backend-Storage-Policy-Index\u0027] \u003d policy_index"},{"line_number":251,"context_line":"        if \u0027x-open-expired\u0027 in req.headers:"},{"line_number":252,"context_line":"            req.headers[\u0027X-Backend-Open-Expired\u0027] \u003d \u0027true\u0027"},{"line_number":253,"context_line":"        if \u0027swift.authorize\u0027 in req.environ:"},{"line_number":254,"context_line":"            aresp \u003d req.environ[\u0027swift.authorize\u0027](req)"}],"source_content_type":"text/x-python","patch_set":14,"id":"0e4eb4ee_58cc41dd","line":251,"in_reply_to":"fa9f7aef_e3c5216f","updated":"2023-03-20 11:49:49.000000000","message":"Bumping this comment. I think there should be a check that the header value is truthy.","commit_id":"57289ff1c5b8ef8b482bf31e599c95a1266822cd"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"8929f26021a671ca7006ce506445bbce707cd053","unresolved":true,"context_lines":[{"line_number":248,"context_line":"        policy \u003d POLICIES.get_by_index(policy_index)"},{"line_number":249,"context_line":"        obj_ring \u003d self.app.get_object_ring(policy_index)"},{"line_number":250,"context_line":"        req.headers[\u0027X-Backend-Storage-Policy-Index\u0027] \u003d policy_index"},{"line_number":251,"context_line":"        if \u0027x-open-expired\u0027 in req.headers:"},{"line_number":252,"context_line":"            req.headers[\u0027X-Backend-Open-Expired\u0027] \u003d \u0027true\u0027"},{"line_number":253,"context_line":"        if \u0027swift.authorize\u0027 in req.environ:"},{"line_number":254,"context_line":"            aresp \u003d req.environ[\u0027swift.authorize\u0027](req)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ae723f1d_95e3a38b","line":251,"in_reply_to":"fa9f7aef_e3c5216f","updated":"2023-08-17 16:15:24.000000000","message":"I thought that was sufficiently verified in the func test written here, ref: https://review.opendev.org/c/openstack/swift/+/874710/14/test/functional/test_object.py#517, are you suggesting refactoring the if condition ?","commit_id":"57289ff1c5b8ef8b482bf31e599c95a1266822cd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cbf478fe983845fa640a6ff9258a9f52daced3d4","unresolved":true,"context_lines":[{"line_number":251,"context_line":"        policy \u003d POLICIES.get_by_index(policy_index)"},{"line_number":252,"context_line":"        obj_ring \u003d self.app.get_object_ring(policy_index)"},{"line_number":253,"context_line":"        req.headers[\u0027X-Backend-Storage-Policy-Index\u0027] \u003d policy_index"},{"line_number":254,"context_line":"        if config_true_value(req.headers.get(\u0027x-open-expired\u0027)):"},{"line_number":255,"context_line":"            req.headers[\u0027X-Backend-Open-Expired\u0027] \u003d \u0027true\u0027"},{"line_number":256,"context_line":"        if \u0027swift.authorize\u0027 in req.environ:"},{"line_number":257,"context_line":"            aresp \u003d req.environ[\u0027swift.authorize\u0027](req)"}],"source_content_type":"text/x-python","patch_set":26,"id":"788e346c_01dac882","line":254,"updated":"2023-11-06 19:36:22.000000000","message":"I still think we need some access control here -- we shouldn\u0027t be allowing any old client the ability to bypass expiration. I\u0027m open to making it configurable, though; maybe something like\n```\nopen_expired_access_level \u003d [ reseller_admin | swift_owner | unrestricted ]\n```\n?","commit_id":"0a885246badf3546da222feccd0e07f1202aed26"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":252,"context_line":"        req.headers[\u0027X-Backend-Storage-Policy-Index\u0027] \u003d policy_index"},{"line_number":253,"context_line":"        if (config_true_value(self.app.enable_open_expired) and"},{"line_number":254,"context_line":"                config_true_value(req.headers.get(\u0027x-open-expired\u0027))):"},{"line_number":255,"context_line":"            req.headers[\u0027X-Backend-Open-Expired\u0027] \u003d \u0027true\u0027"},{"line_number":256,"context_line":"        if \u0027swift.authorize\u0027 in req.environ:"},{"line_number":257,"context_line":"            aresp \u003d req.environ[\u0027swift.authorize\u0027](req)"},{"line_number":258,"context_line":"            if aresp:"}],"source_content_type":"text/x-python","patch_set":33,"id":"d1bef7f5_ac4af58b","line":255,"updated":"2024-03-14 15:38:48.000000000","message":"maybe a companion helper in request_helpers:\n\n```\ndef is_open_expired(app, req):\n```","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        req.headers[\u0027X-Backend-Storage-Policy-Index\u0027] \u003d policy_index"},{"line_number":253,"context_line":"        if (config_true_value(self.app.enable_open_expired) and"},{"line_number":254,"context_line":"                config_true_value(req.headers.get(\u0027x-open-expired\u0027))):"},{"line_number":255,"context_line":"            req.headers[\u0027X-Backend-Open-Expired\u0027] \u003d \u0027true\u0027"},{"line_number":256,"context_line":"        if \u0027swift.authorize\u0027 in req.environ:"},{"line_number":257,"context_line":"            aresp \u003d req.environ[\u0027swift.authorize\u0027](req)"},{"line_number":258,"context_line":"            if aresp:"}],"source_content_type":"text/x-python","patch_set":33,"id":"8f9787c6_16361169","line":255,"in_reply_to":"d1bef7f5_ac4af58b","updated":"2024-03-18 21:57:15.000000000","message":"Thanks for this suggestion, updating: looks much cleaner!","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"616db680566770b17c1bdf0514d7843621af09c9","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        container_partition, container_nodes, container_path \u003d \\"},{"line_number":406,"context_line":"            self._get_update_target(req, container_info)"},{"line_number":407,"context_line":"        req.acl \u003d container_info[\u0027write_acl\u0027]"},{"line_number":408,"context_line":"        if is_open_expired(self.app, req):"},{"line_number":409,"context_line":"            req.headers[\u0027X-Backend-Open-Expired\u0027] \u003d \u0027true\u0027"},{"line_number":410,"context_line":"        if \u0027swift.authorize\u0027 in req.environ:"},{"line_number":411,"context_line":"            aresp \u003d req.environ[\u0027swift.authorize\u0027](req)"}],"source_content_type":"text/x-python","patch_set":49,"id":"1042af34_65ee26ef","line":408,"updated":"2024-04-16 12:46:28.000000000","message":"nice to have request_helpers to do the job for us again","commit_id":"efb0f08ddd5253c84691c62927bb1e4a4d55f872"}],"swift/proxy/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"65a6eb1b8566e7fe2688086dec3a6ac717872384","unresolved":true,"context_lines":[{"line_number":287,"context_line":"        self.strict_cors_mode \u003d config_true_value("},{"line_number":288,"context_line":"            conf.get(\u0027strict_cors_mode\u0027, \u0027t\u0027))"},{"line_number":289,"context_line":"        self.enable_open_expired \u003d config_true_value("},{"line_number":290,"context_line":"            conf.get(\u0027enable_open_expired\u0027, \u0027f\u0027))"},{"line_number":291,"context_line":"        self.node_timings \u003d {}"},{"line_number":292,"context_line":"        self.timing_expiry \u003d int(conf.get(\u0027timing_expiry\u0027, 300))"},{"line_number":293,"context_line":"        value \u003d conf.get(\u0027request_node_count\u0027, \u00272 * replicas\u0027)"}],"source_content_type":"text/x-python","patch_set":32,"id":"02796456_4ff8aaf8","line":290,"updated":"2024-03-11 16:39:14.000000000","message":"yeah, default is false","commit_id":"56f8d4435a90147244dcdb14c51c1e79795c78db"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        self.strict_cors_mode \u003d config_true_value("},{"line_number":288,"context_line":"            conf.get(\u0027strict_cors_mode\u0027, \u0027t\u0027))"},{"line_number":289,"context_line":"        self.enable_open_expired \u003d config_true_value("},{"line_number":290,"context_line":"            conf.get(\u0027enable_open_expired\u0027, \u0027f\u0027))"},{"line_number":291,"context_line":"        self.node_timings \u003d {}"},{"line_number":292,"context_line":"        self.timing_expiry \u003d int(conf.get(\u0027timing_expiry\u0027, 300))"},{"line_number":293,"context_line":"        value \u003d conf.get(\u0027request_node_count\u0027, \u00272 * replicas\u0027)"}],"source_content_type":"text/x-python","patch_set":32,"id":"ca818520_2788315f","line":290,"in_reply_to":"02796456_4ff8aaf8","updated":"2024-03-18 21:57:15.000000000","message":"Acknowledged","commit_id":"56f8d4435a90147244dcdb14c51c1e79795c78db"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3980eee847d156c5ae08bfb52f293d9023fcae2f","unresolved":true,"context_lines":[{"line_number":349,"context_line":"            policies\u003dPOLICIES.get_policy_info(),"},{"line_number":350,"context_line":"            allow_account_management\u003dself.allow_account_management,"},{"line_number":351,"context_line":"            account_autocreate\u003dself.account_autocreate,"},{"line_number":352,"context_line":"            allow_open_expired\u003dself.allow_open_expired,"},{"line_number":353,"context_line":"            **constraints.EFFECTIVE_CONSTRAINTS)"},{"line_number":354,"context_line":"        self.watchdog \u003d Watchdog()"},{"line_number":355,"context_line":"        self.watchdog.spawn()"}],"source_content_type":"text/x-python","patch_set":56,"id":"637b820f_ed883bd0","line":352,"updated":"2024-04-26 07:35:00.000000000","message":"Hmm, I think this is ok to advertise. I mean you can only do it if your a user and you can\u0027t do it via tempurl.\n\nBut just want to confirm this doesn\u0027t give out any unwanted data to neferous persons. I assume not.. just being paranoid. So just raising it, but no doubt just a NIT","commit_id":"32a15b5f4606c5ddc4b7b0c9f09cdfbd4f1f3b3c"}],"test/functional/test_object.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"30bf6816bd1c2c41363f8a1e2c777d0639452790","unresolved":true,"context_lines":[{"line_number":536,"context_line":""},{"line_number":537,"context_line":"        resp \u003d retry(get, extra_headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":538,"context_line":"        dt \u003d datetime.datetime.now()"},{"line_number":539,"context_line":"        delete_time \u003d str(int(time.mktime(dt.timetuple())) + 2)"},{"line_number":540,"context_line":"        resp.read()"},{"line_number":541,"context_line":"        headers \u003d HeaderKeyDict(resp.getheaders())"},{"line_number":542,"context_line":"        # read the expired object with magic x-open-expired header"}],"source_content_type":"text/x-python","patch_set":24,"id":"4b9300a2_1a8284cc","line":539,"range":{"start_line":539,"start_character":8,"end_line":539,"end_character":63},"updated":"2023-10-30 04:14:14.000000000","message":"Can we move this generate delete_time to just before the get call on line 537. \nI think this would read and look better, ie if we can generate it then run the GET, so we know the timestamp if anything would be a little later then the delete_time timestamp value, yet it\u0027s newer then the x-delete-at.. a small thing but think makes it more readable/complete.\n\nI know it\u0027s already deleted by this point, but still would make more sense when reading this test.","commit_id":"5a8eee9916f1f773cfebc7162ec1779366641318"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"743cfef6a8edae9e1c745ffbd6e5efb9a86c65ad","unresolved":false,"context_lines":[{"line_number":536,"context_line":""},{"line_number":537,"context_line":"        resp \u003d retry(get, extra_headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":538,"context_line":"        dt \u003d datetime.datetime.now()"},{"line_number":539,"context_line":"        delete_time \u003d str(int(time.mktime(dt.timetuple())) + 2)"},{"line_number":540,"context_line":"        resp.read()"},{"line_number":541,"context_line":"        headers \u003d HeaderKeyDict(resp.getheaders())"},{"line_number":542,"context_line":"        # read the expired object with magic x-open-expired header"}],"source_content_type":"text/x-python","patch_set":24,"id":"786a8ef1_9ae2fa86","line":539,"range":{"start_line":539,"start_character":8,"end_line":539,"end_character":63},"in_reply_to":"4b9300a2_1a8284cc","updated":"2023-11-01 16:09:01.000000000","message":"Done","commit_id":"5a8eee9916f1f773cfebc7162ec1779366641318"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"30bf6816bd1c2c41363f8a1e2c777d0639452790","unresolved":true,"context_lines":[{"line_number":579,"context_line":"        # verify object is not updated and remains deleted"},{"line_number":580,"context_line":"        self.assertEqual(resp.status, 404)"},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"        resp \u003d retry(post, extra_headers\u003d{\u0027X-Open-Expired\u0027: True,"},{"line_number":583,"context_line":"                                          \u0027X-Object-Meta-Test\u0027: \u0027restored!\u0027})"},{"line_number":584,"context_line":"        resp.read()"},{"line_number":585,"context_line":"        self.assertEqual(resp.status, 202)"},{"line_number":586,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"745719ac_3f691287","line":583,"range":{"start_line":582,"start_character":8,"end_line":583,"end_character":77},"updated":"2023-10-30 04:14:14.000000000","message":"What just happened here? Could we get a comment in the test to say some dark magic happened","commit_id":"5a8eee9916f1f773cfebc7162ec1779366641318"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"743cfef6a8edae9e1c745ffbd6e5efb9a86c65ad","unresolved":false,"context_lines":[{"line_number":579,"context_line":"        # verify object is not updated and remains deleted"},{"line_number":580,"context_line":"        self.assertEqual(resp.status, 404)"},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"        resp \u003d retry(post, extra_headers\u003d{\u0027X-Open-Expired\u0027: True,"},{"line_number":583,"context_line":"                                          \u0027X-Object-Meta-Test\u0027: \u0027restored!\u0027})"},{"line_number":584,"context_line":"        resp.read()"},{"line_number":585,"context_line":"        self.assertEqual(resp.status, 202)"},{"line_number":586,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"9ebeeeb9_11757936","line":583,"range":{"start_line":582,"start_character":8,"end_line":583,"end_character":77},"in_reply_to":"745719ac_3f691287","updated":"2023-11-01 16:09:01.000000000","message":"Done","commit_id":"5a8eee9916f1f773cfebc7162ec1779366641318"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"30bf6816bd1c2c41363f8a1e2c777d0639452790","unresolved":true,"context_lines":[{"line_number":596,"context_line":"        resp.read()"},{"line_number":597,"context_line":"        self.assertEqual(resp.status, 200)"},{"line_number":598,"context_line":"        # verify object is updated with advanced delete time"},{"line_number":599,"context_line":"        self.assertIn(\u0027X-Delete-At\u0027, resp.headers)"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"        # To avoid an error when the object deletion in tearDown(),"},{"line_number":602,"context_line":"        # the object is added again."}],"source_content_type":"text/x-python","patch_set":24,"id":"022d4381_9d8b6a33","line":599,"updated":"2023-10-30 04:14:14.000000000","message":"Since when would restoring it (with adding non x-delete-{at,after}) also update the x-delete-at header. I thought the header is removed as new x-delete-at should be null or 0.\n\nedit: ahh the post helper method is adding a new x-delete-at, question is why? Isn\u0027t just restoring with new obj meta a good enough test, and also shows the x-delete-at is removed (which in IMHO would be a better test). Although it is nice that you can restore it by setting an update x-delete-at too. Maybe that should be additional part of the test? Ie: restore with just an x-delete-at and check there is the new x-delete-at, then let it expire and this time restore it with other meta and now there is no x-delete-at.\n( or make a second test that new x-delete-at restores).","commit_id":"5a8eee9916f1f773cfebc7162ec1779366641318"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"743cfef6a8edae9e1c745ffbd6e5efb9a86c65ad","unresolved":false,"context_lines":[{"line_number":596,"context_line":"        resp.read()"},{"line_number":597,"context_line":"        self.assertEqual(resp.status, 200)"},{"line_number":598,"context_line":"        # verify object is updated with advanced delete time"},{"line_number":599,"context_line":"        self.assertIn(\u0027X-Delete-At\u0027, resp.headers)"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"        # To avoid an error when the object deletion in tearDown(),"},{"line_number":602,"context_line":"        # the object is added again."}],"source_content_type":"text/x-python","patch_set":24,"id":"bcf89360_48008790","line":599,"in_reply_to":"022d4381_9d8b6a33","updated":"2023-11-01 16:09:01.000000000","message":"ahh the post helper method is adding a new x-delete-at, question is why?\nTo demonstrate that it doesn\u0027t matter whether we have x-delete-at accompanied or not but we can also post x-open-expired along with x-delete-at, although i think your question is for the the tests i added in test/unit/obj/test_server.py\n\n \n\nThere\u0027s a test we have for that already.\n\nDone, Added a test that restores with just an x-delete-at and did a check that x-delete-at is not present.","commit_id":"5a8eee9916f1f773cfebc7162ec1779366641318"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cbf478fe983845fa640a6ff9258a9f52daced3d4","unresolved":true,"context_lines":[{"line_number":466,"context_line":"        resp.read()"},{"line_number":467,"context_line":"        self.assertEqual(resp.status, 201)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"    def test_x_open_expired(self):"},{"line_number":470,"context_line":"        def put(url, token, parsed, conn):"},{"line_number":471,"context_line":"            dt \u003d datetime.datetime.now()"},{"line_number":472,"context_line":"            epoch \u003d time.mktime(dt.timetuple())"}],"source_content_type":"text/x-python","patch_set":26,"id":"602a454f_909cebe8","line":469,"updated":"2023-11-06 19:36:22.000000000","message":"This is an interesting test -- it\u0027s really straddling the space between func and probe tests. I see at least one race if you\u0027re running it against a real cluster with all daemons running. I think I might prefer this as a probe test, even if the failure is unlikely.","commit_id":"0a885246badf3546da222feccd0e07f1202aed26"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"960a734805b917f773eeabf57462d2761fa4f8ee","unresolved":true,"context_lines":[{"line_number":466,"context_line":"        resp.read()"},{"line_number":467,"context_line":"        self.assertEqual(resp.status, 201)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"    def test_x_open_expired(self):"},{"line_number":470,"context_line":"        def put(url, token, parsed, conn):"},{"line_number":471,"context_line":"            dt \u003d datetime.datetime.now()"},{"line_number":472,"context_line":"            epoch \u003d time.mktime(dt.timetuple())"}],"source_content_type":"text/x-python","patch_set":26,"id":"f9e3bebd_9fb3e142","line":469,"in_reply_to":"245cab93_1ec75bdf","updated":"2024-03-22 20:42:20.000000000","message":"Made a new probe test that tests this same behavior (used the same names as well).","commit_id":"0a885246badf3546da222feccd0e07f1202aed26"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":466,"context_line":"        resp.read()"},{"line_number":467,"context_line":"        self.assertEqual(resp.status, 201)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"    def test_x_open_expired(self):"},{"line_number":470,"context_line":"        def put(url, token, parsed, conn):"},{"line_number":471,"context_line":"            dt \u003d datetime.datetime.now()"},{"line_number":472,"context_line":"            epoch \u003d time.mktime(dt.timetuple())"}],"source_content_type":"text/x-python","patch_set":26,"id":"f8fba05b_c9d9d5b5","line":469,"in_reply_to":"602a454f_909cebe8","updated":"2024-03-14 15:38:48.000000000","message":"I think I agree with Tim\n\nAlso, this test could just skip if enable_open_expired is False. And maybe have a companion test that does the opposite, rather than all the conditional assertions. The anti-test would be odd though because it can\u0027t really assert that the object is on disk but x-open-expired\u003dFalse doesn\u0027t access it.\n\nAlso reminds me that it would be really nice to be able to dynamically tweak configs when running probe tests without having to rewrite conf files.","commit_id":"0a885246badf3546da222feccd0e07f1202aed26"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":true,"context_lines":[{"line_number":466,"context_line":"        resp.read()"},{"line_number":467,"context_line":"        self.assertEqual(resp.status, 201)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"    def test_x_open_expired(self):"},{"line_number":470,"context_line":"        def put(url, token, parsed, conn):"},{"line_number":471,"context_line":"            dt \u003d datetime.datetime.now()"},{"line_number":472,"context_line":"            epoch \u003d time.mktime(dt.timetuple())"}],"source_content_type":"text/x-python","patch_set":26,"id":"fcc3949b_7353b4be","line":469,"in_reply_to":"f8fba05b_c9d9d5b5","updated":"2024-03-18 21:57:15.000000000","message":"Got it. I\u0027ve made another test `test_enable_open_expired_false` when the global config `enable_open_expired` is set to false. Let me know if we should write a probe test for this as well - just making the unit test for now!","commit_id":"0a885246badf3546da222feccd0e07f1202aed26"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"5aa693b780c13aa26d6a60574f3bd398bbef7aa4","unresolved":false,"context_lines":[{"line_number":466,"context_line":"        resp.read()"},{"line_number":467,"context_line":"        self.assertEqual(resp.status, 201)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"    def test_x_open_expired(self):"},{"line_number":470,"context_line":"        def put(url, token, parsed, conn):"},{"line_number":471,"context_line":"            dt \u003d datetime.datetime.now()"},{"line_number":472,"context_line":"            epoch \u003d time.mktime(dt.timetuple())"}],"source_content_type":"text/x-python","patch_set":26,"id":"acf02c12_2f5ae254","line":469,"in_reply_to":"f9e3bebd_9fb3e142","updated":"2024-04-03 02:49:04.000000000","message":"Done","commit_id":"0a885246badf3546da222feccd0e07f1202aed26"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3cc6ff099db6fba5807f4de82cc9d68a54ab805a","unresolved":true,"context_lines":[{"line_number":466,"context_line":"        resp.read()"},{"line_number":467,"context_line":"        self.assertEqual(resp.status, 201)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"    def test_x_open_expired(self):"},{"line_number":470,"context_line":"        def put(url, token, parsed, conn):"},{"line_number":471,"context_line":"            dt \u003d datetime.datetime.now()"},{"line_number":472,"context_line":"            epoch \u003d time.mktime(dt.timetuple())"}],"source_content_type":"text/x-python","patch_set":26,"id":"245cab93_1ec75bdf","line":469,"in_reply_to":"fcc3949b_7353b4be","updated":"2024-03-20 11:32:40.000000000","message":"Thanks\n\ncould the tests have similar naming e.g. test_open_expired_[enabled|disabled]\n\nit makes it easier (for me at least) if they adjacent in file structure view on IDE, or simply for grepping.","commit_id":"0a885246badf3546da222feccd0e07f1202aed26"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3cc6ff099db6fba5807f4de82cc9d68a54ab805a","unresolved":true,"context_lines":[{"line_number":591,"context_line":"        resp.read()"},{"line_number":592,"context_line":"        self.assertEqual(resp.status, 202)"},{"line_number":593,"context_line":""},{"line_number":594,"context_line":"        # verify object cccccbkb restored and you can do normal GET"},{"line_number":595,"context_line":"        resp \u003d retry(get)"},{"line_number":596,"context_line":"        resp.read()"},{"line_number":597,"context_line":"        self.assertEqual(resp.status, 200)"}],"source_content_type":"text/x-python","patch_set":36,"id":"d9f534fb_ffc2a260","line":594,"range":{"start_line":594,"start_character":24,"end_line":594,"end_character":32},"updated":"2024-03-20 11:32:40.000000000","message":"could be? 😄","commit_id":"0e6ddd55d4297eb758a23ce1a5b55469adff3c1c"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"e0a587cb73db5f0918f72cb883a0669261bcb7c2","unresolved":false,"context_lines":[{"line_number":591,"context_line":"        resp.read()"},{"line_number":592,"context_line":"        self.assertEqual(resp.status, 202)"},{"line_number":593,"context_line":""},{"line_number":594,"context_line":"        # verify object cccccbkb restored and you can do normal GET"},{"line_number":595,"context_line":"        resp \u003d retry(get)"},{"line_number":596,"context_line":"        resp.read()"},{"line_number":597,"context_line":"        self.assertEqual(resp.status, 200)"}],"source_content_type":"text/x-python","patch_set":36,"id":"df213ba2_0ec85eed","line":594,"range":{"start_line":594,"start_character":24,"end_line":594,"end_character":32},"in_reply_to":"d9f534fb_ffc2a260","updated":"2024-03-21 00:15:00.000000000","message":"That\u0027s right!","commit_id":"0e6ddd55d4297eb758a23ce1a5b55469adff3c1c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3cc6ff099db6fba5807f4de82cc9d68a54ab805a","unresolved":true,"context_lines":[{"line_number":605,"context_line":"        # verify object is updated with advanced delete time"},{"line_number":606,"context_line":"        self.assertIn(\u0027X-Delete-At\u0027, resp.headers)"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"        # To avoid an error when the object deletion in tearDown(),"},{"line_number":609,"context_line":"        # the object is added again."},{"line_number":610,"context_line":"        resp \u003d retry(put)"},{"line_number":611,"context_line":"        resp.read()"}],"source_content_type":"text/x-python","patch_set":36,"id":"de1664b7_7be7c708","line":608,"updated":"2024-03-20 11:32:40.000000000","message":"I didn\u0027t understand why this is necessary, and when I removed it the test was fine.\n\nHowever, I think it might be significant if the expirer ran during teardown: the teardown list all objects and tries to delete them, but here we have an object that may appear in the listing but then be expired before it is deleted in the teardown, if the teardown and expirer are racing.\n\nSo perhaps it\u0027s about \"don\u0027t leave an expiring object at the end of a test\" ??","commit_id":"0e6ddd55d4297eb758a23ce1a5b55469adff3c1c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5c62c0088d9c36f1ecd0a5a5eae41064d6f6064b","unresolved":false,"context_lines":[{"line_number":605,"context_line":"        # verify object is updated with advanced delete time"},{"line_number":606,"context_line":"        self.assertIn(\u0027X-Delete-At\u0027, resp.headers)"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"        # To avoid an error when the object deletion in tearDown(),"},{"line_number":609,"context_line":"        # the object is added again."},{"line_number":610,"context_line":"        resp \u003d retry(put)"},{"line_number":611,"context_line":"        resp.read()"}],"source_content_type":"text/x-python","patch_set":36,"id":"b16e4875_2f44771d","line":608,"in_reply_to":"3d2e5f85_b9bb2c46","updated":"2024-04-19 10:36:54.000000000","message":"Acknowledged","commit_id":"0e6ddd55d4297eb758a23ce1a5b55469adff3c1c"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"e0a587cb73db5f0918f72cb883a0669261bcb7c2","unresolved":true,"context_lines":[{"line_number":605,"context_line":"        # verify object is updated with advanced delete time"},{"line_number":606,"context_line":"        self.assertIn(\u0027X-Delete-At\u0027, resp.headers)"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"        # To avoid an error when the object deletion in tearDown(),"},{"line_number":609,"context_line":"        # the object is added again."},{"line_number":610,"context_line":"        resp \u003d retry(put)"},{"line_number":611,"context_line":"        resp.read()"}],"source_content_type":"text/x-python","patch_set":36,"id":"efd3a95b_294fb5d4","line":608,"in_reply_to":"de1664b7_7be7c708","updated":"2024-03-21 00:15:00.000000000","message":"I\u0027m actually not sure about this one. This is from Ash\u0027s initial test that I modified for the enable_open_expired config, but don\u0027t fully know the rationale.","commit_id":"0e6ddd55d4297eb758a23ce1a5b55469adff3c1c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"616db680566770b17c1bdf0514d7843621af09c9","unresolved":true,"context_lines":[{"line_number":605,"context_line":"        # verify object is updated with advanced delete time"},{"line_number":606,"context_line":"        self.assertIn(\u0027X-Delete-At\u0027, resp.headers)"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"        # To avoid an error when the object deletion in tearDown(),"},{"line_number":609,"context_line":"        # the object is added again."},{"line_number":610,"context_line":"        resp \u003d retry(put)"},{"line_number":611,"context_line":"        resp.read()"}],"source_content_type":"text/x-python","patch_set":36,"id":"3d2e5f85_b9bb2c46","line":608,"in_reply_to":"efd3a95b_294fb5d4","updated":"2024-04-16 12:46:28.000000000","message":"So perhaps it\u0027s about \"don\u0027t leave an expiring object at the end of a test\" ??\n\n\u003e Yes, Alistair. This was observed in a race condition when teardown was conducted while the object-expirer ran.\n\nI didn\u0027t want to leave any test data related to functests lying around. In the past I have seen our cleanup pertinent to functests be not that effective. This scenario has not been observed in a saio/vsaio but when we run the upstream functional test suite in a cqa cluster","commit_id":"0e6ddd55d4297eb758a23ce1a5b55469adff3c1c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3cc6ff099db6fba5807f4de82cc9d68a54ab805a","unresolved":true,"context_lines":[{"line_number":692,"context_line":"        headers \u003d HeaderKeyDict(resp.getheaders())"},{"line_number":693,"context_line":"        # read the expired object with magic x-open-expired header"},{"line_number":694,"context_line":"        self.assertEqual(resp.status, 404)"},{"line_number":695,"context_line":"        if enable_open_expired:"},{"line_number":696,"context_line":"            self.assertTrue(delete_time \u003e headers[\u0027X-Delete-At\u0027])"},{"line_number":697,"context_line":""},{"line_number":698,"context_line":"        resp \u003d retry(head, extra_headers\u003d{\u0027X-Open-Expired\u0027: True})"}],"source_content_type":"text/x-python","patch_set":36,"id":"6518d68e_12ad962b","line":695,"range":{"start_line":695,"start_character":8,"end_line":695,"end_character":31},"updated":"2024-03-20 11:32:40.000000000","message":"this must be true or the test skipped at line 618","commit_id":"0e6ddd55d4297eb758a23ce1a5b55469adff3c1c"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"e0a587cb73db5f0918f72cb883a0669261bcb7c2","unresolved":false,"context_lines":[{"line_number":692,"context_line":"        headers \u003d HeaderKeyDict(resp.getheaders())"},{"line_number":693,"context_line":"        # read the expired object with magic x-open-expired header"},{"line_number":694,"context_line":"        self.assertEqual(resp.status, 404)"},{"line_number":695,"context_line":"        if enable_open_expired:"},{"line_number":696,"context_line":"            self.assertTrue(delete_time \u003e headers[\u0027X-Delete-At\u0027])"},{"line_number":697,"context_line":""},{"line_number":698,"context_line":"        resp \u003d retry(head, extra_headers\u003d{\u0027X-Open-Expired\u0027: True})"}],"source_content_type":"text/x-python","patch_set":36,"id":"bb4ca0e6_e7e98e6e","line":695,"range":{"start_line":695,"start_character":8,"end_line":695,"end_character":31},"in_reply_to":"6518d68e_12ad962b","updated":"2024-03-21 00:15:00.000000000","message":"That\u0027s right","commit_id":"0e6ddd55d4297eb758a23ce1a5b55469adff3c1c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3cc6ff099db6fba5807f4de82cc9d68a54ab805a","unresolved":true,"context_lines":[{"line_number":713,"context_line":"        resp \u003d retry(get, extra_headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":714,"context_line":"        resp.read()"},{"line_number":715,"context_line":"        self.assertEqual(resp.status, 404)"},{"line_number":716,"context_line":"        if enable_open_expired:"},{"line_number":717,"context_line":"            headers \u003d HeaderKeyDict(resp.getheaders())"},{"line_number":718,"context_line":"            self.assertTrue(delete_time \u003e headers[\u0027X-Delete-At\u0027])"},{"line_number":719,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"0eb1b620_bdc18881","line":716,"range":{"start_line":716,"start_character":8,"end_line":716,"end_character":31},"updated":"2024-03-20 11:32:40.000000000","message":"ditto - this is always true","commit_id":"0e6ddd55d4297eb758a23ce1a5b55469adff3c1c"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"e0a587cb73db5f0918f72cb883a0669261bcb7c2","unresolved":false,"context_lines":[{"line_number":713,"context_line":"        resp \u003d retry(get, extra_headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":714,"context_line":"        resp.read()"},{"line_number":715,"context_line":"        self.assertEqual(resp.status, 404)"},{"line_number":716,"context_line":"        if enable_open_expired:"},{"line_number":717,"context_line":"            headers \u003d HeaderKeyDict(resp.getheaders())"},{"line_number":718,"context_line":"            self.assertTrue(delete_time \u003e headers[\u0027X-Delete-At\u0027])"},{"line_number":719,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"cacc9140_ecaf0703","line":716,"range":{"start_line":716,"start_character":8,"end_line":716,"end_character":31},"in_reply_to":"0eb1b620_bdc18881","updated":"2024-03-21 00:15:00.000000000","message":"Acknowledged","commit_id":"0e6ddd55d4297eb758a23ce1a5b55469adff3c1c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3cc6ff099db6fba5807f4de82cc9d68a54ab805a","unresolved":true,"context_lines":[{"line_number":730,"context_line":"        # verify object is not updated and remains deleted"},{"line_number":731,"context_line":"        self.assertEqual(resp.status, 404)"},{"line_number":732,"context_line":""},{"line_number":733,"context_line":"        # object got restored with magic x-open-expired header"},{"line_number":734,"context_line":"        resp \u003d retry(post, extra_headers\u003d{\u0027X-Open-Expired\u0027: True,"},{"line_number":735,"context_line":"                                          \u0027X-Object-Meta-Test\u0027: \u0027restored!\u0027})"},{"line_number":736,"context_line":"        resp.read()"}],"source_content_type":"text/x-python","patch_set":36,"id":"f8fda58c_1dce28f4","line":733,"range":{"start_line":733,"start_character":17,"end_line":733,"end_character":29},"updated":"2024-03-20 11:32:40.000000000","message":"comment is stale:\n\n```\n# object cannot be restored with magic x-open-expired header\n```","commit_id":"0e6ddd55d4297eb758a23ce1a5b55469adff3c1c"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"e0a587cb73db5f0918f72cb883a0669261bcb7c2","unresolved":false,"context_lines":[{"line_number":730,"context_line":"        # verify object is not updated and remains deleted"},{"line_number":731,"context_line":"        self.assertEqual(resp.status, 404)"},{"line_number":732,"context_line":""},{"line_number":733,"context_line":"        # object got restored with magic x-open-expired header"},{"line_number":734,"context_line":"        resp \u003d retry(post, extra_headers\u003d{\u0027X-Open-Expired\u0027: True,"},{"line_number":735,"context_line":"                                          \u0027X-Object-Meta-Test\u0027: \u0027restored!\u0027})"},{"line_number":736,"context_line":"        resp.read()"}],"source_content_type":"text/x-python","patch_set":36,"id":"38d693d7_970cfd6c","line":733,"range":{"start_line":733,"start_character":17,"end_line":733,"end_character":29},"in_reply_to":"f8fda58c_1dce28f4","updated":"2024-03-21 00:15:00.000000000","message":"That\u0027s right","commit_id":"0e6ddd55d4297eb758a23ce1a5b55469adff3c1c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"616db680566770b17c1bdf0514d7843621af09c9","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        enable_open_expired \u003d config_true_value(tf.cluster_info[\u0027swift\u0027].get("},{"line_number":471,"context_line":"            \u0027enable_open_expired\u0027, \u0027false\u0027))"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"        if not enable_open_expired:"},{"line_number":474,"context_line":"            raise SkipTest"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"        def put(url, token, parsed, conn):"}],"source_content_type":"text/x-python","patch_set":49,"id":"da8c6eea_2cbdb12b","line":473,"updated":"2024-04-16 12:46:28.000000000","message":"It is good that this test would now otherwise skip if we have enabled the use of `x-open-expire`","commit_id":"efb0f08ddd5253c84691c62927bb1e4a4d55f872"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1bdcebd733613f6de075a64c5e9272abf44de452","unresolved":true,"context_lines":[{"line_number":541,"context_line":"        self.assertEqual(resp.status, 404)"},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"        dt \u003d datetime.datetime.now()"},{"line_number":544,"context_line":"        delete_time \u003d str(int(time.mktime(dt.timetuple())) + 2)"},{"line_number":545,"context_line":"        resp \u003d retry(get, extra_headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":546,"context_line":"        resp.read()"},{"line_number":547,"context_line":"        headers \u003d HeaderKeyDict(resp.getheaders())"}],"source_content_type":"text/x-python","patch_set":51,"id":"b48143f3_a5b14421","line":544,"range":{"start_line":544,"start_character":8,"end_line":544,"end_character":19},"updated":"2024-04-22 19:26:39.000000000","message":"Why do we call this `delete_time`? I kept expecting us to use it in another `X-Delete-At` header, but we just use it for comparisons. Could we tighten up the assertions by dropping the `+ 2` and just call it `now`?","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"6c4fc915b42fe57fe0d87131393c3c43114ea568","unresolved":false,"context_lines":[{"line_number":541,"context_line":"        self.assertEqual(resp.status, 404)"},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"        dt \u003d datetime.datetime.now()"},{"line_number":544,"context_line":"        delete_time \u003d str(int(time.mktime(dt.timetuple())) + 2)"},{"line_number":545,"context_line":"        resp \u003d retry(get, extra_headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":546,"context_line":"        resp.read()"},{"line_number":547,"context_line":"        headers \u003d HeaderKeyDict(resp.getheaders())"}],"source_content_type":"text/x-python","patch_set":51,"id":"feb4d8d2_8da4fb67","line":544,"range":{"start_line":544,"start_character":8,"end_line":544,"end_character":19},"in_reply_to":"b48143f3_a5b14421","updated":"2024-04-24 19:50:46.000000000","message":"interesting, looks like the +2 wasn\u0027t necessary since the object is already expired, removing it and calling it `now`","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1bdcebd733613f6de075a64c5e9272abf44de452","unresolved":true,"context_lines":[{"line_number":616,"context_line":"            \u0027enable_open_expired\u0027, \u0027false\u0027))"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"        if enable_open_expired:"},{"line_number":619,"context_line":"            raise SkipTest"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"        def put(url, token, parsed, conn):"},{"line_number":622,"context_line":"            dt \u003d datetime.datetime.now()"}],"source_content_type":"text/x-python","patch_set":51,"id":"5188677b_7e033cd5","line":619,"updated":"2024-04-22 19:26:39.000000000","message":"OK, so one of the two of these will always get skipped. I\u0027m ambivalent -- I often find myself wanting to minimize skips (in an attempt to ensure fullest coverage); on the other hand, we\u0027re validating opposite behaviors, so having assertions branching off config would give a _false_ sense of coverage...\n\nWe should probably at least give a _reason_ for the skip, though; something like\n```\nraise SkipTest(\u0027enable_open_expired is enabled\u0027)\n```\n\nDo we have both tests running in the gate (under different jobs), or only one of them?","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"60b926e7b362c140c07d1d97d1996c98ae831642","unresolved":false,"context_lines":[{"line_number":616,"context_line":"            \u0027enable_open_expired\u0027, \u0027false\u0027))"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"        if enable_open_expired:"},{"line_number":619,"context_line":"            raise SkipTest"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"        def put(url, token, parsed, conn):"},{"line_number":622,"context_line":"            dt \u003d datetime.datetime.now()"}],"source_content_type":"text/x-python","patch_set":51,"id":"9daea31e_33f08d2e","line":619,"in_reply_to":"3a7e53f7_a3bdcf0c","updated":"2024-04-24 20:42:20.000000000","message":"We can, but it\u0027s a little involved. I wouldn\u0027t worry about it for this patch; having it pass locally (which I have, once I bumped up POST\u0027s expiry) can suffice.","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"6c4fc915b42fe57fe0d87131393c3c43114ea568","unresolved":true,"context_lines":[{"line_number":616,"context_line":"            \u0027enable_open_expired\u0027, \u0027false\u0027))"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"        if enable_open_expired:"},{"line_number":619,"context_line":"            raise SkipTest"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"        def put(url, token, parsed, conn):"},{"line_number":622,"context_line":"            dt \u003d datetime.datetime.now()"}],"source_content_type":"text/x-python","patch_set":51,"id":"3a7e53f7_a3bdcf0c","line":619,"in_reply_to":"5188677b_7e033cd5","updated":"2024-04-24 19:50:46.000000000","message":"Added a reason for the skip, but not sure if we have them running under different jobs, given they\u0027re dependent on the cluster config. Is it possible to set up a clusters with different configs where we can do that?","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"}],"test/probe/test_object_expirer.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2f5e9000e647f40387c13a75fdbeb6506de99ae5","unresolved":true,"context_lines":[{"line_number":288,"context_line":"            raise unittest.SkipTest("},{"line_number":289,"context_line":"                \"enable_open_expired is disabled in this swift cluster\")"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        def put_object(headers):"},{"line_number":292,"context_line":"            # use swift client to PUT objects"},{"line_number":293,"context_line":"            headers[\u0027Content-Length\u0027] \u003d \u00270\u0027"},{"line_number":294,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":40,"id":"f8760e32_b6ed524e","line":291,"updated":"2024-04-02 11:17:30.000000000","message":"this inner function only seems to be called once so could just be inline","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"5aa693b780c13aa26d6a60574f3bd398bbef7aa4","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            raise unittest.SkipTest("},{"line_number":289,"context_line":"                \"enable_open_expired is disabled in this swift cluster\")"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        def put_object(headers):"},{"line_number":292,"context_line":"            # use swift client to PUT objects"},{"line_number":293,"context_line":"            headers[\u0027Content-Length\u0027] \u003d \u00270\u0027"},{"line_number":294,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":40,"id":"01c2e2cd_b3fc777a","line":291,"in_reply_to":"f8760e32_b6ed524e","updated":"2024-04-03 02:49:04.000000000","message":"Acknowledged","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2f5e9000e647f40387c13a75fdbeb6506de99ae5","unresolved":true,"context_lines":[{"line_number":294,"context_line":"            try:"},{"line_number":295,"context_line":"                client.put_object(self.url, self.token,"},{"line_number":296,"context_line":"                                     self.container_name, self.object_name,"},{"line_number":297,"context_line":"                                     headers\u003dheaders)"},{"line_number":298,"context_line":"            except ClientException as e:"},{"line_number":299,"context_line":"                self.fail("},{"line_number":300,"context_line":"                    \u0027Expected 201 for PUT object but got %s\u0027 % e.http_status)"}],"source_content_type":"text/x-python","patch_set":40,"id":"842110f3_e32e4678","line":297,"updated":"2024-04-02 11:17:30.000000000","message":"I think the two lines above should be de-dented, let\u0027s see what zuul says","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"5aa693b780c13aa26d6a60574f3bd398bbef7aa4","unresolved":false,"context_lines":[{"line_number":294,"context_line":"            try:"},{"line_number":295,"context_line":"                client.put_object(self.url, self.token,"},{"line_number":296,"context_line":"                                     self.container_name, self.object_name,"},{"line_number":297,"context_line":"                                     headers\u003dheaders)"},{"line_number":298,"context_line":"            except ClientException as e:"},{"line_number":299,"context_line":"                self.fail("},{"line_number":300,"context_line":"                    \u0027Expected 201 for PUT object but got %s\u0027 % e.http_status)"}],"source_content_type":"text/x-python","patch_set":40,"id":"ec5b8377_819b627f","line":297,"in_reply_to":"842110f3_e32e4678","updated":"2024-04-03 02:49:04.000000000","message":"Acknowledged","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2f5e9000e647f40387c13a75fdbeb6506de99ae5","unresolved":true,"context_lines":[{"line_number":303,"context_line":"            # use swift client to HEAD objects"},{"line_number":304,"context_line":"            return client.head_object(self.url, self.token,"},{"line_number":305,"context_line":"                                      self.container_name, self.object_name,"},{"line_number":306,"context_line":"                                      headers\u003dheaders)"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        obj_brain \u003d BrainSplitter(self.url, self.token, self.container_name,"},{"line_number":309,"context_line":"                                  self.object_name, \u0027object\u0027, self.policy)"}],"source_content_type":"text/x-python","patch_set":40,"id":"15e05722_a65b4f0f","line":306,"updated":"2024-04-02 11:17:30.000000000","message":"this doesn\u0027t really warrant being an inner function","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"5aa693b780c13aa26d6a60574f3bd398bbef7aa4","unresolved":false,"context_lines":[{"line_number":303,"context_line":"            # use swift client to HEAD objects"},{"line_number":304,"context_line":"            return client.head_object(self.url, self.token,"},{"line_number":305,"context_line":"                                      self.container_name, self.object_name,"},{"line_number":306,"context_line":"                                      headers\u003dheaders)"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        obj_brain \u003d BrainSplitter(self.url, self.token, self.container_name,"},{"line_number":309,"context_line":"                                  self.object_name, \u0027object\u0027, self.policy)"}],"source_content_type":"text/x-python","patch_set":40,"id":"7765074c_4fd3ef0c","line":306,"in_reply_to":"15e05722_a65b4f0f","updated":"2024-04-03 02:49:04.000000000","message":"Acknowledged","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2f5e9000e647f40387c13a75fdbeb6506de99ae5","unresolved":true,"context_lines":[{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        now \u003d time.time()"},{"line_number":314,"context_line":"        delete_at \u003d int(now + 2)"},{"line_number":315,"context_line":"        put_object(headers\u003d{\u0027X-Delete-At\u0027: str(delete_at),"},{"line_number":316,"context_line":"                            \u0027X-Timestamp\u0027: Timestamp(now).normal})"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        # sanity: check that the object was created"}],"source_content_type":"text/x-python","patch_set":40,"id":"6c2e5f83_f33a0b73","line":315,"updated":"2024-04-02 11:17:30.000000000","message":"maybe add some user metadata \u0027X-Object-Meta-Test: foo\u0027","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"5aa693b780c13aa26d6a60574f3bd398bbef7aa4","unresolved":false,"context_lines":[{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        now \u003d time.time()"},{"line_number":314,"context_line":"        delete_at \u003d int(now + 2)"},{"line_number":315,"context_line":"        put_object(headers\u003d{\u0027X-Delete-At\u0027: str(delete_at),"},{"line_number":316,"context_line":"                            \u0027X-Timestamp\u0027: Timestamp(now).normal})"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        # sanity: check that the object was created"}],"source_content_type":"text/x-python","patch_set":40,"id":"b3eec727_fd94ad7d","line":315,"in_reply_to":"6c2e5f83_f33a0b73","updated":"2024-04-03 02:49:04.000000000","message":"Thanks for the pointer, this is a great thing to add","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2f5e9000e647f40387c13a75fdbeb6506de99ae5","unresolved":true,"context_lines":[{"line_number":313,"context_line":"        now \u003d time.time()"},{"line_number":314,"context_line":"        delete_at \u003d int(now + 2)"},{"line_number":315,"context_line":"        put_object(headers\u003d{\u0027X-Delete-At\u0027: str(delete_at),"},{"line_number":316,"context_line":"                            \u0027X-Timestamp\u0027: Timestamp(now).normal})"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        # sanity: check that the object was created"},{"line_number":319,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":40,"id":"37563b8e_d1143ebf","line":316,"updated":"2024-04-02 11:17:30.000000000","message":"The X-Timestamp header passed in here will be ignored: clients cannot ordinarily specify x-timestamp, the proxy will remove it from oncoming requests generate a fresh x-timestamp. The test will still likely pass because of the granularity of the sleeps.\n\nBut this will fail:\n\n```\ndiff --git a/test/probe/test_object_expirer.py b/test/probe/test_object_expirer.py\nindex 9a6114570..a60cfa8f3 100644\n--- a/test/probe/test_object_expirer.py\n+++ b/test/probe/test_object_expirer.py\n@@ -317,11 +317,11 @@ class TestObjectExpirer(ReplProbeTest):\n\n         # sanity: check that the object was created\n         try:\n-            head_object(headers\u003d{})\n+            hdrs \u003d head_object(headers\u003d{})\n         except ClientException as e:\n             self.fail(\n                 \u0027Expected 200 for HEAD object but got %s\u0027 % e.http_status)\n-\n+        self.assertEqual(Timestamp(now).normal, hdrs[\u0027x-timestamp\u0027])\n         # make sure auto-created containers get in the account listing\n         Manager([\u0027container-updater\u0027]).once()\n```\n\nHowever, you can use an InternalClient to send X-Timestamp - see the put_object method at line 192. In fact, I suggest you make that inner function a class method an re-use it here.","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"5aa693b780c13aa26d6a60574f3bd398bbef7aa4","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        now \u003d time.time()"},{"line_number":314,"context_line":"        delete_at \u003d int(now + 2)"},{"line_number":315,"context_line":"        put_object(headers\u003d{\u0027X-Delete-At\u0027: str(delete_at),"},{"line_number":316,"context_line":"                            \u0027X-Timestamp\u0027: Timestamp(now).normal})"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        # sanity: check that the object was created"},{"line_number":319,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":40,"id":"ac8b409d_b339c352","line":316,"in_reply_to":"37563b8e_d1143ebf","updated":"2024-04-03 02:49:04.000000000","message":"Got it, using an internal client instead. Putting it in a helper function","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2f5e9000e647f40387c13a75fdbeb6506de99ae5","unresolved":true,"context_lines":[{"line_number":337,"context_line":"        # since enable_open_expired is enabled, ensure object can be accessed"},{"line_number":338,"context_line":"        # with x-open-expired header"},{"line_number":339,"context_line":"        try:"},{"line_number":340,"context_line":"            head_object(headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":341,"context_line":"        except ClientException as e:"},{"line_number":342,"context_line":"            self.fail("},{"line_number":343,"context_line":"                \u0027Expected 200 for HEAD object but got %s\u0027 % e.http_status)"}],"source_content_type":"text/x-python","patch_set":40,"id":"dbc875c0_d25da569","line":340,"updated":"2024-04-02 11:17:30.000000000","message":"assert we get back the expected headers (see above - add some user metadata and check for it here)","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"5aa693b780c13aa26d6a60574f3bd398bbef7aa4","unresolved":false,"context_lines":[{"line_number":337,"context_line":"        # since enable_open_expired is enabled, ensure object can be accessed"},{"line_number":338,"context_line":"        # with x-open-expired header"},{"line_number":339,"context_line":"        try:"},{"line_number":340,"context_line":"            head_object(headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":341,"context_line":"        except ClientException as e:"},{"line_number":342,"context_line":"            self.fail("},{"line_number":343,"context_line":"                \u0027Expected 200 for HEAD object but got %s\u0027 % e.http_status)"}],"source_content_type":"text/x-python","patch_set":40,"id":"b3180c16_6c07c8f6","line":340,"in_reply_to":"dbc875c0_d25da569","updated":"2024-04-03 02:49:04.000000000","message":"Done","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2f5e9000e647f40387c13a75fdbeb6506de99ae5","unresolved":true,"context_lines":[{"line_number":340,"context_line":"            head_object(headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":341,"context_line":"        except ClientException as e:"},{"line_number":342,"context_line":"            self.fail("},{"line_number":343,"context_line":"                \u0027Expected 200 for HEAD object but got %s\u0027 % e.http_status)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # expirer runs to reap the object"},{"line_number":346,"context_line":"        self.expirer.once()"}],"source_content_type":"text/x-python","patch_set":40,"id":"009f2f78_7719fd9a","line":343,"updated":"2024-04-02 11:17:30.000000000","message":"also check that a GET works, and a POST","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"5aa693b780c13aa26d6a60574f3bd398bbef7aa4","unresolved":false,"context_lines":[{"line_number":340,"context_line":"            head_object(headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":341,"context_line":"        except ClientException as e:"},{"line_number":342,"context_line":"            self.fail("},{"line_number":343,"context_line":"                \u0027Expected 200 for HEAD object but got %s\u0027 % e.http_status)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # expirer runs to reap the object"},{"line_number":346,"context_line":"        self.expirer.once()"}],"source_content_type":"text/x-python","patch_set":40,"id":"3d3be858_260dcd46","line":343,"in_reply_to":"009f2f78_7719fd9a","updated":"2024-04-03 02:49:04.000000000","message":"Done","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2f5e9000e647f40387c13a75fdbeb6506de99ae5","unresolved":true,"context_lines":[{"line_number":380,"context_line":"            # use swift client to HEAD objects"},{"line_number":381,"context_line":"            return client.head_object(self.url, self.token,"},{"line_number":382,"context_line":"                                      self.container_name, self.object_name,"},{"line_number":383,"context_line":"                                      headers\u003dheaders)"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        obj_brain \u003d BrainSplitter(self.url, self.token, self.container_name,"},{"line_number":386,"context_line":"                                  self.object_name, \u0027object\u0027, self.policy)"}],"source_content_type":"text/x-python","patch_set":40,"id":"bcc5a787_80b9aef6","line":383,"updated":"2024-04-02 11:17:30.000000000","message":"same comment as above re the inner functions","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"5aa693b780c13aa26d6a60574f3bd398bbef7aa4","unresolved":false,"context_lines":[{"line_number":380,"context_line":"            # use swift client to HEAD objects"},{"line_number":381,"context_line":"            return client.head_object(self.url, self.token,"},{"line_number":382,"context_line":"                                      self.container_name, self.object_name,"},{"line_number":383,"context_line":"                                      headers\u003dheaders)"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        obj_brain \u003d BrainSplitter(self.url, self.token, self.container_name,"},{"line_number":386,"context_line":"                                  self.object_name, \u0027object\u0027, self.policy)"}],"source_content_type":"text/x-python","patch_set":40,"id":"6a762a69_1db3455d","line":383,"in_reply_to":"bcc5a787_80b9aef6","updated":"2024-04-03 02:49:04.000000000","message":"Done","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2f5e9000e647f40387c13a75fdbeb6506de99ae5","unresolved":true,"context_lines":[{"line_number":409,"context_line":"        # should get a 404, object is expired"},{"line_number":410,"context_line":"        with self.assertRaises(ClientException) as e:"},{"line_number":411,"context_line":"            head_object(headers\u003d{})"},{"line_number":412,"context_line":"            self.assertEqual(e.exception.http_status, 404)"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        # since enable_open_expired is disabled, should get 404 even"},{"line_number":415,"context_line":"        # with x-open-expired header"}],"source_content_type":"text/x-python","patch_set":40,"id":"47d990f3_91915271","line":412,"updated":"2024-04-02 11:17:30.000000000","message":"you could move everything up to here into a helper method such as _setup_test_open_expired and re-use it for each of the enabled/disabled cases","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"5aa693b780c13aa26d6a60574f3bd398bbef7aa4","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        # should get a 404, object is expired"},{"line_number":410,"context_line":"        with self.assertRaises(ClientException) as e:"},{"line_number":411,"context_line":"            head_object(headers\u003d{})"},{"line_number":412,"context_line":"            self.assertEqual(e.exception.http_status, 404)"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        # since enable_open_expired is disabled, should get 404 even"},{"line_number":415,"context_line":"        # with x-open-expired header"}],"source_content_type":"text/x-python","patch_set":40,"id":"64c6ca50_af2f11dd","line":412,"in_reply_to":"47d990f3_91915271","updated":"2024-04-03 02:49:04.000000000","message":"Great idea - using this","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2f5e9000e647f40387c13a75fdbeb6506de99ae5","unresolved":true,"context_lines":[{"line_number":415,"context_line":"        # with x-open-expired header"},{"line_number":416,"context_line":"        with self.assertRaises(ClientException) as e:"},{"line_number":417,"context_line":"            head_object(headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":418,"context_line":"            self.assertEqual(e.exception.http_status, 404)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"        # expirer runs to reap the object"},{"line_number":421,"context_line":"        self.expirer.once()"}],"source_content_type":"text/x-python","patch_set":40,"id":"53c18436_dea4bf2f","line":418,"updated":"2024-04-02 11:17:30.000000000","message":"also check GET and POST receive a 404","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"5aa693b780c13aa26d6a60574f3bd398bbef7aa4","unresolved":false,"context_lines":[{"line_number":415,"context_line":"        # with x-open-expired header"},{"line_number":416,"context_line":"        with self.assertRaises(ClientException) as e:"},{"line_number":417,"context_line":"            head_object(headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":418,"context_line":"            self.assertEqual(e.exception.http_status, 404)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"        # expirer runs to reap the object"},{"line_number":421,"context_line":"        self.expirer.once()"}],"source_content_type":"text/x-python","patch_set":40,"id":"31160f8d_d78b1a5d","line":418,"in_reply_to":"53c18436_dea4bf2f","updated":"2024-04-03 02:49:04.000000000","message":"Done","commit_id":"0c93115a234cb4dd6c184045a1c8b73c807a86e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0199903a49fff5a860adafd3d87a8fbcf661f5ad","unresolved":true,"context_lines":[{"line_number":314,"context_line":"        with self.assertRaises(ClientException) as e:"},{"line_number":315,"context_line":"            client.head_object(self.url, self.token,"},{"line_number":316,"context_line":"                               self.container_name, self.object_name)"},{"line_number":317,"context_line":"            self.assertEqual(e.exception.http_status, 404)"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    def test_open_expired_enabled(self):"},{"line_number":320,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"e5151499_4d64c397","line":317,"updated":"2024-04-03 09:29:45.000000000","message":"dedent this line\n\nIn general it is usually good practice to exit a context manager as soon as it\u0027s no longer needed. \n\nIn this case it\u0027s good to exit the assertRaises as soon as the code that the assertion covers is done so that the assertion is tested as soon as possible. As it is currently written, the exception status assertEqual (line 317) is attempted *before* the the assertion is made that an exception was raised.","commit_id":"d6808863999b02f628b70e646ecf22155993f6d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"bbc51c282681845c9e9bd79a218980a3021e8034","unresolved":false,"context_lines":[{"line_number":314,"context_line":"        with self.assertRaises(ClientException) as e:"},{"line_number":315,"context_line":"            client.head_object(self.url, self.token,"},{"line_number":316,"context_line":"                               self.container_name, self.object_name)"},{"line_number":317,"context_line":"            self.assertEqual(e.exception.http_status, 404)"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    def test_open_expired_enabled(self):"},{"line_number":320,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"366ff3e8_aad48d65","line":317,"in_reply_to":"e5151499_4d64c397","updated":"2024-04-04 18:24:15.000000000","message":"Understood, thanks for pointing this out!","commit_id":"d6808863999b02f628b70e646ecf22155993f6d6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0199903a49fff5a860adafd3d87a8fbcf661f5ad","unresolved":true,"context_lines":[{"line_number":363,"context_line":"                               self.container_name, self.object_name,"},{"line_number":364,"context_line":"                               headers\u003d{"},{"line_number":365,"context_line":"                                   \u0027X-Open-Expired\u0027: True,"},{"line_number":366,"context_line":"                                   \u0027X-Delete-At\u0027: str(new_delete_at)"},{"line_number":367,"context_line":"                               })"},{"line_number":368,"context_line":"        except ClientException as e:"},{"line_number":369,"context_line":"            self.fail("}],"source_content_type":"text/x-python","patch_set":41,"id":"72246de7_6afb2827","line":366,"updated":"2024-04-03 09:29:45.000000000","message":"this is a smart idea - push the expiry time into the future with the POST\n\nEven better would be to the run the expirer and verify that the object has not been deleted yet - this then mimics our use case for the feature: object expires, oops!, modify expiry time in delay_reaping window, etc\n\nhere\u0027s a diff:\n```\ndiff --git a/test/probe/test_object_expirer.py b/test/probe/test_object_expirer.py\nindex 732d89aa8..0ebe7f161 100644\n--- a/test/probe/test_object_expirer.py\n+++ b/test/probe/test_object_expirer.py\n@@ -314,7 +314,7 @@ class TestObjectExpirer(ReplProbeTest):\n         with self.assertRaises(ClientException) as e:\n             client.head_object(self.url, self.token,\n                                self.container_name, self.object_name)\n-            self.assertEqual(e.exception.http_status, 404)\n+        self.assertEqual(e.exception.http_status, 404)\n\n     def test_open_expired_enabled(self):\n\n@@ -363,7 +363,8 @@ class TestObjectExpirer(ReplProbeTest):\n                                self.container_name, self.object_name,\n                                headers\u003d{\n                                    \u0027X-Open-Expired\u0027: True,\n-                                   \u0027X-Delete-At\u0027: str(new_delete_at)\n+                                   \u0027X-Delete-At\u0027: str(new_delete_at),\n+                                   \u0027X-Object-Meta-Test\u0027: \u0027bar\u0027\n                                })\n         except ClientException as e:\n             self.fail(\n@@ -371,6 +372,17 @@ class TestObjectExpirer(ReplProbeTest):\n\n         # make sure auto-created containers get in the account listing\n         Manager([\u0027container-updater\u0027]).once()\n+        # run the expirer, but the object expiry time is now in the future\n+        self.expirer.once()\n+\n+        try:\n+            resp \u003d client.head_object(self.url, self.token,\n+                                      self.container_name, self.object_name,\n+                                      headers\u003d{\u0027X-Open-Expired\u0027: True})\n+            self.assertEqual(\u0027bar\u0027, resp.get(\u0027x-object-meta-test\u0027))\n+        except ClientException as e:\n+            self.fail(\n+                \u0027Expected 200 for HEAD object but got %s\u0027 % e.http_status)\n\n         while time.time() \u003c\u003d new_delete_at:\n             time.sleep(0.1)\n@@ -383,7 +395,7 @@ class TestObjectExpirer(ReplProbeTest):\n             client.head_object(self.url, self.token,\n                                self.container_name, self.object_name,\n                                headers\u003d{\u0027X-Open-Expired\u0027: True})\n-            self.assertEqual(e.exception.http_status, 404)\n+        self.assertEqual(e.exception.http_status, 404)\n\n     def test_open_expired_disabled(self):\n\n@@ -409,21 +421,21 @@ class TestObjectExpirer(ReplProbeTest):\n             client.head_object(self.url, self.token,\n                                self.container_name, self.object_name,\n                                headers\u003d{\u0027X-Open-Expired\u0027: True})\n-            self.assertEqual(e.exception.http_status, 404)\n+        self.assertEqual(e.exception.http_status, 404)\n\n         # POST request should fail\n         with self.assertRaises(ClientException) as e:\n             client.post_object(self.url, self.token,\n                                self.container_name, self.object_name,\n                                headers\u003d{\u0027X-Open-Expired\u0027: True})\n-            self.assertEqual(e.exception.http_status, 404)\n+        self.assertEqual(e.exception.http_status, 404)\n\n         # GET request should fail\n         with self.assertRaises(ClientException) as e:\n             client.get_object(self.url, self.token,\n                               self.container_name, self.object_name,\n                               headers\u003d{\u0027X-Open-Expired\u0027: True})\n-            self.assertEqual(e.exception.http_status, 404)\n+        self.assertEqual(e.exception.http_status, 404)\n\n         # expirer runs to reap the object\n         self.expirer.once()\n@@ -433,7 +445,7 @@ class TestObjectExpirer(ReplProbeTest):\n             client.head_object(self.url, self.token,\n                                self.container_name, self.object_name,\n                                headers\u003d{\u0027X-Open-Expired\u0027: True})\n-            self.assertEqual(e.exception.http_status, 404)\n+        self.assertEqual(e.exception.http_status, 404)\n\n     def _test_expirer_delete_outdated_object_version(self, object_exists):\n         # This test simulates a case where the expirer tries to delete\n         ```","commit_id":"d6808863999b02f628b70e646ecf22155993f6d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"bbc51c282681845c9e9bd79a218980a3021e8034","unresolved":false,"context_lines":[{"line_number":363,"context_line":"                               self.container_name, self.object_name,"},{"line_number":364,"context_line":"                               headers\u003d{"},{"line_number":365,"context_line":"                                   \u0027X-Open-Expired\u0027: True,"},{"line_number":366,"context_line":"                                   \u0027X-Delete-At\u0027: str(new_delete_at)"},{"line_number":367,"context_line":"                               })"},{"line_number":368,"context_line":"        except ClientException as e:"},{"line_number":369,"context_line":"            self.fail("}],"source_content_type":"text/x-python","patch_set":41,"id":"c2b6ebcc_a9bbf9aa","line":366,"in_reply_to":"72246de7_6afb2827","updated":"2024-04-04 18:24:15.000000000","message":"Got it, making this change! A good additional check to have.","commit_id":"d6808863999b02f628b70e646ecf22155993f6d6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0199903a49fff5a860adafd3d87a8fbcf661f5ad","unresolved":true,"context_lines":[{"line_number":383,"context_line":"            client.head_object(self.url, self.token,"},{"line_number":384,"context_line":"                               self.container_name, self.object_name,"},{"line_number":385,"context_line":"                               headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":386,"context_line":"            self.assertEqual(e.exception.http_status, 404)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    def test_open_expired_disabled(self):"},{"line_number":389,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"2b2dbc51_167da0fb","line":386,"updated":"2024-04-03 09:29:45.000000000","message":"this line should be de-dented (and same in other places where an assertion is made about the assertRaises context-manager state.\n\nWhy? I tweaked the test and somehow broke things so that the ClientException was not raised here, and I saw (the lines numbers are different due to my modifications):\n\n```\n        # should get a 404 even with x-open-expired since object is reaped\n        with self.assertRaises(ClientException) as e:\n            client.head_object(self.url, self.token,\n                               self.container_name, self.object_name,\n                               headers\u003d{\u0027X-Open-Expired\u0027: True})\n\u003e           self.assertEqual(e.exception.http_status, 404)\nE           AttributeError: \u0027_AssertRaisesContext\u0027 object has no attribute \u0027exception\u0027\n\ntest/probe/test_object_expirer.py:396: AttributeError\n```\n\nwhich is not the error we want displayed. No ClientException was raised so \u0027e\u0027 has not been given an exception attribute. But we haven\u0027t detected that no exception was raised because we haven\u0027t yet exited the assertRaises context manager, so line 386 is executed and blows up 😞\n\nIf we dedent line 386, then the assertRaises context manager exits before line 386 is reached and the absence of an exception is detected, giving us the error message we\u0027d like:\n```\n        with self.assertRaises(ClientException) as e:\n\u003e           client.head_object(self.url, self.token,\n                               self.container_name, self.object_name,\n                               headers\u003d{\u0027X-Open-Expired\u0027: True})\nE           AssertionError: ClientException not raised\n```","commit_id":"d6808863999b02f628b70e646ecf22155993f6d6"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"bbc51c282681845c9e9bd79a218980a3021e8034","unresolved":false,"context_lines":[{"line_number":383,"context_line":"            client.head_object(self.url, self.token,"},{"line_number":384,"context_line":"                               self.container_name, self.object_name,"},{"line_number":385,"context_line":"                               headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":386,"context_line":"            self.assertEqual(e.exception.http_status, 404)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    def test_open_expired_disabled(self):"},{"line_number":389,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"f04945a8_aaf5fc56","line":386,"in_reply_to":"2b2dbc51_167da0fb","updated":"2024-04-04 18:24:15.000000000","message":"Thanks Alistair! Really helpful, thanks for pointing this out","commit_id":"d6808863999b02f628b70e646ecf22155993f6d6"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"616db680566770b17c1bdf0514d7843621af09c9","unresolved":false,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        self.assertIn(\u0027x-object-meta-expired\u0027, metadata)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def _setup_test_open_expired(self):"},{"line_number":277,"context_line":"        obj_brain \u003d BrainSplitter(self.url, self.token, self.container_name,"},{"line_number":278,"context_line":"                                  self.object_name, \u0027object\u0027, self.policy)"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"cff72b0e_8b81dff8","line":276,"updated":"2024-04-16 12:46:28.000000000","message":"This patch always needed a probe test like Tim mentioned in his earlier feedback. This is handy!","commit_id":"efb0f08ddd5253c84691c62927bb1e4a4d55f872"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1bdcebd733613f6de075a64c5e9272abf44de452","unresolved":true,"context_lines":[{"line_number":274,"context_line":"        self.assertIn(\u0027x-object-meta-expired\u0027, metadata)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def _setup_test_open_expired(self):"},{"line_number":277,"context_line":"        obj_brain \u003d BrainSplitter(self.url, self.token, self.container_name,"},{"line_number":278,"context_line":"                                  self.object_name, \u0027object\u0027, self.policy)"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        obj_brain.put_container()"}],"source_content_type":"text/x-python","patch_set":51,"id":"bcd82e75_c99f3e5f","line":277,"range":{"start_line":277,"start_character":20,"end_line":277,"end_character":33},"updated":"2024-04-22 19:26:39.000000000","message":"I was kind of expecting us to actually do a split-brain: have some object servers miss some updates, and make sure that we still behave reasonably. For example, I think a setup like\n\n```\n+----+-----------+-----------+\n|    |  Side A   |  Side B   |\n+----+-----------+-----------+\n| t0 |          PUT          |\n+----+-----------+-----------+\n| t1 |           | POST w/   |\n|    |           | expiry t3 |\n+----+-----------+-----------+\n| t2 | POST w/   |           |\n|    | expiry t4 |           |\n+----+-----------+-----------+\n```\n\nshould get us into a state where we have two queue entries; if only one side gets a POST at t5 clearing the expiry, how does the system respond?\n\nI suspect it\u0027ll depend on the order in which background daemons process work; you\u0027d get either\n\n- replicator settles things to t0.data and t5.meta\n- expirer tries to process the queue, gets back 409s (or would they be 412s?) and clears the stale queue entry\n\nor\n\n- expirer processes the queue and gets back a mix of 204s (writing down a tombstone at either t3 or t4) and 409s\n- replicator settles things to the tombstone and the t5 meta\n\nThat\u0027s... not great, but I think [we already knew that](https://bugs.launchpad.net/swift/+bug/1182628).\n\n(Which is to say, I don\u0027t think we *need* to write that test or address that behavior to get this merged.)","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1bdcebd733613f6de075a64c5e9272abf44de452","unresolved":true,"context_lines":[{"line_number":350,"context_line":"            _, body \u003d client.get_object(self.url, self.token,"},{"line_number":351,"context_line":"                                        self.container_name, self.object_name,"},{"line_number":352,"context_line":"                                        headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":353,"context_line":"            self.assertEqual(body, b\u0027\u0027)"},{"line_number":354,"context_line":"        except ClientException as e:"},{"line_number":355,"context_line":"            self.fail("},{"line_number":356,"context_line":"                \u0027Expected 200 for GET object but got %s\u0027 % e.http_status)"}],"source_content_type":"text/x-python","patch_set":51,"id":"7fa73e19_0416ccc5","line":353,"range":{"start_line":353,"start_character":35,"end_line":353,"end_character":38},"updated":"2024-04-22 19:26:39.000000000","message":"nit: Assertion would feel a little stronger if we had some data. As it is we\u0027re mostly looking for that acceptable status, but that ought to be sufficient.","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"6c4fc915b42fe57fe0d87131393c3c43114ea568","unresolved":false,"context_lines":[{"line_number":350,"context_line":"            _, body \u003d client.get_object(self.url, self.token,"},{"line_number":351,"context_line":"                                        self.container_name, self.object_name,"},{"line_number":352,"context_line":"                                        headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":353,"context_line":"            self.assertEqual(body, b\u0027\u0027)"},{"line_number":354,"context_line":"        except ClientException as e:"},{"line_number":355,"context_line":"            self.fail("},{"line_number":356,"context_line":"                \u0027Expected 200 for GET object but got %s\u0027 % e.http_status)"}],"source_content_type":"text/x-python","patch_set":51,"id":"61fb60f6_d1fafa21","line":353,"range":{"start_line":353,"start_character":35,"end_line":353,"end_character":38},"in_reply_to":"7fa73e19_0416ccc5","updated":"2024-04-24 19:50:46.000000000","message":"Got it, adding some data as an additional verification.","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1bdcebd733613f6de075a64c5e9272abf44de452","unresolved":true,"context_lines":[{"line_number":439,"context_line":"        self.assertEqual(e.exception.http_status, 404)"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"        # expirer runs to reap the object"},{"line_number":442,"context_line":"        self.expirer.once()"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        # should get a 404 with x-open-expired since object is reaped"},{"line_number":445,"context_line":"        with self.assertRaises(ClientException) as e:"}],"source_content_type":"text/x-python","patch_set":51,"id":"88fdd8ec_e83d6b72","line":442,"updated":"2024-04-22 19:26:39.000000000","message":"Test would be a little stronger if we checked that the .data file was still on disk ahead of running the expirer. (Or maybe even use direct client w/ `X-Backend-Open-Expired`!?)","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"6c4fc915b42fe57fe0d87131393c3c43114ea568","unresolved":false,"context_lines":[{"line_number":439,"context_line":"        self.assertEqual(e.exception.http_status, 404)"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"        # expirer runs to reap the object"},{"line_number":442,"context_line":"        self.expirer.once()"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        # should get a 404 with x-open-expired since object is reaped"},{"line_number":445,"context_line":"        with self.assertRaises(ClientException) as e:"}],"source_content_type":"text/x-python","patch_set":51,"id":"ec6c8d28_8970f18e","line":442,"in_reply_to":"88fdd8ec_e83d6b72","updated":"2024-04-24 19:50:46.000000000","message":"Good idea! Adding this in","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1bdcebd733613f6de075a64c5e9272abf44de452","unresolved":true,"context_lines":[{"line_number":446,"context_line":"            client.head_object(self.url, self.token,"},{"line_number":447,"context_line":"                               self.container_name, self.object_name,"},{"line_number":448,"context_line":"                               headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":449,"context_line":"        self.assertEqual(e.exception.http_status, 404)"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    def _test_expirer_delete_outdated_object_version(self, object_exists):"},{"line_number":452,"context_line":"        # This test simulates a case where the expirer tries to delete"}],"source_content_type":"text/x-python","patch_set":51,"id":"b9c58c2f_3bb35760","line":449,"updated":"2024-04-22 19:26:39.000000000","message":"This exactly matches our assertion just before running the expirer; again, looking at the on-disk files would be better.","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"60b926e7b362c140c07d1d97d1996c98ae831642","unresolved":false,"context_lines":[{"line_number":446,"context_line":"            client.head_object(self.url, self.token,"},{"line_number":447,"context_line":"                               self.container_name, self.object_name,"},{"line_number":448,"context_line":"                               headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":449,"context_line":"        self.assertEqual(e.exception.http_status, 404)"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    def _test_expirer_delete_outdated_object_version(self, object_exists):"},{"line_number":452,"context_line":"        # This test simulates a case where the expirer tries to delete"}],"source_content_type":"text/x-python","patch_set":51,"id":"a872e659_ab5c5388","line":449,"in_reply_to":"481c61a3_291c3287","updated":"2024-04-24 20:42:20.000000000","message":"LGTM","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"6c4fc915b42fe57fe0d87131393c3c43114ea568","unresolved":true,"context_lines":[{"line_number":446,"context_line":"            client.head_object(self.url, self.token,"},{"line_number":447,"context_line":"                               self.container_name, self.object_name,"},{"line_number":448,"context_line":"                               headers\u003d{\u0027X-Open-Expired\u0027: True})"},{"line_number":449,"context_line":"        self.assertEqual(e.exception.http_status, 404)"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    def _test_expirer_delete_outdated_object_version(self, object_exists):"},{"line_number":452,"context_line":"        # This test simulates a case where the expirer tries to delete"}],"source_content_type":"text/x-python","patch_set":51,"id":"481c61a3_291c3287","line":449,"in_reply_to":"b9c58c2f_3bb35760","updated":"2024-04-24 19:50:46.000000000","message":"Got it. I\u0027m running another check with `X-Backend-Open-Expired` instead, since that would be more indicative of what happens after the expirer runs.","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"60b926e7b362c140c07d1d97d1996c98ae831642","unresolved":true,"context_lines":[{"line_number":369,"context_line":"                               })"},{"line_number":370,"context_line":"        except ClientException as e:"},{"line_number":371,"context_line":"            self.fail("},{"line_number":372,"context_line":"                \u0027Expected 200 for POST object but got %s\u0027 % e.http_status)"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"        # make sure auto-created containers get in the account listing"},{"line_number":375,"context_line":"        Manager([\u0027container-updater\u0027]).once()"}],"source_content_type":"text/x-python","patch_set":52,"id":"08ac2190_dcea888d","line":372,"updated":"2024-04-24 20:42:20.000000000","message":"Might be good to sanity-check that GETs/HEADs *without* `X-Open-Expired` now 200 again:\n```\ndiff --git a/test/probe/test_object_expirer.py b/test/probe/test_object_expirer.py\nindex 9c336cfda..e4a23daaf 100644\n--- a/test/probe/test_object_expirer.py\n+++ b/test/probe/test_object_expirer.py\n@@ -371,6 +371,15 @@ class TestObjectExpirer(ReplProbeTest):\n             self.fail(\n                 \u0027Expected 200 for POST object but got %s\u0027 % e.http_status)\n \n+        # GET requests succeed again, even without the magic header\n+        try:\n+            _, body \u003d client.get_object(self.url, self.token,\n+                                        self.container_name, self.object_name)\n+            self.assertEqual(body, b\u0027foo\u0027)\n+        except ClientException as e:\n+            self.fail(\n+                \u0027Expected 200 for GET object but got %s\u0027 % e.http_status)\n+\n         # make sure auto-created containers get in the account listing\n         Manager([\u0027container-updater\u0027]).once()\n \n```","commit_id":"a1e33a2a554606c1340933e84f6c1eac57130e30"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"36f148521a373b93cf39ba4a27130abb25441e83","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                               })"},{"line_number":370,"context_line":"        except ClientException as e:"},{"line_number":371,"context_line":"            self.fail("},{"line_number":372,"context_line":"                \u0027Expected 200 for POST object but got %s\u0027 % e.http_status)"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"        # make sure auto-created containers get in the account listing"},{"line_number":375,"context_line":"        Manager([\u0027container-updater\u0027]).once()"}],"source_content_type":"text/x-python","patch_set":52,"id":"841f1f17_027a8771","line":372,"in_reply_to":"08ac2190_dcea888d","updated":"2024-04-24 21:05:23.000000000","message":"Got it, adding this","commit_id":"a1e33a2a554606c1340933e84f6c1eac57130e30"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"60b926e7b362c140c07d1d97d1996c98ae831642","unresolved":true,"context_lines":[{"line_number":375,"context_line":"        Manager([\u0027container-updater\u0027]).once()"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        # run the expirer, but the object expiry time is now in the future"},{"line_number":378,"context_line":"        self.expirer.once()"},{"line_number":379,"context_line":"        try:"},{"line_number":380,"context_line":"            resp \u003d client.head_object(self.url, self.token,"},{"line_number":381,"context_line":"                                      self.container_name, self.object_name,"}],"source_content_type":"text/x-python","patch_set":52,"id":"7179fc51_4ef84e3c","line":378,"updated":"2024-04-24 20:42:20.000000000","message":"Huh -- looks like it *did* get reaped when I ran this locally:\n```\n        except ClientException as e:\n\u003e           self.fail(\n                \u0027Expected 200 for HEAD object but got %s\u0027 % e.http_status)\nE           AssertionError: Expected 200 for HEAD object but got 404\n\ntest/probe/test_object_expirer.py:385: AssertionError\n```\n\nI think the POST should maybe kick the expiry out a *little* further into the future -- maybe 5 or 10s? Especially given the need to run the updaters -- locally, I\u0027m seeing ~2s between last `proxy-server` request and first `object-expirer-ic` request.","commit_id":"a1e33a2a554606c1340933e84f6c1eac57130e30"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"567c4dfd34eed6044d460e46f8c49dcb2363f636","unresolved":false,"context_lines":[{"line_number":375,"context_line":"        Manager([\u0027container-updater\u0027]).once()"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        # run the expirer, but the object expiry time is now in the future"},{"line_number":378,"context_line":"        self.expirer.once()"},{"line_number":379,"context_line":"        try:"},{"line_number":380,"context_line":"            resp \u003d client.head_object(self.url, self.token,"},{"line_number":381,"context_line":"                                      self.container_name, self.object_name,"}],"source_content_type":"text/x-python","patch_set":52,"id":"aad5f050_16946a9c","line":378,"in_reply_to":"02de9871_7f6589ee","updated":"2024-04-24 22:13:59.000000000","message":"Done","commit_id":"a1e33a2a554606c1340933e84f6c1eac57130e30"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"36f148521a373b93cf39ba4a27130abb25441e83","unresolved":true,"context_lines":[{"line_number":375,"context_line":"        Manager([\u0027container-updater\u0027]).once()"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        # run the expirer, but the object expiry time is now in the future"},{"line_number":378,"context_line":"        self.expirer.once()"},{"line_number":379,"context_line":"        try:"},{"line_number":380,"context_line":"            resp \u003d client.head_object(self.url, self.token,"},{"line_number":381,"context_line":"                                      self.container_name, self.object_name,"}],"source_content_type":"text/x-python","patch_set":52,"id":"02de9871_7f6589ee","line":378,"in_reply_to":"7179fc51_4ef84e3c","updated":"2024-04-24 21:05:23.000000000","message":"Got it, I noticed this as well when reducing the time. Pushing it to 5s - let me know if that ends up working","commit_id":"a1e33a2a554606c1340933e84f6c1eac57130e30"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"60b926e7b362c140c07d1d97d1996c98ae831642","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                self.account, self.container_name, self.object_name,"},{"line_number":460,"context_line":"                acceptable_statuses\u003d(2,),"},{"line_number":461,"context_line":"                headers\u003d{\u0027X-Backend-Open-Expired\u0027: True})"},{"line_number":462,"context_line":"        self.assertEqual(e.exception.resp.status_int, 404)"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"    def _test_expirer_delete_outdated_object_version(self, object_exists):"},{"line_number":465,"context_line":"        # This test simulates a case where the expirer tries to delete"}],"source_content_type":"text/x-python","patch_set":52,"id":"0ce5ef89_89b05d7e","line":462,"range":{"start_line":462,"start_character":37,"end_line":462,"end_character":41},"updated":"2024-04-24 20:42:20.000000000","message":"Right; the change from (swiftclient\u0027s) `ClientException` to (internal_client\u0027s) `UnexpectedResponse` means we pick up this extra layer.","commit_id":"a1e33a2a554606c1340933e84f6c1eac57130e30"}],"test/unit/common/middleware/test_tempurl.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":1040,"context_line":"                self.assertIn(b\u0027not allowed\u0027, resp.body)"},{"line_number":1041,"context_line":"                self.assertIn(hdr.encode(\u0027utf-8\u0027), resp.body)"},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"    def test_removed_incoming_header(self):"},{"line_number":1044,"context_line":"        self.tempurl \u003d tempurl.filter_factory({"},{"line_number":1045,"context_line":"            \u0027incoming_remove_headers\u0027: \u0027x-remove-this x-open-expired\u0027"},{"line_number":1046,"context_line":"        })(self.auth)"}],"source_content_type":"text/x-python","patch_set":33,"id":"7bdad3b6_023614c1","line":1043,"updated":"2024-03-14 15:38:48.000000000","message":"we need a similar test that uses the default config - this test is explicitly setting \n```\n\u0027incoming_remove_headers\u0027: \u0027x-remove-this x-open-expired\u0027\n```","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":false,"context_lines":[{"line_number":1040,"context_line":"                self.assertIn(b\u0027not allowed\u0027, resp.body)"},{"line_number":1041,"context_line":"                self.assertIn(hdr.encode(\u0027utf-8\u0027), resp.body)"},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"    def test_removed_incoming_header(self):"},{"line_number":1044,"context_line":"        self.tempurl \u003d tempurl.filter_factory({"},{"line_number":1045,"context_line":"            \u0027incoming_remove_headers\u0027: \u0027x-remove-this x-open-expired\u0027"},{"line_number":1046,"context_line":"        })(self.auth)"}],"source_content_type":"text/x-python","patch_set":33,"id":"b2c21fe7_989789c3","line":1043,"in_reply_to":"7bdad3b6_023614c1","updated":"2024-03-18 21:57:15.000000000","message":"Makes sense! Added a test `test_default_removed_incoming_header` to check the default config","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"901e5e88a4a3fe70b30b0a372b2c987a93dc778f","unresolved":true,"context_lines":[{"line_number":1671,"context_line":"        self.assertEqual(set(info[\u0027methods\u0027]),"},{"line_number":1672,"context_line":"                         set((\u0027GET\u0027, \u0027HEAD\u0027, \u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027)))"},{"line_number":1673,"context_line":"        self.assertEqual(set(info[\u0027incoming_remove_headers\u0027]),"},{"line_number":1674,"context_line":"                         set((\u0027x-timestamp\u0027, \u0027x-open-expired\u0027,)))"},{"line_number":1675,"context_line":"        self.assertEqual(set(info[\u0027incoming_allow_headers\u0027]), set())"},{"line_number":1676,"context_line":"        self.assertEqual(set(info[\u0027outgoing_remove_headers\u0027]),"},{"line_number":1677,"context_line":"                         set((\u0027x-object-meta-*\u0027,)))"}],"source_content_type":"text/x-python","patch_set":33,"id":"95f02ad7_4b620f8a","line":1674,"updated":"2024-03-14 15:38:48.000000000","message":"re. comment above - this test asserts that the default remove_headers are published in info, but not that they are applied to requests\n\nwe need a ``test_removed_incoming_header_defaults``","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"edcbe3be1945522ce3ca33efd1a615c7a6dec432","unresolved":true,"context_lines":[{"line_number":1671,"context_line":"        self.assertEqual(set(info[\u0027methods\u0027]),"},{"line_number":1672,"context_line":"                         set((\u0027GET\u0027, \u0027HEAD\u0027, \u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027)))"},{"line_number":1673,"context_line":"        self.assertEqual(set(info[\u0027incoming_remove_headers\u0027]),"},{"line_number":1674,"context_line":"                         set((\u0027x-timestamp\u0027, \u0027x-open-expired\u0027,)))"},{"line_number":1675,"context_line":"        self.assertEqual(set(info[\u0027incoming_allow_headers\u0027]), set())"},{"line_number":1676,"context_line":"        self.assertEqual(set(info[\u0027outgoing_remove_headers\u0027]),"},{"line_number":1677,"context_line":"                         set((\u0027x-object-meta-*\u0027,)))"}],"source_content_type":"text/x-python","patch_set":33,"id":"e5a7b675_4028d4af","line":1674,"in_reply_to":"95f02ad7_4b620f8a","updated":"2024-03-18 21:57:15.000000000","message":"Just added a `test_removed_incoming_header_defaults` that does it based on the incoming_remove_headers in swift_info.","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"e0a587cb73db5f0918f72cb883a0669261bcb7c2","unresolved":false,"context_lines":[{"line_number":1671,"context_line":"        self.assertEqual(set(info[\u0027methods\u0027]),"},{"line_number":1672,"context_line":"                         set((\u0027GET\u0027, \u0027HEAD\u0027, \u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027)))"},{"line_number":1673,"context_line":"        self.assertEqual(set(info[\u0027incoming_remove_headers\u0027]),"},{"line_number":1674,"context_line":"                         set((\u0027x-timestamp\u0027, \u0027x-open-expired\u0027,)))"},{"line_number":1675,"context_line":"        self.assertEqual(set(info[\u0027incoming_allow_headers\u0027]), set())"},{"line_number":1676,"context_line":"        self.assertEqual(set(info[\u0027outgoing_remove_headers\u0027]),"},{"line_number":1677,"context_line":"                         set((\u0027x-object-meta-*\u0027,)))"}],"source_content_type":"text/x-python","patch_set":33,"id":"dd547745_4fdfa950","line":1674,"in_reply_to":"e5a7b675_4028d4af","updated":"2024-03-21 00:15:00.000000000","message":"Done","commit_id":"5753883ae57fb766acefb50d0e081bf04783689e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":1046,"context_line":"        swift_info \u003d registry.get_swift_info()"},{"line_number":1047,"context_line":"        self.assertIn(\u0027tempurl\u0027, swift_info)"},{"line_number":1048,"context_line":"        info \u003d swift_info[\u0027tempurl\u0027]"},{"line_number":1049,"context_line":"        incoming_remove_headers \u003d info.get(\u0027incoming_remove_headers\u0027, set())"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"        method \u003d \u0027GET\u0027"},{"line_number":1052,"context_line":"        expires \u003d int(time() + 86400)"}],"source_content_type":"text/x-python","patch_set":43,"id":"3627e0e1_eb553fc8","line":1049,"updated":"2024-04-05 11:25:53.000000000","message":"ok, we have test_registered_defaults that verifies the defaults (\u0027x-timestamp\u0027, \u0027x-open-expired\u0027) are published in swift_info, so this won\u0027t be an empty set","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":false,"context_lines":[{"line_number":1046,"context_line":"        swift_info \u003d registry.get_swift_info()"},{"line_number":1047,"context_line":"        self.assertIn(\u0027tempurl\u0027, swift_info)"},{"line_number":1048,"context_line":"        info \u003d swift_info[\u0027tempurl\u0027]"},{"line_number":1049,"context_line":"        incoming_remove_headers \u003d info.get(\u0027incoming_remove_headers\u0027, set())"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"        method \u003d \u0027GET\u0027"},{"line_number":1052,"context_line":"        expires \u003d int(time() + 86400)"}],"source_content_type":"text/x-python","patch_set":43,"id":"241f4e95_f547da65","line":1049,"in_reply_to":"11a1f2e5_e5ce606c","updated":"2024-04-09 12:16:26.000000000","message":"sorry, my comment wasn\u0027t clear, I meant \"This is ok\" :) It\u0027s fine as it is now too.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":1046,"context_line":"        swift_info \u003d registry.get_swift_info()"},{"line_number":1047,"context_line":"        self.assertIn(\u0027tempurl\u0027, swift_info)"},{"line_number":1048,"context_line":"        info \u003d swift_info[\u0027tempurl\u0027]"},{"line_number":1049,"context_line":"        incoming_remove_headers \u003d info.get(\u0027incoming_remove_headers\u0027, set())"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"        method \u003d \u0027GET\u0027"},{"line_number":1052,"context_line":"        expires \u003d int(time() + 86400)"}],"source_content_type":"text/x-python","patch_set":43,"id":"11a1f2e5_e5ce606c","line":1049,"in_reply_to":"3627e0e1_eb553fc8","updated":"2024-04-08 21:47:48.000000000","message":"Got it, looks like I overlooked this - thanks for pointing this out!","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"616db680566770b17c1bdf0514d7843621af09c9","unresolved":false,"context_lines":[{"line_number":1040,"context_line":"                self.assertIn(b\u0027not allowed\u0027, resp.body)"},{"line_number":1041,"context_line":"                self.assertIn(hdr.encode(\u0027utf-8\u0027), resp.body)"},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"    def test_removed_incoming_header_defaults(self):"},{"line_number":1044,"context_line":"        self.tempurl \u003d tempurl.filter_factory({})(self.auth)"},{"line_number":1045,"context_line":""},{"line_number":1046,"context_line":"        swift_info \u003d registry.get_swift_info()"}],"source_content_type":"text/x-python","patch_set":49,"id":"0e166ff2_2f9b802e","line":1043,"updated":"2024-04-16 12:46:28.000000000","message":"We now test to make sure we remove the incoming x-open-expired headers for tempurls for objects. This helps in avoiding unnecessary access to objects that are eligible to be reaped from disk, to not still be accessed.","commit_id":"efb0f08ddd5253c84691c62927bb1e4a4d55f872"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1bdcebd733613f6de075a64c5e9272abf44de452","unresolved":true,"context_lines":[{"line_number":1046,"context_line":"        swift_info \u003d registry.get_swift_info()"},{"line_number":1047,"context_line":"        self.assertIn(\u0027tempurl\u0027, swift_info)"},{"line_number":1048,"context_line":"        info \u003d swift_info[\u0027tempurl\u0027]"},{"line_number":1049,"context_line":"        incoming_remove_headers \u003d info.get(\u0027incoming_remove_headers\u0027, set("},{"line_number":1050,"context_line":"            (\u0027x-timestamp\u0027, \u0027x-open-expired\u0027)"},{"line_number":1051,"context_line":"        ))"},{"line_number":1052,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"01ca6c60_386322a7","line":1049,"updated":"2024-04-22 19:26:39.000000000","message":"Can\u0027t we just use `swift_info[\u0027tempurl\u0027][\u0027incoming_remove_headers\u0027]`? That key should always be present, right?","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"6c4fc915b42fe57fe0d87131393c3c43114ea568","unresolved":false,"context_lines":[{"line_number":1046,"context_line":"        swift_info \u003d registry.get_swift_info()"},{"line_number":1047,"context_line":"        self.assertIn(\u0027tempurl\u0027, swift_info)"},{"line_number":1048,"context_line":"        info \u003d swift_info[\u0027tempurl\u0027]"},{"line_number":1049,"context_line":"        incoming_remove_headers \u003d info.get(\u0027incoming_remove_headers\u0027, set("},{"line_number":1050,"context_line":"            (\u0027x-timestamp\u0027, \u0027x-open-expired\u0027)"},{"line_number":1051,"context_line":"        ))"},{"line_number":1052,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"0b40f314_d2ea2b59","line":1049,"in_reply_to":"01ca6c60_386322a7","updated":"2024-04-24 19:50:46.000000000","message":"Done","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1bdcebd733613f6de075a64c5e9272abf44de452","unresolved":true,"context_lines":[{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":"    def test_removed_incoming_header(self):"},{"line_number":1070,"context_line":"        self.tempurl \u003d tempurl.filter_factory({"},{"line_number":1071,"context_line":"            \u0027incoming_remove_headers\u0027: \u0027x-remove-this x-open-expired\u0027"},{"line_number":1072,"context_line":"        })(self.auth)"},{"line_number":1073,"context_line":"        method \u003d \u0027GET\u0027"},{"line_number":1074,"context_line":"        expires \u003d int(time() + 86400)"}],"source_content_type":"text/x-python","patch_set":51,"id":"1edb90fd_4de0c195","line":1071,"range":{"start_line":1071,"start_character":53,"end_line":1071,"end_character":68},"updated":"2024-04-22 19:26:39.000000000","message":"I think I\u0027d find this even more compelling if the config *didn\u0027t* include `x-open-expired` and then we demonstrated that starts being allowed to be used with tempurl.","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"6c4fc915b42fe57fe0d87131393c3c43114ea568","unresolved":false,"context_lines":[{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":"    def test_removed_incoming_header(self):"},{"line_number":1070,"context_line":"        self.tempurl \u003d tempurl.filter_factory({"},{"line_number":1071,"context_line":"            \u0027incoming_remove_headers\u0027: \u0027x-remove-this x-open-expired\u0027"},{"line_number":1072,"context_line":"        })(self.auth)"},{"line_number":1073,"context_line":"        method \u003d \u0027GET\u0027"},{"line_number":1074,"context_line":"        expires \u003d int(time() + 86400)"}],"source_content_type":"text/x-python","patch_set":51,"id":"b8bb7864_c5a9610c","line":1071,"range":{"start_line":1071,"start_character":53,"end_line":1071,"end_character":68},"in_reply_to":"1edb90fd_4de0c195","updated":"2024-04-24 19:50:46.000000000","message":"Got it, adding this case. Makes sense since we already tested the default behavior in the previous test.","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"}],"test/unit/common/test_request_helpers.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"edb8242995ea695fc30e9bc8b0245dacf20ab87f","unresolved":true,"context_lines":[{"line_number":491,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027, headers\u003d{\u0027X-Open-Expired\u0027: \u0027yes\u0027})"},{"line_number":492,"context_line":"        self.assertTrue(rh.is_open_expired(app, req))"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    def test_is_backend_open_expired(self):"},{"line_number":495,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027, headers\u003d{"},{"line_number":496,"context_line":"            \u0027X-Backend-Open-Expired\u0027: \u0027yes\u0027"},{"line_number":497,"context_line":"        })"}],"source_content_type":"text/x-python","patch_set":48,"id":"8710b0a4_b48e7be6","line":494,"updated":"2024-04-12 08:35:20.000000000","message":"please add the default case (no headers -\u003e False)","commit_id":"f84e42df73bb041b52c8e394024e9121586b1b69"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"3d45d6acb5891426a0dd54699a14d3b8ee6ee3d0","unresolved":false,"context_lines":[{"line_number":491,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027, headers\u003d{\u0027X-Open-Expired\u0027: \u0027yes\u0027})"},{"line_number":492,"context_line":"        self.assertTrue(rh.is_open_expired(app, req))"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    def test_is_backend_open_expired(self):"},{"line_number":495,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027, headers\u003d{"},{"line_number":496,"context_line":"            \u0027X-Backend-Open-Expired\u0027: \u0027yes\u0027"},{"line_number":497,"context_line":"        })"}],"source_content_type":"text/x-python","patch_set":48,"id":"77de856a_df75cb2d","line":494,"in_reply_to":"8710b0a4_b48e7be6","updated":"2024-04-15 04:13:42.000000000","message":"Done","commit_id":"f84e42df73bb041b52c8e394024e9121586b1b69"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"616db680566770b17c1bdf0514d7843621af09c9","unresolved":false,"context_lines":[{"line_number":473,"context_line":"        self.assertEqual(str(ctx.exception),"},{"line_number":474,"context_line":"                         \u0027Invalid reserved name\u0027)"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"    def test_is_open_expired(self):"},{"line_number":477,"context_line":"        app \u003d argparse.Namespace(enable_open_expired\u003dFalse)"},{"line_number":478,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027, headers\u003d{\u0027X-Open-Expired\u0027: \u0027yes\u0027})"},{"line_number":479,"context_line":"        self.assertFalse(rh.is_open_expired(app, req))"}],"source_content_type":"text/x-python","patch_set":49,"id":"04b0e231_ca1c5d55","line":476,"updated":"2024-04-16 12:46:28.000000000","message":"Nice test.","commit_id":"efb0f08ddd5253c84691c62927bb1e4a4d55f872"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5d5d137b2f38da74c0430db25c9dfabf65527649","unresolved":true,"context_lines":[{"line_number":6568,"context_line":"                         \u0027X-Open-Expired\u0027: \u0027True\u0027})"},{"line_number":6569,"context_line":"            resp \u003d req.get_response(self.object_controller)"},{"line_number":6570,"context_line":"            self.assertEqual(resp.status_int, 200)"},{"line_number":6571,"context_line":"            self.assertEqual(expected_body, resp.body)"},{"line_number":6572,"context_line":""},{"line_number":6573,"context_line":"    def test_HEAD_but_expired(self):"},{"line_number":6574,"context_line":"        # We have an object that expires in the future"}],"source_content_type":"text/x-python","patch_set":5,"id":"67c721cf_d99f8c9c","line":6571,"updated":"2023-02-22 15:10:36.000000000","message":"i think this shows x-open-expired true works\n\nyou could negative test x-open-expired False\n\n... or test with both x-open-expired \u0026 x-backend-replication","commit_id":"2246783942844a212c853dc727788c534ceeb156"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"8929f26021a671ca7006ce506445bbce707cd053","unresolved":false,"context_lines":[{"line_number":6568,"context_line":"                         \u0027X-Open-Expired\u0027: \u0027True\u0027})"},{"line_number":6569,"context_line":"            resp \u003d req.get_response(self.object_controller)"},{"line_number":6570,"context_line":"            self.assertEqual(resp.status_int, 200)"},{"line_number":6571,"context_line":"            self.assertEqual(expected_body, resp.body)"},{"line_number":6572,"context_line":""},{"line_number":6573,"context_line":"    def test_HEAD_but_expired(self):"},{"line_number":6574,"context_line":"        # We have an object that expires in the future"}],"source_content_type":"text/x-python","patch_set":5,"id":"6d3ad938_8f4780c9","line":6571,"in_reply_to":"67c721cf_d99f8c9c","updated":"2023-08-17 16:15:24.000000000","message":"Done","commit_id":"2246783942844a212c853dc727788c534ceeb156"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"648b57ebd0aeb5db53f09319ecd35578a91ab2ab","unresolved":true,"context_lines":[{"line_number":6737,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"},{"line_number":6738,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time)})"},{"line_number":6739,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":6740,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":6741,"context_line":""},{"line_number":6742,"context_line":""},{"line_number":6743,"context_line":"    def test_DELETE_can_skip_updating_expirer_queue(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"f6da3f12_b6081730","line":6740,"updated":"2023-02-28 10:42:33.000000000","message":"for completeness, you could also test for 200 when headers include \u0027x-backend-open-expired\u0027: \u0027true\u0027 and time is *before* the delete-at time has been reached.","commit_id":"40576d39c83d8592b3ab8086790d9ea28963e1b0"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"8929f26021a671ca7006ce506445bbce707cd053","unresolved":false,"context_lines":[{"line_number":6737,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"},{"line_number":6738,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time)})"},{"line_number":6739,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":6740,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":6741,"context_line":""},{"line_number":6742,"context_line":""},{"line_number":6743,"context_line":"    def test_DELETE_can_skip_updating_expirer_queue(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"47ec1088_b6fb670a","line":6740,"in_reply_to":"f6da3f12_b6081730","updated":"2023-08-17 16:15:24.000000000","message":"Ack","commit_id":"40576d39c83d8592b3ab8086790d9ea28963e1b0"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a7601bb6c400919ac72780e7dbc967fcf309a939","unresolved":true,"context_lines":[{"line_number":6721,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},"},{"line_number":6722,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time)})"},{"line_number":6723,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":6724,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":6725,"context_line":""},{"line_number":6726,"context_line":"        the_time \u003d delete_at_timestamp + 104"},{"line_number":6727,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":17,"id":"1fc2a10e_393fa9cc","line":6724,"updated":"2023-03-20 23:22:54.000000000","message":"you might add another block to show that the object-server will ignore x-open-expired unless the proxy sets x-backend-open-expired","commit_id":"b23a6195f11651a7c1b7923d68b4613317b973c8"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"6620822508a628ee6e4d857ec0e37dda50a0f17c","unresolved":false,"context_lines":[{"line_number":6721,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},"},{"line_number":6722,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time)})"},{"line_number":6723,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":6724,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":6725,"context_line":""},{"line_number":6726,"context_line":"        the_time \u003d delete_at_timestamp + 104"},{"line_number":6727,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":17,"id":"68791b3e_3e462395","line":6724,"in_reply_to":"1fc2a10e_393fa9cc","updated":"2023-10-25 20:43:45.000000000","message":"Done","commit_id":"b23a6195f11651a7c1b7923d68b4613317b973c8"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"30bf6816bd1c2c41363f8a1e2c777d0639452790","unresolved":true,"context_lines":[{"line_number":7167,"context_line":"            resp \u003d req.get_response(self.object_controller)"},{"line_number":7168,"context_line":"            self.assertEqual(resp.status_int, 201)"},{"line_number":7169,"context_line":""},{"line_number":7170,"context_line":"        # You can POST to a not-yet-expired object without x-delete-at"},{"line_number":7171,"context_line":"        recreate_test_object(now)"},{"line_number":7172,"context_line":"        the_time \u003d now + 1"},{"line_number":7173,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":24,"id":"154a8ef3_121d4d4b","line":7170,"range":{"start_line":7170,"start_character":10,"end_line":7170,"end_character":70},"updated":"2023-10-30 04:14:14.000000000","message":"oh nice we do do a test where we restore without an x-delete-at, nice.","commit_id":"5a8eee9916f1f773cfebc7162ec1779366641318"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"743cfef6a8edae9e1c745ffbd6e5efb9a86c65ad","unresolved":false,"context_lines":[{"line_number":7167,"context_line":"            resp \u003d req.get_response(self.object_controller)"},{"line_number":7168,"context_line":"            self.assertEqual(resp.status_int, 201)"},{"line_number":7169,"context_line":""},{"line_number":7170,"context_line":"        # You can POST to a not-yet-expired object without x-delete-at"},{"line_number":7171,"context_line":"        recreate_test_object(now)"},{"line_number":7172,"context_line":"        the_time \u003d now + 1"},{"line_number":7173,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":24,"id":"7917cc2a_b3b6bc07","line":7170,"range":{"start_line":7170,"start_character":10,"end_line":7170,"end_character":70},"in_reply_to":"154a8ef3_121d4d4b","updated":"2023-11-01 16:09:01.000000000","message":"Done","commit_id":"5a8eee9916f1f773cfebc7162ec1779366641318"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"743cfef6a8edae9e1c745ffbd6e5efb9a86c65ad","unresolved":false,"context_lines":[{"line_number":7167,"context_line":"            resp \u003d req.get_response(self.object_controller)"},{"line_number":7168,"context_line":"            self.assertEqual(resp.status_int, 201)"},{"line_number":7169,"context_line":""},{"line_number":7170,"context_line":"        # You can POST to a not-yet-expired object without x-delete-at"},{"line_number":7171,"context_line":"        recreate_test_object(now)"},{"line_number":7172,"context_line":"        the_time \u003d now + 1"},{"line_number":7173,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":24,"id":"7b5ae36d_51fa0632","line":7170,"range":{"start_line":7170,"start_character":10,"end_line":7170,"end_character":70},"in_reply_to":"154a8ef3_121d4d4b","updated":"2023-11-01 16:09:01.000000000","message":"Done","commit_id":"5a8eee9916f1f773cfebc7162ec1779366641318"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"743cfef6a8edae9e1c745ffbd6e5efb9a86c65ad","unresolved":false,"context_lines":[{"line_number":7178,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7179,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7180,"context_line":""},{"line_number":7181,"context_line":"        the_time \u003d now + 2"},{"line_number":7182,"context_line":"        req \u003d Request.blank("},{"line_number":7183,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7184,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027POST\u0027},"}],"source_content_type":"text/x-python","patch_set":25,"id":"eba8301d_ba483a73","line":7181,"updated":"2023-11-01 16:09:01.000000000","message":"I have added a new comment here as per feedback given here, ref:","commit_id":"ef23ffc874e9ceb3d301f4fef73052cac038fa65"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7114,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7115,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027POST\u0027},"},{"line_number":7116,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time),"},{"line_number":7117,"context_line":"                     \u0027x-backend-replication\u0027: \u0027true\u0027,"},{"line_number":7118,"context_line":"                     \u0027x-delete-at\u0027: str(delete_at_timestamp + 100)})"},{"line_number":7119,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7120,"context_line":"        self.assertEqual(resp.status_int, 202)"}],"source_content_type":"text/x-python","patch_set":43,"id":"ad504abf_c0782fe8","side":"PARENT","line":7117,"updated":"2024-04-05 11:25:53.000000000","message":"oh! why did this get deleted?","commit_id":"7bffb150fd2281e125cdb5ac99a627aa035a5ead"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7114,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7115,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027POST\u0027},"},{"line_number":7116,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time),"},{"line_number":7117,"context_line":"                     \u0027x-backend-replication\u0027: \u0027true\u0027,"},{"line_number":7118,"context_line":"                     \u0027x-delete-at\u0027: str(delete_at_timestamp + 100)})"},{"line_number":7119,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7120,"context_line":"        self.assertEqual(resp.status_int, 202)"}],"source_content_type":"text/x-python","patch_set":43,"id":"7ec407b5_41736f83","side":"PARENT","line":7117,"in_reply_to":"ad504abf_c0782fe8","updated":"2024-04-08 21:47:48.000000000","message":"Not sure - looks like even the comment mentions this is needed to update the delete-at-timestamp. Adding it back in!","commit_id":"7bffb150fd2281e125cdb5ac99a627aa035a5ead"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7012,"context_line":"        expected \u003d {"},{"line_number":7013,"context_line":"            \u0027GET\u0027: b\u0027TEST\u0027,"},{"line_number":7014,"context_line":"            \u0027HEAD\u0027: b\u0027\u0027,"},{"line_number":7015,"context_line":"        }"},{"line_number":7016,"context_line":"        for meth, expected_body in expected.items():"},{"line_number":7017,"context_line":"            req \u003d Request.blank("},{"line_number":7018,"context_line":"                \u0027/sda1/p/a/c/o\u0027, method\u003dmeth,"}],"source_content_type":"text/x-python","patch_set":43,"id":"6962ae9f_d8529de6","line":7015,"updated":"2024-04-05 11:25:53.000000000","message":"hmmm, GET *and* HEAD testing got added here in the GET-specific test_GET_but_expired, whereas the next test is specific to HEAD","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7012,"context_line":"        expected \u003d {"},{"line_number":7013,"context_line":"            \u0027GET\u0027: b\u0027TEST\u0027,"},{"line_number":7014,"context_line":"            \u0027HEAD\u0027: b\u0027\u0027,"},{"line_number":7015,"context_line":"        }"},{"line_number":7016,"context_line":"        for meth, expected_body in expected.items():"},{"line_number":7017,"context_line":"            req \u003d Request.blank("},{"line_number":7018,"context_line":"                \u0027/sda1/p/a/c/o\u0027, method\u003dmeth,"}],"source_content_type":"text/x-python","patch_set":43,"id":"1a7af39d_2f42c84c","line":7015,"in_reply_to":"6962ae9f_d8529de6","updated":"2024-04-08 21:47:48.000000000","message":"Got it - changing this to only handle GET requests and the second to only handle HEAD requests.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7027,"context_line":"        expected \u003d {"},{"line_number":7028,"context_line":"            \u0027GET\u0027: b\u0027TEST\u0027,"},{"line_number":7029,"context_line":"            \u0027HEAD\u0027: b\u0027\u0027,"},{"line_number":7030,"context_line":"        }"},{"line_number":7031,"context_line":"        for meth, expected_body in expected.items():"},{"line_number":7032,"context_line":"            req \u003d Request.blank("},{"line_number":7033,"context_line":"                \u0027/sda1/p/a/c/o\u0027, method\u003dmeth,"}],"source_content_type":"text/x-python","patch_set":43,"id":"77bbd3d5_d12a8c00","line":7030,"updated":"2024-04-05 11:25:53.000000000","message":"nit: this does not need to be defined again, see line 7012","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7027,"context_line":"        expected \u003d {"},{"line_number":7028,"context_line":"            \u0027GET\u0027: b\u0027TEST\u0027,"},{"line_number":7029,"context_line":"            \u0027HEAD\u0027: b\u0027\u0027,"},{"line_number":7030,"context_line":"        }"},{"line_number":7031,"context_line":"        for meth, expected_body in expected.items():"},{"line_number":7032,"context_line":"            req \u003d Request.blank("},{"line_number":7033,"context_line":"                \u0027/sda1/p/a/c/o\u0027, method\u003dmeth,"}],"source_content_type":"text/x-python","patch_set":43,"id":"77e822b7_ae7d07b4","line":7030,"in_reply_to":"77bbd3d5_d12a8c00","updated":"2024-04-08 21:47:48.000000000","message":"Got it - removing it and changing it since it just needs to do the GET request directly and doesn\u0027t need to do the HEAD request.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7083,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp("},{"line_number":7084,"context_line":"                delete_at_timestamp + 2), \u0027x-backend-open-expired\u0027: \u0027true\u0027})"},{"line_number":7085,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7086,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7087,"context_line":""},{"line_number":7088,"context_line":"        req \u003d Request.blank("},{"line_number":7089,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"070f9ed4_a7789941","line":7086,"updated":"2024-04-05 11:25:53.000000000","message":"nit: this duplicates the scenario in the GET-specific test at line 7031\n\nit\u0027s a prior \"mistake\" but for bonus points it might be better to have both the X-Backend-Replication and x-open-expired scenarios tested for HEAD here in test_HEAD_but_expired, and only test the GET method in test_GET_but_expired.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7083,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp("},{"line_number":7084,"context_line":"                delete_at_timestamp + 2), \u0027x-backend-open-expired\u0027: \u0027true\u0027})"},{"line_number":7085,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7086,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7087,"context_line":""},{"line_number":7088,"context_line":"        req \u003d Request.blank("},{"line_number":7089,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"73635da4_ffdab4c1","line":7086,"in_reply_to":"070f9ed4_a7789941","updated":"2024-04-08 21:47:48.000000000","message":"Got it, I\u0027ve made the previous method focus on GET requests and this on HEAD requests so the scenario is not repeated.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7085,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7086,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7087,"context_line":""},{"line_number":7088,"context_line":"        req \u003d Request.blank("},{"line_number":7089,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7090,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},"},{"line_number":7091,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp("},{"line_number":7092,"context_line":"                delete_at_timestamp + 3)})"},{"line_number":7093,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7094,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":7095,"context_line":""},{"line_number":7096,"context_line":"    def test_POST_but_expired(self):"},{"line_number":7097,"context_line":"        now \u003d time()"}],"source_content_type":"text/x-python","patch_set":43,"id":"4c1025a4_e8de310f","line":7094,"range":{"start_line":7088,"start_character":8,"end_line":7094,"end_character":46},"updated":"2024-04-05 11:25:53.000000000","message":"nit: this seems to just repeat the scenario at line 7069 (albeit with a later timestamp) - doesn\u0027t seem necessary","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7085,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7086,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7087,"context_line":""},{"line_number":7088,"context_line":"        req \u003d Request.blank("},{"line_number":7089,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7090,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},"},{"line_number":7091,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp("},{"line_number":7092,"context_line":"                delete_at_timestamp + 3)})"},{"line_number":7093,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7094,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":7095,"context_line":""},{"line_number":7096,"context_line":"    def test_POST_but_expired(self):"},{"line_number":7097,"context_line":"        now \u003d time()"}],"source_content_type":"text/x-python","patch_set":43,"id":"a2117c83_7b0467d0","line":7094,"range":{"start_line":7088,"start_character":8,"end_line":7094,"end_character":46},"in_reply_to":"4c1025a4_e8de310f","updated":"2024-04-08 21:47:48.000000000","message":"Got it, removing it since this functionality was already tested in the previous 404 check.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7126,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7127,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7128,"context_line":""},{"line_number":7129,"context_line":"        # object has not expired yet"},{"line_number":7130,"context_line":"        the_time \u003d now + 1"},{"line_number":7131,"context_line":"        req \u003d Request.blank("},{"line_number":7132,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"bcb21110_0a051be5","line":7129,"updated":"2024-04-05 11:25:53.000000000","message":"nit: add to the comment \", x-open-expired is irrelevant\"","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":true,"context_lines":[{"line_number":7126,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7127,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7128,"context_line":""},{"line_number":7129,"context_line":"        # object has not expired yet"},{"line_number":7130,"context_line":"        the_time \u003d now + 1"},{"line_number":7131,"context_line":"        req \u003d Request.blank("},{"line_number":7132,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"e9e9b46d_9c0e2471","line":7129,"in_reply_to":"bcb21110_0a051be5","updated":"2024-04-08 21:47:48.000000000","message":"Got it, should it be X-Backend-Open-Expired is irrelevant since we\u0027re requesting with this header but that doesn\u0027t really change any behavior? Or x-open-expired?","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7126,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7127,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7128,"context_line":""},{"line_number":7129,"context_line":"        # object has not expired yet"},{"line_number":7130,"context_line":"        the_time \u003d now + 1"},{"line_number":7131,"context_line":"        req \u003d Request.blank("},{"line_number":7132,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"69ab9662_f090abf8","line":7129,"in_reply_to":"c59556f5_4299659b","updated":"2024-04-09 17:09:49.000000000","message":"Done","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":true,"context_lines":[{"line_number":7126,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7127,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7128,"context_line":""},{"line_number":7129,"context_line":"        # object has not expired yet"},{"line_number":7130,"context_line":"        the_time \u003d now + 1"},{"line_number":7131,"context_line":"        req \u003d Request.blank("},{"line_number":7132,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"c59556f5_4299659b","line":7129,"in_reply_to":"e9e9b46d_9c0e2471","updated":"2024-04-09 12:16:26.000000000","message":"I think it\u0027s taken care of in new version","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7127,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7128,"context_line":""},{"line_number":7129,"context_line":"        # object has not expired yet"},{"line_number":7130,"context_line":"        the_time \u003d now + 1"},{"line_number":7131,"context_line":"        req \u003d Request.blank("},{"line_number":7132,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7133,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},"}],"source_content_type":"text/x-python","patch_set":43,"id":"2344874a_025948f3","line":7130,"updated":"2024-04-05 11:25:53.000000000","message":"nit: unnecessary re-declaration vs line 7121","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7127,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7128,"context_line":""},{"line_number":7129,"context_line":"        # object has not expired yet"},{"line_number":7130,"context_line":"        the_time \u003d now + 1"},{"line_number":7131,"context_line":"        req \u003d Request.blank("},{"line_number":7132,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7133,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},"}],"source_content_type":"text/x-python","patch_set":43,"id":"3d1d5b95_dfc7eb80","line":7130,"in_reply_to":"2344874a_025948f3","updated":"2024-04-08 21:47:48.000000000","message":"got it, removing","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7132,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7133,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},"},{"line_number":7134,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time),"},{"line_number":7135,"context_line":"                     \u0027X-Backend-Open-Expired\u0027: \u0027true\u0027})"},{"line_number":7136,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7137,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7138,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"2b60accc_64e25a38","line":7135,"updated":"2024-04-05 11:25:53.000000000","message":"ok, at first I misunderstood this scenario: the expiry time has NOT been reached yet, so x-open-expired is not needed but the scenario verifies that x-open-expired doesn\u0027t break anything.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7132,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7133,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},"},{"line_number":7134,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time),"},{"line_number":7135,"context_line":"                     \u0027X-Backend-Open-Expired\u0027: \u0027true\u0027})"},{"line_number":7136,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7137,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7138,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"9572f2a1_fa98ecd6","line":7135,"in_reply_to":"2b60accc_64e25a38","updated":"2024-04-08 21:47:48.000000000","message":"Got it, so adding the comment that x-open-expired is irrelevant could help clarify this","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7147,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7148,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":7149,"context_line":""},{"line_number":7150,"context_line":"        # You can POST to an expired object with an x-open-expired header"},{"line_number":7151,"context_line":"        now +\u003d 2"},{"line_number":7152,"context_line":"        recreate_test_object(now)"},{"line_number":7153,"context_line":"        the_time \u003d delete_at_timestamp + 1"}],"source_content_type":"text/x-python","patch_set":43,"id":"f8064a9a_467c003a","line":7150,"range":{"start_line":7150,"start_character":52,"end_line":7150,"end_character":66},"updated":"2024-04-05 11:25:53.000000000","message":"s/x-open-expired/x-backend-open-expired/","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7147,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7148,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":7149,"context_line":""},{"line_number":7150,"context_line":"        # You can POST to an expired object with an x-open-expired header"},{"line_number":7151,"context_line":"        now +\u003d 2"},{"line_number":7152,"context_line":"        recreate_test_object(now)"},{"line_number":7153,"context_line":"        the_time \u003d delete_at_timestamp + 1"}],"source_content_type":"text/x-python","patch_set":43,"id":"2419eedd_9150a463","line":7150,"range":{"start_line":7150,"start_character":52,"end_line":7150,"end_character":66},"in_reply_to":"f8064a9a_467c003a","updated":"2024-04-08 21:47:48.000000000","message":"Done","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7148,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":7149,"context_line":""},{"line_number":7150,"context_line":"        # You can POST to an expired object with an x-open-expired header"},{"line_number":7151,"context_line":"        now +\u003d 2"},{"line_number":7152,"context_line":"        recreate_test_object(now)"},{"line_number":7153,"context_line":"        the_time \u003d delete_at_timestamp + 1"},{"line_number":7154,"context_line":"        req \u003d Request.blank("},{"line_number":7155,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7156,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027POST\u0027},"}],"source_content_type":"text/x-python","patch_set":43,"id":"0b7d0491_bd0bf8dd","line":7153,"range":{"start_line":7151,"start_character":8,"end_line":7153,"end_character":39},"updated":"2024-04-05 11:25:53.000000000","message":"I don\u0027t think this repeated setup is necessary","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7148,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":7149,"context_line":""},{"line_number":7150,"context_line":"        # You can POST to an expired object with an x-open-expired header"},{"line_number":7151,"context_line":"        now +\u003d 2"},{"line_number":7152,"context_line":"        recreate_test_object(now)"},{"line_number":7153,"context_line":"        the_time \u003d delete_at_timestamp + 1"},{"line_number":7154,"context_line":"        req \u003d Request.blank("},{"line_number":7155,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7156,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027POST\u0027},"}],"source_content_type":"text/x-python","patch_set":43,"id":"a95b47ec_98ffa2cd","line":7153,"range":{"start_line":7151,"start_character":8,"end_line":7153,"end_character":39},"in_reply_to":"0b7d0491_bd0bf8dd","updated":"2024-04-08 21:47:48.000000000","message":"That makes sense, since it\u0027s a head req?","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7160,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7161,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7162,"context_line":""},{"line_number":7163,"context_line":"        # You should HEAD the object to verify the updated delete_at"},{"line_number":7164,"context_line":"        req \u003d Request.blank("},{"line_number":7165,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7166,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},"}],"source_content_type":"text/x-python","patch_set":43,"id":"9fd99cb4_0187f3f9","line":7163,"updated":"2024-04-05 11:25:53.000000000","message":"nit: s/should/can/","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7160,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7161,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7162,"context_line":""},{"line_number":7163,"context_line":"        # You should HEAD the object to verify the updated delete_at"},{"line_number":7164,"context_line":"        req \u003d Request.blank("},{"line_number":7165,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7166,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},"}],"source_content_type":"text/x-python","patch_set":43,"id":"e5054c0e_346689de","line":7163,"in_reply_to":"9fd99cb4_0187f3f9","updated":"2024-04-08 21:47:48.000000000","message":"Done","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7168,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7169,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7170,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7171,"context_line":"                         str(delete_at_timestamp + 70))"},{"line_number":7172,"context_line":"        # You cannot POST to an expired object with an x-open-expired header"},{"line_number":7173,"context_line":"        # if the x_delete_at value is in the past"},{"line_number":7174,"context_line":"        now +\u003d 2"}],"source_content_type":"text/x-python","patch_set":43,"id":"53a47e42_22901db8","line":7171,"updated":"2024-04-05 11:25:53.000000000","message":"nit: insert blank line as per all the other scenarios","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7168,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7169,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7170,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7171,"context_line":"                         str(delete_at_timestamp + 70))"},{"line_number":7172,"context_line":"        # You cannot POST to an expired object with an x-open-expired header"},{"line_number":7173,"context_line":"        # if the x_delete_at value is in the past"},{"line_number":7174,"context_line":"        now +\u003d 2"}],"source_content_type":"text/x-python","patch_set":43,"id":"5b83326d_076755cf","line":7171,"in_reply_to":"53a47e42_22901db8","updated":"2024-04-08 21:47:48.000000000","message":"Done","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7169,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7170,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7171,"context_line":"                         str(delete_at_timestamp + 70))"},{"line_number":7172,"context_line":"        # You cannot POST to an expired object with an x-open-expired header"},{"line_number":7173,"context_line":"        # if the x_delete_at value is in the past"},{"line_number":7174,"context_line":"        now +\u003d 2"},{"line_number":7175,"context_line":"        recreate_test_object(now)"}],"source_content_type":"text/x-python","patch_set":43,"id":"b891a5d0_6ba6ecdd","line":7172,"range":{"start_line":7172,"start_character":55,"end_line":7172,"end_character":69},"updated":"2024-04-05 11:25:53.000000000","message":"s/x-open-expired/x-backend-open-expired/","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7169,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7170,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7171,"context_line":"                         str(delete_at_timestamp + 70))"},{"line_number":7172,"context_line":"        # You cannot POST to an expired object with an x-open-expired header"},{"line_number":7173,"context_line":"        # if the x_delete_at value is in the past"},{"line_number":7174,"context_line":"        now +\u003d 2"},{"line_number":7175,"context_line":"        recreate_test_object(now)"}],"source_content_type":"text/x-python","patch_set":43,"id":"2ed83462_55b21bb0","line":7172,"range":{"start_line":7172,"start_character":55,"end_line":7172,"end_character":69},"in_reply_to":"b891a5d0_6ba6ecdd","updated":"2024-04-08 21:47:48.000000000","message":"Done","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7170,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7171,"context_line":"                         str(delete_at_timestamp + 70))"},{"line_number":7172,"context_line":"        # You cannot POST to an expired object with an x-open-expired header"},{"line_number":7173,"context_line":"        # if the x_delete_at value is in the past"},{"line_number":7174,"context_line":"        now +\u003d 2"},{"line_number":7175,"context_line":"        recreate_test_object(now)"},{"line_number":7176,"context_line":"        the_time \u003d delete_at_timestamp + 75"}],"source_content_type":"text/x-python","patch_set":43,"id":"4d503f7c_8cced537","line":7173,"updated":"2024-04-05 11:25:53.000000000","message":"this scenario confused me...I think it is asserting that the *new* x-delete-at sent with the POST cannot be in the past w.r.t. the POST x-timestamp (standard bad request) *even if x-backend-open-expired* is sent, except the test does not send x-backend-open-expired!\n\nI\u0027d find this comment more helpful:\n\n```\nYou cannot send an x-delete-at that is in the past with a POST even when x-backend-open-expired is sent.\n```","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7170,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7171,"context_line":"                         str(delete_at_timestamp + 70))"},{"line_number":7172,"context_line":"        # You cannot POST to an expired object with an x-open-expired header"},{"line_number":7173,"context_line":"        # if the x_delete_at value is in the past"},{"line_number":7174,"context_line":"        now +\u003d 2"},{"line_number":7175,"context_line":"        recreate_test_object(now)"},{"line_number":7176,"context_line":"        the_time \u003d delete_at_timestamp + 75"}],"source_content_type":"text/x-python","patch_set":43,"id":"c4a4ea90_331cfe2e","line":7173,"in_reply_to":"4d503f7c_8cced537","updated":"2024-04-08 21:47:48.000000000","message":"Agreed - I also got confused by this comment. This rewording is great and makes a lot more sense.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7177,"context_line":"        req \u003d Request.blank("},{"line_number":7178,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7179,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027POST\u0027},"},{"line_number":7180,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time),"},{"line_number":7181,"context_line":"                     \u0027x-delete-at\u0027: str(delete_at_timestamp - 50)})"},{"line_number":7182,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7183,"context_line":"        self.assertEqual(resp.status_int, 400)"}],"source_content_type":"text/x-python","patch_set":43,"id":"e4416d4d_5bc7ae8f","line":7180,"updated":"2024-04-05 11:25:53.000000000","message":"add\n\n```\n                     \u0027x-backend-open-expired\u0027: \u0027true\u0027,\n```","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7177,"context_line":"        req \u003d Request.blank("},{"line_number":7178,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7179,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027POST\u0027},"},{"line_number":7180,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time),"},{"line_number":7181,"context_line":"                     \u0027x-delete-at\u0027: str(delete_at_timestamp - 50)})"},{"line_number":7182,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7183,"context_line":"        self.assertEqual(resp.status_int, 400)"}],"source_content_type":"text/x-python","patch_set":43,"id":"d95b4b98_14b653cf","line":7180,"in_reply_to":"e4416d4d_5bc7ae8f","updated":"2024-04-08 21:47:48.000000000","message":"Agreed - looks like this was missed","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7193,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time),"},{"line_number":7194,"context_line":"                     \u0027x-delete-at\u0027: str(delete_at_timestamp + 100)})"},{"line_number":7195,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7196,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7197,"context_line":""},{"line_number":7198,"context_line":"        now +\u003d 2"},{"line_number":7199,"context_line":"        recreate_test_object(now)"}],"source_content_type":"text/x-python","patch_set":43,"id":"c74249bc_824e8a8c","line":7196,"updated":"2024-04-05 11:25:53.000000000","message":"how did this request succeed, without x-open-expired or x-backend-replication? well, I think it is because:\n\n the POST at line 7175 was at delete_at_timestamp+1, making a .meta file at delete_at_timestamp+1,\n \n  then line 7188 recreated the test object with a PUT, making a new .data file at now \u003c\u003c delete_at_timestamp,\n  \n   so the .meta file still exists at delete_at_timestamp+1 and it\u0027s x-delete-at of delete_at_timestamp+70 takes precedence\n   \n   then this request is made at delete_at_timestamp+2 and the object has not yet expired !\n   \nI think this confirms that this test has become way too long and complex, we should try to break it down to separate scenarios where we can reason more easily about the passage of time.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":false,"context_lines":[{"line_number":7193,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time),"},{"line_number":7194,"context_line":"                     \u0027x-delete-at\u0027: str(delete_at_timestamp + 100)})"},{"line_number":7195,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7196,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7197,"context_line":""},{"line_number":7198,"context_line":"        now +\u003d 2"},{"line_number":7199,"context_line":"        recreate_test_object(now)"}],"source_content_type":"text/x-python","patch_set":43,"id":"b7786a2e_ffa4846d","line":7196,"in_reply_to":"39533b21_29ed3155","updated":"2024-04-09 12:16:26.000000000","message":"Done","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":true,"context_lines":[{"line_number":7193,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time),"},{"line_number":7194,"context_line":"                     \u0027x-delete-at\u0027: str(delete_at_timestamp + 100)})"},{"line_number":7195,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7196,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7197,"context_line":""},{"line_number":7198,"context_line":"        now +\u003d 2"},{"line_number":7199,"context_line":"        recreate_test_object(now)"}],"source_content_type":"text/x-python","patch_set":43,"id":"39533b21_29ed3155","line":7196,"in_reply_to":"c74249bc_824e8a8c","updated":"2024-04-08 21:47:48.000000000","message":"I agree - this test is incredibly long and convoluted, partly because it mixes in x-backend-open-expired components with other testing. I\u0027m moving some components specific to x-backend-open-expired to another test, so that this functionality is still tested but in a different test.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7217,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7218,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7219,"context_line":""},{"line_number":7220,"context_line":"        the_time \u003d delete_at_timestamp + 103"},{"line_number":7221,"context_line":"        req \u003d Request.blank("},{"line_number":7222,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7223,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},"}],"source_content_type":"text/x-python","patch_set":43,"id":"3670342c_a8f09de9","line":7220,"updated":"2024-04-05 11:25:53.000000000","message":"I\u0027ve lost track of what the following scenarios are covering 😞","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7217,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7218,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7219,"context_line":""},{"line_number":7220,"context_line":"        the_time \u003d delete_at_timestamp + 103"},{"line_number":7221,"context_line":"        req \u003d Request.blank("},{"line_number":7222,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7223,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},"}],"source_content_type":"text/x-python","patch_set":43,"id":"0bcc65b7_7b2fd0b3","line":7220,"in_reply_to":"3670342c_a8f09de9","updated":"2024-04-08 21:47:48.000000000","message":"It looks like these scenarios were added for test x-backend-open-expired functionality, which is not required since this can be tested in the next test, so I\u0027m moving them there.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7251,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7252,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":7253,"context_line":""},{"line_number":7254,"context_line":"    def test_POST_with_x_open_expired_only(self):"},{"line_number":7255,"context_line":"        now \u003d time()"},{"line_number":7256,"context_line":"        delete_at_timestamp \u003d int(now + 100)"},{"line_number":7257,"context_line":"        delete_at_container \u003d str("}],"source_content_type":"text/x-python","patch_set":43,"id":"12905a82_d62f09a2","line":7254,"range":{"start_line":7254,"start_character":23,"end_line":7254,"end_character":37},"updated":"2024-04-05 11:25:53.000000000","message":"s/x_open_expired/x_backend_open_expired/","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7251,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7252,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":7253,"context_line":""},{"line_number":7254,"context_line":"    def test_POST_with_x_open_expired_only(self):"},{"line_number":7255,"context_line":"        now \u003d time()"},{"line_number":7256,"context_line":"        delete_at_timestamp \u003d int(now + 100)"},{"line_number":7257,"context_line":"        delete_at_container \u003d str("}],"source_content_type":"text/x-python","patch_set":43,"id":"181e03cd_c7e110c9","line":7254,"range":{"start_line":7254,"start_character":23,"end_line":7254,"end_character":37},"in_reply_to":"12905a82_d62f09a2","updated":"2024-04-08 21:47:48.000000000","message":"Done","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7263,"context_line":"            req \u003d Request.blank("},{"line_number":7264,"context_line":"                \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":7265,"context_line":"                headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(when),"},{"line_number":7266,"context_line":"                         \u0027X-Delete-At-Container\u0027: delete_at_container,"},{"line_number":7267,"context_line":"                         \u0027Content-Length\u0027: \u00274\u0027,"},{"line_number":7268,"context_line":"                         \u0027Content-Type\u0027: \u0027application/octet-stream\u0027})"},{"line_number":7269,"context_line":"            req.body \u003d \u0027TEST\u0027"}],"source_content_type":"text/x-python","patch_set":43,"id":"b9aff9a1_8a64be05","line":7266,"range":{"start_line":7266,"start_character":25,"end_line":7266,"end_character":48},"updated":"2024-04-05 11:25:53.000000000","message":"I don\u0027t think this would be included for real without an X-Delete-At header","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7263,"context_line":"            req \u003d Request.blank("},{"line_number":7264,"context_line":"                \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":7265,"context_line":"                headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(when),"},{"line_number":7266,"context_line":"                         \u0027X-Delete-At-Container\u0027: delete_at_container,"},{"line_number":7267,"context_line":"                         \u0027Content-Length\u0027: \u00274\u0027,"},{"line_number":7268,"context_line":"                         \u0027Content-Type\u0027: \u0027application/octet-stream\u0027})"},{"line_number":7269,"context_line":"            req.body \u003d \u0027TEST\u0027"}],"source_content_type":"text/x-python","patch_set":43,"id":"c1b36a1d_e49809b3","line":7266,"range":{"start_line":7266,"start_character":25,"end_line":7266,"end_character":48},"in_reply_to":"19f20943_14a90d3b","updated":"2024-04-09 17:09:49.000000000","message":"Done","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":true,"context_lines":[{"line_number":7263,"context_line":"            req \u003d Request.blank("},{"line_number":7264,"context_line":"                \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":7265,"context_line":"                headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(when),"},{"line_number":7266,"context_line":"                         \u0027X-Delete-At-Container\u0027: delete_at_container,"},{"line_number":7267,"context_line":"                         \u0027Content-Length\u0027: \u00274\u0027,"},{"line_number":7268,"context_line":"                         \u0027Content-Type\u0027: \u0027application/octet-stream\u0027})"},{"line_number":7269,"context_line":"            req.body \u003d \u0027TEST\u0027"}],"source_content_type":"text/x-python","patch_set":43,"id":"19f20943_14a90d3b","line":7266,"range":{"start_line":7266,"start_character":25,"end_line":7266,"end_character":48},"in_reply_to":"b9aff9a1_8a64be05","updated":"2024-04-08 21:47:48.000000000","message":"I think this test may have actually intended to have an X-Delete-At header. I\u0027m turning it into a test for x-backend-open-expired where there is an x-delete-at.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7270,"context_line":"            resp \u003d req.get_response(self.object_controller)"},{"line_number":7271,"context_line":"            self.assertEqual(resp.status_int, 201)"},{"line_number":7272,"context_line":""},{"line_number":7273,"context_line":"        # You can POST to a not-yet-expired object without x-delete-at"},{"line_number":7274,"context_line":"        recreate_test_object(now)"},{"line_number":7275,"context_line":"        the_time \u003d now + 1"},{"line_number":7276,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":43,"id":"50efaa2b_417e5698","line":7273,"updated":"2024-04-05 11:25:53.000000000","message":"? the object has no x-delete-at, it never expires","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":true,"context_lines":[{"line_number":7270,"context_line":"            resp \u003d req.get_response(self.object_controller)"},{"line_number":7271,"context_line":"            self.assertEqual(resp.status_int, 201)"},{"line_number":7272,"context_line":""},{"line_number":7273,"context_line":"        # You can POST to a not-yet-expired object without x-delete-at"},{"line_number":7274,"context_line":"        recreate_test_object(now)"},{"line_number":7275,"context_line":"        the_time \u003d now + 1"},{"line_number":7276,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":43,"id":"faaa5771_fe13a88a","line":7273,"in_reply_to":"50efaa2b_417e5698","updated":"2024-04-08 21:47:48.000000000","message":"Changing this, adding an x-delete-at. I think this was the originally intended behavior, and might have been missed.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7270,"context_line":"            resp \u003d req.get_response(self.object_controller)"},{"line_number":7271,"context_line":"            self.assertEqual(resp.status_int, 201)"},{"line_number":7272,"context_line":""},{"line_number":7273,"context_line":"        # You can POST to a not-yet-expired object without x-delete-at"},{"line_number":7274,"context_line":"        recreate_test_object(now)"},{"line_number":7275,"context_line":"        the_time \u003d now + 1"},{"line_number":7276,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":43,"id":"90b22a0f_21ee7d1d","line":7273,"in_reply_to":"faaa5771_fe13a88a","updated":"2024-04-09 17:09:49.000000000","message":"Done","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7281,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7282,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7283,"context_line":""},{"line_number":7284,"context_line":"        # You can POST to an expired object with a much later x-delete-at"},{"line_number":7285,"context_line":"        the_time \u003d now + 2"},{"line_number":7286,"context_line":"        req \u003d Request.blank("},{"line_number":7287,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"6b093a48_b26157cc","line":7284,"updated":"2024-04-05 11:25:53.000000000","message":"? the object hasn\u0027t expired, and the test has x-backend-open-expired FALSE","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7281,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7282,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7283,"context_line":""},{"line_number":7284,"context_line":"        # You can POST to an expired object with a much later x-delete-at"},{"line_number":7285,"context_line":"        the_time \u003d now + 2"},{"line_number":7286,"context_line":"        req \u003d Request.blank("},{"line_number":7287,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"bcef6c8c_17ea516f","line":7284,"in_reply_to":"05284498_59075307","updated":"2024-04-09 17:09:49.000000000","message":"Done","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":true,"context_lines":[{"line_number":7281,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7282,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7283,"context_line":""},{"line_number":7284,"context_line":"        # You can POST to an expired object with a much later x-delete-at"},{"line_number":7285,"context_line":"        the_time \u003d now + 2"},{"line_number":7286,"context_line":"        req \u003d Request.blank("},{"line_number":7287,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"05284498_59075307","line":7284,"in_reply_to":"6b093a48_b26157cc","updated":"2024-04-08 21:47:48.000000000","message":"Adding x-delete-at so that x-backend-open-expired is actually relevant","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7292,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7293,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7294,"context_line":""},{"line_number":7295,"context_line":"        # You restored an expired object with just a later x-delete-at"},{"line_number":7296,"context_line":"        req \u003d Request.blank("},{"line_number":7297,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7298,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"}],"source_content_type":"text/x-python","patch_set":43,"id":"c601bb56_c07a17e2","line":7295,"updated":"2024-04-05 11:25:53.000000000","message":"this test is deluded 😊","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7292,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7293,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":7294,"context_line":""},{"line_number":7295,"context_line":"        # You restored an expired object with just a later x-delete-at"},{"line_number":7296,"context_line":"        req \u003d Request.blank("},{"line_number":7297,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7298,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"}],"source_content_type":"text/x-python","patch_set":43,"id":"f156e959_472ae289","line":7295,"in_reply_to":"c601bb56_c07a17e2","updated":"2024-04-08 21:47:48.000000000","message":"Acknowledged","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7300,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7301,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7302,"context_line":"                         str(delete_at_timestamp))"},{"line_number":7303,"context_line":"        self.assertIsNone(resp.headers.get(\u0027x-backend-open-expired\u0027))"},{"line_number":7304,"context_line":""},{"line_number":7305,"context_line":"        the_time \u003d now + 2"},{"line_number":7306,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":43,"id":"26e021b4_c78c8207","line":7303,"updated":"2024-04-05 11:25:53.000000000","message":"interesting, I don\u0027t think we ever expect to see this header in a response","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":7300,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7301,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7302,"context_line":"                         str(delete_at_timestamp))"},{"line_number":7303,"context_line":"        self.assertIsNone(resp.headers.get(\u0027x-backend-open-expired\u0027))"},{"line_number":7304,"context_line":""},{"line_number":7305,"context_line":"        the_time \u003d now + 2"},{"line_number":7306,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":43,"id":"7c2d1b45_eb3b7804","line":7303,"in_reply_to":"26e021b4_c78c8207","updated":"2024-04-08 21:47:48.000000000","message":"Yes, this is strange - removing the check since it shouldn\u0027t be there.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":7320,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time)})"},{"line_number":7321,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7322,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":7323,"context_line":"        self.assertIsNone(resp.headers.get(\u0027x-delete-at\u0027))"},{"line_number":7324,"context_line":""},{"line_number":7325,"context_line":"    def test_DELETE_can_skip_updating_expirer_queue(self):"},{"line_number":7326,"context_line":"        policy \u003d POLICIES.get_by_index(0)"}],"source_content_type":"text/x-python","patch_set":43,"id":"8e1016f3_f29358a7","line":7323,"updated":"2024-04-05 11:25:53.000000000","message":"I can remove every occurrence of x-backend-open-expired from this test and it still passes :/","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":true,"context_lines":[{"line_number":7320,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time)})"},{"line_number":7321,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7322,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":7323,"context_line":"        self.assertIsNone(resp.headers.get(\u0027x-delete-at\u0027))"},{"line_number":7324,"context_line":""},{"line_number":7325,"context_line":"    def test_DELETE_can_skip_updating_expirer_queue(self):"},{"line_number":7326,"context_line":"        policy \u003d POLICIES.get_by_index(0)"}],"source_content_type":"text/x-python","patch_set":43,"id":"af735510_3de8dffe","line":7323,"in_reply_to":"8e1016f3_f29358a7","updated":"2024-04-08 21:47:48.000000000","message":"Yes, looks like this test was deluded. I am updating it so that it tests x-backend-open-expired functionality by setting an x-delete-at value.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7320,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time)})"},{"line_number":7321,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7322,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":7323,"context_line":"        self.assertIsNone(resp.headers.get(\u0027x-delete-at\u0027))"},{"line_number":7324,"context_line":""},{"line_number":7325,"context_line":"    def test_DELETE_can_skip_updating_expirer_queue(self):"},{"line_number":7326,"context_line":"        policy \u003d POLICIES.get_by_index(0)"}],"source_content_type":"text/x-python","patch_set":43,"id":"ad40498f_4a769f81","line":7323,"in_reply_to":"af735510_3de8dffe","updated":"2024-04-09 17:09:49.000000000","message":"Done","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":true,"context_lines":[{"line_number":7073,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp("},{"line_number":7074,"context_line":"                delete_at_timestamp + 2), \u0027x-backend-open-expired\u0027: \u0027true\u0027})"},{"line_number":7075,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7076,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7077,"context_line":""},{"line_number":7078,"context_line":"    def test_POST_but_expired(self):"},{"line_number":7079,"context_line":"        # We have an object that expires in the future"}],"source_content_type":"text/x-python","patch_set":44,"id":"27a233cd_9408197e","line":7076,"updated":"2024-04-09 12:16:26.000000000","message":"we also need to test the X-Backend-Replication case here for HEADs\n\n```\n        # It should be accessible with x-backend-replication\n        req \u003d Request.blank(\n            \u0027/sda1/p/a/c/o\u0027,\n            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},\n            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(\n                delete_at_timestamp + 2), \u0027x-backend-replication\u0027: \u0027true\u0027})\n        resp \u003d req.get_response(self.object_controller)\n        self.assertEqual(resp.status_int, 200)\n        self.assertEqual(b\u0027\u0027, resp.body)\n```","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7073,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp("},{"line_number":7074,"context_line":"                delete_at_timestamp + 2), \u0027x-backend-open-expired\u0027: \u0027true\u0027})"},{"line_number":7075,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7076,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7077,"context_line":""},{"line_number":7078,"context_line":"    def test_POST_but_expired(self):"},{"line_number":7079,"context_line":"        # We have an object that expires in the future"}],"source_content_type":"text/x-python","patch_set":44,"id":"f00916e3_13e1f359","line":7076,"in_reply_to":"27a233cd_9408197e","updated":"2024-04-09 17:09:49.000000000","message":"Acknowledged","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":true,"context_lines":[{"line_number":7114,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time),"},{"line_number":7115,"context_line":"                     \u0027X-Delete-At\u0027: str(delete_at_timestamp)})"},{"line_number":7116,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7117,"context_line":"        self.assertEqual(resp.status_int, 400)"},{"line_number":7118,"context_line":""},{"line_number":7119,"context_line":"        # It should be accessible with x-backend-open-expired"},{"line_number":7120,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":44,"id":"a8966f71_f5586065","line":7117,"range":{"start_line":7117,"start_character":42,"end_line":7117,"end_character":45},"updated":"2024-04-09 12:16:26.000000000","message":"400 is because the x-delete-at \u003c x-timestamp. We should expect a 404 when testing \"it\u0027s not accessible\" - either increase or delete the x-delete-at and change expected status_int to 404","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7114,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time),"},{"line_number":7115,"context_line":"                     \u0027X-Delete-At\u0027: str(delete_at_timestamp)})"},{"line_number":7116,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7117,"context_line":"        self.assertEqual(resp.status_int, 400)"},{"line_number":7118,"context_line":""},{"line_number":7119,"context_line":"        # It should be accessible with x-backend-open-expired"},{"line_number":7120,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":44,"id":"e45ba898_af488e58","line":7117,"range":{"start_line":7117,"start_character":42,"end_line":7117,"end_character":45},"in_reply_to":"a8966f71_f5586065","updated":"2024-04-09 17:09:49.000000000","message":"I see! That makes sense, updating.","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":true,"context_lines":[{"line_number":7125,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7126,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7127,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7128,"context_line":"                         str(delete_at_timestamp))"},{"line_number":7129,"context_line":""},{"line_number":7130,"context_line":"    def test_update_x_delete_at(self):"},{"line_number":7131,"context_line":"        now \u003d time()"}],"source_content_type":"text/x-python","patch_set":44,"id":"290b28cc_87a00e07","line":7128,"updated":"2024-04-09 12:16:26.000000000","message":"ok, this test is easier to grok: POST works before x-delete-at, POST fails after x-delete-at.\n\nThe final check using HEAD with x-backend-open-expired is probably unnecessary but does no harm.","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7125,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7126,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7127,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7128,"context_line":"                         str(delete_at_timestamp))"},{"line_number":7129,"context_line":""},{"line_number":7130,"context_line":"    def test_update_x_delete_at(self):"},{"line_number":7131,"context_line":"        now \u003d time()"}],"source_content_type":"text/x-python","patch_set":44,"id":"c9e6ff56_7e99e420","line":7128,"in_reply_to":"290b28cc_87a00e07","updated":"2024-04-09 17:09:49.000000000","message":"Acknowledged","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":true,"context_lines":[{"line_number":7127,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7128,"context_line":"                         str(delete_at_timestamp))"},{"line_number":7129,"context_line":""},{"line_number":7130,"context_line":"    def test_update_x_delete_at(self):"},{"line_number":7131,"context_line":"        now \u003d time()"},{"line_number":7132,"context_line":"        delete_at_timestamp \u003d int(now + 100)"},{"line_number":7133,"context_line":"        delete_at_container \u003d str("}],"source_content_type":"text/x-python","patch_set":44,"id":"1a7951cb_8e526603","line":7130,"updated":"2024-04-09 12:16:26.000000000","message":"nit: this is similar to test_POST_with_x_backend_replication, except uses x-backend-open-expired - might be worth getting the names consistent i.e. test_POST_with_x_backend_open_expired","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7127,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7128,"context_line":"                         str(delete_at_timestamp))"},{"line_number":7129,"context_line":""},{"line_number":7130,"context_line":"    def test_update_x_delete_at(self):"},{"line_number":7131,"context_line":"        now \u003d time()"},{"line_number":7132,"context_line":"        delete_at_timestamp \u003d int(now + 100)"},{"line_number":7133,"context_line":"        delete_at_container \u003d str("}],"source_content_type":"text/x-python","patch_set":44,"id":"3ea24064_c05b7d43","line":7130,"in_reply_to":"1a7951cb_8e526603","updated":"2024-04-09 17:09:49.000000000","message":"Done","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":true,"context_lines":[{"line_number":7129,"context_line":""},{"line_number":7130,"context_line":"    def test_update_x_delete_at(self):"},{"line_number":7131,"context_line":"        now \u003d time()"},{"line_number":7132,"context_line":"        delete_at_timestamp \u003d int(now + 100)"},{"line_number":7133,"context_line":"        delete_at_container \u003d str("},{"line_number":7134,"context_line":"            delete_at_timestamp /"},{"line_number":7135,"context_line":"            self.object_controller.expiring_objects_container_divisor *"}],"source_content_type":"text/x-python","patch_set":44,"id":"75d144d6_32da445c","line":7132,"range":{"start_line":7132,"start_character":8,"end_line":7132,"end_character":27},"updated":"2024-04-09 12:16:26.000000000","message":"nit: might be clearer if named `original_delete_at`","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7129,"context_line":""},{"line_number":7130,"context_line":"    def test_update_x_delete_at(self):"},{"line_number":7131,"context_line":"        now \u003d time()"},{"line_number":7132,"context_line":"        delete_at_timestamp \u003d int(now + 100)"},{"line_number":7133,"context_line":"        delete_at_container \u003d str("},{"line_number":7134,"context_line":"            delete_at_timestamp /"},{"line_number":7135,"context_line":"            self.object_controller.expiring_objects_container_divisor *"}],"source_content_type":"text/x-python","patch_set":44,"id":"51b66456_40dcf1f1","line":7132,"range":{"start_line":7132,"start_character":8,"end_line":7132,"end_character":27},"in_reply_to":"75d144d6_32da445c","updated":"2024-04-09 17:09:49.000000000","message":"Done","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":true,"context_lines":[{"line_number":7155,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7156,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027POST\u0027},"},{"line_number":7157,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time),"},{"line_number":7158,"context_line":"                     \u0027x-delete-at\u0027: later_delete_at,"},{"line_number":7159,"context_line":"                     \u0027x-backend-open-expired\u0027: \u0027true\u0027})"},{"line_number":7160,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7161,"context_line":"        self.assertEqual(resp.status_int, 202)"}],"source_content_type":"text/x-python","patch_set":44,"id":"ae4866b5_902dd551","line":7158,"range":{"start_line":7158,"start_character":36,"end_line":7158,"end_character":51},"updated":"2024-04-09 12:16:26.000000000","message":"should be a string, i.e. str(later_delete_at)","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7155,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7156,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027POST\u0027},"},{"line_number":7157,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(the_time),"},{"line_number":7158,"context_line":"                     \u0027x-delete-at\u0027: later_delete_at,"},{"line_number":7159,"context_line":"                     \u0027x-backend-open-expired\u0027: \u0027true\u0027})"},{"line_number":7160,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7161,"context_line":"        self.assertEqual(resp.status_int, 202)"}],"source_content_type":"text/x-python","patch_set":44,"id":"1e405b10_f6a7c76e","line":7158,"range":{"start_line":7158,"start_character":36,"end_line":7158,"end_character":51},"in_reply_to":"ae4866b5_902dd551","updated":"2024-04-09 17:09:49.000000000","message":"Done","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":true,"context_lines":[{"line_number":7174,"context_line":""},{"line_number":7175,"context_line":"        # Verify object has expired"},{"line_number":7176,"context_line":"        # We have no x-delete-at in response"},{"line_number":7177,"context_line":"        the_time \u003d now + 300"},{"line_number":7178,"context_line":"        req \u003d Request.blank("},{"line_number":7179,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7180,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},"}],"source_content_type":"text/x-python","patch_set":44,"id":"6db5bd38_b76fdff1","line":7177,"updated":"2024-04-09 12:16:26.000000000","message":"nit: might be clearer as ``the_time \u003d later_delete_at + 1``\n\nor use the same var naming as test_POST_with_x_backend_replication i.e. delete_at_timestamp and new_delete_at_timestamp\n\nIn fact. might be good if that test was adjacent to this one - move the invalid headers test down in file","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7174,"context_line":""},{"line_number":7175,"context_line":"        # Verify object has expired"},{"line_number":7176,"context_line":"        # We have no x-delete-at in response"},{"line_number":7177,"context_line":"        the_time \u003d now + 300"},{"line_number":7178,"context_line":"        req \u003d Request.blank("},{"line_number":7179,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":7180,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027},"}],"source_content_type":"text/x-python","patch_set":44,"id":"bf3a72b4_88ddbbe2","line":7177,"in_reply_to":"6db5bd38_b76fdff1","updated":"2024-04-09 17:09:49.000000000","message":"Got it, making them adjacent + using the same naming convention","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":true,"context_lines":[{"line_number":7193,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7194,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7195,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7196,"context_line":"                         str(later_delete_at))"},{"line_number":7197,"context_line":""},{"line_number":7198,"context_line":"    def test_POST_invalid_headers(self):"},{"line_number":7199,"context_line":"        now \u003d time()"}],"source_content_type":"text/x-python","patch_set":44,"id":"15bc43c2_07a58a2a","line":7196,"updated":"2024-04-09 12:16:26.000000000","message":"Great! Also easier to grok and better targeted: POST after x-delete-at DOES work with x-backend-open-expired, the POST DOES extend the expiry time.","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7193,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7194,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":7195,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7196,"context_line":"                         str(later_delete_at))"},{"line_number":7197,"context_line":""},{"line_number":7198,"context_line":"    def test_POST_invalid_headers(self):"},{"line_number":7199,"context_line":"        now \u003d time()"}],"source_content_type":"text/x-python","patch_set":44,"id":"379ab3da_9049dbc0","line":7196,"in_reply_to":"15bc43c2_07a58a2a","updated":"2024-04-09 17:09:49.000000000","message":"Acknowledged","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":true,"context_lines":[{"line_number":7195,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7196,"context_line":"                         str(later_delete_at))"},{"line_number":7197,"context_line":""},{"line_number":7198,"context_line":"    def test_POST_invalid_headers(self):"},{"line_number":7199,"context_line":"        now \u003d time()"},{"line_number":7200,"context_line":"        delete_at_timestamp \u003d int(now + 100)"},{"line_number":7201,"context_line":"        delete_at_container \u003d str("}],"source_content_type":"text/x-python","patch_set":44,"id":"ec47169a_e2029264","line":7198,"updated":"2024-04-09 12:16:26.000000000","message":"good thinking to put the negative tests into their own method","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7195,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7196,"context_line":"                         str(later_delete_at))"},{"line_number":7197,"context_line":""},{"line_number":7198,"context_line":"    def test_POST_invalid_headers(self):"},{"line_number":7199,"context_line":"        now \u003d time()"},{"line_number":7200,"context_line":"        delete_at_timestamp \u003d int(now + 100)"},{"line_number":7201,"context_line":"        delete_at_container \u003d str("}],"source_content_type":"text/x-python","patch_set":44,"id":"631eb132_6a916e96","line":7198,"in_reply_to":"ec47169a_e2029264","updated":"2024-04-09 17:09:49.000000000","message":"Acknowledged","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":true,"context_lines":[{"line_number":7225,"context_line":"                     \u0027x-backend-open-expired\u0027: \u0027true\u0027,"},{"line_number":7226,"context_line":"                     \u0027x-delete-at\u0027: str(delete_at_timestamp - 50)})"},{"line_number":7227,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7228,"context_line":"        self.assertEqual(resp.status_int, 400)"},{"line_number":7229,"context_line":""},{"line_number":7230,"context_line":"        # Object server always ignores x-open-expired and"},{"line_number":7231,"context_line":"        # only understands x-backend-open-expired on expired objects"}],"source_content_type":"text/x-python","patch_set":44,"id":"4c206e72_0c790112","line":7228,"range":{"start_line":7228,"start_character":42,"end_line":7228,"end_character":45},"updated":"2024-04-09 12:16:26.000000000","message":"this is correct - x-delete-at in the past is a 400 Bad Request","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7225,"context_line":"                     \u0027x-backend-open-expired\u0027: \u0027true\u0027,"},{"line_number":7226,"context_line":"                     \u0027x-delete-at\u0027: str(delete_at_timestamp - 50)})"},{"line_number":7227,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7228,"context_line":"        self.assertEqual(resp.status_int, 400)"},{"line_number":7229,"context_line":""},{"line_number":7230,"context_line":"        # Object server always ignores x-open-expired and"},{"line_number":7231,"context_line":"        # only understands x-backend-open-expired on expired objects"}],"source_content_type":"text/x-python","patch_set":44,"id":"ebefbeb5_ce346c9f","line":7228,"range":{"start_line":7228,"start_character":42,"end_line":7228,"end_character":45},"in_reply_to":"4c206e72_0c790112","updated":"2024-04-09 17:09:49.000000000","message":"Acknowledged","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":true,"context_lines":[{"line_number":7237,"context_line":"                     \u0027x-open-expired\u0027: \u0027true\u0027,"},{"line_number":7238,"context_line":"                     \u0027x-delete-at\u0027: str(delete_at_timestamp)})"},{"line_number":7239,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7240,"context_line":"        self.assertEqual(resp.status_int, 400)"},{"line_number":7241,"context_line":""},{"line_number":7242,"context_line":"    def test_POST_with_x_backend_replication(self):"},{"line_number":7243,"context_line":"        now \u003d time()"}],"source_content_type":"text/x-python","patch_set":44,"id":"54cd7a74_920454a9","line":7240,"updated":"2024-04-09 12:16:26.000000000","message":"I\u0027m glad we now have this use of x-open-expired covered, but 400 is not correct here - we should expect a 404. What is actually happening is that x-delete-at \u003c x-timestamp, like the first scenario, and so the response is 400 (try changing x-open-expired to x-backend-open-expired - it is still 400).\n\nSo x-delete-at needs to be \u003e x-timestamp and assert a 404 status_int","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":7237,"context_line":"                     \u0027x-open-expired\u0027: \u0027true\u0027,"},{"line_number":7238,"context_line":"                     \u0027x-delete-at\u0027: str(delete_at_timestamp)})"},{"line_number":7239,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7240,"context_line":"        self.assertEqual(resp.status_int, 400)"},{"line_number":7241,"context_line":""},{"line_number":7242,"context_line":"    def test_POST_with_x_backend_replication(self):"},{"line_number":7243,"context_line":"        now \u003d time()"}],"source_content_type":"text/x-python","patch_set":44,"id":"f0171989_0eda19cc","line":7240,"in_reply_to":"54cd7a74_920454a9","updated":"2024-04-09 17:09:49.000000000","message":"Got it, this makes sense. Updating it!","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"616db680566770b17c1bdf0514d7843621af09c9","unresolved":false,"context_lines":[{"line_number":7205,"context_line":"        self.assertEqual(resp.headers.get(\u0027x-delete-at\u0027),"},{"line_number":7206,"context_line":"                         str(new_delete_at_timestamp))"},{"line_number":7207,"context_line":""},{"line_number":7208,"context_line":"    def test_POST_with_x_backend_replication(self):"},{"line_number":7209,"context_line":"        now \u003d time()"},{"line_number":7210,"context_line":"        delete_at_timestamp \u003d int(now + 100)"},{"line_number":7211,"context_line":"        delete_at_container \u003d str("}],"source_content_type":"text/x-python","patch_set":49,"id":"7f110be3_811b2fe3","line":7208,"updated":"2024-04-16 12:46:28.000000000","message":"Nice to include this scenario as well","commit_id":"efb0f08ddd5253c84691c62927bb1e4a4d55f872"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1bdcebd733613f6de075a64c5e9272abf44de452","unresolved":false,"context_lines":[{"line_number":7011,"context_line":"        # ...unless X-Backend-Replication is sent"},{"line_number":7012,"context_line":"        expected \u003d {"},{"line_number":7013,"context_line":"            \u0027GET\u0027: b\u0027TEST\u0027,"},{"line_number":7014,"context_line":"            \u0027HEAD\u0027: b\u0027\u0027,"},{"line_number":7015,"context_line":"        }"},{"line_number":7016,"context_line":"        for meth, expected_body in expected.items():"},{"line_number":7017,"context_line":"            req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":51,"id":"8b5b50c6_411d5bdb","side":"PARENT","line":7014,"range":{"start_line":7014,"start_character":12,"end_line":7014,"end_character":24},"updated":"2024-04-22 19:26:39.000000000","message":"I was nervous for a moment, but then I saw this is now covered in `test_HEAD_but_expired` 😅","commit_id":"6f7afa83927ea9fb4d06a255112616c5bf9e51df"}],"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a7601bb6c400919ac72780e7dbc967fcf309a939","unresolved":true,"context_lines":[{"line_number":789,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":790,"context_line":"        for r in fake_conn.requests:"},{"line_number":791,"context_line":"            self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027true\u0027)"},{"line_number":792,"context_line":"            self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"},{"line_number":793,"context_line":""},{"line_number":794,"context_line":"    def test_HEAD_simple(self):"},{"line_number":795,"context_line":"        req \u003d swift.common.swob.Request.blank(\u0027/v1/a/c/o\u0027, method\u003d\u0027HEAD\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"842cdd38_596a68fa","line":792,"updated":"2023-03-20 23:22:54.000000000","message":"i should have tested DELETE as well","commit_id":"b23a6195f11651a7c1b7923d68b4613317b973c8"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"8929f26021a671ca7006ce506445bbce707cd053","unresolved":false,"context_lines":[{"line_number":789,"context_line":"        self.assertEqual(resp.status_int, 202)"},{"line_number":790,"context_line":"        for r in fake_conn.requests:"},{"line_number":791,"context_line":"            self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027true\u0027)"},{"line_number":792,"context_line":"            self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"},{"line_number":793,"context_line":""},{"line_number":794,"context_line":"    def test_HEAD_simple(self):"},{"line_number":795,"context_line":"        req \u003d swift.common.swob.Request.blank(\u0027/v1/a/c/o\u0027, method\u003d\u0027HEAD\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"30a12524_eeaa785e","line":792,"in_reply_to":"842cdd38_596a68fa","updated":"2023-08-17 16:15:24.000000000","message":"Ack","commit_id":"b23a6195f11651a7c1b7923d68b4613317b973c8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":841,"context_line":"            requests \u003d self._test_x_open_expired("},{"line_number":842,"context_line":"                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027true\u0027})"},{"line_number":843,"context_line":"            for r in requests:"},{"line_number":844,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027true\u0027)"},{"line_number":845,"context_line":"                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"},{"line_number":846,"context_line":""},{"line_number":847,"context_line":"            requests \u003d self._test_x_open_expired("}],"source_content_type":"text/x-python","patch_set":43,"id":"4ba16782_9f964565","line":844,"updated":"2024-04-05 11:25:53.000000000","message":"oh, so we do allow the x-open-expired through to the backend server - there should therefore be a test in obj/test_server.py that verifies that x-open-expired is always ignored by the object server - I\u0027m not sure I have seen that","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":false,"context_lines":[{"line_number":841,"context_line":"            requests \u003d self._test_x_open_expired("},{"line_number":842,"context_line":"                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027true\u0027})"},{"line_number":843,"context_line":"            for r in requests:"},{"line_number":844,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027true\u0027)"},{"line_number":845,"context_line":"                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"},{"line_number":846,"context_line":""},{"line_number":847,"context_line":"            requests \u003d self._test_x_open_expired("}],"source_content_type":"text/x-python","patch_set":43,"id":"ece7c6cf_b07b03e6","line":844,"in_reply_to":"4ba16782_9f964565","updated":"2024-04-09 12:16:26.000000000","message":"Done","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":850,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027false\u0027)"},{"line_number":851,"context_line":"                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"        # we don\u0027t support x-open-expired on PUT"},{"line_number":854,"context_line":"        req \u003d swift.common.swob.Request.blank("},{"line_number":855,"context_line":"            \u0027/v1/a/c/o\u0027, method\u003d\u0027PUT\u0027, headers\u003d{"},{"line_number":856,"context_line":"                \u0027Content-Length\u0027: \u00270\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"15db253f_6553f81e","line":853,"updated":"2024-04-05 11:25:53.000000000","message":"I feel like this scenario would be more relevant when enable_open_expired is true","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":850,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027false\u0027)"},{"line_number":851,"context_line":"                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"        # we don\u0027t support x-open-expired on PUT"},{"line_number":854,"context_line":"        req \u003d swift.common.swob.Request.blank("},{"line_number":855,"context_line":"            \u0027/v1/a/c/o\u0027, method\u003d\u0027PUT\u0027, headers\u003d{"},{"line_number":856,"context_line":"                \u0027Content-Length\u0027: \u00270\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"ef98b4e1_c961ea7a","line":853,"in_reply_to":"15db253f_6553f81e","updated":"2024-04-08 21:47:48.000000000","message":"This is true - we should verify that PUT requests don\u0027t work when enable_open_expired is true, so I\u0027m moving this over.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":893,"context_line":"                # to true, then we set x-backend-open-expired to true"},{"line_number":894,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027true\u0027)"},{"line_number":895,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Backend-Open-Expired\u0027],"},{"line_number":896,"context_line":"                                 \u0027true\u0027)"},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"        # Disable open expired"},{"line_number":899,"context_line":"        conf \u003d {\u0027enable_open_expired\u0027: \u0027false\u0027}"}],"source_content_type":"text/x-python","patch_set":43,"id":"34227d2d_6e584517","line":896,"updated":"2024-04-05 11:25:53.000000000","message":"there should also be a check that when x-open-expired is False, x-backend-open-expired is also false (or not in the headers)\n\nupdate: covered at line 2428 in test_POST_delete_at_with_x_open_expired","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":893,"context_line":"                # to true, then we set x-backend-open-expired to true"},{"line_number":894,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027true\u0027)"},{"line_number":895,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Backend-Open-Expired\u0027],"},{"line_number":896,"context_line":"                                 \u0027true\u0027)"},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"        # Disable open expired"},{"line_number":899,"context_line":"        conf \u003d {\u0027enable_open_expired\u0027: \u0027false\u0027}"}],"source_content_type":"text/x-python","patch_set":43,"id":"ef913fee_ef76736a","line":896,"in_reply_to":"34227d2d_6e584517","updated":"2024-04-08 21:47:48.000000000","message":"Acknowledged","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a07c99e83566502598fe00a25533ad976b8321ad","unresolved":true,"context_lines":[{"line_number":917,"context_line":"                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027true\u0027})"},{"line_number":918,"context_line":"            for r in requests:"},{"line_number":919,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027true\u0027)"},{"line_number":920,"context_line":"                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"    def test_HEAD_simple(self):"},{"line_number":923,"context_line":"        req \u003d swift.common.swob.Request.blank(\u0027/v1/a/c/o\u0027, method\u003d\u0027HEAD\u0027)"}],"source_content_type":"text/x-python","patch_set":43,"id":"1b7a480a_b83115ea","line":920,"updated":"2024-04-05 11:25:53.000000000","message":"PUT should be covered","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"8b31bbcff7c4b9f0e5b1876931c1c79c5f68dd69","unresolved":false,"context_lines":[{"line_number":917,"context_line":"                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027true\u0027})"},{"line_number":918,"context_line":"            for r in requests:"},{"line_number":919,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027true\u0027)"},{"line_number":920,"context_line":"                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"    def test_HEAD_simple(self):"},{"line_number":923,"context_line":"        req \u003d swift.common.swob.Request.blank(\u0027/v1/a/c/o\u0027, method\u003d\u0027HEAD\u0027)"}],"source_content_type":"text/x-python","patch_set":43,"id":"0087a742_27cf861b","line":920,"in_reply_to":"1b7a480a_b83115ea","updated":"2024-04-08 21:47:48.000000000","message":"Made a helper function to test that PUT is unsupported in both cases.","commit_id":"32db8ac2a3abaa05d0d18b1902e0ef1d31068163"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01a0224639ba1908b78d8155fa58127ca62e236f","unresolved":true,"context_lines":[{"line_number":894,"context_line":"                # to true, then we set x-backend-open-expired to true"},{"line_number":895,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027true\u0027)"},{"line_number":896,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Backend-Open-Expired\u0027],"},{"line_number":897,"context_line":"                                 \u0027true\u0027)"},{"line_number":898,"context_line":""},{"line_number":899,"context_line":"        # we don\u0027t support x-open-expired on PUT when enable_open_expired"},{"line_number":900,"context_line":"        test_put_unsupported()"}],"source_content_type":"text/x-python","patch_set":44,"id":"a63d6c24_8dc166c7","line":897,"updated":"2024-04-09 12:16:26.000000000","message":"we should also check that x-open-expired\u003dfalse is translated to x-backend-open-expired\u003dfalse:\n\n```\n        for method, num_reqs in (\n                (\u0027GET\u0027,\n                 self.obj_ring.replicas + self.obj_ring.max_more_nodes),\n                (\u0027HEAD\u0027,\n                 self.obj_ring.replicas + self.obj_ring.max_more_nodes),\n                (\u0027POST\u0027, self.obj_ring.replicas)):\n            requests \u003d self._test_x_open_expired(\n                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027false\u0027})\n            for r in requests:\n                # If the proxy server config is has enable_open_expired set\n                # to true, then we set x-backend-open-expired to true\n                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027false\u0027)\n                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])\n\n```","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"869d3d2d5d5e515e420399795c8842ea6e65c98a","unresolved":false,"context_lines":[{"line_number":894,"context_line":"                # to true, then we set x-backend-open-expired to true"},{"line_number":895,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027true\u0027)"},{"line_number":896,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Backend-Open-Expired\u0027],"},{"line_number":897,"context_line":"                                 \u0027true\u0027)"},{"line_number":898,"context_line":""},{"line_number":899,"context_line":"        # we don\u0027t support x-open-expired on PUT when enable_open_expired"},{"line_number":900,"context_line":"        test_put_unsupported()"}],"source_content_type":"text/x-python","patch_set":44,"id":"eb528a7a_c68c3b52","line":897,"in_reply_to":"a63d6c24_8dc166c7","updated":"2024-04-09 17:09:49.000000000","message":"Done","commit_id":"3d33d11f20c5f78a08b81a50f08cf02895c58274"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c0327644ec38a0ce70ea4c2e7d75fee64fb88fd4","unresolved":true,"context_lines":[{"line_number":906,"context_line":"                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027false\u0027})"},{"line_number":907,"context_line":"            for r in requests:"},{"line_number":908,"context_line":"                # If the proxy server config is has enable_open_expired set"},{"line_number":909,"context_line":"                # to true, then we set x-backend-open-expired to true"},{"line_number":910,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027false\u0027)"},{"line_number":911,"context_line":"                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"},{"line_number":912,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"4a1b62ac_2af174e9","line":909,"updated":"2024-04-10 10:42:32.000000000","message":"the comment is wrong :/","commit_id":"04287753d4ad42b70bee47be4db8c04a5975f7ae"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"657e5b870fb74f7a654388696a7f034e8740a5c6","unresolved":false,"context_lines":[{"line_number":906,"context_line":"                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027false\u0027})"},{"line_number":907,"context_line":"            for r in requests:"},{"line_number":908,"context_line":"                # If the proxy server config is has enable_open_expired set"},{"line_number":909,"context_line":"                # to true, then we set x-backend-open-expired to true"},{"line_number":910,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027false\u0027)"},{"line_number":911,"context_line":"                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"},{"line_number":912,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"933231ad_896acc17","line":909,"in_reply_to":"4a1b62ac_2af174e9","updated":"2024-04-10 16:51:00.000000000","message":"Fixed, thanks for pointing this out","commit_id":"04287753d4ad42b70bee47be4db8c04a5975f7ae"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"edb8242995ea695fc30e9bc8b0245dacf20ab87f","unresolved":true,"context_lines":[{"line_number":905,"context_line":"            requests \u003d self._test_x_open_expired("},{"line_number":906,"context_line":"                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027false\u0027})"},{"line_number":907,"context_line":"            for r in requests:"},{"line_number":908,"context_line":"                # If the proxy server config is has enable_open_expired set"},{"line_number":909,"context_line":"                # to false, then we set x-backend-open-expired to false"},{"line_number":910,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027false\u0027)"},{"line_number":911,"context_line":"                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"}],"source_content_type":"text/x-python","patch_set":48,"id":"d1cbf24d_0d9b8cdc","line":908,"range":{"start_line":908,"start_character":45,"end_line":908,"end_character":51},"updated":"2024-04-12 08:35:20.000000000","message":"typo","commit_id":"f84e42df73bb041b52c8e394024e9121586b1b69"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"3d45d6acb5891426a0dd54699a14d3b8ee6ee3d0","unresolved":false,"context_lines":[{"line_number":905,"context_line":"            requests \u003d self._test_x_open_expired("},{"line_number":906,"context_line":"                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027false\u0027})"},{"line_number":907,"context_line":"            for r in requests:"},{"line_number":908,"context_line":"                # If the proxy server config is has enable_open_expired set"},{"line_number":909,"context_line":"                # to false, then we set x-backend-open-expired to false"},{"line_number":910,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027false\u0027)"},{"line_number":911,"context_line":"                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"}],"source_content_type":"text/x-python","patch_set":48,"id":"412b3457_39428c3b","line":908,"range":{"start_line":908,"start_character":45,"end_line":908,"end_character":51},"in_reply_to":"d1cbf24d_0d9b8cdc","updated":"2024-04-15 04:13:42.000000000","message":"Done","commit_id":"f84e42df73bb041b52c8e394024e9121586b1b69"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"616db680566770b17c1bdf0514d7843621af09c9","unresolved":false,"context_lines":[{"line_number":852,"context_line":""},{"line_number":853,"context_line":"    def test_x_open_expired_custom_config(self):"},{"line_number":854,"context_line":"        # helper to check that PUT is not supported in all cases"},{"line_number":855,"context_line":"        def test_put_unsupported():"},{"line_number":856,"context_line":"            req \u003d swift.common.swob.Request.blank("},{"line_number":857,"context_line":"                \u0027/v1/a/c/o\u0027, method\u003d\u0027PUT\u0027, headers\u003d{"},{"line_number":858,"context_line":"                    \u0027Content-Length\u0027: \u00270\u0027,"}],"source_content_type":"text/x-python","patch_set":49,"id":"0e9f36e2_2fd17df7","line":855,"updated":"2024-04-16 12:46:28.000000000","message":"We only have `GET`, `HEAD` and `POST`, so nice to reflect we don\u0027t support PUTs","commit_id":"efb0f08ddd5253c84691c62927bb1e4a4d55f872"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1bdcebd733613f6de075a64c5e9272abf44de452","unresolved":true,"context_lines":[{"line_number":2438,"context_line":"        self.app.container_info \u003d dict(self.container_info)"},{"line_number":2439,"context_line":"        self.obj_ring \u003d self.app.get_object_ring(int(self.policy))"},{"line_number":2440,"context_line":""},{"line_number":2441,"context_line":"        post_headers \u003d []"},{"line_number":2442,"context_line":"        do_post({})"},{"line_number":2443,"context_line":"        for given_headers in post_headers:"},{"line_number":2444,"context_line":"            self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, given_headers)"},{"line_number":2445,"context_line":""},{"line_number":2446,"context_line":"        post_headers \u003d []"}],"source_content_type":"text/x-python","patch_set":51,"id":"b73e89cb_9557b1b0","line":2443,"range":{"start_line":2441,"start_character":8,"end_line":2443,"end_character":42},"updated":"2024-04-22 19:26:39.000000000","message":"It took me longer than I should admit to understand why this loop would ever actually execute.","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6b45a60bbf6ae8d1d06fd3a77867e4b969f0e207","unresolved":true,"context_lines":[{"line_number":2438,"context_line":"        self.app.container_info \u003d dict(self.container_info)"},{"line_number":2439,"context_line":"        self.obj_ring \u003d self.app.get_object_ring(int(self.policy))"},{"line_number":2440,"context_line":""},{"line_number":2441,"context_line":"        post_headers \u003d []"},{"line_number":2442,"context_line":"        do_post({})"},{"line_number":2443,"context_line":"        for given_headers in post_headers:"},{"line_number":2444,"context_line":"            self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, given_headers)"},{"line_number":2445,"context_line":""},{"line_number":2446,"context_line":"        post_headers \u003d []"}],"source_content_type":"text/x-python","patch_set":51,"id":"78049906_c9e198fc","line":2443,"range":{"start_line":2441,"start_character":8,"end_line":2443,"end_character":42},"in_reply_to":"b73e89cb_9557b1b0","updated":"2024-04-23 03:01:09.000000000","message":"hahah, this comment made me double take as well - it\u0027s because post_headers is updated in capture_headers\n\nit\u0027s quite subtle but we assert in do_post that `len(post_headers) \u003d\u003d obj_ring.replicas` so it\u0027s safe to assume these asserts *are* getting executed.  but you have to hold a couple of layers of abstraction in your header to understand this test; I typically encourage saving of our clever-ness for the implementation and making tests as boring and wrote as possible: DAMP not DRY","commit_id":"9c44f5b5da11e97e4996b6f34e23ba3d1f60990e"}]}
