)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c572fdff25bbba9cc4f0e7d98bb8069b05546eba","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Optionally, also delete them."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"This doesn\u0027t do anything to stop the creation of orphaned segments, but"},{"line_number":12,"context_line":"at least it can help reclaim some space now and then."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"TODO: check old versions in versioning-ever-enabled containers"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"351e83d1_b2a2e598","line":11,"range":{"start_line":11,"start_character":28,"end_line":11,"end_character":66},"updated":"2021-03-27 01:15:22.000000000","message":"I think this part is going to be harder than I originally envisioned -- at one point I was hopeful that we could just fire off a HEAD (and maybe DELETE) before every PUT, but wasn\u0027t thinking about how we might, for example, fail a fresh CompleteMultipartUpload with validation errors midway through the PUT (from s3api\u0027s perspective).\n\nThe actual *fix* may require a primitive that more-closely reflects S3\u0027s semantics.","commit_id":"0b70c44a2d97db68bd223bead65bb0edd025dccf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c572fdff25bbba9cc4f0e7d98bb8069b05546eba","unresolved":true,"context_lines":[{"line_number":11,"context_line":"This doesn\u0027t do anything to stop the creation of orphaned segments, but"},{"line_number":12,"context_line":"at least it can help reclaim some space now and then."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"TODO: check old versions in versioning-ever-enabled containers"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I8a48b4dd9ec7a85e61221d9a495837f0cca0a5cb"},{"line_number":17,"context_line":"Related-Bug: #1813202"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7e685121_b12d74db","line":14,"updated":"2021-03-27 01:15:22.000000000","message":"At the very least, this needs to check whether versioning was ever enabled and bail if it\u0027s not willing to check the old versions.","commit_id":"0b70c44a2d97db68bd223bead65bb0edd025dccf"}],"swift/obj/watchers/bug_1813202.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c0256ae1571d5a2d2ad37d4288a0d60f181f66b5","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2020 NVIDIA"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":1,"id":"473a3be6_3be63ee8","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"updated":"2021-03-29 05:56:44.000000000","message":"2021?","commit_id":"0b70c44a2d97db68bd223bead65bb0edd025dccf"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c0256ae1571d5a2d2ad37d4288a0d60f181f66b5","unresolved":true,"context_lines":[{"line_number":64,"context_line":"        try:"},{"line_number":65,"context_line":"            acct, cont, obj \u003d utils.split_path("},{"line_number":66,"context_line":"                object_metadata[\"name\"], 3, 3, True)"},{"line_number":67,"context_line":"            if not cont.endswith(s3_utils.MULTIUPLOAD_SUFFIX):"},{"line_number":68,"context_line":"                return"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"            upload_marker_obj, _segment_number \u003d obj.rsplit(\"/\", 1)"}],"source_content_type":"text/x-python","patch_set":1,"id":"00e58f02_82eefdf0","line":67,"updated":"2021-03-29 05:56:44.000000000","message":"What if users decide to use a \u003ccont\u003e+segments name for their segments container in swift. I guess that\u0027s a weird edgecase. We could add a:\n\n  if obj.count(\u0027/\u0027) \u003c 2:\n    return\n\nBecause rsplit doesn\u0027t throw an error if there is no splitting character.\nJust spitballing here as it\u0027s getting to the end of my day 😊\n\nThe sooner we use null string markers the better ;)","commit_id":"0b70c44a2d97db68bd223bead65bb0edd025dccf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"339f739058fb152b617799271ae440cfeed7f021","unresolved":true,"context_lines":[{"line_number":64,"context_line":"        try:"},{"line_number":65,"context_line":"            acct, cont, obj \u003d utils.split_path("},{"line_number":66,"context_line":"                object_metadata[\"name\"], 3, 3, True)"},{"line_number":67,"context_line":"            if not cont.endswith(s3_utils.MULTIUPLOAD_SUFFIX):"},{"line_number":68,"context_line":"                return"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"            upload_marker_obj, _segment_number \u003d obj.rsplit(\"/\", 1)"}],"source_content_type":"text/x-python","patch_set":1,"id":"b0e08928_91c48be9","line":67,"in_reply_to":"00e58f02_82eefdf0","updated":"2021-03-30 19:38:09.000000000","message":"Unpacking a list with len 1 into two vars should throw a ValueError, though, and we\u0027ll return at L75.\n\nFair point on the possibility (however remote) of having \u003ccont\u003e+segments used with the Swift API -- I could do some validation of the upload_id, as it should be some base64-encoded hex: https://github.com/openstack/swift/blob/2.27.0/swift/common/middleware/s3api/utils.py#L55","commit_id":"0b70c44a2d97db68bd223bead65bb0edd025dccf"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"8d3edf851942d6a190bf8d5d86e474f5de04f531","unresolved":true,"context_lines":[{"line_number":106,"context_line":"                \"X-Newest\": \"True\","},{"line_number":107,"context_line":"                # If it\u0027s *not* a manifest, we want this to be pretty cheap"},{"line_number":108,"context_line":"                # (though it\u0027ll still kinda suck for EC :-/ )"},{"line_number":109,"context_line":"                \"Range\": \"bytes\u003d-1\","},{"line_number":110,"context_line":"                # But if it *is* a manifest, grab the whole thing"},{"line_number":111,"context_line":"                \"X-Backend-Ignore-Range-If-Metadata-Present\":"},{"line_number":112,"context_line":"                    \"X-Static-Large-Object\","}],"source_content_type":"text/x-python","patch_set":1,"id":"b2ab37b8_f057d2cd","line":109,"updated":"2021-03-27 02:32:57.000000000","message":"This syntax requests 1 last byte of the object, right? So, how does it work with json.loads(app_iter) below?","commit_id":"0b70c44a2d97db68bd223bead65bb0edd025dccf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"339f739058fb152b617799271ae440cfeed7f021","unresolved":true,"context_lines":[{"line_number":106,"context_line":"                \"X-Newest\": \"True\","},{"line_number":107,"context_line":"                # If it\u0027s *not* a manifest, we want this to be pretty cheap"},{"line_number":108,"context_line":"                # (though it\u0027ll still kinda suck for EC :-/ )"},{"line_number":109,"context_line":"                \"Range\": \"bytes\u003d-1\","},{"line_number":110,"context_line":"                # But if it *is* a manifest, grab the whole thing"},{"line_number":111,"context_line":"                \"X-Backend-Ignore-Range-If-Metadata-Present\":"},{"line_number":112,"context_line":"                    \"X-Static-Large-Object\","}],"source_content_type":"text/x-python","patch_set":1,"id":"da902962_1bdbccc0","line":109,"in_reply_to":"b2ab37b8_f057d2cd","updated":"2021-03-30 19:38:09.000000000","message":"Yup, last byte -- unless it\u0027s an SLO manifest, in which case we ignore the range header. See below; works just like in https://github.com/openstack/swift/commit/e8b654f3","commit_id":"0b70c44a2d97db68bd223bead65bb0edd025dccf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4f694236396fd299e88028272b246609ab0a7b2d","unresolved":true,"context_lines":[{"line_number":116,"context_line":"        versions_prefix \u003d request_helpers.get_reserved_name(manifest_obj, \u0027\u0027)"},{"line_number":117,"context_line":"        for item in self.swift.iter_objects("},{"line_number":118,"context_line":"                acct, versions_cont, prefix\u003dversions_prefix):"},{"line_number":119,"context_line":"            potential_manifests.append((versions_cont, item[\u0027name\u0027]))"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        any_errors \u003d False"},{"line_number":122,"context_line":"        all_segments \u003d set()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3d5727b5_4e630afd","line":119,"updated":"2022-01-19 22:04:35.000000000","message":"Oh hey, that\u0027s right -- I think I can drop that TODO from the commit message...","commit_id":"da37f621fddd3bee8dd7048b24d976ab093757b8"}]}
