)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38173,"name":"Tanvi Nautiyal","email":"tnautiya@redhat.com","username":"tnautiyal"},"change_message_id":"681e05cee60a3d3cdeb6d77845a42bdfba9da83e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"b3fec74b_613873e6","updated":"2026-06-19 08:40:18.000000000","message":"The swift assertions LGTM!","commit_id":"fc3c18f88a3631c9ac3191083fd717761f2a4826"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy"},"change_message_id":"2ec0d5b303707c2e6f79fb514ddbe3234b0da7c8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c4442c09_6114b3e7","updated":"2026-06-19 09:24:20.000000000","message":"Well done, great bug fix! I added some minor suggestions that are up to you if you want to add them or not. I also asked a few questions for clarification. From Swift specifics it is looking pretty great as well\n\n**Correct Swift Consistency Model Understanding**:\n - Container listings are eventually consistent (typically \u003c1s, but can be\n  longer)\n - SLO deletion with multipart-manifest\u003ddelete performs async segment cleanup on\n  backend\n - Container DELETE fails with 409 if listing still shows objects/segments\n\n**Proper Swift Error Handling**:\n - Catches swiftclient.ClientException with e.http_status check\n - Uses http.client.CONFLICT (409) constant, not magic numbers\n - Re-raises all non-409 errors (doesn\u0027t mask Swift failures)\n\n**Multi-Tenant Container Pattern**:\n - Per-image containers (glance_{uuid}) are not reused\n - Container deletion is cleanup, not a required operation\n - Safe to leave empty containers (minimal metadata overhead)\n\n**Parent Store.delete() Segment Handling**:\n - SLO: Single call with multipart-manifest\u003ddelete query string (atomic from client perspective, but async backend cleanup)\n - DLO: Iterates segments by prefix, then deletes manifest\n - Both patterns can trigger the 409 due to eventual consistency","commit_id":"fc3c18f88a3631c9ac3191083fd717761f2a4826"}],"glance_store/_drivers/swift/store.py":[{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy"},"change_message_id":"2ec0d5b303707c2e6f79fb514ddbe3234b0da7c8","unresolved":true,"context_lines":[{"line_number":1662,"context_line":"        super(MultiTenantStore, self).delete(location, connection)"},{"line_number":1663,"context_line":"        container \u003d location.store_location.container"},{"line_number":1664,"context_line":"        try:"},{"line_number":1665,"context_line":"            connection.delete_container(container)"},{"line_number":1666,"context_line":"        except swiftclient.ClientException as e:"},{"line_number":1667,"context_line":"            if e.http_status !\u003d http.client.CONFLICT:"},{"line_number":1668,"context_line":"                raise"}],"source_content_type":"text/x-python","patch_set":1,"id":"31bf46b2_332c3534","line":1665,"updated":"2026-06-19 09:24:20.000000000","message":"Question: If an operator retries a failed image delete after getting this 404 warning:\n- The object is already gone (deleted successfully the first time_\n- The retry would likely get 404 Not Found instead of success\n- Is this the expected behaviour?","commit_id":"fc3c18f88a3631c9ac3191083fd717761f2a4826"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy"},"change_message_id":"2ec0d5b303707c2e6f79fb514ddbe3234b0da7c8","unresolved":true,"context_lines":[{"line_number":1672,"context_line":"            # container non-empty and return a 409 Conflict here. The"},{"line_number":1673,"context_line":"            # image data itself has already been removed successfully,"},{"line_number":1674,"context_line":"            # so this is not a fatal error for the delete operation; the"},{"line_number":1675,"context_line":"            # now-empty container will simply be cleaned up the next"},{"line_number":1676,"context_line":"            # time it\u0027s touched (or left as a harmless empty container)."},{"line_number":1677,"context_line":"            LOG.warning(_LW("},{"line_number":1678,"context_line":"                \"Unable to delete container %(container)s after \""}],"source_content_type":"text/x-python","patch_set":1,"id":"6a116e62_3dbd3669","line":1675,"updated":"2026-06-19 09:24:20.000000000","message":"Question: The comment says that orphaned containers will be \"cleaned up the next time it\u0027s touched (or left as harmless empty containers)\". Can you clarify:\n- What triggers \"the next time it\u0027s touched\" in multi-tenant mode?\n- Since containers are per-image (glance_{uuid}), they won\u0027t be reused for new images\n- Is there a periodic cleanup job in glance_store or is manual cleanup expected?","commit_id":"fc3c18f88a3631c9ac3191083fd717761f2a4826"}],"glance_store/tests/unit/test_swift_store.py":[{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy"},"change_message_id":"2ec0d5b303707c2e6f79fb514ddbe3234b0da7c8","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"43f2a833_63f9cfb1","updated":"2026-06-19 09:24:20.000000000","message":"Excellent test coverage!\n\nSuggestion: Consider adding a test case that mocks a multi-segment object (DLO or SLO) to verify that all segments are deleted before the container delete attempt.\n\nSuggestion 2: Add another test that verifies that LOG.warning() is called with the expected message when a 409 occurs. Something like\n\n```\nwith mock.patch.object(swift.LOG, \u0027warning\u0027) as mock_log:\n    self.store.delete(self.location, connection\u003dself.connection)\n    mock_log.assert_called_once()\n```","commit_id":"fc3c18f88a3631c9ac3191083fd717761f2a4826"}]}
