)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dc381ee316c49cc3d96a6c8b0b905d2049ebe1c0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"6b32b9fe_5a671fad","updated":"2023-06-21 23:27:46.000000000","message":"Look at all those rebases!\n\nHaving re-read the *excellent* commit message, only 1) the operational cavets/limitations with other features and 2) lack of swift api support stand out as problematic in spirit for suitibility upstream.  Perhaps there\u0027s some nitty gritty details that are worse than I remember, but who cares if it works.  In fact, if we could have async deletes as opt-in with an eye towards default and fully supported across the features we want to maintain.... that seems worth pursuing better than abandoning!","commit_id":"b7408c2a1cbbc1869df97f710277837a4242a14d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"42b60050850961d1d4d44611c8078b774fc43344","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"dd42c0b8_be5e3ab0","in_reply_to":"6b32b9fe_5a671fad","updated":"2023-10-16 18:01:37.000000000","message":"IDK if this falls under the \"operational caveats\" you mentioned, but I think the ability to delete the container following s3-multi-deleting all the contents but before the expirer has had a chance to actually get data off disk is still a pretty big problem. I could very much see this feature being used by a client wanting to correct a misconfigured storage policy, and my memory is that the current failure mode would result in a bunch of dark data.","commit_id":"b7408c2a1cbbc1869df97f710277837a4242a14d"}],"swift/common/middleware/s3api/controllers/multi_delete.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7623e8e72b40e8e9c534fd0280adba695993d7b8","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                \u0027swift.authorize_override\u0027: True,"},{"line_number":145,"context_line":"                \u0027REMOTE_USER\u0027: \u0027.wsgi.pre_authed\u0027,"},{"line_number":146,"context_line":"            }"},{"line_number":147,"context_line":"            resp \u003d Request.blank("},{"line_number":148,"context_line":"                path\u003d\"/v1/.expiring_objects/%d\" % int(ts), method\u003d\u0027PUT\u0027,"},{"line_number":149,"context_line":"                environ\u003dpre_auth_env,"},{"line_number":150,"context_line":"            ).get_response(self.app)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_eade3968","line":147,"updated":"2019-03-28 18:32:34.000000000","message":"This should almost certainly be using make_pre_authed_request() instead -- I was being lazy/expedient.","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"723c5ab87dd8b9b2e5f5fce3709219950e97ba3d","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            if not resp.is_success:"},{"line_number":152,"context_line":"                self.logger.error(\u0027Failed to create expiration queue: %s\\n%s\u0027,"},{"line_number":153,"context_line":"                                  resp.status, resp.body)"},{"line_number":154,"context_line":"                return ServiceUnavailable()"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"            resp \u003d Request.blank("},{"line_number":157,"context_line":"                path\u003d\"/v1/.expiring_objects/%d\" % int(ts), method\u003d\u0027REPLICATE\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_f16077d1","line":154,"updated":"2019-03-28 16:03:17.000000000","message":"did you happen to check what the subsequent REPLICATE request does if you pull this out?","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7e1c571c5cd1c8768d3a2fa8f9db8aa94341e5d9","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            if not resp.is_success:"},{"line_number":152,"context_line":"                self.logger.error(\u0027Failed to create expiration queue: %s\\n%s\u0027,"},{"line_number":153,"context_line":"                                  resp.status, resp.body)"},{"line_number":154,"context_line":"                return ServiceUnavailable()"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"            resp \u003d Request.blank("},{"line_number":157,"context_line":"                path\u003d\"/v1/.expiring_objects/%d\" % int(ts), method\u003d\u0027REPLICATE\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_870690cd","line":154,"in_reply_to":"5fc1f717_f16077d1","updated":"2019-03-28 18:06:44.000000000","message":"It\u0027ll 404 -- otherwise I wouldn\u0027t have bothered ;-)","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"723c5ab87dd8b9b2e5f5fce3709219950e97ba3d","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                self.app, method\u003d\u0027REPLICATE\u0027,"},{"line_number":171,"context_line":"                body\u003djson.dumps(dest_container_body),"},{"line_number":172,"context_line":"                headers\u003d{\u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":173,"context_line":"                         \u0027X-Backend-Replicate-Request\u0027: \u0027true\u0027})"},{"line_number":174,"context_line":"            if not resp.is_success:"},{"line_number":175,"context_line":"                return resp"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_f147174b","line":173,"updated":"2019-03-28 16:03:17.000000000","message":"I thought it would be weird to see REPLICATE requests going through the app... but... it\u0027s not obviously insane...","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7e1c571c5cd1c8768d3a2fa8f9db8aa94341e5d9","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                self.app, method\u003d\u0027REPLICATE\u0027,"},{"line_number":171,"context_line":"                body\u003djson.dumps(dest_container_body),"},{"line_number":172,"context_line":"                headers\u003d{\u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":173,"context_line":"                         \u0027X-Backend-Replicate-Request\u0027: \u0027true\u0027})"},{"line_number":174,"context_line":"            if not resp.is_success:"},{"line_number":175,"context_line":"                return resp"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_4725085b","line":173,"in_reply_to":"5fc1f717_f147174b","updated":"2019-03-28 18:06:44.000000000","message":"I just didn\u0027t like the idea of having the proxy making backend requests on the client\u0027s behalf without logging them. *shrug*","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7623e8e72b40e8e9c534fd0280adba695993d7b8","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                query \u003d req.gen_multipart_manifest_delete_query(self.app)"},{"line_number":186,"context_line":"                resp \u003d req.get_response(self.app, method\u003d\u0027DELETE\u0027, query\u003dquery,"},{"line_number":187,"context_line":"                                        headers\u003d{\u0027Accept\u0027: \u0027application/json\u0027})"},{"line_number":188,"context_line":"                # Have to read the response to actually do the SLO delete"},{"line_number":189,"context_line":"                if query:"},{"line_number":190,"context_line":"                    try:"},{"line_number":191,"context_line":"                        delete_result \u003d json.loads(resp.body)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_0a4ce53f","line":188,"range":{"start_line":188,"start_character":63,"end_line":188,"end_character":73},"updated":"2019-03-28 18:32:34.000000000","message":"Oh GDI -- this doesn\u0027t play well with MPUs at *all*...","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"92048149171305ea3956f0cbb89ef8d53ee7c12b","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            # TODO: support deleting specific versions of objects"},{"line_number":112,"context_line":"            raise S3NotImplemented()"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        if not self.conf.s3_acl and not self.conf.allow_multipart_uploads:"},{"line_number":115,"context_line":"            # NOTE(tburke): i have no idea how to make this work with"},{"line_number":116,"context_line":"            #               per-object ACLs or multipart uplaods :-("},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3fce034c_7c6849b8","line":114,"updated":"2019-04-18 19:31:54.000000000","message":"Can an operator want to disallow s3_acl \u0026 multipart_uploads - but also still want a DELETE to mean \"tombstones are on disk\"","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"97b0d9dbd55058b71071e2e56c0beb38265aa01f","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            # TODO: support deleting specific versions of objects"},{"line_number":112,"context_line":"            raise S3NotImplemented()"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        if not self.conf.s3_acl and not self.conf.allow_multipart_uploads:"},{"line_number":115,"context_line":"            # NOTE(tburke): i have no idea how to make this work with"},{"line_number":116,"context_line":"            #               per-object ACLs or multipart uplaods :-("},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ffb9cba7_e3cb6250","line":114,"in_reply_to":"3fce034c_7c6849b8","updated":"2019-04-24 20:12:24.000000000","message":"++ definitely deserves its own config option, and we should have it forced to false (with a warning, of course) if either of the above options would cause complications. Possibly even have the proxy refuse to start.","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3fd12af04f12fd527622b95c39c3e7500191a6b2","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            exp_queue_body \u003d []"},{"line_number":121,"context_line":"            dest_container_body \u003d []"},{"line_number":122,"context_line":"            dest_storage_policy \u003d int(head_resp.headers.get("},{"line_number":123,"context_line":"                \u0027x-backend-storage-policy-index\u0027, 0))"},{"line_number":124,"context_line":"            for key, _ in delete_list:"},{"line_number":125,"context_line":"                # NB: no ROWIDs"},{"line_number":126,"context_line":"                exp_queue_body.append({"}],"source_content_type":"text/x-python","patch_set":5,"id":"dfbec78f_0a5eaee5","line":123,"range":{"start_line":123,"start_character":16,"end_line":123,"end_character":48},"updated":"2019-05-09 16:50:09.000000000","message":"This isn\u0027t (necessarily?) present... When hitting a container with storage-policy 1, I saw this patch still UPDATEing with SP0. I *think* this caused further issues since the expirer would be using the exact same timestamp but with the *right* storage policy... Maybe the expirer entry should bump offset?","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fdba66e6c0a6ab4778dbbee5fc246c261bb6d102","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            exp_queue_body \u003d []"},{"line_number":121,"context_line":"            dest_container_body \u003d []"},{"line_number":122,"context_line":"            dest_storage_policy \u003d int(head_resp.headers.get("},{"line_number":123,"context_line":"                \u0027x-backend-storage-policy-index\u0027, 0))"},{"line_number":124,"context_line":"            for key, _ in delete_list:"},{"line_number":125,"context_line":"                # NB: no ROWIDs"},{"line_number":126,"context_line":"                exp_queue_body.append({"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_ffeea3b2","line":123,"range":{"start_line":123,"start_character":16,"end_line":123,"end_character":48},"in_reply_to":"dfbec78f_0a5eaee5","updated":"2019-05-21 20:05:31.000000000","message":"Done -- just go get_container_info; it\u0027s already cached anyway.","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0e881aa67d064bd88d32aee53106984b809a0907","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                    \"name\": \"%d-%s/%s/%s\" % (int(ts), req.account,"},{"line_number":128,"context_line":"                                             req.container_name, key),"},{"line_number":129,"context_line":"                    \"deleted\": 0, \"created_at\": ts.internal,"},{"line_number":130,"context_line":"                    \"storage_policy_index\": 0, \"etag\": MD5_OF_EMPTY_STRING,"},{"line_number":131,"context_line":"                    # NB: normal expiring object queue uses text/plain;"},{"line_number":132,"context_line":"                    # use a special content-type to indicate we shouldn\u0027t"},{"line_number":133,"context_line":"                    # include x-if-delete-at"}],"source_content_type":"text/x-python","patch_set":5,"id":"ffb9cba7_2c1fd05b","line":130,"range":{"start_line":130,"start_character":20,"end_line":130,"end_character":45},"updated":"2019-04-30 17:43:36.000000000","message":"We need to specify the storage policy index in the PUT below, or these rows can get gummed up in the reconciler and never get processed.\n\nSP 0 is not necessarily the default policy, Tim! There may not even *be* a policy 0!","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fdba66e6c0a6ab4778dbbee5fc246c261bb6d102","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                    \"name\": \"%d-%s/%s/%s\" % (int(ts), req.account,"},{"line_number":128,"context_line":"                                             req.container_name, key),"},{"line_number":129,"context_line":"                    \"deleted\": 0, \"created_at\": ts.internal,"},{"line_number":130,"context_line":"                    \"storage_policy_index\": 0, \"etag\": MD5_OF_EMPTY_STRING,"},{"line_number":131,"context_line":"                    # NB: normal expiring object queue uses text/plain;"},{"line_number":132,"context_line":"                    # use a special content-type to indicate we shouldn\u0027t"},{"line_number":133,"context_line":"                    # include x-if-delete-at"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_ff4303ae","line":130,"range":{"start_line":130,"start_character":20,"end_line":130,"end_character":45},"in_reply_to":"dfbec78f_05df33d6","updated":"2019-05-21 20:05:31.000000000","message":"Further, expirer queues *always* use SP0 -- the tooling introduced in the parent change makes this a bit easier to think about.","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3904ba65926ec01d81905429aa2e33d8d7430c93","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                    \"name\": \"%d-%s/%s/%s\" % (int(ts), req.account,"},{"line_number":128,"context_line":"                                             req.container_name, key),"},{"line_number":129,"context_line":"                    \"deleted\": 0, \"created_at\": ts.internal,"},{"line_number":130,"context_line":"                    \"storage_policy_index\": 0, \"etag\": MD5_OF_EMPTY_STRING,"},{"line_number":131,"context_line":"                    # NB: normal expiring object queue uses text/plain;"},{"line_number":132,"context_line":"                    # use a special content-type to indicate we shouldn\u0027t"},{"line_number":133,"context_line":"                    # include x-if-delete-at"}],"source_content_type":"text/x-python","patch_set":5,"id":"dfbec78f_05df33d6","line":130,"range":{"start_line":130,"start_character":20,"end_line":130,"end_character":45},"in_reply_to":"ffb9cba7_2c1fd05b","updated":"2019-05-14 21:47:46.000000000","message":"Correction: there *must* be a policy 0, but it may be deprecated.","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"92048149171305ea3956f0cbb89ef8d53ee7c12b","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                    \"name\": key, \"deleted\": 1, \"created_at\": ts.internal,"},{"line_number":137,"context_line":"                    \"storage_policy_index\": dest_storage_policy,"},{"line_number":138,"context_line":"                    \"etag\": \"noetag\","},{"line_number":139,"context_line":"                    \"content_type\": \"application/deleted\", \"size\": 0})"},{"line_number":140,"context_line":"                if not self.quiet:"},{"line_number":141,"context_line":"                    deleted \u003d SubElement(elem, \u0027Deleted\u0027)"},{"line_number":142,"context_line":"                    SubElement(deleted, \u0027Key\u0027).text \u003d key"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fce034c_9cf095ff","line":139,"updated":"2019-04-18 19:31:54.000000000","message":"I think it\u0027ll help future us debug a mess if we make the content_type something informative like \"bulk-deleted\" or \"async-deleted\"\n\nLike the expirer eventually reap the row and replace it with application/deleted","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"97b0d9dbd55058b71071e2e56c0beb38265aa01f","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                    \"name\": key, \"deleted\": 1, \"created_at\": ts.internal,"},{"line_number":137,"context_line":"                    \"storage_policy_index\": dest_storage_policy,"},{"line_number":138,"context_line":"                    \"etag\": \"noetag\","},{"line_number":139,"context_line":"                    \"content_type\": \"application/deleted\", \"size\": 0})"},{"line_number":140,"context_line":"                if not self.quiet:"},{"line_number":141,"context_line":"                    deleted \u003d SubElement(elem, \u0027Deleted\u0027)"},{"line_number":142,"context_line":"                    SubElement(deleted, \u0027Key\u0027).text \u003d key"}],"source_content_type":"text/x-python","patch_set":5,"id":"ffb9cba7_63dd3213","line":139,"in_reply_to":"3fce034c_9cf095ff","updated":"2019-04-24 20:12:24.000000000","message":"The more we track state here, the more I feel like we ought to be pulling work from here, too... save us the extra PUT \u0026 UPDATE.","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"42b60050850961d1d4d44611c8078b774fc43344","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                    \"name\": key, \"deleted\": 1, \"created_at\": ts.internal,"},{"line_number":137,"context_line":"                    \"storage_policy_index\": dest_storage_policy,"},{"line_number":138,"context_line":"                    \"etag\": \"noetag\","},{"line_number":139,"context_line":"                    \"content_type\": \"application/deleted\", \"size\": 0})"},{"line_number":140,"context_line":"                if not self.quiet:"},{"line_number":141,"context_line":"                    deleted \u003d SubElement(elem, \u0027Deleted\u0027)"},{"line_number":142,"context_line":"                    SubElement(deleted, \u0027Key\u0027).text \u003d key"}],"source_content_type":"text/x-python","patch_set":5,"id":"e3607e47_1f3ed700","line":139,"in_reply_to":"8a64a82c_9ec081a6","updated":"2023-10-16 18:01:37.000000000","message":"Still a neat idea, yeah, but I can\u0027t tell whether it\u0027s moving us closer or further away from (what I think is) our *real* goal: fully consistent listings. I\u0027ve got this suspicion that it would just be a further complication toward us being able to ever deliver that.","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0e881aa67d064bd88d32aee53106984b809a0907","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                    \"name\": key, \"deleted\": 1, \"created_at\": ts.internal,"},{"line_number":137,"context_line":"                    \"storage_policy_index\": dest_storage_policy,"},{"line_number":138,"context_line":"                    \"etag\": \"noetag\","},{"line_number":139,"context_line":"                    \"content_type\": \"application/deleted\", \"size\": 0})"},{"line_number":140,"context_line":"                if not self.quiet:"},{"line_number":141,"context_line":"                    deleted \u003d SubElement(elem, \u0027Deleted\u0027)"},{"line_number":142,"context_line":"                    SubElement(deleted, \u0027Key\u0027).text \u003d key"}],"source_content_type":"text/x-python","patch_set":5,"id":"ffb9cba7_6c7708a2","line":139,"in_reply_to":"ffb9cba7_63dd3213","updated":"2019-04-30 17:43:36.000000000","message":"I\u0027m starting to wonder if we should have a deleted\u003d2 state that keeps the object out of listings, but considers it for stats and whether the container can be deleted...","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dc381ee316c49cc3d96a6c8b0b905d2049ebe1c0","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                    \"name\": key, \"deleted\": 1, \"created_at\": ts.internal,"},{"line_number":137,"context_line":"                    \"storage_policy_index\": dest_storage_policy,"},{"line_number":138,"context_line":"                    \"etag\": \"noetag\","},{"line_number":139,"context_line":"                    \"content_type\": \"application/deleted\", \"size\": 0})"},{"line_number":140,"context_line":"                if not self.quiet:"},{"line_number":141,"context_line":"                    deleted \u003d SubElement(elem, \u0027Deleted\u0027)"},{"line_number":142,"context_line":"                    SubElement(deleted, \u0027Key\u0027).text \u003d key"}],"source_content_type":"text/x-python","patch_set":5,"id":"8a64a82c_9ec081a6","line":139,"in_reply_to":"ffb9cba7_6c7708a2","updated":"2023-06-21 23:27:46.000000000","message":"deleted\u003d2 is still a neat idea!","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3904ba65926ec01d81905429aa2e33d8d7430c93","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                req.environ,"},{"line_number":148,"context_line":"                method\u003d\u0027PUT\u0027,"},{"line_number":149,"context_line":"                path\u003d\"/v1/.expiring_objects/%d\" % int(ts),"},{"line_number":150,"context_line":"            ).get_response(self.app)"},{"line_number":151,"context_line":"            if not resp.is_success:"},{"line_number":152,"context_line":"                self.logger.error(\u0027Failed to create expiration queue: %s\\n%s\u0027,"},{"line_number":153,"context_line":"                                  resp.status, resp.body)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dfbec78f_e5fa1f41","line":150,"updated":"2019-05-14 21:47:46.000000000","message":"This PUT seems like it should be unnecessary -- surely we could have it auto-create like we do when pushing a singular object update?","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fdba66e6c0a6ab4778dbbee5fc246c261bb6d102","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                req.environ,"},{"line_number":148,"context_line":"                method\u003d\u0027PUT\u0027,"},{"line_number":149,"context_line":"                path\u003d\"/v1/.expiring_objects/%d\" % int(ts),"},{"line_number":150,"context_line":"            ).get_response(self.app)"},{"line_number":151,"context_line":"            if not resp.is_success:"},{"line_number":152,"context_line":"                self.logger.error(\u0027Failed to create expiration queue: %s\\n%s\u0027,"},{"line_number":153,"context_line":"                                  resp.status, resp.body)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_bf7cabeb","line":150,"in_reply_to":"dfbec78f_e5fa1f41","updated":"2019-05-21 20:05:31.000000000","message":"Done","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"92048149171305ea3956f0cbb89ef8d53ee7c12b","unresolved":false,"context_lines":[{"line_number":187,"context_line":"            req.object_name \u003d key"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"            try:"},{"line_number":190,"context_line":"                query \u003d req.gen_multipart_manifest_delete_query(self.app)"},{"line_number":191,"context_line":"                resp \u003d req.get_response(self.app, method\u003d\u0027DELETE\u0027, query\u003dquery,"},{"line_number":192,"context_line":"                                        headers\u003d{\u0027Accept\u0027: \u0027application/json\u0027})"},{"line_number":193,"context_line":"                # Have to read the response to actually do the SLO delete"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fce034c_bc59d135","line":190,"updated":"2019-04-18 19:31:54.000000000","message":"Can we make this HEAD request conditional on self.conf.allow_multipart_uploads?","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"97b0d9dbd55058b71071e2e56c0beb38265aa01f","unresolved":false,"context_lines":[{"line_number":187,"context_line":"            req.object_name \u003d key"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"            try:"},{"line_number":190,"context_line":"                query \u003d req.gen_multipart_manifest_delete_query(self.app)"},{"line_number":191,"context_line":"                resp \u003d req.get_response(self.app, method\u003d\u0027DELETE\u0027, query\u003dquery,"},{"line_number":192,"context_line":"                                        headers\u003d{\u0027Accept\u0027: \u0027application/json\u0027})"},{"line_number":193,"context_line":"                # Have to read the response to actually do the SLO delete"}],"source_content_type":"text/x-python","patch_set":5,"id":"ffb9cba7_63069289","line":190,"in_reply_to":"3fce034c_bc59d135","updated":"2019-04-24 20:12:24.000000000","message":"Maybe not a bad idea. Still gotta worry about bimodal access and changing configs over time... hrm...","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fdba66e6c0a6ab4778dbbee5fc246c261bb6d102","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            # TODO: support deleting specific versions of objects"},{"line_number":116,"context_line":"            raise S3NotImplemented()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        if not self.conf.s3_acl and not self.conf.allow_multipart_uploads:"},{"line_number":119,"context_line":"            # NOTE(tburke): i have no idea how to make this work with"},{"line_number":120,"context_line":"            #               per-object ACLs or multipart uplaods :-("},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bfb3d3c7_bf090b96","line":118,"updated":"2019-05-21 20:05:31.000000000","message":"Still needs its own config option.","commit_id":"ab3f6ba29d746ac096f345248b7cd46a34515861"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8b401368e10e8ac46bad2a7ebc7ab43d2492c94c","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                headers\u003d{"},{"line_number":215,"context_line":"                    \u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":216,"context_line":"                    \u0027X-Backend-Storage-Policy-Index\u0027: str(dest_storage_policy),"},{"line_number":217,"context_line":"                    \u0027X-Backend-Allow-Private-Methods\u0027: \u0027True\u0027})"},{"line_number":218,"context_line":"            if not resp.is_success:"},{"line_number":219,"context_line":"                return resp"},{"line_number":220,"context_line":"            # consume the response (should be short)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fb8cfa7_0eaafd6f","line":217,"updated":"2019-06-11 23:14:34.000000000","message":"so we still have the problem where this allows the client to delete the bucket and then that causes the expirer to not clean up the .data files :grimacing:","commit_id":"a836eee015d1d175aeaaf7e0e1ed42825d9d96f1"}],"swift/common/middleware/s3api/s3api.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8b401368e10e8ac46bad2a7ebc7ab43d2492c94c","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                \u0027use_async_delete is not compatible with s3_acl or \u0027"},{"line_number":228,"context_line":"                \u0027allow_multipart_uploads; it has been disabled\u0027)"},{"line_number":229,"context_line":"            # Alternatively, have the proxy refuse to start."},{"line_number":230,"context_line":"            # We default the async to false; operator opted into it..."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def __call__(self, env, start_response):"},{"line_number":233,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fb8cfa7_e1a3019d","line":230,"updated":"2019-06-11 23:14:34.000000000","message":"I think fail to start would be the most defensible choice\n\nHowever, if we\u0027re going to start, we have a choice of which set of explicitly configured options should we ignore...\n\nAt least this way you get all the client facing features you asked for, and the cluster behavior will be correct... just like... slower I guess?\n\nAt which point they can look at their logs!\n\nSo I think we can defend this design as well.","commit_id":"a836eee015d1d175aeaaf7e0e1ed42825d9d96f1"}],"swift/common/middleware/s3api/s3request.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"723c5ab87dd8b9b2e5f5fce3709219950e97ba3d","unresolved":false,"context_lines":[{"line_number":1178,"context_line":"                ],"},{"line_number":1179,"context_line":"                \u0027REPLICATE\u0027: [  # used for bulk deletes"},{"line_number":1180,"context_line":"                    HTTP_ACCEPTED,"},{"line_number":1181,"context_line":"                ],"},{"line_number":1182,"context_line":"            }"},{"line_number":1183,"context_line":"        else:"},{"line_number":1184,"context_line":"            # Swift object access."}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_b1eaef0b","line":1181,"updated":"2019-03-28 16:03:17.000000000","message":"interesting...","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"723c5ab87dd8b9b2e5f5fce3709219950e97ba3d","unresolved":false,"context_lines":[{"line_number":1254,"context_line":"                    HTTP_CONFLICT: BucketNotEmpty,"},{"line_number":1255,"context_line":"                },"},{"line_number":1256,"context_line":"                \u0027REPLICATE\u0027: {"},{"line_number":1257,"context_line":"                },"},{"line_number":1258,"context_line":"            }"},{"line_number":1259,"context_line":"        else:"},{"line_number":1260,"context_line":"            # Swift object access."}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_d188db71","line":1257,"updated":"2019-03-28 16:03:17.000000000","message":"what what now?  something has broken our abstraction layers here...","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"}],"swift/container/server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"06fc714a07097dc1cf72cf46dad6a6257efd68ca","unresolved":false,"context_lines":[{"line_number":744,"context_line":"        if not self.check_free_space(drive):"},{"line_number":745,"context_line":"            return HTTPInsufficientStorage(drive\u003ddrive, request\u003dreq)"},{"line_number":746,"context_line":"        self.logger.warning(req.headers.get(\u0027content-length\u0027))"},{"line_number":747,"context_line":"        self.logger.warning(req.body)"},{"line_number":748,"context_line":"        try:"},{"line_number":749,"context_line":"            args \u003d json.loads(req.body)"},{"line_number":750,"context_line":"        except ValueError as err:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_9694978c","line":747,"updated":"2019-03-27 23:19:33.000000000","message":"Axe all of this -- I was debugging why I wasn\u0027t actually getting any request body.","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0d87f92c0f5ad33045d631cce30a8ce72f63459c","unresolved":false,"context_lines":[{"line_number":744,"context_line":"        if not self.check_free_space(drive):"},{"line_number":745,"context_line":"            return HTTPInsufficientStorage(drive\u003ddrive, request\u003dreq)"},{"line_number":746,"context_line":"        self.logger.warning(req.headers.get(\u0027content-length\u0027))"},{"line_number":747,"context_line":"        self.logger.warning(req.body)"},{"line_number":748,"context_line":"        try:"},{"line_number":749,"context_line":"            args \u003d json.loads(req.body)"},{"line_number":750,"context_line":"        except ValueError as err:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_0a8aa5bd","line":747,"in_reply_to":"5fc1f717_9694978c","updated":"2019-03-28 19:08:18.000000000","message":"Done","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"}],"swift/obj/expirer.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"06fc714a07097dc1cf72cf46dad6a6257efd68ca","unresolved":false,"context_lines":[{"line_number":239,"context_line":"                       \u0027target_path\u0027: \u0027/\u0027.join(["},{"line_number":240,"context_line":"                           target_account, target_container, target_object]),"},{"line_number":241,"context_line":"                       \u0027delete_timestamp\u0027: delete_timestamp,"},{"line_number":242,"context_line":"                       \u0027is_bulk_delete\u0027: o[\u0027content_type\u0027] \u003d\u003d \u0027application/bulkdelete\u0027}"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def run_once(self, *args, **kwargs):"},{"line_number":245,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_366b6385","line":242,"range":{"start_line":242,"start_character":63,"end_line":242,"end_character":85},"updated":"2019-03-27 23:19:33.000000000","message":"application/bulk-deleted, from the middleware code","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0d87f92c0f5ad33045d631cce30a8ce72f63459c","unresolved":false,"context_lines":[{"line_number":239,"context_line":"                       \u0027target_path\u0027: \u0027/\u0027.join(["},{"line_number":240,"context_line":"                           target_account, target_container, target_object]),"},{"line_number":241,"context_line":"                       \u0027delete_timestamp\u0027: delete_timestamp,"},{"line_number":242,"context_line":"                       \u0027is_bulk_delete\u0027: o[\u0027content_type\u0027] \u003d\u003d \u0027application/bulkdelete\u0027}"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def run_once(self, *args, **kwargs):"},{"line_number":245,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_2aae812d","line":242,"range":{"start_line":242,"start_character":63,"end_line":242,"end_character":85},"in_reply_to":"5fc1f717_366b6385","updated":"2019-03-28 19:08:18.000000000","message":"Done","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"06fc714a07097dc1cf72cf46dad6a6257efd68ca","unresolved":false,"context_lines":[{"line_number":420,"context_line":"        headers \u003d {"},{"line_number":421,"context_line":"            \u0027X-Timestamp\u0027: timestamp.normal,"},{"line_number":422,"context_line":"            \u0027X-Backend-Clean-Expiring-Object-Queue\u0027: \u0027no\u0027}"},{"line_number":423,"context_line":"        if is_bulk_delete:"},{"line_number":424,"context_line":"            headers[\u0027X-If-Delete-At\u0027] \u003d timestamp.normal"},{"line_number":425,"context_line":"        self.swift.make_request("},{"line_number":426,"context_line":"            \u0027DELETE\u0027, path, headers,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_f6615baa","line":423,"updated":"2019-03-27 23:19:33.000000000","message":"if *not* is_bulk_delete!","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0d87f92c0f5ad33045d631cce30a8ce72f63459c","unresolved":false,"context_lines":[{"line_number":420,"context_line":"        headers \u003d {"},{"line_number":421,"context_line":"            \u0027X-Timestamp\u0027: timestamp.normal,"},{"line_number":422,"context_line":"            \u0027X-Backend-Clean-Expiring-Object-Queue\u0027: \u0027no\u0027}"},{"line_number":423,"context_line":"        if is_bulk_delete:"},{"line_number":424,"context_line":"            headers[\u0027X-If-Delete-At\u0027] \u003d timestamp.normal"},{"line_number":425,"context_line":"        self.swift.make_request("},{"line_number":426,"context_line":"            \u0027DELETE\u0027, path, headers,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_caa81d21","line":423,"in_reply_to":"5fc1f717_f6615baa","updated":"2019-03-28 19:08:18.000000000","message":"Done","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9455bb91de34a75ae96e9f8cfac9d3b2c79aebed","unresolved":false,"context_lines":[{"line_number":422,"context_line":"        path \u003d \u0027/v1/\u0027 + urllib.parse.quote(actual_obj.lstrip(\u0027/\u0027))"},{"line_number":423,"context_line":"        headers \u003d {"},{"line_number":424,"context_line":"            \u0027X-Timestamp\u0027: timestamp.normal,"},{"line_number":425,"context_line":"            \u0027X-Backend-Clean-Expiring-Object-Queue\u0027: \u0027no\u0027}"},{"line_number":426,"context_line":"        if not is_bulk_delete:"},{"line_number":427,"context_line":"            headers[\u0027X-If-Delete-At\u0027] \u003d timestamp.normal"},{"line_number":428,"context_line":"        self.swift.make_request("}],"source_content_type":"text/x-python","patch_set":4,"id":"3fce034c_0c563708","line":425,"updated":"2019-04-10 19:08:27.000000000","message":"We maybe *should* clean the expiring-object queue for async deletes? IDK...","commit_id":"99b172c49f637c142f790e8b264ea9717b7da289"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9455bb91de34a75ae96e9f8cfac9d3b2c79aebed","unresolved":false,"context_lines":[{"line_number":427,"context_line":"            headers[\u0027X-If-Delete-At\u0027] \u003d timestamp.normal"},{"line_number":428,"context_line":"        self.swift.make_request("},{"line_number":429,"context_line":"            \u0027DELETE\u0027, path, headers,"},{"line_number":430,"context_line":"            (2, HTTP_CONFLICT))"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fce034c_cc3fcfb3","line":430,"updated":"2019-04-10 19:08:27.000000000","message":"For async-deletes, we should also accept a 404.","commit_id":"99b172c49f637c142f790e8b264ea9717b7da289"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"92048149171305ea3956f0cbb89ef8d53ee7c12b","unresolved":false,"context_lines":[{"line_number":421,"context_line":"        \"\"\""},{"line_number":422,"context_line":"        path \u003d \u0027/v1/\u0027 + urllib.parse.quote(actual_obj.lstrip(\u0027/\u0027))"},{"line_number":423,"context_line":"        headers \u003d {\u0027X-Timestamp\u0027: timestamp.normal}"},{"line_number":424,"context_line":"        acceptable_statuses \u003d (2, HTTP_CONFLICT, HTTP_NOT_FOUND)"},{"line_number":425,"context_line":"        if not is_bulk_delete:"},{"line_number":426,"context_line":"            headers.update({"},{"line_number":427,"context_line":"                \u0027X-If-Delete-At\u0027: timestamp.normal,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fce034c_35d4fdbc","line":424,"updated":"2019-04-18 19:31:54.000000000","message":"the 404 might be coming from the container :\\\n\nif the container is deleted we pop the queue w/o dropping a tombstone","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"97b0d9dbd55058b71071e2e56c0beb38265aa01f","unresolved":false,"context_lines":[{"line_number":421,"context_line":"        \"\"\""},{"line_number":422,"context_line":"        path \u003d \u0027/v1/\u0027 + urllib.parse.quote(actual_obj.lstrip(\u0027/\u0027))"},{"line_number":423,"context_line":"        headers \u003d {\u0027X-Timestamp\u0027: timestamp.normal}"},{"line_number":424,"context_line":"        acceptable_statuses \u003d (2, HTTP_CONFLICT, HTTP_NOT_FOUND)"},{"line_number":425,"context_line":"        if not is_bulk_delete:"},{"line_number":426,"context_line":"            headers.update({"},{"line_number":427,"context_line":"                \u0027X-If-Delete-At\u0027: timestamp.normal,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ffb9cba7_0f7017a5","line":424,"in_reply_to":"3fce034c_35d4fdbc","updated":"2019-04-24 20:12:24.000000000","message":":-(\n\nWell, one probably *terrible* idea on top of this already-dubious one would be to inject a \"this container totally, definitely exists!\" into the internal-client\u0027s req.environ info cache.... there\u0027s still the matter of plumbing in the storage policy, of course....\n\nThis is making me want some notion of a soft delete -- won\u0027t show up in listings but still counts for stats (and as a result, prevents the container from getting deleted)...","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"92048149171305ea3956f0cbb89ef8d53ee7c12b","unresolved":false,"context_lines":[{"line_number":427,"context_line":"                \u0027X-If-Delete-At\u0027: timestamp.normal,"},{"line_number":428,"context_line":"                \u0027X-Backend-Clean-Expiring-Object-Queue\u0027: \u0027no\u0027})"},{"line_number":429,"context_line":"            acceptable_statuses \u003d (2, HTTP_CONFLICT)"},{"line_number":430,"context_line":"        self.swift.make_request(\u0027DELETE\u0027, path, headers, acceptable_statuses)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fce034c_5c4c6d41","line":430,"updated":"2019-04-18 19:31:54.000000000","message":"Internal client will 404 early if the container has been DELETED\n\nhttps://bugs.launchpad.net/swift/+bug/1670565","commit_id":"8adddd8312597c2f2ca914ebb8ab80bdde9be19d"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"06fc714a07097dc1cf72cf46dad6a6257efd68ca","unresolved":false,"context_lines":[{"line_number":1674,"context_line":"                self.app.set_node_timing(node, time.time() - start_node_timing)"},{"line_number":1675,"context_line":"                with Timeout(self.app.node_timeout):"},{"line_number":1676,"context_line":"                    if body:"},{"line_number":1677,"context_line":"                        conn.send(body)"},{"line_number":1678,"context_line":"                    resp \u003d conn.getresponse()"},{"line_number":1679,"context_line":"                    if not is_informational(resp.status) and \\"},{"line_number":1680,"context_line":"                            not is_server_error(resp.status):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_96c25784","line":1677,"updated":"2019-03-27 23:19:33.000000000","message":"Probably deserves its own Timeout.","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7e1c571c5cd1c8768d3a2fa8f9db8aa94341e5d9","unresolved":false,"context_lines":[{"line_number":1674,"context_line":"                self.app.set_node_timing(node, time.time() - start_node_timing)"},{"line_number":1675,"context_line":"                with Timeout(self.app.node_timeout):"},{"line_number":1676,"context_line":"                    if body:"},{"line_number":1677,"context_line":"                        conn.send(body)"},{"line_number":1678,"context_line":"                    resp \u003d conn.getresponse()"},{"line_number":1679,"context_line":"                    if not is_informational(resp.status) and \\"},{"line_number":1680,"context_line":"                            not is_server_error(resp.status):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_67dda43f","line":1677,"in_reply_to":"5fc1f717_166f3928","updated":"2019-03-28 18:06:44.000000000","message":"Yeah, IDK... I should definitely document that this thing MUST be a byte string and it SHOULD be small-ish...","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0d87f92c0f5ad33045d631cce30a8ce72f63459c","unresolved":false,"context_lines":[{"line_number":1674,"context_line":"                self.app.set_node_timing(node, time.time() - start_node_timing)"},{"line_number":1675,"context_line":"                with Timeout(self.app.node_timeout):"},{"line_number":1676,"context_line":"                    if body:"},{"line_number":1677,"context_line":"                        conn.send(body)"},{"line_number":1678,"context_line":"                    resp \u003d conn.getresponse()"},{"line_number":1679,"context_line":"                    if not is_informational(resp.status) and \\"},{"line_number":1680,"context_line":"                            not is_server_error(resp.status):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_0a614505","line":1677,"in_reply_to":"5fc1f717_96c25784","updated":"2019-03-28 19:08:18.000000000","message":"Done","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"723c5ab87dd8b9b2e5f5fce3709219950e97ba3d","unresolved":false,"context_lines":[{"line_number":1674,"context_line":"                self.app.set_node_timing(node, time.time() - start_node_timing)"},{"line_number":1675,"context_line":"                with Timeout(self.app.node_timeout):"},{"line_number":1676,"context_line":"                    if body:"},{"line_number":1677,"context_line":"                        conn.send(body)"},{"line_number":1678,"context_line":"                    resp \u003d conn.getresponse()"},{"line_number":1679,"context_line":"                    if not is_informational(resp.status) and \\"},{"line_number":1680,"context_line":"                            not is_server_error(resp.status):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_166f3928","line":1677,"in_reply_to":"5fc1f717_96c25784","updated":"2019-03-28 16:03:17.000000000","message":"this whole plumbing of a body through make_request is way less gross than I thought it would be... this seems quite manageable","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"}],"swift/proxy/controllers/container.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7623e8e72b40e8e9c534fd0280adba695993d7b8","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    cors_validation, set_info_cache, clear_info_cache"},{"line_number":28,"context_line":"from swift.common.storage_policy import POLICIES"},{"line_number":29,"context_line":"from swift.common.swob import HTTPBadRequest, HTTPForbidden, \\"},{"line_number":30,"context_line":"    HTTPNotFound, HTTPServiceUnavailable, str_to_wsgi, wsgi_to_bytes"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ContainerController(Controller):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_2acc4187","line":30,"updated":"2019-03-28 18:32:34.000000000","message":"Need to import HTTPMethodNotAllowed","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0d87f92c0f5ad33045d631cce30a8ce72f63459c","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    cors_validation, set_info_cache, clear_info_cache"},{"line_number":28,"context_line":"from swift.common.storage_policy import POLICIES"},{"line_number":29,"context_line":"from swift.common.swob import HTTPBadRequest, HTTPForbidden, \\"},{"line_number":30,"context_line":"    HTTPNotFound, HTTPServiceUnavailable, str_to_wsgi, wsgi_to_bytes"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ContainerController(Controller):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_ca2b3d92","line":30,"in_reply_to":"5fc1f717_2acc4187","updated":"2019-03-28 19:08:18.000000000","message":"Done","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"723c5ab87dd8b9b2e5f5fce3709219950e97ba3d","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        X-Backend-Replicate-Request header present"},{"line_number":366,"context_line":"        \"\"\""},{"line_number":367,"context_line":"        if \u0027X-Backend-Replicate-Request\u0027 not in req.headers:"},{"line_number":368,"context_line":"            return HTTPMethodNotAllowed(request\u003dreq)"},{"line_number":369,"context_line":"        container_partition, containers \u003d self.app.container_ring.get_nodes("},{"line_number":370,"context_line":"            self.account_name, self.container_name)"},{"line_number":371,"context_line":"        headers \u003d self._backend_requests(req, len(containers),"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_164899b0","line":368,"updated":"2019-03-28 16:03:17.000000000","message":"yeah, this is gross - the machinery is getting in the way, big smell here","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7e1c571c5cd1c8768d3a2fa8f9db8aa94341e5d9","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        X-Backend-Replicate-Request header present"},{"line_number":366,"context_line":"        \"\"\""},{"line_number":367,"context_line":"        if \u0027X-Backend-Replicate-Request\u0027 not in req.headers:"},{"line_number":368,"context_line":"            return HTTPMethodNotAllowed(request\u003dreq)"},{"line_number":369,"context_line":"        container_partition, containers \u003d self.app.container_ring.get_nodes("},{"line_number":370,"context_line":"            self.account_name, self.container_name)"},{"line_number":371,"context_line":"        headers \u003d self._backend_requests(req, len(containers),"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_a7c06c51","line":368,"in_reply_to":"5fc1f717_164899b0","updated":"2019-03-28 18:06:44.000000000","message":"Super gross, yep. I should probably drop the @cors_validation, but even then I\u0027m not entirely sure whether REPLICATE would show up in an OPTIONS request...","commit_id":"be810035b19e6d38ebc2e41d0b4646445a40dd18"}]}
