)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b1410b6caa3827a31e605f437b3e3bbf6fc3c478","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"276c28bb_4fe6dffb","updated":"2022-01-10 23:23:52.000000000","message":"open question about how this interacts with SSYNC subrequests","commit_id":"48b5a13344f6b203bc879608c1d0139c5e643afd"}],"swift/obj/expirer.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c616a1911c770ffa4bbda7b9175573deaf8f3315","unresolved":true,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"MAX_OBJECTS_TO_CACHE \u003d 100000"},{"line_number":39,"context_line":"ASYNC_DELETE_TYPE \u003d \u0027application/async-deleted\u0027"},{"line_number":40,"context_line":"MPU_DELETE_TYPE \u003d \u0027mpu-deleted\u0027"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def build_task_obj(timestamp, target_account, target_container,"}],"source_content_type":"text/x-python","patch_set":1,"id":"4401d28c_5633e0d3","line":40,"updated":"2021-12-21 23:20:33.000000000","message":"Probably ought to use something of the form\n\n \u003ctype\u003e/\u003csubtype\u003e","commit_id":"63f39ce70658fa95f82f553f9975cc36ba0cc024"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c616a1911c770ffa4bbda7b9175573deaf8f3315","unresolved":true,"context_lines":[{"line_number":291,"context_line":"                is_mpu_delete \u003d o.get(\u0027content_type\u0027).startswith("},{"line_number":292,"context_line":"                    MPU_DELETE_TYPE)"},{"line_number":293,"context_line":"                if is_mpu_delete:"},{"line_number":294,"context_line":"                    # ignore trailing / components, so ... kind of extensible?"},{"line_number":295,"context_line":"                    num_segments \u003d o[\u0027content_type\u0027].split(\u0027/\u0027)[1]"},{"line_number":296,"context_line":"                else:"},{"line_number":297,"context_line":"                    num_segments \u003d 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"718e2b53_05c482f9","line":294,"updated":"2021-12-21 23:20:33.000000000","message":"Content-Type is loads extensible -- but I\u0027d rather do it via the\n\n \u003ctype\u003e/\u003csubtype\u003e; \u003cname\u003e\u003d\u003cvalue\u003e; \u003cname2\u003e\u003d\u003cvalue2\u003e; ...\n\nsyntax.","commit_id":"63f39ce70658fa95f82f553f9975cc36ba0cc024"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c616a1911c770ffa4bbda7b9175573deaf8f3315","unresolved":true,"context_lines":[{"line_number":489,"context_line":"        headers \u003d {\u0027X-Timestamp\u0027: timestamp.normal}"},{"line_number":490,"context_line":"        acceptable_statuses \u003d (2, HTTP_CONFLICT, HTTP_NOT_FOUND)"},{"line_number":491,"context_line":"        a, c, o \u003d split_path(\u0027/\u0027 + segment_name_prefix, 3, 3, True)"},{"line_number":492,"context_line":"        for segment_number in range(int(num_segments)):"},{"line_number":493,"context_line":"            segment_name \u003d \u0027%s/%s\u0027 % (o, segment_number + 1)"},{"line_number":494,"context_line":"            try:"},{"line_number":495,"context_line":"                self.swift.delete_object("}],"source_content_type":"text/x-python","patch_set":1,"id":"f69ad8d5_e3a6fab9","line":492,"updated":"2021-12-21 23:20:33.000000000","message":"Why not just do a listing? I\u0027d find this more palatable as some new delete_prefix task... Listing consistency becomes a problem, but what if we just always kept the entry around for a reclaim age?","commit_id":"63f39ce70658fa95f82f553f9975cc36ba0cc024"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"04798ee8bacfb2183a0ee8209b59e899aef201e3","unresolved":true,"context_lines":[{"line_number":286,"context_line":"                    continue"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"                # XXX maybe better to hijack content-type for generic k/v"},{"line_number":289,"context_line":"                # metadata queue (don\u0027t we already do this for crypto?)"},{"line_number":290,"context_line":"                is_async \u003d o.get(\u0027content_type\u0027) \u003d\u003d ASYNC_DELETE_TYPE"},{"line_number":291,"context_line":"                is_mpu_delete \u003d o.get(\u0027content_type\u0027).startswith("},{"line_number":292,"context_line":"                    MPU_DELETE_TYPE)"}],"source_content_type":"text/x-python","patch_set":2,"id":"6bcc1bbd_d8c22696","line":289,"updated":"2022-01-11 16:31:42.000000000","message":"content-type support extensible parameterisation https://www.rfc-editor.org/rfc/rfc1341\n\ne.g. this would be allowed:\n\n  application/expiry; type\u003dmpu; num-segments\u003d123 \n\nbut maybe the \u0027mpu\u0027 can just be inferred from num_segments existing","commit_id":"48b5a13344f6b203bc879608c1d0139c5e643afd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"04798ee8bacfb2183a0ee8209b59e899aef201e3","unresolved":true,"context_lines":[{"line_number":289,"context_line":"                # metadata queue (don\u0027t we already do this for crypto?)"},{"line_number":290,"context_line":"                is_async \u003d o.get(\u0027content_type\u0027) \u003d\u003d ASYNC_DELETE_TYPE"},{"line_number":291,"context_line":"                is_mpu_delete \u003d o.get(\u0027content_type\u0027).startswith("},{"line_number":292,"context_line":"                    MPU_DELETE_TYPE)"},{"line_number":293,"context_line":"                if is_mpu_delete:"},{"line_number":294,"context_line":"                    # ignore trailing / components, so ... kind of extensible?"},{"line_number":295,"context_line":"                    num_segments \u003d o[\u0027content_type\u0027].split(\u0027/\u0027)[1]"}],"source_content_type":"text/x-python","patch_set":2,"id":"6e1f4e60_d708a2f0","line":292,"updated":"2022-01-11 16:31:42.000000000","message":"is it safe to assume that we\u0027d never want to use the concept of async delete at same time as mpu delete?","commit_id":"48b5a13344f6b203bc879608c1d0139c5e643afd"}],"swift/obj/server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5604cc871f04485b9b4938ea914915251cff0f51","unresolved":true,"context_lines":[{"line_number":1253,"context_line":"                           high_precision\u003dTrue),"},{"line_number":1254,"context_line":"            None, None, None,"},{"line_number":1255,"context_line":"            headers_out, device, policy"},{"line_number":1256,"context_line":"        )"},{"line_number":1257,"context_line":""},{"line_number":1258,"context_line":"    @public"},{"line_number":1259,"context_line":"    @timing_stats()"}],"source_content_type":"text/x-python","patch_set":1,"id":"6e91f58a_5aac50a5","line":1256,"updated":"2021-12-22 14:47:14.000000000","message":"so, in abstract terms, we need a way to get some metadata embedded in the expirer queue object\u0027s content-type. The expirer can then interpret that metadata accordingly.","commit_id":"63f39ce70658fa95f82f553f9975cc36ba0cc024"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5604cc871f04485b9b4938ea914915251cff0f51","unresolved":true,"context_lines":[{"line_number":1319,"context_line":"                # differentiate success from no object at all"},{"line_number":1320,"context_line":"                response_class \u003d HTTPNoContent"},{"line_number":1321,"context_line":"                self._maybe_make_mpu_delete_async(account, container, obj,"},{"line_number":1322,"context_line":"                                                  req_timestamp, orig_metadata,"},{"line_number":1323,"context_line":"                                                  device, policy)"},{"line_number":1324,"context_line":"        if orig_delete_at:"},{"line_number":1325,"context_line":"            self.delete_at_update(\u0027DELETE\u0027, orig_delete_at, account,"}],"source_content_type":"text/x-python","patch_set":1,"id":"25e67be0_a6a22734","line":1322,"range":{"start_line":1322,"start_character":65,"end_line":1322,"end_character":78},"updated":"2021-12-22 14:47:14.000000000","message":"ok, so this works because the orig_metadata is populated even when the manifest has expired (line 1278)","commit_id":"63f39ce70658fa95f82f553f9975cc36ba0cc024"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c616a1911c770ffa4bbda7b9175573deaf8f3315","unresolved":true,"context_lines":[{"line_number":1320,"context_line":"                response_class \u003d HTTPNoContent"},{"line_number":1321,"context_line":"                self._maybe_make_mpu_delete_async(account, container, obj,"},{"line_number":1322,"context_line":"                                                  req_timestamp, orig_metadata,"},{"line_number":1323,"context_line":"                                                  device, policy)"},{"line_number":1324,"context_line":"        if orig_delete_at:"},{"line_number":1325,"context_line":"            self.delete_at_update(\u0027DELETE\u0027, orig_delete_at, account,"},{"line_number":1326,"context_line":"                                  container, obj, request, device,"}],"source_content_type":"text/x-python","patch_set":1,"id":"de51544d_6e7763ad","line":1323,"updated":"2021-12-21 23:20:33.000000000","message":"I\u0027d love it if we could do this on overwrite, too... I suppose we\u0027d still have to worry about the overwrite coming via rsync \u0026 cleanup_ondisk_files, though. Would that be a better spot to drop the async?","commit_id":"63f39ce70658fa95f82f553f9975cc36ba0cc024"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b1410b6caa3827a31e605f437b3e3bbf6fc3c478","unresolved":true,"context_lines":[{"line_number":1227,"context_line":"            return"},{"line_number":1228,"context_line":"        segments_container \u003d \u0027%s+segments\u0027 % container"},{"line_number":1229,"context_line":"        obj +\u003d \u0027/%s\u0027 % orig_metadata[\u0027X-Object-Sysmeta-S3Api-Upload-Id\u0027]"},{"line_number":1230,"context_line":"        etag \u003d orig_metadata[\u0027X-Object-Sysmeta-S3Api-Etag\u0027]"},{"line_number":1231,"context_line":"        num_segments \u003d etag.rsplit(\u0027-\u0027, 1)[1]"},{"line_number":1232,"context_line":"        segment_key \u003d \u0027%s/%s\u0027 % (MPU_DELETE_TYPE, num_segments)"},{"line_number":1233,"context_line":"        self.logger.info(\u0027*\u0027 * 100)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fcd79932_c5fe2705","line":1230,"updated":"2022-01-10 23:23:52.000000000","message":"oh, this is pretty MPU specific and I don\u0027t see any obvious way to get it out of here.","commit_id":"48b5a13344f6b203bc879608c1d0139c5e643afd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"04798ee8bacfb2183a0ee8209b59e899aef201e3","unresolved":true,"context_lines":[{"line_number":1227,"context_line":"            return"},{"line_number":1228,"context_line":"        segments_container \u003d \u0027%s+segments\u0027 % container"},{"line_number":1229,"context_line":"        obj +\u003d \u0027/%s\u0027 % orig_metadata[\u0027X-Object-Sysmeta-S3Api-Upload-Id\u0027]"},{"line_number":1230,"context_line":"        etag \u003d orig_metadata[\u0027X-Object-Sysmeta-S3Api-Etag\u0027]"},{"line_number":1231,"context_line":"        num_segments \u003d etag.rsplit(\u0027-\u0027, 1)[1]"},{"line_number":1232,"context_line":"        segment_key \u003d \u0027%s/%s\u0027 % (MPU_DELETE_TYPE, num_segments)"},{"line_number":1233,"context_line":"        self.logger.info(\u0027*\u0027 * 100)"}],"source_content_type":"text/x-python","patch_set":2,"id":"d50fda24_3ffdc245","line":1230,"in_reply_to":"fcd79932_c5fe2705","updated":"2022-01-11 16:31:42.000000000","message":"for new/updated objects we could have the s3api middleware add \u0027generic\u0027 sysmeta such as: \n\n  X-Object-Sysmeta-Expirer-Params \u003d \u0027type\u003dmpu; upload_id\u003dxyz; num_segments\u003d123\u0027\n\nand have the object server stick this into the content-type without needing to understand the meaning.\n\n  if \u0027X-Object-Sysmeta-Expirer-Params\u0027 in orig_metadata:\n      content-type \u003d \u0027application/expiry;%s\u0027 % orig_metadata[\u0027X-Object-Sysmeta-Expirer-Params\u0027]\n  else:\n      content-type \u003d text/plain\n\nor even more direct:\n\n  X-Object-Sysmeta-Expirer-Content-Type \u003d \u0027application/expiry; type\u003dmpu; upload_id\u003dxyz; num_segments\u003d123\u0027","commit_id":"48b5a13344f6b203bc879608c1d0139c5e643afd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b1410b6caa3827a31e605f437b3e3bbf6fc3c478","unresolved":true,"context_lines":[{"line_number":1320,"context_line":"                response_class \u003d HTTPNoContent"},{"line_number":1321,"context_line":"                self._maybe_make_mpu_delete_async(account, container, obj,"},{"line_number":1322,"context_line":"                                                  req_timestamp, orig_metadata,"},{"line_number":1323,"context_line":"                                                  device, policy)"},{"line_number":1324,"context_line":"        if orig_delete_at:"},{"line_number":1325,"context_line":"            self.delete_at_update(\u0027DELETE\u0027, orig_delete_at, account,"},{"line_number":1326,"context_line":"                                  container, obj, request, device,"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfeebd98_0a59e323","line":1323,"updated":"2022-01-10 23:23:52.000000000","message":"if we have an orig_metadata in a PUT overwrite scenario we could probably do this there as well","commit_id":"48b5a13344f6b203bc879608c1d0139c5e643afd"}]}
