)]}'
{"etc/proxy-server.conf-sample":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"323c05fdc31265de963fbdabeee1d3e7479d2598","unresolved":false,"context_lines":[{"line_number":108,"context_line":"# Note: If user sets `X-Derivative-Storage-Policy` metadata on a"},{"line_number":109,"context_line":"# a container, then this header should take precendence over this option."},{"line_number":110,"context_line":"# derived_container_policy_use_default \u003d true"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"[pipeline:main]"},{"line_number":113,"context_line":"# This sample pipeline uses tempauth and is used for SAIO dev work and"},{"line_number":114,"context_line":"# testing. See below for a pipeline using keystone."}],"source_content_type":"application/octet-stream","patch_set":2,"id":"7faddb67_22a482a2","line":111,"updated":"2019-08-20 23:39:37.000000000","message":"No need for \"should\". This is not an RFC. Describe what the implementation does in a firm and positive way. I suspect you reserve this language in case another middleware decides not to comply. I think we have the power to be strict about it.","commit_id":"d53486bca8173f64a876fae4a8f410d22a885198"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"a98cae701ed30a33aabc7363dd60c0307a1b1a04","unresolved":false,"context_lines":[{"line_number":108,"context_line":"# Note: If user sets `X-Derivative-Storage-Policy` metadata on a"},{"line_number":109,"context_line":"# a container, then this header should take precendence over this option."},{"line_number":110,"context_line":"# derived_container_policy_use_default \u003d true"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"[pipeline:main]"},{"line_number":113,"context_line":"# This sample pipeline uses tempauth and is used for SAIO dev work and"},{"line_number":114,"context_line":"# testing. See below for a pipeline using keystone."}],"source_content_type":"application/octet-stream","patch_set":2,"id":"7faddb67_69ddefdb","line":111,"in_reply_to":"7faddb67_22a482a2","updated":"2019-08-29 12:38:33.000000000","message":"I think your last sentence hits at the heart of the issue. We have no power to strict it. If a middleware create a container with `x-storage-policy: wrongpolicy` there\u0027s nothing we can do, at least I can\u0027t see how we could enforce it, but open to ideas.","commit_id":"d53486bca8173f64a876fae4a8f410d22a885198"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"500b445aa83e67b28a4471612a5dea6bea571379","unresolved":false,"context_lines":[{"line_number":108,"context_line":"# Note: If user sets `X-Derivative-Storage-Policy` metadata on a"},{"line_number":109,"context_line":"# a container, then this header should take precendence over this option."},{"line_number":110,"context_line":"# derived_container_policy_use_default \u003d true"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"[pipeline:main]"},{"line_number":113,"context_line":"# This sample pipeline uses tempauth and is used for SAIO dev work and"},{"line_number":114,"context_line":"# testing. See below for a pipeline using keystone."}],"source_content_type":"application/octet-stream","patch_set":2,"id":"7faddb67_3aa97723","line":111,"in_reply_to":"7faddb67_69ddefdb","updated":"2019-08-29 12:40:02.000000000","message":"and I mean third-party middleware, not swift core middleware (those we have the power to be strict about it).","commit_id":"d53486bca8173f64a876fae4a8f410d22a885198"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"23a04c6657d90827f75ab81ad78454840db5e4ce","unresolved":false,"context_lines":[{"line_number":105,"context_line":"# uploads) which storage policy to use. If set to true, it will use the"},{"line_number":106,"context_line":"# cluster\u0027s default policy, if set to false it will use the primary\u0027s"},{"line_number":107,"context_line":"# container storage policy."},{"line_number":108,"context_line":"# Note: If user sets `X-Derivative-Storage-Policy` metadata on a"},{"line_number":109,"context_line":"# a container, then this header should take precendence over this option."},{"line_number":110,"context_line":"# derived_container_policy_use_default \u003d true"},{"line_number":111,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":3,"id":"3fa7e38b_133efad9","line":108,"updated":"2019-10-07 22:25:44.000000000","message":"typo here s/Derivative/Derived/","commit_id":"c13529beac75a52bb3b30e7a1d6f4e86ad69a51e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4567d60517476b0a9b9792fb44f78048bd0e9056","unresolved":false,"context_lines":[{"line_number":107,"context_line":"# container storage policy."},{"line_number":108,"context_line":"# Note: If user sets `X-Derivative-Storage-Policy` metadata on a"},{"line_number":109,"context_line":"# a container, then this header should take precendence over this option."},{"line_number":110,"context_line":"# derived_container_policy_use_default \u003d true"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"[pipeline:main]"},{"line_number":113,"context_line":"# This sample pipeline uses tempauth and is used for SAIO dev work and"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"3fa7e38b_ca8bca65","line":110,"updated":"2019-10-07 20:44:09.000000000","message":"This is in the DEFAULT section, it\u0027s by design then that it \"falls through\" to the s3api filter section?","commit_id":"c13529beac75a52bb3b30e7a1d6f4e86ad69a51e"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"91c2906de9124dc14cf1cc35afa1942e6fbcfc16","unresolved":false,"context_lines":[{"line_number":107,"context_line":"# container storage policy."},{"line_number":108,"context_line":"# Note: If user sets `X-Derivative-Storage-Policy` metadata on a"},{"line_number":109,"context_line":"# a container, then this header should take precendence over this option."},{"line_number":110,"context_line":"# derived_container_policy_use_default \u003d true"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"[pipeline:main]"},{"line_number":113,"context_line":"# This sample pipeline uses tempauth and is used for SAIO dev work and"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"3fa7e38b_997079a6","line":110,"in_reply_to":"3fa7e38b_ca8bca65","updated":"2019-10-30 02:23:11.000000000","message":"I wonder if the default here should be false, and derive from the primary container.\nWhy? I\u0027d suspect in the new world be it MPU or new versioning whereby users don\u0027t get a choice in the \"backend\" container (ie it\u0027s invisible to them), they\u0027d expect it to be the primary.\n\nIe. If uploading a large object to EC because I care about the space, I don\u0027t want all it\u0027s segments to be replicated.. that\u0027s why I\u0027m using an EC storage policy. Maybe my MPU understanding is wrong.\nBut this is the same for the new versioning. If we\u0027re going to create a \"shadow container\" to hold the versions and then point at the correct version with a symlink. Then as a user when I\u0027m putting my object in an EC (for example) container, and it happens to be versioned, I want my data to be just that EC, no matter where it lives behind the scene.\n\nOtherwise I could image problems, what about data sovereignty, where some of my \"data\" must be say in Oz, but my default policy is global.. ops.. my data leaked.\n\nIn my mind, I think we should always default to primary container.. but maybe it\u0027s just me :)","commit_id":"c13529beac75a52bb3b30e7a1d6f4e86ad69a51e"}],"swift/common/middleware/s3api/controllers/multi_upload.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"323c05fdc31265de963fbdabeee1d3e7479d2598","unresolved":false,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"        try:"},{"line_number":380,"context_line":"            seg_req \u003d copy.copy(req)"},{"line_number":381,"context_line":"            seg_req.environ \u003d copy.copy(req.environ)"},{"line_number":382,"context_line":"            seg_req.container_name \u003d seg_container"},{"line_number":383,"context_line":"            seg_req.get_container_info(self.app)"},{"line_number":384,"context_line":"        except NoSuchBucket:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_45dd086e","line":381,"updated":"2019-08-20 23:39:37.000000000","message":"The conventional way to do this is seg_req \u003d Request(copy.copy(req.environ)). What is it that you gain by copy(req)? Is there some state in the instance of Request that gets copied in that case.... and if so, how?","commit_id":"d53486bca8173f64a876fae4a8f410d22a885198"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"a98cae701ed30a33aabc7363dd60c0307a1b1a04","unresolved":false,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"        try:"},{"line_number":380,"context_line":"            seg_req \u003d copy.copy(req)"},{"line_number":381,"context_line":"            seg_req.environ \u003d copy.copy(req.environ)"},{"line_number":382,"context_line":"            seg_req.container_name \u003d seg_container"},{"line_number":383,"context_line":"            seg_req.get_container_info(self.app)"},{"line_number":384,"context_line":"        except NoSuchBucket:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_5add53db","line":381,"in_reply_to":"7faddb67_45dd086e","updated":"2019-08-29 12:38:33.000000000","message":"since it\u0027s a S3Request, I thought I\u0027d copy parameters that are not in req.environ","commit_id":"d53486bca8173f64a876fae4a8f410d22a885198"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"323c05fdc31265de963fbdabeee1d3e7479d2598","unresolved":false,"context_lines":[{"line_number":385,"context_line":"            try:"},{"line_number":386,"context_line":"                # define which policy to use"},{"line_number":387,"context_line":"                info \u003d req.get_container_info(self.app)"},{"line_number":388,"context_line":"                if self.conf.derived_container_policy_use_default:"},{"line_number":389,"context_line":"                    headers \u003d None"},{"line_number":390,"context_line":"                else:"},{"line_number":391,"context_line":"                    policy_name \u003d POLICIES[info[\u0027storage_policy\u0027]].name"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_c5bc98dd","line":388,"updated":"2019-08-20 23:39:37.000000000","message":"It would make a more sense if consulting the configuration was done in else: of checking the header below, I think.","commit_id":"d53486bca8173f64a876fae4a8f410d22a885198"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"a98cae701ed30a33aabc7363dd60c0307a1b1a04","unresolved":false,"context_lines":[{"line_number":385,"context_line":"            try:"},{"line_number":386,"context_line":"                # define which policy to use"},{"line_number":387,"context_line":"                info \u003d req.get_container_info(self.app)"},{"line_number":388,"context_line":"                if self.conf.derived_container_policy_use_default:"},{"line_number":389,"context_line":"                    headers \u003d None"},{"line_number":390,"context_line":"                else:"},{"line_number":391,"context_line":"                    policy_name \u003d POLICIES[info[\u0027storage_policy\u0027]].name"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_dad143ce","line":388,"in_reply_to":"7faddb67_c5bc98dd","updated":"2019-08-29 12:38:33.000000000","message":"Done","commit_id":"d53486bca8173f64a876fae4a8f410d22a885198"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"323c05fdc31265de963fbdabeee1d3e7479d2598","unresolved":false,"context_lines":[{"line_number":391,"context_line":"                    policy_name \u003d POLICIES[info[\u0027storage_policy\u0027]].name"},{"line_number":392,"context_line":"                    headers \u003d {\u0027X-Storage-Policy\u0027: policy_name}"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"                # policy set by user takes precedence"},{"line_number":395,"context_line":"                if info.get(\u0027derived_container_storage_policy\u0027):"},{"line_number":396,"context_line":"                    headers \u003d {"},{"line_number":397,"context_line":"                        \u0027X-Storage-Policy\u0027:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_8556a0cd","line":394,"updated":"2019-08-20 23:39:37.000000000","message":"See the discussion in configuration file comments.","commit_id":"d53486bca8173f64a876fae4a8f410d22a885198"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"323c05fdc31265de963fbdabeee1d3e7479d2598","unresolved":false,"context_lines":[{"line_number":395,"context_line":"                if info.get(\u0027derived_container_storage_policy\u0027):"},{"line_number":396,"context_line":"                    headers \u003d {"},{"line_number":397,"context_line":"                        \u0027X-Storage-Policy\u0027:"},{"line_number":398,"context_line":"                        info[\u0027derived_container_storage_policy\u0027]}"},{"line_number":399,"context_line":"                seg_req.get_response(self.app, \u0027PUT\u0027, seg_container, \u0027\u0027,"},{"line_number":400,"context_line":"                                     headers\u003dheaders)"},{"line_number":401,"context_line":"            except (BucketAlreadyExists, BucketAlreadyOwnedByYou):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_25c1ec4e","line":398,"updated":"2019-08-20 23:39:37.000000000","message":"What is going to happen if a user supplied an invalid policy name (this is name, right? not index?)?","commit_id":"d53486bca8173f64a876fae4a8f410d22a885198"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"a98cae701ed30a33aabc7363dd60c0307a1b1a04","unresolved":false,"context_lines":[{"line_number":395,"context_line":"                if info.get(\u0027derived_container_storage_policy\u0027):"},{"line_number":396,"context_line":"                    headers \u003d {"},{"line_number":397,"context_line":"                        \u0027X-Storage-Policy\u0027:"},{"line_number":398,"context_line":"                        info[\u0027derived_container_storage_policy\u0027]}"},{"line_number":399,"context_line":"                seg_req.get_response(self.app, \u0027PUT\u0027, seg_container, \u0027\u0027,"},{"line_number":400,"context_line":"                                     headers\u003dheaders)"},{"line_number":401,"context_line":"            except (BucketAlreadyExists, BucketAlreadyOwnedByYou):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_1ac83b1f","line":398,"in_reply_to":"7faddb67_25c1ec4e","updated":"2019-08-29 12:38:33.000000000","message":"it is the name, but it was validated[0] during container PUT. should we no longer trust it? should it be validated again?\n \n[0] - https://review.opendev.org/#/c/676959/2/swift/proxy/controllers/container.py@266","commit_id":"d53486bca8173f64a876fae4a8f410d22a885198"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4567d60517476b0a9b9792fb44f78048bd0e9056","unresolved":false,"context_lines":[{"line_number":390,"context_line":"                if info.get(\u0027derived_container_storage_policy\u0027):"},{"line_number":391,"context_line":"                    headers \u003d {"},{"line_number":392,"context_line":"                        \u0027X-Storage-Policy\u0027:"},{"line_number":393,"context_line":"                        info[\u0027derived_container_storage_policy\u0027]}"},{"line_number":394,"context_line":"                else:"},{"line_number":395,"context_line":"                    # If not set by user, look at option defined by operator"},{"line_number":396,"context_line":"                    if self.conf.derived_container_policy_use_default:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_eac48694","line":393,"updated":"2019-10-07 20:44:09.000000000","message":"this seems slightly precarious, but I think it works\n\ninfo might be cached, so the \u0027derived_container_storage_policy\u0027 key might be missing - but we do a .get above and only fall here if the key exists *and* the value is truthy\n\nI doubt we\u0027d ever do anything to make the header value an integer, but if we did this code might have trouble with an integer index 0 evaluating as false","commit_id":"c13529beac75a52bb3b30e7a1d6f4e86ad69a51e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4567d60517476b0a9b9792fb44f78048bd0e9056","unresolved":false,"context_lines":[{"line_number":397,"context_line":"                        headers \u003d None"},{"line_number":398,"context_line":"                    else:"},{"line_number":399,"context_line":"                        policy_name \u003d POLICIES[info[\u0027storage_policy\u0027]].name"},{"line_number":400,"context_line":"                        headers \u003d {\u0027X-Storage-Policy\u0027: policy_name}"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"                seg_req.get_response(self.app, \u0027PUT\u0027, seg_container, \u0027\u0027,"},{"line_number":403,"context_line":"                                     headers\u003dheaders)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_cab98a15","line":400,"updated":"2019-10-07 20:44:09.000000000","message":"so barring any setup, effort or configuration from the operator or user we\u0027ll just use whatever policy is set for the parent container\n\n... which is really the crux of the whole issue - so, that\u0027s good","commit_id":"c13529beac75a52bb3b30e7a1d6f4e86ad69a51e"}],"swift/common/middleware/s3api/s3api.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4567d60517476b0a9b9792fb44f78048bd0e9056","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        self.conf.min_segment_size \u003d config_positive_int_value("},{"line_number":218,"context_line":"            conf.get(\u0027min_segment_size\u0027, 5242880))"},{"line_number":219,"context_line":"        self.conf.derived_container_policy_use_default \u003d config_true_value("},{"line_number":220,"context_line":"            conf.get(\u0027derived_container_policy_use_default\u0027, True))"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        self.logger \u003d get_logger("},{"line_number":223,"context_line":"            conf, log_route\u003dconf.get(\u0027log_name\u0027, \u0027s3api\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_4a803a47","line":220,"updated":"2019-10-07 20:44:09.000000000","message":"here the conf is the filter:s3api section, correct?","commit_id":"c13529beac75a52bb3b30e7a1d6f4e86ad69a51e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"23a04c6657d90827f75ab81ad78454840db5e4ce","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        self.conf.min_segment_size \u003d config_positive_int_value("},{"line_number":218,"context_line":"            conf.get(\u0027min_segment_size\u0027, 5242880))"},{"line_number":219,"context_line":"        self.conf.derived_container_policy_use_default \u003d config_true_value("},{"line_number":220,"context_line":"            conf.get(\u0027derived_container_policy_use_default\u0027, True))"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        self.logger \u003d get_logger("},{"line_number":223,"context_line":"            conf, log_route\u003dconf.get(\u0027log_name\u0027, \u0027s3api\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_b6403437","line":220,"in_reply_to":"3fa7e38b_4a803a47","updated":"2019-10-07 22:25:44.000000000","message":"The default here really should be False - or it doesn\u0027t really FIX the bug\n\nHonestly I\u0027m not sure who would ever possibly want the legacy/existing behavior - aws doesn\u0027t have anything like \"derived containers\" - your segments always inherit the storage class of the bucket you\u0027re uploading too","commit_id":"c13529beac75a52bb3b30e7a1d6f4e86ad69a51e"}],"swift/container/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4567d60517476b0a9b9792fb44f78048bd0e9056","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    # Ensure these are all lowercase"},{"line_number":90,"context_line":"    save_headers \u003d [\u0027x-container-read\u0027, \u0027x-container-write\u0027,"},{"line_number":91,"context_line":"                    \u0027x-container-sync-key\u0027, \u0027x-container-sync-to\u0027,"},{"line_number":92,"context_line":"                    \u0027x-derived-container-storage-policy\u0027]"},{"line_number":93,"context_line":"    server_type \u003d \u0027container-server\u0027"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def __init__(self, conf, logger\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_cab2ea49","line":92,"updated":"2019-10-07 20:44:09.000000000","message":"one of the many benefits of always using sysmeta for system metadata is that we don\u0027t have to remember to update all these damn lists.","commit_id":"c13529beac75a52bb3b30e7a1d6f4e86ad69a51e"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4567d60517476b0a9b9792fb44f78048bd0e9056","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            \u0027max_age\u0027: meta.get(\u0027access-control-max-age\u0027)"},{"line_number":193,"context_line":"        },"},{"line_number":194,"context_line":"        \u0027meta\u0027: meta,"},{"line_number":195,"context_line":"        \u0027sysmeta\u0027: sysmeta,"},{"line_number":196,"context_line":"        \u0027sharding_state\u0027: headers.get(\u0027x-backend-sharding-state\u0027, \u0027unsharded\u0027),"},{"line_number":197,"context_line":"    }"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_2af29e07","line":195,"updated":"2019-10-07 20:44:09.000000000","message":"I think it might be acceptable to just leave it in sysmeta rather than a top-level key... i\u0027m not sure we have a strong convention here","commit_id":"c13529beac75a52bb3b30e7a1d6f4e86ad69a51e"}],"swift/proxy/controllers/container.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4567d60517476b0a9b9792fb44f78048bd0e9056","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    # Ensure these are all lowercase"},{"line_number":38,"context_line":"    pass_through_headers \u003d [\u0027x-container-read\u0027, \u0027x-container-write\u0027,"},{"line_number":39,"context_line":"                            \u0027x-container-sync-key\u0027, \u0027x-container-sync-to\u0027,"},{"line_number":40,"context_line":"                            \u0027x-derived-container-storage-policy\u0027,"},{"line_number":41,"context_line":"                            \u0027x-versions-location\u0027]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self, app, account_name, container_name, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_6a75f697","line":40,"updated":"2019-10-07 20:44:09.000000000","message":"Using this form of container metadata is generally considered legacy - we use sysmeta for this kind of thing now.","commit_id":"c13529beac75a52bb3b30e7a1d6f4e86ad69a51e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4567d60517476b0a9b9792fb44f78048bd0e9056","unresolved":false,"context_lines":[{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        # validate \u0027X-Derivative-Storage-Policy\u0027"},{"line_number":267,"context_line":"        self._convert_policy_to_index("},{"line_number":268,"context_line":"            req, \u0027X-Derived-Container-Storage-Policy\u0027)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        if not req.environ.get(\u0027swift_owner\u0027):"},{"line_number":271,"context_line":"            for key in self.app.swift_owner_headers:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_aa620ed7","line":268,"updated":"2019-10-07 20:44:09.000000000","message":"we should really be *translating* here not just verifying\n\nit\u0027s not ok to store the storage policy *name* - we should write down the *index*\n\nvagrant@saio:~$ sqlite3 /srv/node1/sdb1/containers/52/c64/d13dee9839ead7f68b1734b0d607dc64/d13dee9839ead7f68b1734b0d607dc64.db \"select metadata from container_info;\" | jq\n{\n  \"X-Derived-Container-Storage-Policy\": [\n    \"ec\",\n    \"1570479427.61414\"\n  ]\n}","commit_id":"c13529beac75a52bb3b30e7a1d6f4e86ad69a51e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"72c6830f396424bf347187917217be680ad3e09c","unresolved":false,"context_lines":[{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        # validate \u0027X-Derivative-Storage-Policy\u0027"},{"line_number":267,"context_line":"        self._convert_policy_to_index("},{"line_number":268,"context_line":"            req, \u0027X-Derived-Container-Storage-Policy\u0027)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        if not req.environ.get(\u0027swift_owner\u0027):"},{"line_number":271,"context_line":"            for key in self.app.swift_owner_headers:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_934aeaa9","line":268,"in_reply_to":"3fa7e38b_aa620ed7","updated":"2019-10-07 22:05:42.000000000","message":"+1, names can change and operators won\u0027t necessarily add aliases for the old names.","commit_id":"c13529beac75a52bb3b30e7a1d6f4e86ad69a51e"}]}
