)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"976fbd17916c4c0ba3241f12c07c78583cd6e572","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"add enable open expired in proxy config"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This is an addition to the exploding objects patch that creates a"},{"line_number":10,"context_line":"global configuration option in the proxy server\u0027s configuration."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"If the enable_open_expired flag is set to true in the config,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ffc3294b_d1d7c6cd","line":9,"updated":"2024-02-15 17:32:37.000000000","message":"the previous patch would probably be refered to as \"open expired\"","commit_id":"f3db26ca214378f6067684effb586e538d24a959"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"add enable open expired in proxy config"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This is an addition to the exploding objects patch that creates a"},{"line_number":10,"context_line":"global configuration option in the proxy server\u0027s configuration."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"If the enable_open_expired flag is set to true in the config,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"b0615472_5f79f22c","line":9,"in_reply_to":"ffc3294b_d1d7c6cd","updated":"2024-02-23 19:47:37.000000000","message":"Done","commit_id":"f3db26ca214378f6067684effb586e538d24a959"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"976fbd17916c4c0ba3241f12c07c78583cd6e572","unresolved":true,"context_lines":[{"line_number":7,"context_line":"add enable open expired in proxy config"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This is an addition to the exploding objects patch that creates a"},{"line_number":10,"context_line":"global configuration option in the proxy server\u0027s configuration."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"If the enable_open_expired flag is set to true in the config,"},{"line_number":13,"context_line":"then the client will be able to make a request with the header"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"87696c72_f52bacf1","line":10,"updated":"2024-02-15 17:32:37.000000000","message":"it\u0027s confusing, it\u0027s THIS patch that creates a global configuration - not the previous patch","commit_id":"f3db26ca214378f6067684effb586e538d24a959"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":false,"context_lines":[{"line_number":7,"context_line":"add enable open expired in proxy config"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This is an addition to the exploding objects patch that creates a"},{"line_number":10,"context_line":"global configuration option in the proxy server\u0027s configuration."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"If the enable_open_expired flag is set to true in the config,"},{"line_number":13,"context_line":"then the client will be able to make a request with the header"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3b5c1119_11e874db","line":10,"in_reply_to":"87696c72_f52bacf1","updated":"2024-02-23 19:47:37.000000000","message":"Done","commit_id":"f3db26ca214378f6067684effb586e538d24a959"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"976fbd17916c4c0ba3241f12c07c78583cd6e572","unresolved":true,"context_lines":[{"line_number":15,"context_line":"that has not been deleted but is marked for deletion"},{"line_number":16,"context_line":"(it is in its grace period). If this config flag is set to"},{"line_number":17,"context_line":"false, the client will not be able to request for any objects"},{"line_number":18,"context_line":"marked for deletion, even with the header. The allow_open_expired"},{"line_number":19,"context_line":"flag sets this flag for specific accounts when enable_open_expired"},{"line_number":20,"context_line":"is set to \u0027false\u0027."},{"line_number":21,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"2a1557a2_27cdd22f","line":18,"updated":"2024-02-15 17:32:37.000000000","message":"I think we could make an exception for the \"reseller admin\" role - prehaps regardless of the enable_open_expired status these \"super admin users\" might be allowed to open expired objects.\n\nThat plus the global enable might be sufficient; but per-account or per-account *admin* might be ok too.\n\nI would suggest we consider the groups/roles stuff before we go any further than \"global cluster toggle\"","commit_id":"f3db26ca214378f6067684effb586e538d24a959"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":false,"context_lines":[{"line_number":15,"context_line":"that has not been deleted but is marked for deletion"},{"line_number":16,"context_line":"(it is in its grace period). If this config flag is set to"},{"line_number":17,"context_line":"false, the client will not be able to request for any objects"},{"line_number":18,"context_line":"marked for deletion, even with the header. The allow_open_expired"},{"line_number":19,"context_line":"flag sets this flag for specific accounts when enable_open_expired"},{"line_number":20,"context_line":"is set to \u0027false\u0027."},{"line_number":21,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"55989168_6f7872c3","line":18,"in_reply_to":"2a1557a2_27cdd22f","updated":"2024-02-23 19:47:37.000000000","message":"Done","commit_id":"f3db26ca214378f6067684effb586e538d24a959"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"976fbd17916c4c0ba3241f12c07c78583cd6e572","unresolved":true,"context_lines":[{"line_number":17,"context_line":"false, the client will not be able to request for any objects"},{"line_number":18,"context_line":"marked for deletion, even with the header. The allow_open_expired"},{"line_number":19,"context_line":"flag sets this flag for specific accounts when enable_open_expired"},{"line_number":20,"context_line":"is set to \u0027false\u0027."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I69a8e85a2a6e66ba86a5122719a299a10912bd2f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1446f91e_1f2a281c","line":20,"updated":"2024-02-15 17:32:37.000000000","message":"I\u0027m still waffling on if allow_open_expired is needed","commit_id":"f3db26ca214378f6067684effb586e538d24a959"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":false,"context_lines":[{"line_number":17,"context_line":"false, the client will not be able to request for any objects"},{"line_number":18,"context_line":"marked for deletion, even with the header. The allow_open_expired"},{"line_number":19,"context_line":"flag sets this flag for specific accounts when enable_open_expired"},{"line_number":20,"context_line":"is set to \u0027false\u0027."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I69a8e85a2a6e66ba86a5122719a299a10912bd2f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"a443994c_55ab2870","line":20,"in_reply_to":"1446f91e_1f2a281c","updated":"2024-02-23 19:47:37.000000000","message":"Done","commit_id":"f3db26ca214378f6067684effb586e538d24a959"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":true,"context_lines":[{"line_number":12,"context_line":"If the enable_open_expired flag is set to true in the config,"},{"line_number":13,"context_line":"then the client will be able to make a request with the header"},{"line_number":14,"context_line":"\u0027x-open-expired\u0027 set to true in order to retrieve an object"},{"line_number":15,"context_line":"that has not been deleted but is marked for deletion"},{"line_number":16,"context_line":"(it is in its grace period). If this config flag is set to"},{"line_number":17,"context_line":"false, the client will not be able to request for any objects"},{"line_number":18,"context_line":"marked for deletion, even with the header."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"f56ad4b2_434adc72","line":15,"updated":"2024-02-23 19:47:37.000000000","message":"\u003e an object that has not been deleted but is marked for deletion\n\nthis reads a little backwards to me; it seems like the world \"expired\" might belong in here somewhere, but the user api is x-delete-at so make \"marked for deletion\" is ok.","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"context_lines":[{"line_number":12,"context_line":"If the enable_open_expired flag is set to true in the config,"},{"line_number":13,"context_line":"then the client will be able to make a request with the header"},{"line_number":14,"context_line":"\u0027x-open-expired\u0027 set to true in order to retrieve an object"},{"line_number":15,"context_line":"that has not been deleted but is marked for deletion"},{"line_number":16,"context_line":"(it is in its grace period). If this config flag is set to"},{"line_number":17,"context_line":"false, the client will not be able to request for any objects"},{"line_number":18,"context_line":"marked for deletion, even with the header."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"0ca48e51_a6a52508","line":15,"in_reply_to":"f56ad4b2_434adc72","updated":"2024-02-27 18:05:27.000000000","message":"Done","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":true,"context_lines":[{"line_number":15,"context_line":"that has not been deleted but is marked for deletion"},{"line_number":16,"context_line":"(it is in its grace period). If this config flag is set to"},{"line_number":17,"context_line":"false, the client will not be able to request for any objects"},{"line_number":18,"context_line":"marked for deletion, even with the header."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I69a8e85a2a6e66ba86a5122719a299a10912bd2f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"02529181_99721659","line":18,"updated":"2024-02-23 19:47:37.000000000","message":"Probably worth nothing this is the existing behavior and will continue to be the default unless specifically configured otherwise.\n\nI think it\u0027s misleading to state \"the client will not be able to request for any objects marked for deletion\" without also noting that the request is made *after* the time the object was requested to expire.  Or perhaps I\u0027m mis-understanding \"marked for deletion\" as some sort of implicit state transformation that happens when the time in the expirer queue is before \"now\" as opposed to \"marked for deletion\" as meaning an object that has x-delete-at metadata.","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"context_lines":[{"line_number":15,"context_line":"that has not been deleted but is marked for deletion"},{"line_number":16,"context_line":"(it is in its grace period). If this config flag is set to"},{"line_number":17,"context_line":"false, the client will not be able to request for any objects"},{"line_number":18,"context_line":"marked for deletion, even with the header."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I69a8e85a2a6e66ba86a5122719a299a10912bd2f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9b617bcb_f73a95af","line":18,"in_reply_to":"02529181_99721659","updated":"2024-02-27 18:05:27.000000000","message":"Done","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"976fbd17916c4c0ba3241f12c07c78583cd6e572","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"9e3596a9_79e3834b","updated":"2024-02-15 17:32:37.000000000","message":"please update etc/proxy-server.conf example config so I can see how this is setup","commit_id":"f3db26ca214378f6067684effb586e538d24a959"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"b71c9b4a_c61e73a1","updated":"2024-02-23 19:47:37.000000000","message":"I think this patch is functionally doing what we want; we should consider talking with SRE about adding the `enable_open_expired \u003d true` to our cluster\u0027s configuration and carrying the patch.\n\nI like that this patch doesn\u0027t have to make any changes in the object-server\n\nYou need to look into the unittest failure:\n\n    pytest swift/test/unit/proxy/test_server.py::TestSwiftInfo\n\n^ was able to duplicate OMM\n\nSome of the rewording of the unittests seem a little akward; maybe the existing mixture of test method helpers and closures just makes it non-obvious what the clearest pattern would be - generally I prefer tests that only do one thing [1], i.e.\n\n    test_enable_open_expired_default_false\n    test_enable_open_expired_false_does_not_translate_header\n    test_open_expired_HEAD\n    test_open_expired_POST\n    \n... might take a little more typing upfront, but man does help when debugging later.\n\nI like the paragraph describing the feature in the example config the best I think - KUDOS\n\nAfter you get tests passing, I might give a go at rewording the commit message if it\u0027s still needed.\n\n1. https://benjaminlo-dev.medium.com/dry-vs-damp-16513610cdeb","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a77e08554fd472981e740fef2367961757324ff5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"782a1ae3_51d3f656","updated":"2024-02-29 12:07:43.000000000","message":"Code looks good, just minor comments in the doc. I haven\u0027t looked at the tests yet.","commit_id":"536398a0796778e3971f7630c3d4452ce08f4f90"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"6dcfa42e_661395e2","updated":"2024-02-27 18:05:27.000000000","message":"Made updates for global self.app assignment rather than local app variables and other small fixes!","commit_id":"536398a0796778e3971f7630c3d4452ce08f4f90"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b72a46ddc41250f0a596b2b073658e46e84bff0e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"816db871_6dbd4701","updated":"2024-02-28 14:23:31.000000000","message":"recheck\n\nknown flakey test https://bugs.launchpad.net/swift/+bug/2028175","commit_id":"536398a0796778e3971f7630c3d4452ce08f4f90"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"d696fe469d74bf84e0903bc0a953ee90d9c58920","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"641ea672_2225ac17","updated":"2024-02-29 22:18:01.000000000","message":"updated as per review!","commit_id":"536398a0796778e3971f7630c3d4452ce08f4f90"}],"etc/proxy-server.conf-sample":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":true,"context_lines":[{"line_number":344,"context_line":"# configure this flag that will allow accounts to use the"},{"line_number":345,"context_line":"# \u0027x-open-expired\u0027 flag when making HEAD, GET, or POST requests to access"},{"line_number":346,"context_line":"# an expired object. This flag is set to false by default, so it must be"},{"line_number":347,"context_line":"# changed to access expired objects."},{"line_number":348,"context_line":"# enable_open_expired \u003d true"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"# Some proxy-server configuration options may be overridden on a per-policy"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"28fb67e8_e024e391","line":347,"updated":"2024-02-23 19:47:37.000000000","message":"sounds good","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"context_lines":[{"line_number":344,"context_line":"# configure this flag that will allow accounts to use the"},{"line_number":345,"context_line":"# \u0027x-open-expired\u0027 flag when making HEAD, GET, or POST requests to access"},{"line_number":346,"context_line":"# an expired object. This flag is set to false by default, so it must be"},{"line_number":347,"context_line":"# changed to access expired objects."},{"line_number":348,"context_line":"# enable_open_expired \u003d true"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"# Some proxy-server configuration options may be overridden on a per-policy"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"a691ed62_6abd83a2","line":347,"in_reply_to":"28fb67e8_e024e391","updated":"2024-02-27 18:05:27.000000000","message":"Done","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a77e08554fd472981e740fef2367961757324ff5","unresolved":true,"context_lines":[{"line_number":338,"context_line":"# the environment (default). For more information, see"},{"line_number":339,"context_line":"# https://bugs.launchpad.net/liberasurecode/+bug/1886088"},{"line_number":340,"context_line":"# write_legacy_ec_crc \u003d"},{"line_number":341,"context_line":"# "},{"line_number":342,"context_line":"# If you want to allow accounts to access expired objects that are in their"},{"line_number":343,"context_line":"# grace period and therefore have not been deleted from disk yet, you can"},{"line_number":344,"context_line":"# configure this flag that will allow accounts to use the"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"d9b3039e_a4e9456f","line":341,"updated":"2024-02-29 12:07:43.000000000","message":"I think the pink means there is unnecessary whitespace here","commit_id":"536398a0796778e3971f7630c3d4452ce08f4f90"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"d696fe469d74bf84e0903bc0a953ee90d9c58920","unresolved":false,"context_lines":[{"line_number":338,"context_line":"# the environment (default). For more information, see"},{"line_number":339,"context_line":"# https://bugs.launchpad.net/liberasurecode/+bug/1886088"},{"line_number":340,"context_line":"# write_legacy_ec_crc \u003d"},{"line_number":341,"context_line":"# "},{"line_number":342,"context_line":"# If you want to allow accounts to access expired objects that are in their"},{"line_number":343,"context_line":"# grace period and therefore have not been deleted from disk yet, you can"},{"line_number":344,"context_line":"# configure this flag that will allow accounts to use the"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"b6477899_c50a5e0d","line":341,"in_reply_to":"d9b3039e_a4e9456f","updated":"2024-02-29 22:18:01.000000000","message":"Acknowledged","commit_id":"536398a0796778e3971f7630c3d4452ce08f4f90"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a77e08554fd472981e740fef2367961757324ff5","unresolved":true,"context_lines":[{"line_number":339,"context_line":"# https://bugs.launchpad.net/liberasurecode/+bug/1886088"},{"line_number":340,"context_line":"# write_legacy_ec_crc \u003d"},{"line_number":341,"context_line":"# "},{"line_number":342,"context_line":"# If you want to allow accounts to access expired objects that are in their"},{"line_number":343,"context_line":"# grace period and therefore have not been deleted from disk yet, you can"},{"line_number":344,"context_line":"# configure this flag that will allow accounts to use the"},{"line_number":345,"context_line":"# \u0027x-open-expired\u0027 flag when making HEAD, GET, or POST requests to access"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"171f1109_3860e80e","line":342,"range":{"start_line":342,"start_character":23,"end_line":342,"end_character":31},"updated":"2024-02-29 12:07:43.000000000","message":"I\u0027d suggest saying \"requests\" rather than \"accounts\" - \"account\" has a specific meaning w.r.t. access permission that I don\u0027t think is intended here.","commit_id":"536398a0796778e3971f7630c3d4452ce08f4f90"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"d696fe469d74bf84e0903bc0a953ee90d9c58920","unresolved":false,"context_lines":[{"line_number":339,"context_line":"# https://bugs.launchpad.net/liberasurecode/+bug/1886088"},{"line_number":340,"context_line":"# write_legacy_ec_crc \u003d"},{"line_number":341,"context_line":"# "},{"line_number":342,"context_line":"# If you want to allow accounts to access expired objects that are in their"},{"line_number":343,"context_line":"# grace period and therefore have not been deleted from disk yet, you can"},{"line_number":344,"context_line":"# configure this flag that will allow accounts to use the"},{"line_number":345,"context_line":"# \u0027x-open-expired\u0027 flag when making HEAD, GET, or POST requests to access"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"745b89d2_db3410b0","line":342,"range":{"start_line":342,"start_character":23,"end_line":342,"end_character":31},"in_reply_to":"171f1109_3860e80e","updated":"2024-02-29 22:18:01.000000000","message":"makes sense, updated!","commit_id":"536398a0796778e3971f7630c3d4452ce08f4f90"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a77e08554fd472981e740fef2367961757324ff5","unresolved":true,"context_lines":[{"line_number":343,"context_line":"# grace period and therefore have not been deleted from disk yet, you can"},{"line_number":344,"context_line":"# configure this flag that will allow accounts to use the"},{"line_number":345,"context_line":"# \u0027x-open-expired\u0027 flag when making HEAD, GET, or POST requests to access"},{"line_number":346,"context_line":"# an expired object. This flag is set to false by default, so it must be"},{"line_number":347,"context_line":"# changed to access expired objects."},{"line_number":348,"context_line":"# enable_open_expired \u003d true"},{"line_number":349,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":13,"id":"084e2257_6078554b","line":346,"updated":"2024-02-29 12:07:43.000000000","message":"The sentence is quite long. Maybe:\n\n```\nSetting \u0027enable_open_expired\u0027 to \u0027true\u0027 allows the \u0027x-open-expired\u0027 header to be used with HEAD, GET, or POST requests to access expired objects that have not yet been deleted from disk. This can be useful in conjunction with the object-expirer \u0027grace period\u0027 feature.\n```","commit_id":"536398a0796778e3971f7630c3d4452ce08f4f90"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"d696fe469d74bf84e0903bc0a953ee90d9c58920","unresolved":false,"context_lines":[{"line_number":343,"context_line":"# grace period and therefore have not been deleted from disk yet, you can"},{"line_number":344,"context_line":"# configure this flag that will allow accounts to use the"},{"line_number":345,"context_line":"# \u0027x-open-expired\u0027 flag when making HEAD, GET, or POST requests to access"},{"line_number":346,"context_line":"# an expired object. This flag is set to false by default, so it must be"},{"line_number":347,"context_line":"# changed to access expired objects."},{"line_number":348,"context_line":"# enable_open_expired \u003d true"},{"line_number":349,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":13,"id":"18a31b45_99024efe","line":346,"in_reply_to":"084e2257_6078554b","updated":"2024-02-29 22:18:01.000000000","message":"thanks for this recommendation! incredibly concise and practical :)","commit_id":"536398a0796778e3971f7630c3d4452ce08f4f90"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"976fbd17916c4c0ba3241f12c07c78583cd6e572","unresolved":true,"context_lines":[{"line_number":250,"context_line":"        policy \u003d POLICIES.get_by_index(policy_index)"},{"line_number":251,"context_line":"        obj_ring \u003d self.app.get_object_ring(policy_index)"},{"line_number":252,"context_line":"        req.headers[\u0027X-Backend-Storage-Policy-Index\u0027] \u003d policy_index"},{"line_number":253,"context_line":"        if (self.account_name in self.app.allow_open_expired or \\"},{"line_number":254,"context_line":"                config_true_value(self.app.enable_open_expired)) and \\"},{"line_number":255,"context_line":"                config_true_value(req.headers.get(\u0027x-open-expired\u0027)):"},{"line_number":256,"context_line":"            req.headers[\u0027X-Backend-Open-Expired\u0027] \u003d \u0027true\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"a9fb7c7a_858b2967","line":253,"updated":"2024-02-15 17:32:37.000000000","message":"I\u0027d prefer this logic only existing in the proxy - i.e. if the proxy allows the request to update the backend header the object server will honor it.","commit_id":"f3db26ca214378f6067684effb586e538d24a959"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        policy \u003d POLICIES.get_by_index(policy_index)"},{"line_number":251,"context_line":"        obj_ring \u003d self.app.get_object_ring(policy_index)"},{"line_number":252,"context_line":"        req.headers[\u0027X-Backend-Storage-Policy-Index\u0027] \u003d policy_index"},{"line_number":253,"context_line":"        if (self.account_name in self.app.allow_open_expired or \\"},{"line_number":254,"context_line":"                config_true_value(self.app.enable_open_expired)) and \\"},{"line_number":255,"context_line":"                config_true_value(req.headers.get(\u0027x-open-expired\u0027)):"},{"line_number":256,"context_line":"            req.headers[\u0027X-Backend-Open-Expired\u0027] \u003d \u0027true\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"848c64d8_dc853d59","line":253,"in_reply_to":"a9fb7c7a_858b2967","updated":"2024-02-23 19:47:37.000000000","message":"Done","commit_id":"f3db26ca214378f6067684effb586e538d24a959"}],"swift/proxy/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","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":"            enable_open_expired\u003dself.enable_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":9,"id":"cf255fe9_97cf561a","line":352,"updated":"2024-02-23 19:47:37.000000000","message":"this seems reasonable to put in /info","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"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":"            enable_open_expired\u003dself.enable_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":9,"id":"6ba9d688_fe7543b0","line":352,"in_reply_to":"cf255fe9_97cf561a","updated":"2024-02-27 18:05:27.000000000","message":"Acknowledged","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"}],"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":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":true,"context_lines":[{"line_number":804,"context_line":"    def _test_x_open_expired(self, method, num_reqs, headers\u003dNone, app\u003dNone):"},{"line_number":805,"context_line":"        req \u003d swift.common.swob.Request.blank("},{"line_number":806,"context_line":"            \u0027/v1/a/c/o\u0027, method\u003dmethod, headers\u003dheaders)"},{"line_number":807,"context_line":"        codes \u003d [404] * num_reqs"},{"line_number":808,"context_line":"        with mocked_http_conn(*codes) as fake_conn:"},{"line_number":809,"context_line":"            if app is None:"},{"line_number":810,"context_line":"                app \u003d self.app"}],"source_content_type":"text/x-python","patch_set":9,"id":"b5968d22_af72fc7b","line":807,"updated":"2024-02-23 19:47:37.000000000","message":"oic, here were mocking the backend to respond 404 regarless of the x-backed-open-expired header - the callers just go on to assert if the backend request header was present based on the configuration of the app\n\nthis helper method doesn\u0027t really have anything in it specific to x-open-expired - it just sets up a 404, turns the crank, and returns the captured backend requests","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"context_lines":[{"line_number":804,"context_line":"    def _test_x_open_expired(self, method, num_reqs, headers\u003dNone, app\u003dNone):"},{"line_number":805,"context_line":"        req \u003d swift.common.swob.Request.blank("},{"line_number":806,"context_line":"            \u0027/v1/a/c/o\u0027, method\u003dmethod, headers\u003dheaders)"},{"line_number":807,"context_line":"        codes \u003d [404] * num_reqs"},{"line_number":808,"context_line":"        with mocked_http_conn(*codes) as fake_conn:"},{"line_number":809,"context_line":"            if app is None:"},{"line_number":810,"context_line":"                app \u003d self.app"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf44e4dd_093964ba","line":807,"in_reply_to":"b5968d22_af72fc7b","updated":"2024-02-27 18:05:27.000000000","message":"That\u0027s right! This existed before this patch as well","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":true,"context_lines":[{"line_number":807,"context_line":"        codes \u003d [404] * num_reqs"},{"line_number":808,"context_line":"        with mocked_http_conn(*codes) as fake_conn:"},{"line_number":809,"context_line":"            if app is None:"},{"line_number":810,"context_line":"                app \u003d self.app"},{"line_number":811,"context_line":"            resp \u003d req.get_response(app)"},{"line_number":812,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":813,"context_line":"        return fake_conn.requests"}],"source_content_type":"text/x-python","patch_set":9,"id":"27c015ff_20fc5176","line":810,"updated":"2024-02-23 19:47:37.000000000","message":"more idiomatic as\n\n    app \u003d app or self.app\n    \nyou might also consider just setting self.app to the configured app you want to test before calling this helper.","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"context_lines":[{"line_number":807,"context_line":"        codes \u003d [404] * num_reqs"},{"line_number":808,"context_line":"        with mocked_http_conn(*codes) as fake_conn:"},{"line_number":809,"context_line":"            if app is None:"},{"line_number":810,"context_line":"                app \u003d self.app"},{"line_number":811,"context_line":"            resp \u003d req.get_response(app)"},{"line_number":812,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":813,"context_line":"        return fake_conn.requests"}],"source_content_type":"text/x-python","patch_set":9,"id":"29af7560_554c0446","line":810,"in_reply_to":"27c015ff_20fc5176","updated":"2024-02-27 18:05:27.000000000","message":"Acknowledged","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":true,"context_lines":[{"line_number":828,"context_line":"                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027true\u0027})"},{"line_number":829,"context_line":"            for r in requests:"},{"line_number":830,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027true\u0027)"},{"line_number":831,"context_line":"                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"            requests \u003d self._test_x_open_expired("},{"line_number":834,"context_line":"                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027false\u0027})"}],"source_content_type":"text/x-python","patch_set":9,"id":"4feb1262_daae5c8b","line":831,"updated":"2024-02-23 19:47:37.000000000","message":"oic, this is the existing test - it also covered all methods - because it used the default config the expected behavior changed.","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"context_lines":[{"line_number":828,"context_line":"                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027true\u0027})"},{"line_number":829,"context_line":"            for r in requests:"},{"line_number":830,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027true\u0027)"},{"line_number":831,"context_line":"                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"            requests \u003d self._test_x_open_expired("},{"line_number":834,"context_line":"                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027false\u0027})"}],"source_content_type":"text/x-python","patch_set":9,"id":"92c9de80_a1252ae7","line":831,"in_reply_to":"4feb1262_daae5c8b","updated":"2024-02-27 18:05:27.000000000","message":"Acknowledged","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":true,"context_lines":[{"line_number":861,"context_line":"        # Create a new proxy instance for test with config"},{"line_number":862,"context_line":"        app \u003d PatchedObjControllerApp("},{"line_number":863,"context_line":"            conf, account_ring\u003dFakeRing(),"},{"line_number":864,"context_line":"            container_ring\u003dFakeRing(), logger\u003dNone)"},{"line_number":865,"context_line":"        # Use the same container info as the app used in other tests"},{"line_number":866,"context_line":"        app.container_info \u003d dict(self.container_info)"},{"line_number":867,"context_line":"        obj_ring \u003d app.get_object_ring(int(POLICIES[0]))"}],"source_content_type":"text/x-python","patch_set":9,"id":"e7a22fd2_5c79ca66","line":864,"updated":"2024-02-23 19:47:37.000000000","message":"rather than passing in app\u003dapp down below it wouldn\u0027t have been SO bad just to set\n\n    self.app \u003d ...\n    \n... and then let the helper test the app you\u0027ve configured.","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"context_lines":[{"line_number":861,"context_line":"        # Create a new proxy instance for test with config"},{"line_number":862,"context_line":"        app \u003d PatchedObjControllerApp("},{"line_number":863,"context_line":"            conf, account_ring\u003dFakeRing(),"},{"line_number":864,"context_line":"            container_ring\u003dFakeRing(), logger\u003dNone)"},{"line_number":865,"context_line":"        # Use the same container info as the app used in other tests"},{"line_number":866,"context_line":"        app.container_info \u003d dict(self.container_info)"},{"line_number":867,"context_line":"        obj_ring \u003d app.get_object_ring(int(POLICIES[0]))"}],"source_content_type":"text/x-python","patch_set":9,"id":"a8ab3271_b810bb8b","line":864,"in_reply_to":"e7a22fd2_5c79ca66","updated":"2024-02-27 18:05:27.000000000","message":"Got it, makes sense!","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":true,"context_lines":[{"line_number":864,"context_line":"            container_ring\u003dFakeRing(), logger\u003dNone)"},{"line_number":865,"context_line":"        # Use the same container info as the app used in other tests"},{"line_number":866,"context_line":"        app.container_info \u003d dict(self.container_info)"},{"line_number":867,"context_line":"        obj_ring \u003d app.get_object_ring(int(POLICIES[0]))"},{"line_number":868,"context_line":""},{"line_number":869,"context_line":"        for method, num_reqs in ("},{"line_number":870,"context_line":"                (\u0027GET\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"35ee1cf0_aaa3ae25","line":867,"updated":"2024-02-23 19:47:37.000000000","message":"it\u0027s interesting that this uses POLICIES[0], this test is in CommonObjectControllerMixin and does run on TestECObjController which appears to have a patch_policies(with_ec_default\u003dTrue)\n\nbut it might look a little more obvious out of context as just \n\n    obj_ring \u003d app.get_object_ring(int(self.policy))\n    \nwhich reads more like \"whichever policy this TestCase sets up as the main policy to test\" instead \"whichever policy this TestCase sets up as the default\" (i\u0027m sure this is jaded by my expierience with deployed clusters where the \"default policy-0\" is almost always going to be a replicated policy, although I suppose it turns out in the context of this test configuration POLICIES[0] and self.policy are equiivilent)","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"context_lines":[{"line_number":864,"context_line":"            container_ring\u003dFakeRing(), logger\u003dNone)"},{"line_number":865,"context_line":"        # Use the same container info as the app used in other tests"},{"line_number":866,"context_line":"        app.container_info \u003d dict(self.container_info)"},{"line_number":867,"context_line":"        obj_ring \u003d app.get_object_ring(int(POLICIES[0]))"},{"line_number":868,"context_line":""},{"line_number":869,"context_line":"        for method, num_reqs in ("},{"line_number":870,"context_line":"                (\u0027GET\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"68d91794_06945f93","line":867,"in_reply_to":"35ee1cf0_aaa3ae25","updated":"2024-02-27 18:05:27.000000000","message":"Done","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":true,"context_lines":[{"line_number":903,"context_line":"                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027true\u0027}, app\u003dapp)"},{"line_number":904,"context_line":"            for r in requests:"},{"line_number":905,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027true\u0027)"},{"line_number":906,"context_line":"                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"    def test_HEAD_simple(self):"},{"line_number":909,"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":9,"id":"a2ef9f6c_b4e66ba4","line":906,"updated":"2024-02-23 19:47:37.000000000","message":"this seems like a re-telling of the test_POST_delete_at_with_x_open_expired test - but covers the HEAD and GET methods as well.","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"context_lines":[{"line_number":903,"context_line":"                method, num_reqs, headers\u003d{\u0027X-Open-Expired\u0027: \u0027true\u0027}, app\u003dapp)"},{"line_number":904,"context_line":"            for r in requests:"},{"line_number":905,"context_line":"                self.assertEqual(r[\u0027headers\u0027][\u0027X-Open-Expired\u0027], \u0027true\u0027)"},{"line_number":906,"context_line":"                self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, r[\u0027headers\u0027])"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"    def test_HEAD_simple(self):"},{"line_number":909,"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":9,"id":"e8465395_85dc43a0","line":906,"in_reply_to":"a2ef9f6c_b4e66ba4","updated":"2024-02-27 18:05:27.000000000","message":"Acknowledged","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":true,"context_lines":[{"line_number":2285,"context_line":"            if method \u003d\u003d \u0027POST\u0027:"},{"line_number":2286,"context_line":"                post_headers.append(headers)"},{"line_number":2287,"context_line":""},{"line_number":2288,"context_line":"        def do_post(extra_headers, app\u003dself.app, obj_ring\u003dself.obj_ring):"},{"line_number":2289,"context_line":"            headers \u003d {\u0027Content-Type\u0027: \u0027foo/bar\u0027,"},{"line_number":2290,"context_line":"                       \u0027X-Delete-At\u0027: t_delete}"},{"line_number":2291,"context_line":"            headers.update(extra_headers)"}],"source_content_type":"text/x-python","patch_set":9,"id":"381f6ab4_12c8da06","line":2288,"updated":"2024-02-23 19:47:37.000000000","message":"it looks a little weird to me to have a closure defined with default kwargs pointing at attributes on self - w/i the closure we already have access to self, and the non local app and obj_ring variables honestly.\n\nmaybe what you\u0027d have preferred is a","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"context_lines":[{"line_number":2285,"context_line":"            if method \u003d\u003d \u0027POST\u0027:"},{"line_number":2286,"context_line":"                post_headers.append(headers)"},{"line_number":2287,"context_line":""},{"line_number":2288,"context_line":"        def do_post(extra_headers, app\u003dself.app, obj_ring\u003dself.obj_ring):"},{"line_number":2289,"context_line":"            headers \u003d {\u0027Content-Type\u0027: \u0027foo/bar\u0027,"},{"line_number":2290,"context_line":"                       \u0027X-Delete-At\u0027: t_delete}"},{"line_number":2291,"context_line":"            headers.update(extra_headers)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7346ff33_49bb9221","line":2288,"in_reply_to":"381f6ab4_12c8da06","updated":"2024-02-27 18:05:27.000000000","message":"I\u0027ve updated it to use the self.app and self.obj_ring without function args","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":true,"context_lines":[{"line_number":2305,"context_line":"                self.assertIn(\u0027X-Delete-At-Container\u0027, given_headers)"},{"line_number":2306,"context_line":""},{"line_number":2307,"context_line":"        # Check when enable_open_expired config is set to true"},{"line_number":2308,"context_line":"        conf \u003d {\u0027enable_open_expired\u0027: \u0027true\u0027}"},{"line_number":2309,"context_line":"        app \u003d PatchedObjControllerApp("},{"line_number":2310,"context_line":"            conf, account_ring\u003dFakeRing(),"},{"line_number":2311,"context_line":"            container_ring\u003dFakeRing(), logger\u003dNone)"}],"source_content_type":"text/x-python","patch_set":9,"id":"54f3bae8_5fb0632f","line":2308,"updated":"2024-02-23 19:47:37.000000000","message":"it makes sense that the existing x-open-expired tests should need to set this config option to true","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"context_lines":[{"line_number":2305,"context_line":"                self.assertIn(\u0027X-Delete-At-Container\u0027, given_headers)"},{"line_number":2306,"context_line":""},{"line_number":2307,"context_line":"        # Check when enable_open_expired config is set to true"},{"line_number":2308,"context_line":"        conf \u003d {\u0027enable_open_expired\u0027: \u0027true\u0027}"},{"line_number":2309,"context_line":"        app \u003d PatchedObjControllerApp("},{"line_number":2310,"context_line":"            conf, account_ring\u003dFakeRing(),"},{"line_number":2311,"context_line":"            container_ring\u003dFakeRing(), logger\u003dNone)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ad0d5f93_79187865","line":2308,"in_reply_to":"54f3bae8_5fb0632f","updated":"2024-02-27 18:05:27.000000000","message":"Acknowledged","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":true,"context_lines":[{"line_number":2332,"context_line":"        conf \u003d {\u0027enable_open_expired\u0027: \u0027false\u0027}"},{"line_number":2333,"context_line":"        app \u003d PatchedObjControllerApp("},{"line_number":2334,"context_line":"            conf, account_ring\u003dFakeRing(),"},{"line_number":2335,"context_line":"            container_ring\u003dFakeRing(), logger\u003dNone)"},{"line_number":2336,"context_line":"        app.container_info \u003d dict(self.container_info)"},{"line_number":2337,"context_line":"        obj_ring \u003d app.get_object_ring(int(POLICIES[0]))"},{"line_number":2338,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9acbb09e_50ad4099","line":2335,"updated":"2024-02-23 19:47:37.000000000","message":"this assignment actually changes the value of app in this scope and the closure would have access to it; in my testing the extra plumbing isn\u0027t needed:\n\n    diff --git a/test/unit/proxy/controllers/test_obj.py b/test/unit/proxy/controllers/test_obj.py\n    index 6c4b2da94..92654bfd7 100644\n    --- a/test/unit/proxy/controllers/test_obj.py\n    +++ b/test/unit/proxy/controllers/test_obj.py\n    @@ -2285,7 +2285,7 @@ class TestReplicatedObjController(CommonObjectControllerMixin,\n                 if method \u003d\u003d \u0027POST\u0027:\n                     post_headers.append(headers)\n     \n    -        def do_post(extra_headers, app\u003dself.app, obj_ring\u003dself.obj_ring):\n    +        def do_post(extra_headers):\n                 headers \u003d {\u0027Content-Type\u0027: \u0027foo/bar\u0027,\n                            \u0027X-Delete-At\u0027: t_delete}\n                 headers.update(extra_headers)\n    @@ -2313,17 +2313,17 @@ class TestReplicatedObjController(CommonObjectControllerMixin,\n             obj_ring \u003d app.get_object_ring(int(POLICIES[0]))\n     \n             post_headers \u003d []\n    -        do_post({}, app\u003dapp, obj_ring\u003dobj_ring)\n    +        do_post({})\n             for given_headers in post_headers:\n                 self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, given_headers)\n     \n             post_headers \u003d []\n    -        do_post({\u0027X-Open-Expired\u0027: \u0027false\u0027}, app\u003dapp, obj_ring\u003dobj_ring)\n    +        do_post({\u0027X-Open-Expired\u0027: \u0027false\u0027})\n             for given_headers in post_headers:\n                 self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, given_headers)\n     \n             post_headers \u003d []\n    -        do_post({\u0027X-Open-Expired\u0027: \u0027true\u0027}, app\u003dapp, obj_ring\u003dobj_ring)\n    +        do_post({\u0027X-Open-Expired\u0027: \u0027true\u0027})\n             for given_headers in post_headers:\n                 self.assertEqual(given_headers.get(\u0027X-Backend-Open-Expired\u0027),\n                                  \u0027true\u0027)\n    @@ -2337,17 +2337,17 @@ class TestReplicatedObjController(CommonObjectControllerMixin,\n             obj_ring \u003d app.get_object_ring(int(POLICIES[0]))\n     \n             post_headers \u003d []\n    -        do_post({}, app\u003dapp, obj_ring\u003dobj_ring)\n    +        do_post({})\n             for given_headers in post_headers:\n                 self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, given_headers)\n     \n             post_headers \u003d []\n    -        do_post({\u0027X-Open-Expired\u0027: \u0027false\u0027}, app\u003dapp, obj_ring\u003dobj_ring)\n    +        do_post({\u0027X-Open-Expired\u0027: \u0027false\u0027})\n             for given_headers in post_headers:\n                 self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, given_headers)\n     \n             post_headers \u003d []\n    -        do_post({\u0027X-Open-Expired\u0027: \u0027true\u0027}, app\u003dapp, obj_ring\u003dobj_ring)\n    ...skipping...\n    @@ -2285,7 +2285,7 @@ class TestReplicatedObjController(CommonObjectControllerMixin,\n                 if method \u003d\u003d \u0027POST\u0027:\n                     post_headers.append(headers)\n     \n    -        def do_post(extra_headers, app\u003dself.app, obj_ring\u003dself.obj_ring):\n    +        def do_post(extra_headers):\n                 headers \u003d {\u0027Content-Type\u0027: \u0027foo/bar\u0027,\n                            \u0027X-Delete-At\u0027: t_delete}\n                 headers.update(extra_headers)\n    @@ -2313,17 +2313,17 @@ class TestReplicatedObjController(CommonObjectControllerMixin,\n             obj_ring \u003d app.get_object_ring(int(POLICIES[0]))\n     \n             post_headers \u003d []\n    -        do_post({}, app\u003dapp, obj_ring\u003dobj_ring)\n    +        do_post({})\n             for given_headers in post_headers:\n                 self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, given_headers)\n     \n             post_headers \u003d []\n    -        do_post({\u0027X-Open-Expired\u0027: \u0027false\u0027}, app\u003dapp, obj_ring\u003dobj_ring)\n    +        do_post({\u0027X-Open-Expired\u0027: \u0027false\u0027})\n             for given_headers in post_headers:\n                 self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, given_headers)\n     \n             post_headers \u003d []\n    -        do_post({\u0027X-Open-Expired\u0027: \u0027true\u0027}, app\u003dapp, obj_ring\u003dobj_ring)\n    +        do_post({\u0027X-Open-Expired\u0027: \u0027true\u0027})\n             for given_headers in post_headers:\n                 self.assertEqual(given_headers.get(\u0027X-Backend-Open-Expired\u0027),\n                                  \u0027true\u0027)\n    @@ -2337,17 +2337,17 @@ class TestReplicatedObjController(CommonObjectControllerMixin,\n             obj_ring \u003d app.get_object_ring(int(POLICIES[0]))\n     \n             post_headers \u003d []\n    -        do_post({}, app\u003dapp, obj_ring\u003dobj_ring)\n    +        do_post({})\n             for given_headers in post_headers:\n                 self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, given_headers)\n     \n             post_headers \u003d []\n    -        do_post({\u0027X-Open-Expired\u0027: \u0027false\u0027}, app\u003dapp, obj_ring\u003dobj_ring)\n    +        do_post({\u0027X-Open-Expired\u0027: \u0027false\u0027})\n             for given_headers in post_headers:\n                 self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, given_headers)\n     \n             post_headers \u003d []\n    -        do_post({\u0027X-Open-Expired\u0027: \u0027true\u0027}, app\u003dapp, obj_ring\u003dobj_ring)\n    +        do_post({\u0027X-Open-Expired\u0027: \u0027true\u0027})\n             for given_headers in post_headers:\n                 self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, given_headers)","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"context_lines":[{"line_number":2332,"context_line":"        conf \u003d {\u0027enable_open_expired\u0027: \u0027false\u0027}"},{"line_number":2333,"context_line":"        app \u003d PatchedObjControllerApp("},{"line_number":2334,"context_line":"            conf, account_ring\u003dFakeRing(),"},{"line_number":2335,"context_line":"            container_ring\u003dFakeRing(), logger\u003dNone)"},{"line_number":2336,"context_line":"        app.container_info \u003d dict(self.container_info)"},{"line_number":2337,"context_line":"        obj_ring \u003d app.get_object_ring(int(POLICIES[0]))"},{"line_number":2338,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"f529e76c_a1fe00d6","line":2335,"in_reply_to":"9acbb09e_50ad4099","updated":"2024-02-27 18:05:27.000000000","message":"Done","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"58adb8b06d6c7a134e6d1bbd8f4cd090013c0f0d","unresolved":true,"context_lines":[{"line_number":2349,"context_line":"        post_headers \u003d []"},{"line_number":2350,"context_line":"        do_post({\u0027X-Open-Expired\u0027: \u0027true\u0027}, app\u003dapp, obj_ring\u003dobj_ring)"},{"line_number":2351,"context_line":"        for given_headers in post_headers:"},{"line_number":2352,"context_line":"            self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, given_headers)"},{"line_number":2353,"context_line":""},{"line_number":2354,"context_line":"    def test_PUT_converts_delete_after_to_delete_at(self):"},{"line_number":2355,"context_line":"        req \u003d swob.Request.blank(\u0027/v1/a/c/o\u0027, method\u003d\u0027PUT\u0027, body\u003db\u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"350a356d_19496859","line":2352,"updated":"2024-02-23 19:47:37.000000000","message":"looks right, so the proxy doesn\u0027t translate the backend header regardless of the request header when it\u0027s configured with enable_open_expired \u003d false","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"},{"author":{"_account_id":36763,"name":"Anish Kachinthaya","display_name":"Anish","email":"akachinthaya@nvidia.com","username":"akachinthaya"},"change_message_id":"563650ba3f6f0f99a8b5070c2859a2b165c7725a","unresolved":false,"context_lines":[{"line_number":2349,"context_line":"        post_headers \u003d []"},{"line_number":2350,"context_line":"        do_post({\u0027X-Open-Expired\u0027: \u0027true\u0027}, app\u003dapp, obj_ring\u003dobj_ring)"},{"line_number":2351,"context_line":"        for given_headers in post_headers:"},{"line_number":2352,"context_line":"            self.assertNotIn(\u0027X-Backend-Open-Expired\u0027, given_headers)"},{"line_number":2353,"context_line":""},{"line_number":2354,"context_line":"    def test_PUT_converts_delete_after_to_delete_at(self):"},{"line_number":2355,"context_line":"        req \u003d swob.Request.blank(\u0027/v1/a/c/o\u0027, method\u003d\u0027PUT\u0027, body\u003db\u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"89cf16a3_f177861c","line":2352,"in_reply_to":"350a356d_19496859","updated":"2024-02-27 18:05:27.000000000","message":"Acknowledged","commit_id":"a8618099ed4741bac277ff39dd2d7611195aa360"}]}
