)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"756f74c2a6f481ad6f5b1582e3db2adc1c91c49e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"ff9702ad_84cb23da","updated":"2026-07-21 09:33:45.000000000","message":"If the mtu stuff will end up in a hidden account, what\u0027s going to go update the main account/container policy_stat mtu_bytes stats? Or is the idea that the data will be stored in a hidden account but the main container will update the users account mpu_bytes.. I guess the latter makes sense now that I think about it.. it is getting late here 😛\n\nAnd so the \"mpu\" in the user size will just count to the object_count as per normal?","commit_id":"5dc2869626acf7f0423bf674e6648996053de543"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4ad79843d70f7433664b4ec15d9e1e0ab59a7d22","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"972335cd_a1a5b939","updated":"2026-08-05 17:34:35.000000000","message":"still WIP\n\nI flipped from storing mpu_size to storing mpu_manifest_size in the db, and making the existing bytes_used be the total size of the mpu parts i.e. bytes_used is what users would be billed for","commit_id":"22595ba352da05fc102d4b6494fda4642a50113d"}],"swift/common/middleware/mpu.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"9fcd6feda1e61b43b006afb375a21d4ce7e14e60","unresolved":false,"context_lines":[{"line_number":1346,"context_line":"    def segments_iter(self, byteranges_parts_iter):"},{"line_number":1347,"context_line":"        # translate manifest part dicts to SegmentedIterable segment dicts"},{"line_number":1348,"context_line":"        for part, part_range_start, part_range_end in byteranges_parts_iter:"},{"line_number":1349,"context_line":"            yield(dict(part,"},{"line_number":1350,"context_line":"                       path\u003d\u0027/%s/%s\u0027 % (self.api_version, part[\u0027path\u0027]),"},{"line_number":1351,"context_line":"                       hash\u003dNone,"},{"line_number":1352,"context_line":"                       first_byte\u003dpart_range_start,"}],"source_content_type":"text/x-python","patch_set":3,"id":"57a3dd7a_cc609820","line":1349,"updated":"2026-07-10 12:06:07.000000000","message":"pep8: E275 missing whitespace after keyword","commit_id":"19912bea1ebc379338d48279047add8e8bce5640"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"4aff93acfac9efe607f94a0d68b0b8b510455918","unresolved":false,"context_lines":[{"line_number":1346,"context_line":"    def segments_iter(self, byteranges_parts_iter):"},{"line_number":1347,"context_line":"        # translate manifest part dicts to SegmentedIterable segment dicts"},{"line_number":1348,"context_line":"        for part, part_range_start, part_range_end in byteranges_parts_iter:"},{"line_number":1349,"context_line":"            yield(dict(part,"},{"line_number":1350,"context_line":"                       path\u003d\u0027/%s/%s\u0027 % (self.api_version, part[\u0027path\u0027]),"},{"line_number":1351,"context_line":"                       hash\u003dNone,"},{"line_number":1352,"context_line":"                       first_byte\u003dpart_range_start,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ed9a917b_fc4a19bc","line":1349,"updated":"2026-07-15 11:56:37.000000000","message":"pep8: E275 missing whitespace after keyword","commit_id":"5dc2869626acf7f0423bf674e6648996053de543"}],"swift/container/backend.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"756f74c2a6f481ad6f5b1582e3db2adc1c91c49e","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        SELECT new.storage_policy_index,"},{"line_number":101,"context_line":"               (new.deleted \u003d\u003d 0),"},{"line_number":102,"context_line":"               new.size * (new.deleted \u003d\u003d 0),"},{"line_number":103,"context_line":"               new.mpu_size * (new.mpu_size !\u003d -1) * (new.deleted \u003d\u003d 0)"},{"line_number":104,"context_line":"        WHERE NOT EXISTS("},{"line_number":105,"context_line":"            SELECT changes() as change"},{"line_number":106,"context_line":"            FROM policy_stat"}],"source_content_type":"text/x-python","patch_set":4,"id":"ca0a33fd_2a600b35","line":103,"updated":"2026-07-21 09:33:45.000000000","message":"oh cool, added via a trigger in the policy_stat table","commit_id":"5dc2869626acf7f0423bf674e6648996053de543"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"756f74c2a6f481ad6f5b1582e3db2adc1c91c49e","unresolved":true,"context_lines":[{"line_number":261,"context_line":"        updated.update("},{"line_number":262,"context_line":"            [(k, existing[k])"},{"line_number":263,"context_line":"             for k in (\u0027size\u0027, \u0027etag\u0027, \u0027deleted\u0027, \u0027swift_bytes\u0027, \u0027mpu_size\u0027,"},{"line_number":264,"context_line":"                       \u0027systags\u0027)])"},{"line_number":265,"context_line":"        updated[\u0027data_timestamp\u0027] \u003d existing[\u0027data_timestamp\u0027]"},{"line_number":266,"context_line":"        newer_than_existing[0] \u003d False"},{"line_number":267,"context_line":"    if Timestamp(existing[\u0027ctype_timestamp\u0027]) \u003e\u003d \\"}],"source_content_type":"text/x-python","patch_set":4,"id":"a8e8d8d7_ba5eecf8","line":264,"range":{"start_line":264,"start_character":24,"end_line":264,"end_character":32},"updated":"2026-07-21 09:33:45.000000000","message":"oh cool, so systags are new (added earlier in the MPU feature branch I assume) and for the metadata of objects. This is cool, we finally pulled the trigger on a metadata field, Love it","commit_id":"5dc2869626acf7f0423bf674e6648996053de543"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"756f74c2a6f481ad6f5b1582e3db2adc1c91c49e","unresolved":true,"context_lines":[{"line_number":994,"context_line":"                    trailing_sync \u003d \u0027-1 AS x_container_sync_point1, \u0027 \\"},{"line_number":995,"context_line":"                                    \u0027-1 AS x_container_sync_point2\u0027"},{"line_number":996,"context_line":"                elif \u0027no such column: bytes_in_mpu\u0027 in err_msg:"},{"line_number":997,"context_line":"                    trailing_bytes_in_mpu \u003d \u00270 AS bytes_in_mpu\u0027"},{"line_number":998,"context_line":"                else:"},{"line_number":999,"context_line":"                    raise"},{"line_number":1000,"context_line":"        data \u003d dict(data)"}],"source_content_type":"text/x-python","patch_set":4,"id":"465c406e_c4c6d054","line":997,"range":{"start_line":997,"start_character":45,"end_line":997,"end_character":46},"updated":"2026-07-21 09:33:45.000000000","message":"should this be a -1? As I thought you said above in comment on line 585.","commit_id":"5dc2869626acf7f0423bf674e6648996053de543"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4ad79843d70f7433664b4ec15d9e1e0ab59a7d22","unresolved":true,"context_lines":[{"line_number":994,"context_line":"                    trailing_sync \u003d \u0027-1 AS x_container_sync_point1, \u0027 \\"},{"line_number":995,"context_line":"                                    \u0027-1 AS x_container_sync_point2\u0027"},{"line_number":996,"context_line":"                elif \u0027no such column: bytes_in_mpu\u0027 in err_msg:"},{"line_number":997,"context_line":"                    trailing_bytes_in_mpu \u003d \u00270 AS bytes_in_mpu\u0027"},{"line_number":998,"context_line":"                else:"},{"line_number":999,"context_line":"                    raise"},{"line_number":1000,"context_line":"        data \u003d dict(data)"}],"source_content_type":"text/x-python","patch_set":4,"id":"b77cb44f_fbd9bd32","line":997,"range":{"start_line":997,"start_character":45,"end_line":997,"end_character":46},"in_reply_to":"465c406e_c4c6d054","updated":"2026-08-05 17:34:35.000000000","message":"hmmm, this is the aggregation, not the object row, so I *think* it starts at 0","commit_id":"5dc2869626acf7f0423bf674e6648996053de543"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"836974bfd2534403736e949ed3edf1fe1f5e8703","unresolved":true,"context_lines":[{"line_number":994,"context_line":"                    trailing_sync \u003d \u0027-1 AS x_container_sync_point1, \u0027 \\"},{"line_number":995,"context_line":"                                    \u0027-1 AS x_container_sync_point2\u0027"},{"line_number":996,"context_line":"                elif \u0027no such column: bytes_in_mpu\u0027 in err_msg:"},{"line_number":997,"context_line":"                    trailing_bytes_in_mpu \u003d \u00270 AS bytes_in_mpu\u0027"},{"line_number":998,"context_line":"                else:"},{"line_number":999,"context_line":"                    raise"},{"line_number":1000,"context_line":"        data \u003d dict(data)"}],"source_content_type":"text/x-python","patch_set":4,"id":"00325e90_ea76e78a","line":997,"range":{"start_line":997,"start_character":45,"end_line":997,"end_character":46},"in_reply_to":"b77cb44f_fbd9bd32","updated":"2026-08-10 09:45:33.000000000","message":"oh right, its the object row and the -1 means not an mpu","commit_id":"5dc2869626acf7f0423bf674e6648996053de543"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"836974bfd2534403736e949ed3edf1fe1f5e8703","unresolved":true,"context_lines":[{"line_number":288,"context_line":"    if item_manifest_size is None:"},{"line_number":289,"context_line":"        expanded[\u0027manifest_size\u0027] \u003d -1"},{"line_number":290,"context_line":"    else:"},{"line_number":291,"context_line":"        expanded[\u0027manifest_size\u0027] \u003d item_manifest_size"},{"line_number":292,"context_line":"    expanded[\u0027systags\u0027] \u003d param_str_to_dict(item.get(\u0027systags\u0027))"},{"line_number":293,"context_line":"    return expanded"},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"a8eddbd2_2f75c188","line":291,"updated":"2026-08-10 09:45:33.000000000","message":"NIT: this line seems redundant, it should already exist becuase of the if on 288 and already be in expanded via 271.\n\nI guess specfically overriding it here is arguably easier to maintain I guess which is why I just labled it a NIT.","commit_id":"22595ba352da05fc102d4b6494fda4642a50113d"}]}
